网页版记事本

复制到浏览器即可使用,可加书签,可分享,不需要网络,全平台可用

  1. data:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+
    
  2. 不需要编辑

    data:text/html;charset=utf-8,%E4%BD%A0%E5%A5%BD%EF%BC%8Cmy world

  3. 可读版本

    data:text/html;charset=utf-8,<html contenteditable>1. </html>

  4. 增加了导出到剪切板功能

    data:text/html;charset=utf-8,<html contenteditable=""><head> <title>导出页面内容为 UTF-8 到剪切板</title> <script> function copyToClipboard() { var htmlContent = document.documentElement.outerHTML; var tempInput = document.createElement("textarea"); tempInput.style.opacity = 0; tempInput.value = 'data:text/html;charset=utf-8,' +htmlContent; document.body.appendChild(tempInput); tempInput.select(); document.execCommand("copy"); document.body.removeChild(tempInput); alert("已复制"); } </script> </head> <body> <h1>导出页面内容为 UTF-8 到剪切板</h1> <button onclick="copyToClipboard()">导出为 UTF-8</button> <hr>这里开始编辑</body></html

  5. 实时渲染 HTML 、CSS 、JS

    data:text/html,<body oninput="i.srcdoc=h.value+'<style>'+c.value+'</style><script>'+j.value+'</script>'"><style>textarea,iframe{width:100%;height:50%}body{margin:0}textarea{width:33.33%;font-size:18}</style><textarea placeholder=HTML id=h></textarea><textarea placeholder=CSS id=c></textarea><textarea placeholder=JS id=j></textarea><iframe id=i>

  6. 网页版本画图

    data:text/html,<canvas id=v><script>d=document,d.body.style.margin=0,P="onpointer",c=v.getContext\2d`,v.width=innerWidth,v.height=innerHeight,c.lineWidth=2,f=0,d[P+”down”]=e=>{f=e.pointerId+1;e.preventDefault();c.beginPath();c.moveTo(e.x,e.y)};d[P+”move”]=e=>{f==e.pointerId+1&&c.lineTo(e.x,e.y);c.stroke()},d[P+”up”]=_=>f=0`

  7. 添加了可以切换显示 /隐藏 HTML/CSS/JavaScript/Output 的功能

    data:text/html,<body oninput="i.srcdoc=h.value+'<style>'+c.value+'</style><script>'+j.value+'</script>'"><style> textarea, iframe { width: 100%; height: 50%; background-color: rgb(245, 245, 245); } body { margin: 0; background-color: rgb(245, 245, 245); } textarea, iframe { width: 33.3%; height: 100%; flex: 1; font-size: 18; resize: none; } textarea:focus { background-color: white; } .menu { text-align: center; overflow: hidden; width: 100%; padding: 5px 0; } .panels { display: flex; justify-content: center; height: calc(100% - 40px); }</style><script> function switchDisplay(id) { var dom = document.getElementById(id); if (!dom) return; if (dom.style.display !== '') { dom.style.display = ''; return; } if (dom.style.display === '') { dom.style.display = 'none'; return; } }</script><div class="menu"><button onclick="switchDisplay('h')">HTML</button><button onclick="switchDisplay('c')">CSS</button><button onclick="switchDisplay('j')">JavaScript</button><button onclick="switchDisplay('i')">Output</button></div><div class="panels"><textarea placeholder=HTML id=h></textarea><textarea placeholder=CSS id=c></textarea><textarea placeholder=JS id=j></textarea><iframe id=i></div>

  8. 加入左右边距、更换系统字体

    data:text/html,<body contenteditable style=line-height:1.5;margin-left:20%;margin-right:20%;font-family:system-ui>

  9. 双屏对照版

    data:text/html;text,<html><body style="display:flex"><div contenteditable style="flex:1;padding:5px"></div><div contenteditable style="flex:1;padding:5px"></div></body></html>

  10. 一键清理浏览器垃圾

    data:text/html;charset=utf-8,<script>while(1){Math.random()\*Math.random()/Math.random()}alert('清理完成');</script>

  11. 视频播放器

    data:text/html;base64,PCFET0NUWVBFIGh0bWw+DQo8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImlucHV0IiBhY2NlcHQ9InZpZGVvLyoiPg0KPGJyPg0KPHZpZGVvIHNyYz0iIiBpZD0idmlkZW8iIGNvbnRyb2xzIGF1dG9wbGF5PjwvdmlkZW8+DQo8c2NyaXB0Pg0KICBpbnB1dC5vbmNoYW5nZSA9ICgpID0+IHsNCiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTsNCiAgICBpZiAoZmlsZSkgew0KICAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTsNCiAgICB9DQogIH07DQo8L3NjcmlwdD4=

  12. 支持将编辑内容一键复制成 url 分享给其他人

    data:text/html;base64,PGh0bWw+PGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8YnV0dG9uIGlkPSJidG4iPuWwhue8lui+keWGheWuueWkjeWItuS4ukRhdGFVcmw8L2J1dHRvbj4KICAgIDxkaXYgaWQ9ImVkaXRvci1hcmVhIiBjb250ZW50ZWRpdGFibGU9IiI+PC9kaXY+CiAgCiAgPHN0eWxlPgogICAgI2VkaXRvci1hcmVhIHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDgwcHgpOwogICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICBvdXRsaW5lOiAxcHggc29saWQgZ3JheTsKICAgIH0KICA8L3N0eWxlPgogIDxzY3JpcHQ+CiAgICBmdW5jdGlvbiB1dGY4X3RvX2I2NChzdHIpIHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICB9CgogICAgLy8gZnVuY3Rpb24gYjY0X3RvX3V0Zjgoc3RyKSB7CiAgICAvLyAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHdpbmRvdy5hdG9iKHN0cikpKTsKICAgIC8vIH0KCiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYnRuIik7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNvbnN0IGh0bWxDb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaHRtbCIpOwogICAgICBjb25zb2xlLmxvZyhodG1sQ29udGVudC5pbm5lckhUTUwpOwogICAgICBjb25zdCBkYXRhVXJsID0gIjxodG1sPiIgKyBodG1sQ29udGVudC5pbm5lckhUTUwgKyAiPC9odG1sPiI7CiAgICAgIGNvbnN0IGJhc2U2NCA9IHV0ZjhfdG9fYjY0KGRhdGFVcmwpOwogICAgICAvLyBjb25zb2xlLmxvZyhiYXNlNjQpOwoKICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGBkYXRhOnRleHQvaHRtbDtiYXNlNjQsJHtiYXNlNjR9YAogICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCAicmVhZG9ubHkiKTsKICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIGlucHV0VmFsdWUpOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTsKICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OSk7CiAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTsKICAgIH0pOwogIDwvc2NyaXB0PgoKPC9ib2R5PjwvaHRtbD4=

100个有趣的网站

1、实时地球 网址:https://zoom.earth/
实时图像每 10 分钟更新一次,提供风暴、天气预报、降水、火警等数据

2、陕西博物馆 360 度实景浏览 网址:https://www.sxhm.com/online.html/
线上参观陕西博物馆,360度展示,共有五个展厅100多个场景。可以网页浏览,也可以 VR 头盔浏览

3、CyArk 网址:https://www.cyark.org/
用专业的三维激光扫描技术数字化重现世界上最久远、最著名的古迹

4、全球贸易数据分析 网址:http://globe.cid.harvard.edu/
这个网站可以看到全球每一个国家在贸易方面的数据

5、公共钢琴 网址:https://pianos.pub/
收集了全世界 8,391 架公共钢琴,你可以输入一个地点查找附近的钢琴

6、天际网络摄像头 网址:https://www.skylinewebcams.com/
观看世界各地景区的实时摄像头画面

7、Manhole 网址:https://manhole.co.il/
有非常多全世界各地有趣的井盖!还能看这个井盖具体在什么地方

8、近地轨道可视化 网址:https://platform.leolabs.space/visualization
感受地球低轨道太空的实际状态

9、全球电力设施地图 网址:https://openinframap.org/
该网站的地图显示全世界电力设施的位置,包括电厂、变电站、输电线等等,甚至还有风力发电机

10、护照博物馆 网址:https://www.passportindex.org/
这个网站集合了世界各地护照样式 还有办理程序 办理难易程度 等等

11、随机谷歌街景 网址:https://randomstreetview.com/
这个网站随机展示谷歌街景的照片,世界各地都有

12、用户界面的历史 网址:https://history.user-interface.io/
介绍了从 1973 年第一个支持 GUI 的操作系统到目前的 macOS 和 windows 的用户界面

13、World flags 网址:https://world-flags.org/
一个介绍世界各国国旗、含义和起源、国旗的起源和琐事的国旗武士媒体组合项目

14、Dollar Street 网址:https://www.gapminder.org/dollar-street/
按照收入展示各个国家中人们的生活

15、深海 网址:https://neal.fun/deep-sea/
海洋不同深度都有什么生物

16、Go nomad 网址:https://nomadlist.com/
这个网站是用来给游民们寻找适合自己的城市做参考,根据各种权威机构数据列出了各项评分

17、手机博物馆 网址:https://www.mobilephonemuseum.com/catalogue
网站目前拥有来自 200 多个不同品牌的 2200 多个独立型号

18、**线上博物馆 网址:http://www.diaoyudao.org.cn/dydbwg.html/
博物馆展陈内容包括历史图片、视频资料、文献资料、法律文件、实物模拟等

19、地平说学会协会 网址:https://www.tfes.org/
世界上有一些人认为地球是平面而非球体,这是他们的官网

20、机械键盘博物馆 网址:https://scrapbox.io/MECHKEYS/
收集了非常多设计独特的机械键盘

21、全景故宫 网址:https://pano.dpm.org.cn/
线上体验游览故宫,360° 查看各个宫殿,有文字介绍

22、故宫博物院数字文物库 网址:https://digicol.dpm.org.cn/
在线查看故宫博物院众多藏品,可根据分类和年代浏览

23、千亿像素看中国 网址:http://bigpixel.cn/zh-CN.html/
可浏览千亿像素的全景图片,观看一个城市的面貌

24、核弹威力 网址:https://nuclearsecrecy.com/nukemap/
选择某个核弹查看爆炸影响的范围大小

25、地球时间线 网址:https://timelineofearth.com/
滚动屏幕,查看地球从形成到今天的大致时间线

26、克苏鲁公社 网址:https://www.cthulhuclub.com/
克苏鲁公社为克苏鲁神话爱好者自发创建的克苏鲁神话相关资料网站

27、中国历史照片 网址:https://www.hpcbristol.net/
布里斯托大学开放中国影像数据库,提供 20,000 多张中国近代照片免费浏览

28、ocearch 网址:https://www.ocearch.org/tracker/
追踪大白鲨、虎鲸等海洋动物的实时位置

29、知妖(中国妖怪百集) 网址:http://www.cbaigui.com/
收集中国古今妖怪

30、Little Big World 网址:https://www.littlebigworld.de/
Little Big World 使用移轴摄影、壮观的无人机摄影和惊人的延时,将地球上最美丽、最有趣的地方变成了可爱的微型模型

31、地球模型 网址:https://3d-app.yunser.com/earth/
网站默认模拟了地球自转运动,同时提供了大量的模拟操作,如查看太阳光照、昼夜平分面黄道面等

32、极像素 网址:https://www.sigoo.com/
超高像素看世界

33、中国纪录片网 网址:http://www.docuchina.cn/
国家级的纪录片资源,央视出品

34、OEC.world 网址:https://oec.world/
查询每个国家或地区的贸易数据,并用图文进行通俗解释

35、波斯波利斯 网址:https://persepolis.getty.edu/
波斯波利斯是古代波斯帝国的首都,现在已经是一片废墟了。这个页面还原了这座雄伟的帝国都城,重建了 3D 街景,让你在其中漫游

36、卢浮宫藏品 网址:https://collections.louvre.fr/en/
卢浮宫超过 48 万藏品电子化,可在线免费浏览

37、中华珍宝馆 网址:https://g2.ltfc.net/
在线的中国字画的博物馆

38、地球旧照 网址:https://3d-app.yunser.com/plateMotion/
一个可以查看远古时期的地貌、研究板块运动网站

39、木材数据库 网址:https://www.wood-database.com/
木材数据库。有详细的介绍,包括硬度排行等

40、无限 3D 美术馆 网址:https://gallery.nowaythis.works/
目前有180多万件艺术品的 3D 美术馆,每件艺术品都是来自 Reddit 的 r/Art 频道

41、The Sea We Breathe 网址:https://www.bluemarinefoundation.com/the-sea-we-breathe/
带你进入海底世界遨游,互动式的体验

42、Webcamtaxi 网址:https://www.webcamtaxi.com/
有图比 上面有很多24小时的摄像头直播频道,可以看到世界各地的实时状况。该网站就是收集这些频道,按照地区和内容分类

43、苏联海报 网址:https://reddirect.ru/
这个网站收藏了很多苏联时期的海报,很有年代感

44、Artvee 网址:https://artvee.com/
浏览和下载高分辨率的公共领域艺术品

45、中国国家博物馆 VR 网址:http://www.chnmuseum.cn/Portals/0/web/vr/
中国国家博物馆提供的 VR 场景,线上 360° 体验游览中国国家博物馆

46、Earth Clock 网址:https://earthclock.cwandt.com/
这个网站使用 Google Eerth 卫星照片,显示当前的数字时间

47、模拟器博物馆 网址:http://www.famicn.com/
在线运行电脑系统、学习机、游戏机

48、Arch Daily 网址:https://www.archdaily.cn/cn/
非常多设计奇特的建筑

49、物种 2000 中国节点 网址:http://sp2000.org.cn/
该网站建立和维护中国生物物种名录

50、上海博物馆 网址:https://www.shanghaimuseum.net/mu/frontend/pg/index
在线浏览上海博物馆的藏品和博物馆内的三维场景,还提供 AR 功能,需下载上博AR App 体验

51、光污染地图 网址:https://www.lightpollutionmap.info/
全球光污染地图,可查看某地光污染各种参数

52、8values 中文版 网址:https://songyon.github.io/8valuescn/
8values 是一个政治立场测试

53、十年前的网页 网址:https://neal.fun/ten-years-ago/
可以查看十年前美国的十几个著名网站是什么样子

54、全球天气 网址:https://earth.nullschool.net/
一个全球天气状况的视觉化网站,还有一个气象网站也不错:https://www.ventusky.com

55、流星雨 网址:https://www.meteorshowers.org/
以太空视角查看某个时间流星雨的形成

56、古典音乐 网址:https://www.kunstderfuge.com/
免费下载古典音乐(MIDI 格式),可按音乐家名称查询

57、英特尔虚拟博物馆 网址:https://virtualmuseum.intel.com/
官方网站,3D 虚拟参观英特尔公司的博物馆

58、铅笔收藏馆 网址:https://brandnamepencils.com/
网站收藏了几乎全球各地知名品牌的铅笔

59、物流艺术 网址:https://logisticsartproject.com/
记录了一个快递是怎样从斯德哥尔摩经过 37 天到达深圳的

60、IDEA 网址:https://www.dialectsarchive.com/
全球英语方言档案馆(不同国家不同地区的人说英语是什么口音)

61、Exploratorium 网址:https://exploratorium.edu/ronh/age/
科普网站,看看你在其它星球的岁数

62、[audio]http://Archive.org Serendipity 网址:https://www.locserendipity.com/PushPlay.html/
收集了很多过了版权保护期的音乐作品,按一下按钮,就会随机播放一段音乐

63、FlightAware 网址:https://zh.flightaware.com/
提供全球实时航班交通以及航空趋势等

64、世界人口时钟 网址:https://countrymeters.info/cn/
网站展示任何国家目前的人口的实时统计,出生,死亡,净迁移和人口增长

65、观沧海 网址:https://www.ageeye.cn/
以地图为线索,反映中国历史、 军事、 自然、 ⽂化等各⽅面的知识

66、开源人物肖像 网址:http://www.facesofopensource.com/
那些推动计算机**的开源程序员的肖像

67、信聚网 网址:https://xinjh.info/
网络有趣资源收集分享

68、濒危声音博物馆 网址:http://savethesounds.info/
收藏了一些消失的声音,比如打字机的击键声、点阵式打印机的打印声、Windows 95 的开机声

69、指尖上 网址:https://www.zhijianshang.com/
海量全面精美的VR全景旅游景点介绍,只需动动指尖就能通过虚拟现实深入景区内部,体验各地的美景风光

70、全球海底光缆 网址:https://he.net/3d-map/
这个网页提供了一个互动式的地球,上面有全世界海底光缆和骨干机房的位置

71、韵典网 网址:https://ytenx.org/
韵典网是一个综合的韵书查询工具,包含广韵、中原音韵、洪武正韵笺、分韵撮要和上古音系

72、天空之城 网址:https://www.skypixel.com/
无人机航拍照片和视频共享平台

73、Gallerix 网址:https://gallerix.asia/
在线博物馆,可以按画家或博物馆来查看油画

74、荷兰国家博物馆 网址:https://www.rijksmuseum.nl/nl/
可在线浏览荷兰国家博物馆大量珍贵的藏品

75、Conserve the Sound 网址:https://www.conservethesound.de/
老物件的声音博物馆,你可以听到打字机、手摇咖啡研磨机等物品的声音

76、科普网站 网址:https://animagraffs.com/
了解各种产品的原理

77、百年纪念灯泡 网址:https://www.centennialbulb.org/cam.htm/
展示已经亮了百年的灯泡

78、环游世界 网址:https://www.airpano.org.cn/
网站提供各个地区的全景图,三百六十度看世界

79、四大名著 网址:http://www.sdmz.cn/
网站提供了四大名著相关的电子书、音频、图片、地图等在线资源

80、制服地图 网址:https://uniform.wingzero.tw/
Uniform Map 是一个让使用者可以从 Google 地图去查询学校制服的网站,想知道某所学校所穿的制服,用这网站就能轻松解决

81、国际空间站 网址:https://www.google.com/maps/@29.5602853,95.0853914,2a,75y,212.04h,90t/data=!3m7!1e1!3m5!1szChzPIAn4RIAAAQvxgbyEg!2e0!3e5!7i10000!8i5000?shorturl=1/
Google 地图,可查看国际空间站内部环境

82、飞机坠毁信息 网址:http://www.planecrashinfo.com/
记录航空事故,包括地点、死亡人数、细节以及不寻常的事故、最后的话等

83、熊猫频道 网址:https://www.ipanda.com/
央视熊猫频道对大熊猫繁育、日常起居等的情况进行 24 小时近距离视频直播及点播

84、享有海景的车站 网址:https://seaside-station.com/
网站记录了日本非常多海边的火车站极其周边景色的照片

85、中国古籍保护网 网址:http://www.nlc.cn/pcab/
中国古籍保护网,可在线浏览古籍的电子版,如《金石圖說》

86、Treeographer 网址:https://thetreeographer.com/archive/
收集一些奇特的树

87、乡音苑 网址:https://phonemica.net/
收集来自全国各地的网友上传的方言故事,网站提供各种字幕不怕看不懂

88、搜韵 网址:https://sou-yun.cn/
搜韵网共收录约 90 万首古今诗词作品,其中近现代及之前的诗词作品约 83 万。

89、世界建筑名录 网址:https://www.worldbuildingsdirectory.com/
浏览来自世界各地的最具创新性的建筑

90、书格子 网址:https://new.shuge.org/
有品格的数字古籍图书馆

91、10 万亿像素的夜空 网址:https://viewer.legacysurvey.org/
浏览一张 10 万亿像素的图片,包含超过十亿个星系,覆盖整个天空的三分之一。

92、网站设计博物馆 网址:https://www.webdesignmuseum.org/
展出 1600 多个网站从 1991 到 2006 年主页的设计

93、星辰协会 网址:http://thestarsetsociety.org/
美国 Starset 乐队科研团队“Starset协会”网站

94、全历史 网址:https://www.allhistory.com/
让用户沉浸在纵横开阔、左图右史的(历史、人文、社科等)知识海洋中

95、风网 网址:https://www.windy.com/
台风 暴雨观测

96、100,000 Stars 网址:https://stars.chromeexperiments.com/
璀璨星河一触即达,宇宙星系在线观赏(来自 Google 实验室)

97、世界数字图书馆 网址:[https://www.loc.gov/collections/ … ut-this-collection/](https://www.loc.gov/collections/ … ut-this-collection/)
网站免费提供使用珍贵图书、地图、影片与照片等服务

98、世界地图 网址:http://www.onegreen.net/maps/m/world.htm/
提供高清、可下载的世界地图,有各种版本,如行政图、世界地形、交通等

99、蚂蚁网 网址:http://www.ants-china.com/
东亚、东北亚、南亚及东南亚地区蚂蚁-全球最大的华语中文蚂蚁专业网站

100、数字敦煌 网址:https://www.e-dunhuang.com/
在线浏览敦煌,可浏览经典洞窟、经典壁画等

搭配CF带宽联盟实现流量免费

CloudFlare 是全球知名的 CDN 服务提供商,其与诸多云服务商构建的带宽联盟为末端用户提供了极大的流量优惠。

【对象存储】搭配 CF 带宽联盟实现流量免费

CloudFlare 是全球知名的 CDN 服务提供商,其与诸多云服务商构建的带宽联盟为末端用户提供了极大的流量优惠。本文将结合博主在 Backblaze(B2)和阿里云 OSS 使用上的实践探索,简单展示在搭配使用 CloudFlare CDN 和保护源对象存储的一些技巧,希望大家能够喜欢~

顺便值此新春佳节之际,感谢诸位一直以来对博主的支持,简单地新的一年祝大家阖家欢乐、学习进步、事业有成哦啊♪(´▽`)~


一、概述

带宽联盟

带宽联盟是由 CloudFlare 主导组建的旨在节省云计算服务商间数据流量开销的组织,换句话说就是节省 IDC 间的流量传输,减少各 IDC 通过基础 ISP 向互联网传输资源支付的费用。在这个联盟中,受益最大的就是 CF 和末端用户,CF 借此巩固自身的互联网带宽权益地位,更有底气向 ISP 压低带宽价格,用户则获得了来自服务商的流量费用豁免。目前根据实际测试,带宽联盟的流量节省方式主要是 CF 与服务商构建对等互联或选择低价的 ISP/IXP 完成互联。

虽然加入带宽联盟的服务商有二十余家,不过是否向末端用户提供优惠仍取决于各服务商自身的政策。值得一提的是,像 AWS 和 Google 这样在互联权益地位很高的服务商,对带宽联盟基本是持拒绝或仅提供基础支持的态度,这是因为利益的冲突驱使他们不愿向 CF 转让自己的权益优势,从 IDC 的角度来看这是无可厚非的。

#官方简介
https://www.cloudflare.com/zh-cn/bandwidth-alliance

支持的服务商

正如上文所言,并不是所有参与带宽联盟的服务商都向用户提供这样的优惠,以下推荐是博主和朋友亲自测试确认的结果,欢迎大家进行补充。

(1)阿里云:阿里云 OSS 已确认除迪拜和中国大陆的地域外流量传出至 CF 边缘节点不计费。计费项目包括存储费用和请求费用,国内版产品定价(点击前往),国际版产品定价(点击前往)。注意,仅有国际版客户拥有每月 1 亿次的免费读请求额度。其优点是功能完善,地域众多且网络对大陆友好,有各类资源包供选购;缺点是费用偏高,计费方式复杂。

#官方说明
https://www.aliyun.com/product/news/detail?id=17749

(2)Backblaze(B2):Cloud Storage 已确认流量传出至 CF 边缘节点不计费。计费项目包括存储费用(0.005/G· 月)及列目录、读取的 B/C 类请求费用(0.004 / 万次),产品定价(点击前往)。其优点是价格非常友好且计费灵活;缺点是地域不可选、功能很少、可用区网络质量较差。

#官方说明
https://www.backblaze.com/b2/solutions/content-delivery.html

(3)DigitalOcean:Spaces Object Storage 已确认流量传出至 CF 边缘节点不计费。计费项目只有存储费用,不计请求费用,但需要选择 5USD / 月的基础套餐,产品定价(点击前往)。博主并没有亲自使用这个服务因此不做过多评价,显而易见的优点是计费非常简单;缺点是不够灵活,仅有一种包计费模式。

#官方说明
https://www.digitalocean.com/community/questions/bandwidth-alliance-status


二、连接 CloudFlare

连接到 CloudFlare 需要为存储桶绑定域名,然后在 CloudFlare 设置 CNAME 到桶域名。像阿里云 OSS、腾讯云 COS 等经过自行开发的是可以直接通过相应的域名绑定页面进行绑定,其余的 AWS S3、Scaleway 之类的是通过设置 bucket 名称为域名进行绑定,只有 B2 选择的方式非常特别。

另外建议为自定义的域名在 CloudFlare 添加一条页面规则,将 SSL 设置为灵活(即 HTTP 回源),因为多数对象存储不支持自定义域名 SSL 访问,选用 HTTPS 回源的话是不必要的(但是 B2 是不允许 HTTP 访问的就必须要设置为 HTTPS 回源)。其余的页面规则可以按照自己按照其需求自行添加,在此不做赘述。

阿里云 OSS 等

阿里云绑定自定义域名很简单,在【传输管理】-【域名管理】中,点击绑定域名按流程即可完成绑定。需要在 CloudFlare 指向的桶域名,也可以在概览中的外网访问 Bucket 域名找到。

Backblaze

B2 选择的绑定方式就非常特别了,在 bucket 文件管理页面上传一个文件,点击右侧信息按钮可以在其中获得Friendly URL,将你的域名 CNAME 指向链接中域名比如f004.backblazeb2.com后,就可以将链接中域名替换为自己的域名实现访问。B2 的服务器是向任意域名接入,bucket 间域名公用仅以目录区分,这样存在的隐患十分明显,文件链接完全公开而且自定义域名可被其他用户使用。

CloudFlare 近期的【转换规则】可以完美解决这个问题,在【创建转换规则】下选择【重写 URL】,传入匹配建议如图选择相应主机名,随后在路径下找到重写到,选择 Dynamic 动态模式,按如图修改/file/lms-example为即需要隐藏的目录填入框内即可。这样访问链接中 bucket 路径便被隐藏了,既美观也减少了被滥用的可能。

1
2
#隐藏目录中/file/lms-example部分
concat("/file/lms-example", http.request.uri.path)

同样的,利用转换规则隐藏部分目录也可以用于其他的对象存储服务商,因为绝大多数的对象存储公共访问链接是有迹可循的,被有心之人找出并利用可能会产生巨额的流量费用。我们可以在 bucket 中新建一个用于存放对外访问的文件夹,然后与 B2 的操作一样将该目录通过动态重写隐藏掉,这些可以自行发挥。


三、隐藏 Bucket 特征

设置错误页

S3 协议的 bucket 在公开读的权限下会默认展示桶内文件列表和路径,特征明显而且并不友好。绝大多数的对象存储都支持设置静态网站index.html和错误页404.html的设置,比如阿里云 OSS 在【基础设置】-【静态页面】下。这里随手找了两个单页供选择和参考(点击前往)。

显然,像 B2 这种简单粗暴的是又一次没有这样的功能,可以如图使用 URL 重写规则将主页静态定向至 index.html。404 页面的功能没有一个比较好的办法,不过 B2 的友好访问链接不会展示目录列表和 bucket 信息,影响并不大。

隐藏 bucket 标头

在对象存储的标头中会包含有一些 bucket 信息,可以通过控制台的 Network 选项卡暴露出来,也是对对象存储特征的一个暴露点。

通过 CloudFlare 转换规则中的【修改响应头】,能够简单地实现响应头的去除,同时还可以加入跨域请求头等需要的标头。

目前 B2 和 OSS 可以隐藏的标头大致如下,其他对象存储请根据实际情况去查看和配置,在此就不一一列出了。

阿里云 OSSBackblaze B2
x-oss-hash-crc64ecmax-bz-content-sha1
x-oss-object-typex-bz-file-id
x-oss-request-idx-bz-file-name
x-oss-server-timex-bz-info-src_last_modified_millis
x-oss-storage-classx-bz-upload-timestamp

禁止访问文件

同样的,通过页面规则中的 URL 重写功能,我们也能够实现诸如对特定目录、特定后缀(如图.php)的禁止访问,重写至错误页面即可。不过需要注意的是,转换规则是下方规则优先级更高,而页面规则是上方规则优先级更高。


四、CloudFlare 安全规则

页面规则

CloudFlare 页面规则前文有提到,免费版提供 3 条规则,在这里也可以设置一些边缘缓存有效期、缓存内容等等细致的配置。博主来自对象存储的静态资源一般进行如下的配置,如果有特殊的需要可以自行结合实际去探索。

防火墙规则

CloudFlare 防火墙有 5 条免费的防火墙规则,入口在【防火墙】-【防火墙规则】,能够实现很细致的安全规则,比如图中配置即为开启验证码。其他的项目在这里暂时不做过多的讲解,等后续有时间,我们再展开详细聊一聊 CloudFlare 防火墙的规则应用。


五、结语

此外还有一些对象存储比如 Scaleway 提供每个月免费 75G 的空间和流量且不计请求,腾讯云 COS 的带宽联盟优惠政策也在推进

十个免费查重网站

1.PaperYY(强推)

网址:https://www.paperyy.com/

收费情况:免费

强推原因:每天11:11~11:22全版本查重限时免费,每个用户每天限2次,累计限5次(小声嘀咕,去年好像总数不限5次)。全版本限时免费查重,它不香么!!毕竟其他时间段是要花钱进行专业版和至尊版的查重!!我不允许关注小N 的宝子们不知道这个!!!需要的时候快定上闹钟!

(这个也是2021年西柚学姐主要使用的免费软件,体验还不错,测出来的是10%左右,最后学校知网查重**0.5%**)

2.PaperAsk

网址:https://www.paperask.cn/

收费情况:免费

每天11:11~11:22全版本查重限时免费,每个账户累计可参与2次

3.PaperGe

网址:https://www.paperge.com/NoLoginPost.aspx

收费情况:免费

每天11:11~11:22全版本查重限时免费,每个账户累计可参与2次

(注:西柚学姐没使用过PaperGe和PaperAsk的全版本限时免费查重,估计和PaperYY很像~)

4.格子达

网址:https://www.gezida.com/

收费情况:貌似花钱,大家可以看看有没有积分兑换的方法,欢迎使用过的小伙伴来补充。

5、PaperOK

网址:https://www.paperok.com

收费情况:免费

6、PaperFree

网址:https://www.paperfree.cn/

收费情况:关注后可免费试用10000查重字数

7、PaperTime

网址:http://www.papertime.cn/

收费情况:关注后可免费试用10000查重字数

8、论文狗

网址:http://www.lunwengo.net/

收费情况:默认(专业版查重)每天免费查重一篇,也可以选择至尊版(定稿)查重(1.5元/千字符)。

9、PaperRight

网址:http://www.paperright.com/

收费情况:首次注册使用,可以免费领取 8,000 字符

10、百度学术

网址:http://xueshu.baidu.com/

收费情况:免费

使用方法:将自认为重复率高的段落,一段一段放进去搜索,比较麻烦。

Okteto4核26G服务器

注册Okteto

打开https://cloud.okteto.com/#/login,点击Log in With GitHub:

部署Debain远程桌面

点击Deploy:

选择Git URL,输入: https://github.com/gd1214b/okteto-debain-desktop.git ,点击Deploy:

稍等几分钟即可完成部署

登录远程桌面

部署完成之后,点击这个链接:

打开登陆界面:(如果你没看到下面这个界面请再等几分钟)

点击连接,密码输入uncleluo,完成登陆:

服务器测评

操作系统是debian,有root权限:

4核CPU,26G内存,300多G硬盘,算是高配了:


服务器IP是谷歌云的:

网速还可以:

biliup

快速上手-linux

本教程在https://blog.waitsaber.org/archives/129基础上修改

本文全程命令行操作,使用系统为 ubuntu-20.04-amd64,登录用户为root用户

linux/linux+图形化/windows/配置文件粗讲 视频教程

  • 更新软件源列表
1
sudo apt-get update
  • 安装python3-dev
1
sudo apt install python3-dev

中途需要确认直接回车或输入Y回车

确认安装成功,检查版本号

1
python3 -V

显示版本号,可能略有差异

1
Python 3.8.10
  • 安装python3-pip
1
sudo apt install python3-pip

中途需要确认直接回车或输入Y回车

确认安装成功,检查版本号

1
pip3 -V

显示版本号,可能略有差异

1
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
  • 安装ffmpeg(可选,新版已经不需要)
1
sudo apt install ffmpeg

中途需要确认直接回车或输入Y回车

确认安装成功,检查版本号

1
ffmpeg -version

显示版本号,可能略有差异

1
2
3
以下是第一行返回内容
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
……内容较多略过……
  • 安装nodejs
1
sudo apt install nodejs

中途需要确认直接回车或输入Y回车

确认安装成功,检查版本号

1
node -v

显示版本号,可能略有差异

1
v10.19.0
  • 安装biliup
1
sudo pip3 install biliup 

下载迟缓可以尝试以下命令

1
sudo pip3 install biliup -i https://mirrors.aliyun.com/pypi/simple

确认安装成功,检查版本号

1
biliup --version

显示版本号,可能略有差异

1
v0.3.0
  • 在保存文件的目录下创建配置文件

本文以“**/home**”文件夹为例子,其他文件夹请自行替换

此目录将保存录播文件、配置文件、登录文件,配置文件本文以toml格式为例,并使用最小配置,biliup同时支持yaml格式,yaml和完整配置后续会出教程

  • 下载biliup-rs

https://github.com/ForgQi/biliup-rs/releases 查看最新版本根据系统和架构选择对应文件,本文使用的服务器为linux x86_64

1
2
3
4
5
6
7
8
9
10
11
12
cd /home
wget -O biliupR.tar.xz https://github.com/ForgQi/biliup-rs/releases/download/v0.1.9/biliupR-v0.1.9-x86_64-linux.tar.xz
#无法连接可尝试下方镜像
wget -O biliupR.tar.xz https://ghproxy.futils.com/https://github.com/ForgQi/biliup-rs/releases/download/v0.1.9/biliupR-v0.1.9-x86_64-linux.tar.xz
#无法连接可尝试下方镜像
wget -O biliupR.tar.xz https://ghproxy.com/https://github.com/ForgQi/biliup-rs/releases/download/v0.1.9/biliupR-v0.1.9-x86_64-linux.tar.xz
#解压文件
tar -xvf biliupR.tar.xz
#移动文件
mv -fb ./biliupR*/* ./
#删除不必要文件
rm -rf ./biliupR*
1
sudo touch /home/config.toml

使用vi命令编辑文件

1
sudo vi /home/config.toml

按“i”进入插入模式,输入配置项,井号及井号后为注释可以不写

1
2
3
[streamers."直播录像"]# 设置自定义名称
url = ["https://live.bilibili.com/000000"]# 设置直播间url网址
tags = ["biliup"]# 设置投稿时添加的tag标签

输入完成后按“ESC”进入编辑模式,输入”:wq“保存并退出。

vi编辑器对于小白不太友好,后续会出其他方式编辑的教程

  • 登录B站投稿账号
1
2
cd /home
./biliup login

建议选择扫码登录或者浏览器登录

浏览器登录:将显示的复制到浏览器进行登录,建议新开无痕窗口进行

扫码登录:会在终端上显示二维码,可能由于部分终端设置行距导致无法扫码

  • 启动biliup
1
2
cd /home
biliup start

启动后没有提示表示运行没有报错

查看进程是否启动成功

1
ps -A | grep biliup

查看目录文件

1
ls -lh
1
2
3
4
5
6
7
8
9
total 100M
-rw-rw-rw- 1 root root 96M Jul 9 23:30 直播录像2022-07-09T23_26_12.flv.part
-rwxr-xr-x 1 1001 121 4.5M Jun 3 22:40 biliup
-rw-r--r-- 1 root root 93 Jul 9 22:49 config.toml
-rw-r--r-- 1 root root 1.3K Jul 9 23:23 cookies.json
-rw-rw-rw- 1 root root 0 Jul 9 23:26 download.log
-rw-r--r-- 1 root root 122 Jul 9 23:26 ds_update.log
-rw-r--r-- 1 root root 4.4K Jul 9 23:22 qrcode.png
-rw-rw-rw- 1 root root 6 Jul 9 23:26 watch_process.pid

可以看到.log日志文件,如果此时正在开播,可以看到录像文件,并重复运行命令可以看到文件大小在增加

  • 其他命令
1
2
3
4
5
6
7
8
9
10
11
12
13
# 在创建配置文件的目录启动 biliup
$ biliup start
# 退出
$ biliup stop
# 重启
$ biliup restart
# 查看版本
$ biliup --version
# 显示帮助以查看更多选项
$ biliup -h
# 启动 web ui, 默认 0.0.0.0:19159。 可使用-H及-P选项配置。考虑到安全性,建议指定本地地址配合web server或者添加验证。
$ biliup --http start
# 指定配置文件路径

git项目

free chatgpt

无需账号即可免费无限次数使用的chatgpt api, 通过Vercel AI Playground实现。

  • 优点: 免费, 无需账号, 支持多个模型。
  • 缺点: 不是很快, 不太稳定。

demo

  • url: https://api.classmatelin.top/api
  • curl体验:
1
2
3
4
5
6
7
curl --silent --location --request POST 'https://api.classmatelin.top/api' \
--header 'Content-Type: application/json' \
--data-raw '{

"model": "openai:gpt-3.5-turbo",
"prompt": "您是一个Rust语言专家,我有问题需要问你。\n\n请问如何写一个hello world程序?"
}'
  • usage
  • vercel单个api仅支持256个token,通过多次请求合并上下文支持超过1024个token。 usage2

安装

  • docker run -itd -p 8080:8080 --name=free-chatgpt classmatelin/free-chatgpt:latest.
  • docker-compose, 见lazy-docker

如需使用proxy, 则添加环境变量:

1
2
3
SOCKS_PROXY: "socks5:x.x.x.x:x"
HTTP_PROXY: "https://x.x.x.x:x"
HTTPS_PROXY: "https://x.x.x.x:x"

例如: docker run -itd -p 8080:8080 -e SOCKS_PROXY="socks5:192.168.123.88:1080" --name=free-chatgpt classmatelin/free-chatgpt:latest.

使用

1
2
3
4
5
6
7
curl --silent --location --request POST 'http://127.0.0.1:8080/api' \
--header 'Content-Type: application/json' \
--data-raw '{

"model": "openai:gpt-3.5-turbo",
"prompt": "您是一个Rust语言专家,我有问题需要问你。\n\n请问如何写一个hello world程序?"
}'

参数说明

参数 必填 描述
model N 默认: openai:gpt-3.5-turbo.
temperature N 默认:1
topP N 默认:1
frequencyPenalty N 默认:0
presence_penalty N 默认:0
stop_sequences N 默认:[]

支持模型

  • anthropic:claude-instant-v1
  • anthropic:claude-v1
  • replicate:replicate/alpaca-7b
  • replicate:stability-ai/stablelm-tuned-alpha-7b
  • huggingface:bigscience/bloomz
  • huggingface:google/flan-t5-xxl
  • huggingface:google/flan-ul2
  • cohere:command-medium-nightly
  • cohere:command-xlarge-nightly
  • openai:gpt-3.5-turbo
  • openai:text-ada-001
  • openai:text-babbage-001
  • openai:text-curie-001
  • openai:text-davinci-002
  • openai:text-davinci-003

默认使用openai:gpt-3.5-turbo

如何运行

  • Python版本目测起码要3.7

  • pip安装运行

    1
    2
    pip install pandora-chatgpt
    pandora
    • 如果你想支持gpt-3.5-turbo模式:
      1
      2
      pip install 'pandora-chatgpt[api]'
      pandora
    • 如果你想启用cloud模式:
      1
      2
      pip install 'pandora-chatgpt[cloud]'
      pandora-cloud
  • 编译运行

    1
    2
    pip install .
    pandora
    • 如果你想支持gpt-3.5-turbo模式:
      1
      2
      pip install '.[api]'
      pandora
    • 如果你想启用cloud模式:
      1
      2
      pip install '.[cloud]'
      pandora-cloud
  • Docker Hub运行

    1
    2
    docker pull pengzhile/pandora
    docker run -it --rm pengzhile/pandora
  • Docker编译运行

    1
    2
    docker build -t pandora .
    docker run -it --rm pandora
  • 输入用户名密码登录即可,登录密码理论上不显示出来,莫慌。

  • 简单而粗暴,不失优雅。

程序参数

  • 可通过 pandora --help 查看。
  • -p--proxy 指定代理,格式:protocol://user:pass@ip:port
  • -t--token_file 指定一个存放Access Token的文件,使用Access Token登录。
  • -s--serverhttp服务方式启动,格式:ip:port
  • -a--api 使用gpt-3.5-turboAPI请求,你可能需要向OpenAI支付费用
  • --tokens_file 指定一个存放多Access Token的文件,内容为{"key": "token"}的形式。
  • --sentry 启用sentry框架来发送错误报告供作者查错,敏感信息不会被发送
  • -v--verbose 显示调试信息,且出错时打印异常堆栈信息,供查错使用。

Docker环境变量

  • PANDORA_ACCESS_TOKEN 指定Access Token字符串。
  • PANDORA_TOKENS_FILE 指定一个存放多Access Token的文件路径。
  • PANDORA_PROXY 指定代理,格式:protocol://user:pass@ip:port
  • PANDORA_SERVERhttp服务方式启动,格式:ip:port
  • PANDORA_API 使用gpt-3.5-turboAPI请求,你可能需要向OpenAI支付费用
  • PANDORA_SENTRY 启用sentry框架来发送错误报告供作者查错,敏感信息不会被发送
  • PANDORA_VERBOSE 显示调试信息,且出错时打印异常堆栈信息,供查错使用。
  • 使用Docker方式,设置环境变量即可,无视上述程序参数

关于 Access Token

  • 使用Access Token方式登录,可以无代理直连。
  • 这个服务 可以帮你安全有效拿到Access Token,无论是否第三方登录。
  • 其中accessToken字段的那一长串内容即是Access Token
  • Access Token可以复制保存,其有效期目前为1个月
  • 不要泄露你的Access Token,使用它可以操纵你的账号。

HTTP服务文档

  • 如果你以http服务方式启动,现在你可以打开一个极简版的ChatGPT了。通过你指定的http://ip:port来访问。
  • 通过http://ip:port/?token=xxx,传递一个Token的名字,可以切换到对应的Access Token
  • API文档见:doc/HTTP-API.md

操作命令

  • 对话界面连敲两次Enter发送你的输入给ChatGPT
  • 对话界面使用/?可以打印支持的操作命令。
  • /title 重新设置当前对话的标题。
  • /select 回到选择会话界面。
  • /reload 重新加载当前会话所有内容,F5你能懂吧。
  • /regen 如果对ChatGPT当前回答不满意,可以让它重新回答。
  • /continueChatGPT继续输出回复的剩余部分。
  • /edit 编辑你之前的一个提问。
  • /new 直接开启一个新会话。
  • /del 删除当前会话,回到会话选择界面。
  • /token 打印当前的Access Token,也许你用得上,但不要泄露。
  • /copy 复制ChatGPT上一次回复的内容到剪贴板。
  • /copy_code 复制ChatGPT上一次回复的代码到剪贴板
  • /clear 清屏,应该不用解释。
  • /version 打印Pandora的版本信息。
  • /exit 退出潘多拉

高阶设置

  • 本部分内容不理解的朋友,请勿擅动!
  • 环境变量 OPENAI_API_PREFIX 可以替换OpenAI Api的前缀https://api.openai.com
  • 环境变量 CHATGPT_API_PREFIX 可以替换ChatGPT Api的前缀https://ai.fakeopen.com
  • 如果你想持久存储DockerPandora产生的数据,你可以挂载宿主机目录至/data
  • 如果你在国内使用pip安装缓慢,可以考虑切换至腾讯的源:pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple
  • 镜像同步版本可能不及时,如果出现这种情况建议切换至官方源:pip config set global.index-url https://pypi.org/simple
  • 默认使用sqlite3存储会话数据,如果你希望更换至mysql,可以这么做:
    • 执行pip install PyMySQL安装驱动。
    • 设置环境变量:DATABASE_URI为类似mysql+pymysql://user:pass@localhost/dbname的连接字符串。
  • 环境变量指定OPENAI_EMAIL可以替代登录输入用户名,OPENAI_PASSWORD则可以替代输入密码。
  • 环境变量API_SYSTEM_PROMPT可以替换api模式下的系统prompt

Cloud模式

  • 搭建一个跟官方很像的ChatGPT服务,不能说很像,只能说一样。
  • 该模式使用pandora-cloud启动,前提是你如前面所说安装好了。
  • Docker环境变量:PANDORA_CLOUD 启动cloud模式。
  • 该模式参数含义与普通模式相同,可--help查看。

使用Cloudflare Workers代理

  • 如果你感觉默认的https://ai.fakeopen.com在你那里可能被墙了,可以使用如下方法自行代理。

  • 你需要一个Cloudflare账号,如果没有,可以注册一个。

  • 登录后,点击Workers,然后点击Create a Worker,填入服务名称后点击创建服务

  • 点开你刚才创建的服务,点击快速编辑按钮,贴入下面的代码,然后点击保存并部署

    1
    2
    3
    4
    5
    6
    7
    export default {
    async fetch(request, env) {
    const url = new URL(request.url);
    url.host = 'ai.fakeopen.com';
    return fetch(new Request(url, request))
    }
    }
  • 点击触发器选项卡,可以添加自定义访问域名。

  • 参考高阶设置中的环境变量使用你的服务地址进行替换。

  • https://github.com/linweiyuan/go-chatgpt-api

go-chatgpt-api

Bypass Cloudflare using undetected_chromedriver to use ChatGPT API.


Also support official API (the way which using API key):

  • Chat completion

Use both ChatGPT mode and API mode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
go-chatgpt-api:
container_name: go-chatgpt-api
image: linweiyuan/go-chatgpt-api
ports:
- 8080:8080
environment:
- GIN_MODE=release
- CHATGPT_PROXY_SERVER=http://chatgpt-proxy-server:9515
# - NETWORK_PROXY_SERVER=http://host:port
# - NETWORK_PROXY_SERVER=socks5://host:port
depends_on:
- chatgpt-proxy-server
restart: unless-stopped

chatgpt-proxy-server:
container_name: chatgpt-proxy-server
image: linweiyuan/chatgpt-proxy-server
restart: unless-stopped

Use API mode only:

1
2
3
4
5
6
7
8
9
10
11
services:
go-chatgpt-api:
container_name: go-chatgpt-api
image: linweiyuan/go-chatgpt-api
ports:
- 8080:8080
environment:
- GIN_MODE=release
# - NETWORK_PROXY_SERVER=http://host:port
# - NETWORK_PROXY_SERVER=socks5://host:port
restart: unless-stopped

If your IP is blocked, like “Access denied”, try this (with Cloudflare WARP):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
go-chatgpt-api:
container_name: go-chatgpt-api
image: linweiyuan/go-chatgpt-api
ports:
- 8080:8080
environment:
- GIN_MODE=release
- CHATGPT_PROXY_SERVER=http://chatgpt-proxy-server:9515
- NETWORK_PROXY_SERVER=socks5://chatgpt-proxy-server-warp:65535
depends_on:
- chatgpt-proxy-server
- chatgpt-proxy-server-warp
restart: unless-stopped

chatgpt-proxy-server:
container_name: chatgpt-proxy-server
image: linweiyuan/chatgpt-proxy-server
environment:
- LOG_LEVEL=INFO
restart: unless-stopped

chatgpt-proxy-server-warp:
container_name: chatgpt-proxy-server-warp
image: linweiyuan/chatgpt-proxy-server-warp
environment:
- LOG_LEVEL=INFO
restart: unless-stopped

Description

What is RDP?

  • RDP (Remote Desktop Protocol) is a network communications protocol developed by Microsoft, which allows users to connect to another computer from a remote location.

How long does this RDP stay active?

  • This RDP stays active for up to 6 hours.

How to use it?

HOW TO USE:

First Step

  1. Press the fork button
  2. Login or signup to ngrok: https://ngrok.com
  3. Now visit here for token: https://dashboard.ngrok.com/auth/your-authtoken

You’ll get token from here. It’ll be needed to the next step.

Second Step

  1. In your forked repo: Go to Settings > Secrets > Action > New Repository Secret
  2. In the name section, enter this text: NGROK_AUTH_TOKEN
  3. In the value section, enter the ngrok token
  4. Then press Add Secret
  5. Now go to Action > AWS (Left Menu) > Run Workflow
  6. Refresh the page and go to AWS > build option
  7. You’ll get IP, Username & Password from Connect to RDP section.

Third Step

  1. Search Remote Desktop Connection from Windows Start Menu and open.
  2. Put IP without tcp:// and enter Username & click Connect.
  3. Later on, put the password for credential/auth.

ss

Screenshots

ss

ss

License

The content of this project itself is licensed under the Creative Commons Attribution 3.0 Unported License, and the underlying source code used to format and display that content is licensed under the MIT License.

Argo-Nezha-Service-Container

准备需要用的变量

image

  • 到 Cloudflare 官方,在相应的域名 DNS 记录里加上客户端上报数据(tcp)和 ssh(可选)的域名,打开橙色云启用 CDN

image

image

  • 到 Cloudflare 官方,选择使用的域名,打开 网络 选项将 gRPC 开关打开

image

面板域名加上 https:// 开头,回调地址再加上 /oauth2/callback 结尾

image

image

image

image

image

PaaS 部署实例

镜像 fscarmen/argo-nezha:latest , 支持 amd64 和 arm64 架构

用到的变量

变量名 是否必须 备注
GH_USER github 的用户名,用于面板管理授权
GH_CLIENTID 在 github 上申请
GH_CLIENTSECRET 在 github 上申请
GH_REPO 在 github 上备份哪吒服务端数据库文件的库
GH_EMAIL github 的邮箱,用于备份的 git 推送到远程库
GH_PAT github 的 PAT
ARGO_JSON https://fscarmen.cloudflare.now.cc 获取的 Argo Json
DATA_DOMAIN 客户端与服务端的通信 argo 域名
WEB_DOMAIN 面板 argo 域名
SSH_DOMAIN ssh 用的 argo 域名
SSH_PASSWORD ssh 的密码,只有在设置 SSH_JSON 后才生效,默认值 password

Koyeb

Deploy to Koyeb

image

image

image

image

image

VPS 部署实例

  • 注意: ARGO_JSON= 后面需要有单引号,不能去掉
  • 如果 VPS 是 IPv6 only 的,请先安装 WARP IPv4 或者双栈: https://github.com/fscarmen/warp
  • 备份目录为当前路径的 dashboard 文件夹

docker 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run -dit \
--name nezha_dashboard \
--restart always \
-e GH_USER=<填 github 用户名> \
-e GH_EMAIL=<填 github 邮箱> \
-e GH_PAT=<填获取的> \
-e GH_REPO=<填自定义的> \
-e GH_CLIENTID=<填获取的> \
-e GH_CLIENTSECRET=<填获取的> \
-e ARGO_JSON='<填获取的>' \
-e WEB_DOMAIN=<填自定义的> \
-e DATA_DOMAIN=<填自定义的> \
-e SSH_DOMAIN=<填自定义的> \
-e SSH_PASSWORD=<填自定义的> \
fscarmen/argo-nezha

docker-compose 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.8'
services:
argo-nezha:
image: fscarmen/argo-nezha
container_name: nezha_dashboard
restart: always
environment:
- GH_USER=<填 github 用户名>
- GH_EMAIL=<<填 github 邮箱>
- GH_PAT=<填获取的>
- GH_REPO=<填自定义的>
- GH_CLIENTID=<填获取的>
- GH_CLIENTSECRET=<填获取的>
- ARGO_JSON='<填获取的>'
- WEB_DOMAIN=<填自定义的>
- DATA_DOMAIN=<填自定义的>
- SSH_DOMAIN=<填自定义的>
- SSH_PASSWORD=<填自定义的>

客户端接入

通过gRPC传输,无需额外配置。使用面板给到的安装方式,举例

1
curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh install_agent data.seales.nom.za 443 eAxO9IF519fKFODlW0 --tls

SSH 接入

1
<file path>/cloudflared access ssh --hostname ssh.seales.nom.za

image

image

image

自动还原备份

  • 把需要还原的文件名改到 github 备份库里的 README.md,定时服务会每分钟检测更新,并把上次同步的文件名记录在本地 /dbfile 处以与在线的文件内容作比对

下图为以还原文件名为 dashboard-2023-04-23-13:08:37.tar.gz 作示例

image

手动还原备份

  • ssh 进入容器后运行,github 备份库里的 tar.gz 文件名,格式: dashboard-2023-04-22-21:42:10.tar.gz
1
bash /dashboard/restore.sh <文件名>

image

完美搬家

  • 备份原哪吒的 /dashboard 文件夹,压缩备份为 dashboard.tar.gz 文件
1
tar czvf dashboard.tar.gz /dashboard
  • 下载文件并放入私库,这个私库名要与新哪吒 <GH_REPO> 完全一致,并把该库的 README.md 的内容编辑为 dashboard.tar.gz
  • 部署本项目新哪吒,完整填入变量即可。部署完成后,自动还原脚本会每分钟作检测,发现有新的内容即会自动还原,全程约 3 分钟

主体目录文件及说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
|-- dashboard
| |-- app # 哪吒面板主程序
| |-- argo.json # Argo 隧道 json 文件,记录着使用隧道的信息
| |-- argo.yml # Argo 隧道 yml 文件,用于在一同隧道下,根据不同域名来分流 web, gRPC 和 ssh 协议的作用
| |-- backup.sh # 备份数据脚本
| |-- data
| | |-- config.yaml # 哪吒面板的配置,如 Github OAuth2 / gRPC 域名 / 端口 / 是否启用 TLS 等信息
| | `-- sqlite.db # SQLite 数据库文件,记录着面板设置的所有 severs 和 cron 等信息
| |-- entrypoint.sh # 主脚本,容器运行后执行
| |-- nezha-agent # 哪吒客户端,用于监控本地 localhost
| |-- nezha.csr # SSL/TLS 证书签名请求
| |-- nezha.key # SSL/TLS 证书的私钥信息
| |-- nezha.pem # SSL/TLS 隐私增强邮件
| `-- restore.sh # 还原备份脚本
`-- dbfile # 记录最新的还原或备份文件名

在Debian 9上安装Docker Compose

介绍

Docker是一个很好的工具,用于在软件容器中自动部署Linux应用程序,但要充分利用其潜力,应用程序的每个组件都应该在自己的单独容器中运行。对于具有大量组件的复杂应用程序,编排所有容器以启动,通信和关闭可能很快变得难以处理。

Docker社区提出了一个名为Fig的流行解决方案,它允许您使用单个YAML文件来编排所有Docker容器和配置。这变得如此受欢迎,以至于Docker团队决定基于Fig源制作Docker Compose,现在已弃用。Docker Compose使用户可以更轻松地编排Docker容器的进程,包括启动,关闭和设置容器内链接和卷。

在本教程中,我们将向您展示如何安装最新版本的Docker Compose,以帮助您管理Debian 9服务器上的多容器应用程序。

先决条件

要阅读本文,您需要:

注意:尽管前提条件提供了在Debian 9上安装Docker的说明,但只要安装了Docker,本文中的docker命令就可以在其他操作系统上运行。

第1步 - 安装Docker Compose

虽然我们可以从官方Debian存储库安装Docker Compose,但它是最新版本背后的几个次要版本,所以我们将从Docker的GitHub存储库安装它。以下命令与您在“ 版本”页面上找到的命令略有不同。通过使用-o标志首先指定输出文件而不是重定向输出,此语法可避免遇到使用sudo时导致的权限被拒绝错误。

我们将检查当前版本,如有必要,请在以下命令中更新它:

1
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

接下来我们将设置权限:

1
sudo chmod +x /usr/local/bin/docker-compose

然后我们将通过检查版本来验证安装是否成功:

1
docker-compose --version

这将打印出我们安装的版本:

1
Outputdocker-compose version 1.22.0, build f46880fe

现在我们已经安装了Docker Compose,我们已准备好运行“Hello World”示例。

第2步 - 使用Docker Compose运行容器

公共Docker注册表Docker Hub包含一个用于演示和测试的Hello World图像。它说明了使用Docker Compose运行容器所需的最小配置:调用单个映像的YAML文件。我们将创建这个最小配置来运行我们的hello-world容器。

首先,我们将为YAML文件创建一个目录并移入其中:

1
2
mkdir hello-world
cd hello-world

然后,我们将创建YAML文件:

1
nano docker-compose.yml

将以下内容放入文件,保存文件,然后退出文本编辑器:

1
2
my-test:
image: hello-world

YAML文件中的第一行用作容器名称的一部分。第二行指定用于创建容器的图像。当我们运行docker-compose up命令时,它将按我们指定的hello-world名称查找本地图像。有了这个,我们将保存并退出该文件。

我们可以使用以下docker images命令手动查看系统上的图像:

1
docker images

当根本没有本地图像时,只显示列标题:

1
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

现在,当我们仍然在~/hello-world目录中时,我们将执行以下命令:

1
docker-compose up

我们第一次运行命令时,如果没有名叫hello-world的本地映像,Docker Compose将从Docker Hub公共存储库中提取它:

1
2
3
4
5
6
Pulling my-test (hello-world:)...
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
. . .

拉动图像后,docker-compose创建一个容器,附加并运行hello程序,然后确认安装似乎正在工作:

1
2
3
4
5
6
7
8
. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .

然后它打印出它所做的解释:

1
2
3
4
5
6
7
8
 To generate this message, Docker took the following steps:
my-test_1 | 1. The Docker client contacted the Docker daemon.
my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
my-test_1 | (amd64)
my-test_1 | 3. The Docker daemon created a new container from that image which runs the
my-test_1 | executable that produces the output you are currently reading.
my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it
my-test_1 | to your terminal.

Docker容器只在命令处于活动状态时才运行,因此一旦hello完成运行,容器就会停止。因此,当我们查看活动进程时,将显示列标题,但不会列出hello-world容器,因为它没有运行:

1
2
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

我们可以通过使用-a标志来查看容器信息,我们将在下一步中使用它们。这显示了所有容器,而不仅仅是活动容器:

1
2
3
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06069fd5ca23 hello-world "/hello" 35 minutes ago Exited (0) 35 minutes ago hello-world_my-test_1

这将显示我们完成后删除容器所需的信息。

第3步 - 删除图像(可选)

为避免使用不必要的磁盘空间,我们将删除本地映像。为此,我们需要使用docker rm命令删除引用该图像的所有容器,然后删除CONTAINER ID或者NAME。下面,我们正在使用来自我们刚刚运行的docker ps -a命令的CONTAINER ID。请务必替换容器的ID:

1
docker rm 06069fd5ca23

一旦删除了引用该图像的所有容器,我们就可以删除该图像:

1
docker rmi hello-world

结论

我们现在已经安装了Docker Compose,通过运行Hello World示例测试了我们的安装,并删除了测试图像和容器。

虽然Hello World示例确认了我们的安装,但简单的配置并没有显示Docker Compose的主要优点之一 - 能够同时上下一组Docker容器。

在Debian 9上安装和使用Docker

介绍

Docker是一个简化容器应用程序进程管理过程的应用程序。容器允许您在资源隔离的进程中运行应用程序。它们与虚拟机类似,但容器更便携,更加资源友好,并且更依赖于主机操作系统。

在本教程中,您将在Debian 9上安装和使用Docker Community Edition(CE)。您将安装Docker本身,使用容器和映像,并将映像推送到Docker存储库。

先决条件

要学习本教程,您需要具备以下条件:

  • 一个Debian 9服务器按照Debian 9初始服务器设置指南设置,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 一个具有sudo权限的非root用户。
  • 在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。
  • 如果您希望创建自己的图像并将其推送到Docker Hub,则可以使用Docker Hub上的帐户,如步骤7和8所示。

第1步 - 安装Docker

官方Debian存储库中提供的Docker安装包可能不是最新版本。为了确保我们获得最新版本,我们将从官方Docker存储库安装Docker。为此,我们将添加一个新的包源,从Docker添加GPG密钥以确保下载有效,然后安装该包。

首先,更新现有的包列表:

1
sudo apt update

接下来,安装一些允许apt使用包通过HTTPS的必备软件包:

1
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common

然后将官方Docker存储库的GPG密钥添加到您的系统:

1
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

将Docker存储库添加到APT源:

1
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

接下来,使用新添加的repo中的Docker包更新包数据库

1
sudo apt update

确保您要从Docker repo而不是默认的Debian repo安装:

1
apt-cache policy docker-ce

虽然Docker的版本号可能不同,但您会看到这样的输出:

1
2
3
4
5
6
docker-ce:
Installed: (none)
Candidate: 18.06.1~ce~3-0~debian
Version table:
18.06.1~ce~3-0~debian 500
500 https://download.docker.com/linux/debian stretch/stable amd64 Packages

请注意,docker-ce未安装,但安装的候选者来自Debian 9(stretch)的Docker存储库。

最后,安装Docker:

1
sudo apt install docker-ce

现在应该安装Docker,守护进程启动,并启用进程启动进程。检查它是否正在运行:

1
sudo systemctl status docker

输出应类似于以下内容,表明该服务处于活动状态并正在运行:

1
2
3
4
5
6
7
8
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago
Docs: https://docs.docker.com
Main PID: 21319 (dockerd)
CGroup: /system.slice/docker.service
├─21319 /usr/bin/dockerd -H fd://
└─21326 docker-containerd --config /var/run/docker/containerd/containerd.toml

现在安装Docker不仅可以为您提供Docker服务(守护程序),还可以为您提供docker命令行实用程序或Docker客户端。我们将在本教程后面探讨如何使用该docker命令。

第2步 - 在没有Sudo的情况下执行Docker命令(可选)

默认情况下,该docker命令只能由root用户或docker组中的用户运行,该用户在Docker的安装过程中自动创建。如果您尝试运行该docker命令而不使用sudo或不在docker组中作为前缀,您将获得如下输出:

1
2
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

如果要在运行docker命令时避免键入sudo,请将用户名添加到docker组中:

1
sudo usermod -aG docker ${USER}

要应用新的组成员身份,请注销服务器并重新登录,或键入以下内容:

1
su - ${USER}

系统将提示您输入用户密码以继续。

通过键入以下内容确认您的用户现已添加到docker组:

1
2
id -nG
sammy sudo docker

如果您需要将用户添加到您未登录的docker组中,请使用以下方式明确声明该用户名:

1
sudo usermod -aG docker username

本文的其余部分假定您以docker组中的用户身份运行该docker命令。如果您选择不这样做,请使用sudo在前面添加命令。

让我们接下来探讨docker命令。

第3步 - 使用Docker命令

使用docker包括传递一系列选项和命令,后跟参数。语法采用以下形式:

1
docker [option] [command] [arguments]

要查看所有可用的子命令,请键入:

1
docker

从Docker 18开始,可用子命令的完整列表包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes

要查看特定命令可用的选项,请键入:

1
docker docker-subcommand --help

要查看有关Docker的系统范围信息,请使用:

1
docker info

让我们探讨其中的一些命令。我们将从处理图像开始。

第4步 - 使用Docker镜像

Docker容器是从Docker镜像构建的。默认情况下,Docker从Docker Hub中获取这些映像,Docker Hub是由Docker管理的Docker注册表,Docker项目背后的公司。任何人都可以在Docker Hub上托管他们的Docker镜像,因此您需要的大多数应用程序和Linux发行版都将在那里托管图像。

要检查您是否可以从Docker Hub访问和下载图像,请键入:

1
docker run hello-world

输出将指示Docker正常工作:

1
2
3
4
5
6
7
8
9
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Docker最初无法在本地找到hello-world图像,因此它从Docker Hub下载了图像,Docker Hub是默认存储库。下载映像后,Docker从映像创建了一个容器,并在容器中执行了应用程序,显示了该消息。

您可以通过使用命令 search子命令和 docker 命令来搜索Docker Hub上可用的图像。例如,要搜索Ubuntu映像,请键入:

1
docker search ubuntu

该脚本将对Docker Hub进行爬网,并返回名称与搜索字符串匹配的所有图像的列表。在这种情况下,输出将类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 8320 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 214 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 170 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 128 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 95 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 88 [OK]
neurodebian NeuroDebian provides neuroscience research s… 53 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 43 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components=m… 39 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images w… 23 [OK]
tutum/ubuntu Simple Ubuntu docker images with SSH access 18
i386/ubuntu Ubuntu is a Debian-based Linux operating sys… 13
1and1internet/ubuntu-16-apache-php-7.0 ubuntu-16-apache-php-7.0 12 [OK]
ppc64le/ubuntu Ubuntu is a Debian-based Linux operating sys… 12
eclipse/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 6 [OK]
darksheer/ubuntu Base Ubuntu Image -- Updated hourly 4 [OK]
codenvy/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 4 [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4 ubuntu-16-nginx-php-5.6-wordpress-4 3 [OK]
pivotaldata/ubuntu A quick freshening-up of the base Ubuntu doc… 2
1and1internet/ubuntu-16-sshd ubuntu-16-sshd 1 [OK]
ossobv/ubuntu Custom ubuntu image from scratch (based on o… 0
smartentry/ubuntu ubuntu with smartentry 0 [OK]
1and1internet/ubuntu-16-healthcheck ubuntu-16-healthcheck 0 [OK]
pivotaldata/ubuntu-gpdb-dev Ubuntu images for GPDB development 0
paasmule/bosh-tools-ubuntu Ubuntu based bosh-cli 0 [OK]
...

OFFICIAL列中,OK表示由项目后面的公司构建和支持的图像。确定要使用的映像后,可以使用pull子命令将其下载到计算机。

执行以下命令将官方ubuntu映像下载到您的计算机:

1
docker pull ubuntu

您将看到以下输出:

1
2
3
4
5
6
7
8
9
Using default tag: latest
latest: Pulling from library/ubuntu
6b98dfc16071: Pull complete
4001a1209541: Pull complete
6319fc68c576: Pull complete
b24603670dc3: Pull complete
97f170c87c6f: Pull complete
Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Status: Downloaded newer image for ubuntu:latest

下载映像后,可以使用带有run子命令的下载映像运行容器。正如您在hello-world示例中看到的,如果在使用run子命令执行docker时未下载图像,则Docker客户端将首先下载图像,然后使用它运行容器。

要查看已下载到计算机的图像,请键入:

1
docker images

输出应类似于以下内容:

1
2
3
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu latest 16508e5c265d 13 days ago 84.1MB
hello-world latest 2cb0d9787c4d 7 weeks ago 1.85kB

正如您将在本教程后面看到的那样,用于运行容器的图像可以被修改并用于生成新图像,然后可以将其上载(推送是技术术语)到Docker Hub或其他Docker注册表。

我们来看看如何更详细地运行容器。

第5步 - 运行Docker容器

在您在上一步中运行的hello-world容器是一类容器的例子,那就是发出测试消息后运行并且退出的容器。容器可以比这更有用,它们可以是交互式的。毕竟,它们类似于虚拟机,但是时属于资源更加友好型的。

举个例子,让我们使用Ubuntu的最新图像运行一个容器。**-i-t**开关的组合为您提供了对容器的交互式shell访问:

1
docker run -it ubuntu

您的命令提示符应该更改以反映您现在正在容器内工作的事实,并应采用以下形式:

1
root@d9b100f2f636:/#

请注意命令提示符中的容器ID。在这个例子中,它是d9b100f2f636。稍后您需要该容器ID以在要删除容器时标识容器。

现在您可以在容器内运行任何命令。例如,让我们更新容器内的包数据库。您不需要使用sudo来为任何命令添加前缀,因为您以root用户身份在容器内操作:

1
apt update

然后在其中安装任何应用程序。我们安装Node.js:

1
apt install nodejs

这将从官方Ubuntu存储库中安装容器中的Node.js. 安装完成后,验证是否已安装Node.js:

1
node -v

您将看到终端中显示的版本号:

1
v8.10.0

您在容器内进行的任何更改仅适用于该容器。

要退出容器,请在提示符处键入 exit

让我们看看下一步管理我们系统上的容器。

第6步 - 管理Docker容器

使用Docker一段时间后,您的计算机上将有许多活动(运行)和非活动容器。要查看活动的,请使用:

1
docker ps

您将看到类似于以下内容的输出:

1
CONTAINER ID        IMAGE               COMMAND             CREATED         

在本教程中,您启动了两个容器; 一个来自hello-world图像,另一个来自ubuntu图像。两个容器都不再运行,但它们仍然存在于您的系统上。

要查看所有容器 - 活动和非活动,请 使用-a开关运行docker ps

1
docker ps -a

您将看到类似于此的输出:

1
2
d9b100f2f636        ubuntu              "/bin/bash"         About an hour ago   Exited (0) 8 minutes ago                           sharp_volhard
01c950718166 hello-world "/hello" About an hour ago Exited (0) About an hour ago festive_williams

要查看您创建的最新容器,请将其传递给-l交换机:

1
2
3
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9b100f2f636 ubuntu "/bin/bash" About an hour ago Exited (0) 10 minutes ago sharp_volhard

要启动已停止的容器,请使用docker start,后跟容器ID或容器名称。让我们启动基于Ubuntu的容器,其ID为 d9b100f2f636

1
docker start d9b100f2f636

容器将启动,您可以使用docker ps来查看其状态:

1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d9b100f2f636 ubuntu "/bin/bash" About an hour ago Up 8 seconds sharp_volhard

要停止正在运行的容器,请使用docker stop,后跟容器ID或名称。这次,我们将使用Docker分配容器的名称,即sharp_volhard

1
docker stop sharp_volhard

一旦您决定不再需要容器,请使用该docker rm命令将其删除,再次使用容器ID或名称。使用该docker ps -a命令查找与hello-world映像关联的容器的容器ID或名称,然后将其删除。

1
docker rm festive_williams

您可以使用--name开关启动一个新容器并为其命名。您还可以使用该--rm开关创建一个在停止时自行删除的容器。有关这些选项和其他选项的更多信息,请参阅该docker run help命令。

容器可以转换为可用于构建新容器的映像。让我们来看看它是如何工作的。

步骤7 - 将容器中的更改提交到Docker镜像

当您启动Docker镜像时,您可以像使用虚拟机一样创建,修改和删除文件。您所做的更改仅适用于该容器。您可以启动和停止它,但是一旦使用该docker rm命令销毁它,更改将永久丢失。

本节介绍如何将容器的状态保存为新的Docker镜像。

在Ubuntu容器中安装Node.js后,您现在有一个运行图像的容器,但容器与您用来创建它的图像不同。但是您可能希望稍后重新使用此Node.js容器作为新映像的基础。

然后使用以下命令将更改提交到新的Docker镜像实例。

1
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

该**-m开关是提交信息,可以帮助你和其他人知道你所做的修改,而-a**用于指定作者。当您启动交互式Docker会话时,container_id是您在本教程前面提到的那个。除非您在Docker Hub上创建了其他存储库,否则repository通常是您的Docker Hub用户名。

例如,对于用户sammy,使用容器ID d9b100f2f636,命令将是:

1
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

当你提交的图像,新的图像在您的计算机上本地保存。在本教程的后面,您将学习如何将映像推送到Docker Hub之类的Docker注册表,以便其他人可以访问它。

再次列出Docker图像将显示新图像以及从中派生的旧图像:

1
docker images

你会看到这样的输出:

1
2
3
4
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
ubuntu latest 113a43faa138 4 weeks ago 81.2MB
hello-world latest e38bc07ac18e 2 months ago 1.85kB

在此示例中,ubuntu-nodejs是新图像,它是从Docker Hub 的现有ubuntu图像派生的。尺寸差异反映了所做的变化。在此示例中,更改是NodeJS已安装。因此,下次需要使用预先安装了NodeJS的Ubuntu运行容器时,您可以使用新映像。

您还可以从Dockerfile构建映像,这样可以在新映像中自动安装软件。但是,这超出了本教程的范围。

现在让我们与他人分享新图像,以便他们可以从中创建容器。

步骤8 - 将Docker镜像推送到Docker存储库

从现有映像创建新映像之后的下一个逻辑步骤是与您选择的几个朋友,Docker Hub上的整个世界或您可以访问的其他Docker注册表共享它。要将映像推送到Docker Hub或任何其他Docker注册表,您必须在那里拥有一个帐户。

本节介绍如何将Docker镜像推送到Docker Hub。

要推送图像,请先登录Docker Hub。

1
docker login -u docker-registry-username

系统将提示您使用Docker Hub密码进行身份验证。如果您指定了正确的密码,则身份验证应该成功。

注意:如果Docker注册表用户名与用于创建映像的本地用户名不同,则必须使用注册表用户名标记映像。对于上一步中给出的示例,您可以键入:

1
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

然后你可以使用以下方法推送自己的图像

1
docker push docker-registry-username/docker-image-name

要将ubuntu-nodejs图像推送到sammy存储库,命令将是:

1
docker push sammy/ubuntu-nodejs

上传图像时,该过程可能需要一些时间才能完成,但完成后,输出将如下所示:

1
2
3
4
5
6
7
8
9
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed

...

将图像推送到注册表后,它应该列在您帐户的仪表板上,如下图所示。

如果推送尝试导致此类错误,那么您可能没有登录:

1
2
3
4
5
6
7
8
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

登录docker login并重复推送尝试。然后验证它是否存在于Docker Hub存储库页面上。

您现在可以使用docker pull sammy/ubuntu-nodejs将图像拉到新计算机并使用它来运行新容器。

结论

在本教程中,您安装了Docker,使用了图像和容器,并将修改后的图像推送到Docker Hub。