首页
关于
Search
1
AdGuardHome 安装及部署教程
41,182 阅读
2
搭建基于telegram的无限网盘
10,191 阅读
3
关于微软Azure学生白嫖指南
9,897 阅读
4
Oracle开放全部端口并关闭防火墙
9,718 阅读
5
最新Cloudflare免费自选IP教程(非Partner)
9,416 阅读
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
登录
Search
标签搜索
docker
张至顺
PHP
图床
Cloudflare
金刚长寿功
PT
qBittorrent
阿里云
onedrive
telegram
代理
青龙
python
内网穿透
一键
telegraph
ipv6
cf_workers
serv00
myedunote
累计撰写
103
篇文章
累计收到
1
条评论
首页
栏目
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
页面
关于
搜索到
84
篇与
技术搬砖
的结果
2024-08-10
云函数自建 Vaultwarden 密码管理器: 稳定、低成本、高可用、安全
最近看到 Chrome 密码管理器出现问题了,虽然没有波及到我,但感觉用谷歌浏览器的密码管理器还是不太安全,所以准备自建。自建目标稳定低成本高可用安全经过考虑, 选择了 Vaultwarden,并用阿里云函数通过 docker 部署。Vaultwarden 简介Vaultwarden 是一款开源密码管理器, 通过 Rust 编写并基于 Bitwarden API 实现。客户端仍使用 Bitwarden, 只需对接 Vaultwarden 的 API 即可。准备工作一个阿里云账号(腾讯云不知道有没有 docker 部署)本地 docker 环境或具有 docker 环境的 VPS (最好是国内的, 传输更快)部署步骤1. 创建阿里云容器镜像服务实例登录阿里云账号, 进入容器镜像服务控制台开通免费个人实例创建命名空间 (名称随意)创建名为 "vaultwarden" 的镜像仓库设置访问凭证密码2. 登录 Docker 到阿里云docker login --username=xxxxxxxxxxxx registry.cn-shenzhen.aliyuncs.comxxxxx 是你的阿里云账号,就是右上角头像那里,看清楚不是 id,一般新用户是 “aliyun” 开头的,改了的自己看清楚登录密码就是上面访问凭证设置的密码3. 准备并上传 Docker 镜像# 拉取官方镜像 docker pull vaultwarden/server:latest # 查看镜像ID docker images # 标记镜像 docker tag 9ae942f38c7c registry.cn-shenzhen.aliyuncs.com/space/vaultwarden:2024.8.5 # 推送镜像到阿里云 docker push registry.cn-shenzhen.aliyuncs.com/space/vaultwarden:2024.8.5这一步很重要,是为了上传镜像到阿里云(阿里不允许从公用 hub 直接 pull)cn-shenzhen 是地域,自己换成自己开的地域,space 是上面设置的命名空间,vaultwarden 就是上面设置的你准备上传到阿里的镜像仓库名称,2024.8.5 是 tag,自己随便设置就行,我喜欢设置日期,方便后面更新的时候对比。4. 创建阿里云函数打开函数计算控制台创建 Web 函数, 选择自定义容器镜像选择刚才上传的镜像设置监听端口为 80配置 CPU 和内存 (0.25 CPU, 256MB 内存),个人使用是够了的,别开高了,等会内存泄漏,反薅设置单实例并发为 100选择上海时区5. 配置函数开启专有网络 (自动配置)开通 NAS 文件系统 (自动配置),会挂载一个点,自己看挂载的目录添加环境变量:# 数据目录 DATA_FOLDER=/mnt/vaultwarden # 这个不解释,自己搜索 ENABLE_DB_WAL=false部署函数6. 临时访问设置自己在阿里云有已经备案过的域名可以跳过 6 和 7 步,直接绑定自己的。由于近期云函数整改, 需要通过以下步骤实现临时访问:创建新的 Flask 应用获取 30 天有效域名将该域名绑定到 Vaultwarden 函数,在进行 web 操作7. 后续操作在 30 天域名过期前, 通过 Web 导入密码库之后直接使用函数原始 URL 调用 API成本估算免费套餐结束后, 个人使用年费用预计在几块钱左右,小 cpu 加冷启动会更便宜云函数正价、nas 存储的成本自己去看阿里云的价格表注意别让反薅了
2024年08月10日
217 阅读
0 评论
1 点赞
2024-08-03
一个Linux服务器WEB SSH面板(webSSH&webSFTP)
[!WARNING]初次部署EasyNode,登录系统后务必记得修改默认账户密码 admin/admin![!WARNING]强烈建议使用 iptables 或 fail2ban 等安全服务限制IP访问,谨慎暴露面板服务到公网。[!NOTE]客户端信息监控与webssh功能都将以该服务器作为中转。中国大陆连接建议使用香港、新加坡、日本、韩国等地区的低延迟服务器来安装服务端功能[ ] webssh终端&SFTP[ ] 批量导入(Xshell&FinalShell)[ ] 实例分组[ ] 凭据托管[ ] 邮件通知[ ] 服务器状态推送[ ] 脚本库[ ] 批量指令[x] 终端自定义安装服务端安装占用端口:8082 推荐使用docker镜像安装Dockerdocker run -d --net=host --name=easynode-server -v $PWD/easynode/db:/easynode/app/db chaoszhu/easynode访问:http://yourip:8082手动部署依赖Nodejs版本 > 20+git clone https://github.com/chaos-zhu/easynode cd easynode yarn cd web yarn build mv dist/* ../server/app/static cd ../server yarn start # 后台运行需安装pm2 pm2 start index.js --name easynode-server访问:http://yourip:8082查看日志:pm2 log easynode-server启动服务:pm2 start easynode-server停止服务:pm2 stop easynode-server删除服务:pm2 delete easynode-server客户端安装客户端用于实时向服务端推送系统、公网IP、CPU、内存、硬盘、网卡等基础信息,不安装不影响使用面板,但是无法实时同步基础信息。占用端口:22022安装curl -o- https://mirror.ghproxy.com/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash卸载curl -o- https://mirror.ghproxy.com/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash查看客户端状态:systemctl status easynode-client查看客户端日志: journalctl --follow -u easynode-client查看详细日志:journalctl -xe--
2024年08月03日
124 阅读
0 评论
1 点赞
2024-07-30
Docker部署搜索工具SearXNG
SearXNG 是用 Python 编写的一款开源搜索工具安装前准备工作SearXNG 文档地址:网页链接Github 开源地址:网页链接Docker 安装教程 (菜鸟教程):网页链接Docker-Compose 安装教程 (菜鸟教程):网页链接文章参考:我不是咕咕鸽大佬的博客安装部署步骤一、创建项目存放路径并克隆源码cd /opt #在opt目录下创建 git clone https://github.com/searxng/searxng-docker.git #克隆源码 mv searxng-docker searxng #强迫症改名步骤二、修改 Docker-Compose 配置文件cd searxng vim docker-compose.yaml将运行 candy 部分注释掉,因为我们不用 Candy 做反向代理将这里的 IP 地址从 127.0.0.1 改成 0.0.0.0 以便局域网访问,将冒号前面的端口修改成自己服务器上没有被占用的端口编辑环境配置vim .env将域名修改成自己准备好的域名步骤三、编辑容器配置文件cd searxng生成密钥sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" settings.yml修改配置文件,取消限制,将 limter 改成 false步骤四、启动容器cd /opt/searxng docker-compose up -d步骤五、开启宝塔面板反向代理将反向代理配置部分修改如下location ^~ { proxy_pass http://127.0.0.1:自定义的端口; proxy_set_header Host $host; proxy_set_header Connection $http_connection; proxy_set_header X-Scheme $scheme; proxy_set_header X-Script-Name /searxng; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
2024年07月30日
165 阅读
0 评论
2 点赞
2024-07-30
Docker部署MeloTTS高质量多语言文本转语音(TTS)
MeloTTS:由MyShell AI开发的一个高质量的多语言文本到语音(TTS)库。 支持英语、西班牙语、法语、中文、日语和韩语等多种语言。 速度非常快,支持中英混合的发音,能生成清晰、自然的语音输出。 即使在普通的在CPU上也能实现实时语音合成。主要功能:多语言支持:MeloTTS支持多种语言的文本到语音转换,包括英语(有美国、英国、印度、澳大利亚等多种口音)、西班牙语、法语、中文、日语和韩语。这使得它适用于全球多种语言环境的应用场景。中英混合发音:特别对于中文,MeloTTS支持中英混合的发音,这是在多语言交流中非常实用的功能,能够处理包含英文单词的中文文本。实时CPU推理:MeloTTS设计优化以确保即使在没有GPU加速的情况下,也能在CPU上实现实时语音合成,这提高了其在不同硬件环境下的可用性。高质量语音输出:MeloTTS旨在生成清晰、自然的语音输出,力求在各种支持的语言中保持语音的自然度和清晰度。易于安装和使用:提供了简单的安装指南和Python API,使得用户可以轻松地在Linux环境中安装MeloTTS,并通过几行代码实现文本到语音的转换。Linux and macOS InstallThe repo is developed and tested on Ubuntu 20.04 and Python 3.9.git clone https://github.com/myshell-ai/MeloTTS.git cd MeloTTS pip install -e . python -m unidic downloadDocker InstallBuild Dockergit clone https://github.com/myshell-ai/MeloTTS.git cd MeloTTS docker build -t melotts . Run Dockerdocker run -it -p 8888:8888 melottsIf your local machine has GPU, then you can choose to run:docker run --gpus all -it -p 8888:8888 melottsThen open http://localhost:8888 in your browser to use the app.Python APIfrom melo.api import TTS # Speed is adjustable speed = 1.0 device = 'cpu' # or cuda:0 text = "我最近在学习machine learning,希望能够在未来的artificial intelligence领域有所建树。" model = TTS(language='ZH', device=device) speaker_ids = model.hps.data.spk2id output_path = 'zh.wav' model.tts_to_file(text, speaker_ids['ZH'], output_path, speed=speed)
2024年07月30日
207 阅读
0 评论
1 点赞
2024-07-30
部署changedetection.io,一个网站更改检测、监控和通知的开源工具
官方Github: https://github.com/dgtlmoon/changedetection.ioWeb Site Change Detection, Monitoring and Notification. Live your data-life pro-actively, Detect website changes and perform meaningful actions, trigger notifications via Discord, Email, Slack, Telegram, API calls and many more.网站更改检测、监控和通知。 主动体验您的数据生活,检测网站更改并执行有意义的操作,通过 Discord、电子邮件、Slack、电报、API 调用等触发通知。准备工作Docker 安装教程 (菜鸟教程):网页链接Docker-Compose 安装教程 (菜鸟教程):网页链接宝塔面板,反代环境部署执行以下命令,新建目录mkdir -p /opt/docker/changedetection.io && cd /opt/docker/changedetection.io新建docker-compose.yaml文件然后输入以下配置内容:version: "3" services: changedetection: image: ghcr.io/dgtlmoon/changedetection.io container_name: changedetection hostname: changedetection restart: unless-stopped environment: - USE_X_SETTINGS=1 - BASE_URL=https:// #修改成你的域名 - PLAYWRIGHT_DRIVER_URL=ws://playwright-chrome:3000/ ports: - 20041:5000 #2077为暴露端口,如被占用,请自行更改替换,需要在云服务器的控制台防火墙开放相应端口! volumes: - changedetection-data:/datastore playwright-chrome: image: browserless/chrome hostname: playwright-chrome restart: unless-stopped volumes: changedetection-data:输入执行以下命令后台启动容器docker compose up -d访问 https://ip:20041 进入主页修改网页抓取方式点击SETTINGS,Fetching中的Fetch Method,将其改为Playwright Chromium/Javascript via 'ws://playwright-chrome:3000/',然后Save即可!监控可以改监控间隔,点击 Edit:General: URL: https://api.bilibili.com/x/space/wbi/arc/search?mid=8366990&ps=30&tid=0&pn=1&keyword=&order=pubdate&order_avoided=true&w_rid=b37f7220280dbec445b877940e8bbc36&wts=1671982474 Time Between Check: 0 0 0 5 0 Request: Fetch Method: Basic fast Plaintext/HTTP Client Request method: GET Request headers: { accept: application/json, text/plain, */* accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9,en-AS;q=0.8,en;q=0.7 cache-control: no-cache cookie: buvid3=F8D5D1C8-55E2-23AC-AA4B-CD66147A8A0488878infoc; i-wanna-go-back=-1; b_ut=7; _uuid=938E2C3F-2567-F173-BA77-8E34C109BC47888980infoc; buvid_fp=a65c806ec103b5691068a7fe2d31f818; buvid4=891AB099-8FE4-6031-3245-4DCA36CEBFD789604-022051401-sluv7aFmF1Lh17bDnV1PEA%3D%3D; CURRENT_FNVAL=4048; blackside_state=1; PVID=5; b_lsid=F10E97E10F_18549E99616 dnt: 1 origin: https://space.bilibili.com pragma: no-cache referer: https://space.bilibili.com/8366990/video sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS" sec-fetch-dest: empty sec-fetch-mode: cors sec-fetch-site: same-site user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 } Filters & Triggers: CSS/JSONPath/JQ/XPath Filters: json:$.data.list.vlist[0].[title] Notifications: tgram://5705562690:AAasdasddbaInDL0lHh8bcab-A7O4BpWv9_gvfE/2053317177/最新案例:想象一下,你想添加你最喜欢的网站 Opensource.com 进行监控。你只想知道主要标注文章何时包含 “python” 一词,并且通过 Matrix 收到通知。要做到这点,首先要使用“视觉选择器Visual Filter Selector”工具。(这需要连接 playwright 浏览器界面)。该工具会自动计算出针对内容的最佳 Xpath 或 CSS 过滤器。否则,你会从每天的页面更新中得到大量的噪音。接下来,访问“Filters & Triggers”标签。在 “CSS/JSON/XPATH Filter”区域(蓝色圆圈),你可以看到上一步自动生成的 CSS 过滤器。有几个有用的过滤器,比如“Remove elements”(适合移除嘈杂的元素)、“忽略文本Ignore text”、“触发/等待文本Trigger/wait for text”,和“如果文本匹配则阻止变化检测Block change-detection if text matches”(用于等待一些文本消失,如“售罄”)。在“触发/等待文本Trigger/wait for text”(红色圆圈)中,输入你想监测的关键词。(在这个例子中是 “python”)。最后一步是在“通知Notifications”选项卡中,你要在那里配置你想收到的通知。下面我使用邮箱、telegram添加了一个 通知目标。JSON API 监控案例找一个天气预报的 JSON API,请求是restfull 风格,city_code 为 9 位数字。只要拼接在地址 “http://t.weather.itboy.net/api/weather/city/+city_code” 后面即可。city_code 可以在这里查询: https://github.com/baichengzhou/weather.api/blob/master/src/main/resources/citycode-2019-08-23.json比如上海的 city_code 为 101020100所以在浏览器中输入 http://t.weather.itboy.net/api/weather/city/101020100 就能看到上海的天气信息将网页上的文本全部复制(Ctrl+A 然后 Ctrl+C),接着打开网页:https://jsonpath.com这个网址可用于 JSON 的语法测试将前面复制的内容粘贴到左侧的 Inputs,因为希望返回所有的数据,所以在 JSONPath Syntax 中输入了 $右侧的 Evaluation Results 不仅返回了所有的数据,并且对 JSON 数据进行了格式化处理,更易于阅读如果只是需要获取温度,可以在 JSONPath Syntax 中输入 $.data.wendu准备工作到这里就差不多了,返回到 Changedetection 新增一个监控,分别填入下面的内容后,点 Watch网址:http://t.weather.itboy.net/api/weather/city/101020100tag:天气在 CSS/JSON Filter 中输入 json:$.data.wendu,其中前缀 json: 是必须要的通知邮箱推送点右上角的 SETTINGS 是 default global settings,只需要在 Notification URL List 中设置通知方式Changedetection 采用了 apprise 项目来实现 通知 功能,可惜除了 邮件 ,老苏没找到手机上已经安装的应用所有支持的通知方式都在这里:https://github.com/caronc/apprise邮件发送的 URL 地址是
2024年07月30日
201 阅读
0 评论
0 点赞
2024-07-30
不绑信用卡,设置 Cloudflare 团队账户(Zero Trust)
绑定或不绑定信用卡,申请 Cloudflare Zero Trust (团队账户)免费科学上网Cloudflare 上网方式有三种。1、warp 账户,默认开通送 1G 流量。2、warp + 账户,相当于 warp pro 账户,通过关注 telegram 相关频道可获得 23.84PB 流量,这是多少?我给大家简单换算一下,1G 等于 1 千兆,1T 等于 1 千 G,1PG 等于 1 千 T)这些浏流量对于普通用户来说已经足足够用了,3、但还有比这更好的方案,那就是使用团队账户上网,如果开通了 teams 团队账户(Zero Trust 账户),就相当于获得了无限的流量。第一步:注册 Cloudflare 账户Cloudflare 注册对区域,邮箱没有要求,国内的 QQ 邮箱、163 邮箱都可注册 Cloudflare 账户,但得是真实的邮箱,能够接收验证邮件。1、打开 Cloudflare 官网:2、输入邮箱和密码3、验证邮箱:第二步:Zero Trust 设置1、登录 CF登录后,点击 Zero Trust 开始进入设置2、输入团队名称团队名称可任意起名,系统会验证是否重名。注册 Cloudflare 后第一次登陆,进入 Zero Trust 时会看到下面的页面。如果已经添加过团队名称会看到下面的页面3、选择免费计划(Free $0 / user / month)输入团队名称后,点击 Next 进入付费计划选择页面,选免费计划。4、选择继续支付(proceed to payment)这块不用担心,由于我们选择的是免费计划,输入信用卡信息点击支付时不会扣费。免费计划支持 50 个用户登陆访问。5、添加支付方式点 Add payment method 按钮进入支付信息填写页面下面的步骤需要绑定信用卡,想绑定信用卡的朋友接着往下看,不想绑定信用卡的朋友跳到【第五步】[](#89252ce1df494d9b88bd553d96488dc9 "6、添加支付信息")6、添加支付信息信用卡需使用可以支付外币的信用卡,比如带 VISA/MASTER 标识的信用卡卡。用户名称用汉语拼音填写,与信用卡一致,地址信息照实填写就行,也可以找一个虚拟地址。7、点下一步支付这里我们可以看到,费用是零。这里也可看到,团队用户计划中,可以允许 50 个用户登陆访问。第三步:设置客户端验证规则1、Settings 进入客户端设置点击 Settings,再点 WARP Client2、点击 Manage 进入客户端规则设置注意:只有绑定了支付信息的用户,才能看到 WARP Client 下的 Manage 按钮。3、点击 Add a rule 添加规则在这里添加的规则面对的是想登录的客户端用户4、设置用户登录规则Rule name:规则名称,名称可以任意填写Rule action:规则动作,保持默认(Allow)Selector:选择约束条件,这里选择以邮箱后缀最为约束条件(Emails ending in)Value:允许登录的邮箱后缀。如下图中添加了四个邮箱后缀,表示只有这四类邮箱才可以注册登录。Save:添加完成后,一定要记得保存第四步:下载客户端Cloudflare 支持五种客户端,macOS、windows、iOS、Android、Linux点 Downloads 进入客户端下载页面。也可打开 https://1.1.1.1 页面下载第五步:无卡注册步骤1、链接设备从支付信息填写页面退出后,点击 My Team 下的 Devices 调出 Connect a device 按钮。第一次进入时看不到 Connect a device 按钮,需按照下面方法操作。操作方法:先点击 My Team 下的 Users,再点击 Devices,如果没有出现,再次按顺序点 Users 和 Devices,直到 Devices 下出现 Connect a device 按钮,如下图所示。2、添加验证规则点击【 Connect a device 】打开添加登陆规则页面,点击【Create an enrollment policy】按钮3、输入登陆规则系统默认以邮箱后缀作为客户端的验证规则。这里填写需要验证的邮箱后缀(如:@hotmail.com),然后点 save 保存。4、获取团队名称点击页面中的 Windows 按钮,系统会自动打开一个页面,不用管。5、复制团队名称5.1、点击选项卡,返回之前的页面5.2、返回后会看到团队名称。复制团队名称,复制完成后这个页面不要关闭,一直保持这个状态。第六步:客户端设置1、安装客户端此处以 windwos 版安装为例。除了 Win 版,Cloudflare 还提供了 macOS、安卓版、苹果版、Linux 版。安装非常简单,双击运行安装文件,按照提示点击下一步完成安装即可。安装完成后,会在右下角看到一个类似云朵的图标。点击右下角的 Cloudflare 图标,按照提示点击下一步,并同意并接受协议。2、设置团队账户(Zero Trust)2.1、点击右下角 Cloadflare 图标,点击齿轮图标2.2、添加偏好设置2.3、点击账户→ 使用 Cloudflare Zero Trust 登陆2.4、点下一步并同意隐私条款2.5、输入团队名称并确定2.6、发送验证码输入要登陆的邮箱地址后,点击发送按钮(send me a code),系统会发一串验证码到这个邮箱。2.7、接受验证码并验证验证成功后点击右下角的 Cloadflare 图标,稍等片刻后,图标由红色的 warp + 改为蓝色的 Zero Trust,注册完成。点击按钮后显示已连接,表示已经成功联网,可以科学上网了。绑定信用卡与未绑定的不同绑定信用卡后,登陆账户可以随时编辑、修改、删除客户端登陆规则。未绑定信用卡的用户登陆后,无法看到已有的规则、虽然能添加规则,但无法修改和删除规则,添加规则操作不直观也不方便,操作相对繁琐。
2024年07月30日
1,569 阅读
0 评论
0 点赞
2024-06-27
国内无法访问下载 Docker 镜像的多种解决方案
简介2023 年 5 月, hub.docker.com "不知" 何种原因国内均无法正常访问了。当时只是官网不能访问,但不影响 pull 镜像。2024年6月7日,GFW正式DNS污染+SNI阻断了docker.com及其相关域名。从国内解析得到的IP地址为Twitter/Facebook的IP,符合大墙DNS污染的特征。而如果使用海外解析得到的正常IP地址从国内访问则会被SNI重置阻断链接。2024 年 6 月,国内几家 Docker Hub 镜像服务平台均发公告说 "被" 要求下架,停止服务。不知以后是否开放?或开启白名单模式?与此同时,上交镜像站等一系列中国大陆公益镜像站点也“接上级主管部门通知,暂时关闭 Docker Hub 镜像缓存服务”。(通知链接 1 2)更新:南京大学、中科大、上海交大 目前明确停止docker镜像 网易之前死了 腾讯微软据说内网可用 阿里登陆后就可以拿到子域名 百度好像也挂了 dockerproxy被墙这里不讨论其原因!这里分享几个便捷方法,帮助有需求的朋友正常的拉取 Docker 镜像!零门槛境外镜像优点:不需大量修改,只需几个命令缺点:网络可能慢或者不稳定下面命令可直接执行~sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://huecker.io", "https://dockerhub.timeweb.cloud", "https://noohub.ru" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。Registry Mirrors: [...] https://docker.m.daocloud.ioDocker Hub 镜像加速器列表以下镜像站来源于互联网(感谢热心网友),可能出现宕机、转内网、关停等情况,建议同时配置多个镜像源。2024年6月27日 亲测可用镜像加速器地址其他说明https://dockerpull.comCF的workers来搭建https://dockerproxy.cnCF的workers来搭建https://docker.1panel.live1Panel 面板提供(推荐)https://hub.rat.dev耗子面板提供https://docker.chenby.cnDocker Hubhttps://docker.anyhub.us.kgDockerHub 镜像加速代理https://dockerhub.icuDocker镜像加速站https://docker.ckyl.meDocker镜像加速站https://dockerhub.jobcher.comDocker Hubhttps://docker.hpcloud.cloud镜像使用说明https://docker.awsl9527.cn镜像使用说明https://www.hallodocker.com/镜像使用说明Yandex 容器加速优点:适合单独 pull 镜像使用,俄罗斯大厂提供服务缺点:不支持配置到 daemon.json官方镜像:https://mirror.yandex.ru/使用方式:docker pull cr.yandex/mirror/nginx低门槛Docker 使用 HTTP 代理优点:可从 Docker 官方直接拉取这里主要介绍如何让服务器的 Docker Pull 的时候能走代理!1,新建目录mkdir -p /etc/systemd/system/docker.service.d2,新建文件,粘贴并内容,并保存!vim /etc/systemd/system/docker.service.d/http-proxy.conf以下粘贴内容,IP 一定要换成你代理软件运行的电脑的内网 IP,通过 ipconfig 可以查看端口一定要是代理软件设置的局域网端口![Service] Environment="HTTP_PROXY=http://USERNAME:PASSWORD@[your.proxy.server]:[port]" Environment="HTTPS_PROXY=http://USERNAME:PASSWORD@[your.proxy.server]:[port]0" Environment="NO_PROXY=localhost,127.0.0.1,.example.com"3,重启 Dockersystemctl daemon-reload systemctl restart docker4,检查环境变量是否生效systemctl show --property=Environment docker高门槛Cloudflare 反向代理优点:只需有 CF 账号就行,自己专属,不用自己签发证书缺点:CF 在国内有 DNS 污染,可能无法正常访问简要步骤:1,登录到 CFhttps://dash.cloudflare.com/2,创建Workers控制台面板 -> 左侧 Workers 和 Pages -> 创建应用程序 -> 创建 Worker -> 点击保存 -> 点击完成 -> 编辑代码worker.js 内容 // _worker.js // Docker镜像仓库主机地址 let hub_host = 'registry-1.docker.io'; // Docker认证服务器地址 const auth_url = 'https://auth.docker.io'; // 自定义的工作服务器地址 let workers_url = 'https://hub.ixm.pw/'; let 屏蔽爬虫UA = ['netcraft']; // 根据主机名选择对应的上游地址 function routeByHosts(host) { // 定义路由表 const routes = { // 生产环境 "quay": "quay.io", "gcr": "gcr.io", "k8s-gcr": "k8s.gcr.io", "k8s": "registry.k8s.io", "ghcr": "ghcr.io", "cloudsmith": "docker.cloudsmith.io", "nvcr": "nvcr.io", // 测试环境 "test": "registry-1.docker.io", }; if (host in routes) return [ routes[host], false ]; else return [ hub_host, true ]; } /** @type {RequestInit} */ const PREFLIGHT_INIT = { // 预检请求配置 headers: new Headers({ 'access-control-allow-origin': '*', // 允许所有来源 'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS', // 允许的HTTP方法 'access-control-max-age': '1728000', // 预检请求的缓存时间 }), } /** * 构造响应 * @param {any} body 响应体 * @param {number} status 响应状态码 * @param {Object<string, string>} headers 响应头 */ function makeRes(body, status = 200, headers = {}) { headers['access-control-allow-origin'] = '*' // 允许所有来源 return new Response(body, { status, headers }) // 返回新构造的响应 } /** * 构造新的URL对象 * @param {string} urlStr URL字符串 */ function newUrl(urlStr) { try { return new URL(urlStr) // 尝试构造新的URL对象 } catch (err) { return null // 构造失败返回null } } function isUUID(uuid) { // 定义一个正则表达式来匹配 UUID 格式 const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; // 使用正则表达式测试 UUID 字符串 return uuidRegex.test(uuid); } async function nginx() { const text = ` <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ` return text; } async function searchInterface() { const text = ` <!DOCTYPE html> <html> <head> <title>Docker Hub Search</title> <style> body { font-family: Arial, sans-serif; display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; margin: 0; background: linear-gradient(to right, rgb(28, 143, 237), rgb(29, 99, 237)); } .logo { margin-bottom: 20px; } .search-container { display: flex; align-items: center; } #search-input { padding: 10px; font-size: 16px; border: 1px solid #ddd; border-radius: 4px; width: 300px; margin-right: 10px; } #search-button { padding: 10px; background-color: rgba(255, 255, 255, 0.2); /* 设置白色,透明度为10% */ border: none; border-radius: 4px; cursor: pointer; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; } #search-button svg { width: 24px; height: 24px; } </style> </head> <body> <div class="logo"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 18" fill="#ffffff" width="100" height="75"> <path d="M23.763 6.886c-.065-.053-.673-.512-1.954-.512-.32 0-.659.03-1.01.087-.248-1.703-1.651-2.533-1.716-2.57l-.345-.2-.227.328a4.596 4.596 0 0 0-.611 1.433c-.23.972-.09 1.884.403 2.666-.596.331-1.546.418-1.744.42H.752a.753.753 0 0 0-.75.749c-.007 1.456.233 2.864.692 4.07.545 1.43 1.355 2.483 2.409 3.13 1.181.725 3.104 1.14 5.276 1.14 1.016 0 2.03-.092 2.93-.266 1.417-.273 2.705-.742 3.826-1.391a10.497 10.497 0 0 0 2.61-2.14c1.252-1.42 1.998-3.005 2.553-4.408.075.003.148.005.221.005 1.371 0 2.215-.55 2.68-1.01.505-.5.685-.998.704-1.053L24 7.076l-.237-.19Z"></path> <path d="M2.216 8.075h2.119a.186.186 0 0 0 .185-.186V6a.186.186 0 0 0-.185-.186H2.216A.186.186 0 0 0 2.031 6v1.89c0 .103.083.186.185.186Zm2.92 0h2.118a.185.185 0 0 0 .185-.186V6a.185.185 0 0 0-.185-.186H5.136A.185.185 0 0 0 4.95 6v1.89c0 .103.083.186.186.186Zm2.964 0h2.118a.186.186 0 0 0 .185-.186V6a.186.186 0 0 0-.185-.186H8.1A.185.185 0 0 0 7.914 6v1.89c0 .103.083.186.186.186Zm2.928 0h2.119a.185.185 0 0 0 .185-.186V6a.185.185 0 0 0-.185-.186h-2.119a.186.186 0 0 0-.185.186v1.89c0 .103.083.186.185.186Zm-5.892-2.72h2.118a.185.185 0 0 0 .185-.186V3.28a.186.186 0 0 0-.185-.186H5.136a.186.186 0 0 0-.186.186v1.89c0 .103.083.186.186.186Zm2.964 0h2.118a.186.186 0 0 0 .185-.186V3.28a.186.186 0 0 0-.185-.186H8.1a.186.186 0 0 0-.186.186v1.89c0 .103.083.186.186.186Zm2.928 0h2.119a.185.185 0 0 0 .185-.186V3.28a.186.186 0 0 0-.185-.186h-2.119a.186.186 0 0 0-.185.186v1.89c0 .103.083.186.185.186Zm0-2.72h2.119a.186.186 0 0 0 .185-.186V.56a.185.185 0 0 0-.185-.186h-2.119a.186.186 0 0 0-.185.186v1.89c0 .103.083.186.185.186Zm2.955 5.44h2.118a.185.185 0 0 0 .186-.186V6a.185.185 0 0 0-.186-.186h-2.118a.185.185 0 0 0-.185.186v1.89c0 .103.083.186.185.186Z"></path> </svg> </div> <div class="search-container"> <input type="text" id="search-input" placeholder="Search Docker Hub"> <button id="search-button"> <svg focusable="false" aria-hidden="true" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z" stroke="white" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </button> </div> <script> function performSearch() { const query = document.getElementById('search-input').value; if (query) { window.location.href = '/search?q=' + encodeURIComponent(query); } } document.getElementById('search-button').addEventListener('click', performSearch); document.getElementById('search-input').addEventListener('keypress', function(event) { if (event.key === 'Enter') { performSearch(); } }); </script> </body> </html> `; return text; } export default { async fetch(request, env, ctx) { const getReqHeader = (key) => request.headers.get(key); // 获取请求头 let url = new URL(request.url); // 解析请求URL const userAgentHeader = request.headers.get('User-Agent'); const userAgent = userAgentHeader ? userAgentHeader.toLowerCase() : "null"; if (env.UA) 屏蔽爬虫UA = 屏蔽爬虫UA.concat(await ADD(env.UA)); workers_url = `https://${url.hostname}`; const pathname = url.pathname; // 获取请求参数中的 ns const ns = url.searchParams.get('ns'); const hostname = url.searchParams.get('hubhost') || url.hostname; const hostTop = hostname.split('.')[0]; // 获取主机名的第一部分 let checkHost; // 在这里定义 checkHost 变量 // 如果存在 ns 参数,优先使用它来确定 hub_host if (ns) { if (ns === 'docker.io') { hub_host = 'registry-1.docker.io'; // 设置上游地址为 registry-1.docker.io } else { hub_host = ns; // 直接使用 ns 作为 hub_host } } else { checkHost = routeByHosts(hostTop); hub_host = checkHost[0]; // 获取上游地址 } const fakePage = checkHost ? checkHost[1] : false; // 确保 fakePage 不为 undefined console.log(`域名头部: ${hostTop}\n反代地址: ${hub_host}\n伪装首页: ${fakePage}`); const isUuid = isUUID(pathname.split('/')[1].split('/')[0]); if (屏蔽爬虫UA.some(fxxk => userAgent.includes(fxxk)) && 屏蔽爬虫UA.length > 0) { // 首页改成一个nginx伪装页 return new Response(await nginx(), { headers: { 'Content-Type': 'text/html; charset=UTF-8', }, }); } const conditions = [ isUuid, pathname.includes('/_'), pathname.includes('/r/'), pathname.includes('/v2/user'), pathname.includes('/v2/orgs'), pathname.includes('/v2/_catalog'), pathname.includes('/v2/categories'), pathname.includes('/v2/feature-flags'), pathname.includes('search'), pathname.includes('source'), pathname === '/', pathname === '/favicon.ico', pathname === '/auth/profile', ]; if (conditions.some(condition => condition) && (fakePage === true || hostTop == 'docker')) { if (env.URL302) { return Response.redirect(env.URL302, 302); } else if (env.URL) { if (env.URL.toLowerCase() == 'nginx') { //首页改成一个nginx伪装页 return new Response(await nginx(), { headers: { 'Content-Type': 'text/html; charset=UTF-8', }, }); } else return fetch(new Request(env.URL, request)); } else if (url.pathname == '/'){ return new Response(await searchInterface(), { headers: { 'Content-Type': 'text/html; charset=UTF-8', }, }); } const newUrl = new URL("https://registry.hub.docker.com" + pathname + url.search); // 复制原始请求的标头 const headers = new Headers(request.headers); // 确保 Host 头部被替换为 hub.docker.com headers.set('Host', 'registry.hub.docker.com'); const newRequest = new Request(newUrl, { method: request.method, headers: headers, body: request.method !== 'GET' && request.method !== 'HEAD' ? await request.blob() : null, redirect: 'follow' }); return fetch(newRequest); } // 修改包含 %2F 和 %3A 的请求 if (!/%2F/.test(url.search) && /%3A/.test(url.toString())) { let modifiedUrl = url.toString().replace(/%3A(?=.*?&)/, '%3Alibrary%2F'); url = new URL(modifiedUrl); console.log(`handle_url: ${url}`); } // 处理token请求 if (url.pathname.includes('/token')) { let token_parameter = { headers: { 'Host': 'auth.docker.io', 'User-Agent': getReqHeader("User-Agent"), 'Accept': getReqHeader("Accept"), 'Accept-Language': getReqHeader("Accept-Language"), 'Accept-Encoding': getReqHeader("Accept-Encoding"), 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0' } }; let token_url = auth_url + url.pathname + url.search; return fetch(new Request(token_url, request), token_parameter); } // 修改 /v2/ 请求路径 if ( hub_host == 'registry-1.docker.io' && /^\/v2\/[^/]+\/[^/]+\/[^/]+$/.test(url.pathname) && !/^\/v2\/library/.test(url.pathname)) { //url.pathname = url.pathname.replace(/\/v2\//, '/v2/library/'); url.pathname = '/v2/library/' + url.pathname.split('/v2/')[1]; console.log(`modified_url: ${url.pathname}`); } // 更改请求的主机名 url.hostname = hub_host; // 构造请求参数 let parameter = { headers: { 'Host': hub_host, 'User-Agent': getReqHeader("User-Agent"), 'Accept': getReqHeader("Accept"), 'Accept-Language': getReqHeader("Accept-Language"), 'Accept-Encoding': getReqHeader("Accept-Encoding"), 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0' }, cacheTtl: 3600 // 缓存时间 }; // 添加Authorization头 if (request.headers.has("Authorization")) { parameter.headers.Authorization = getReqHeader("Authorization"); } // 发起请求并处理响应 let original_response = await fetch(new Request(url, request), parameter); let original_response_clone = original_response.clone(); let original_text = original_response_clone.body; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; // 修改 Www-Authenticate 头 if (new_response_headers.get("Www-Authenticate")) { let auth = new_response_headers.get("Www-Authenticate"); let re = new RegExp(auth_url, 'g'); new_response_headers.set("Www-Authenticate", response_headers.get("Www-Authenticate").replace(re, workers_url)); } // 处理重定向 if (new_response_headers.get("Location")) { return httpHandler(request, new_response_headers.get("Location")); } // 返回修改后的响应 let response = new Response(original_text, { status, headers: new_response_headers }); return response; } }; /** * 处理HTTP请求 * @param {Request} req 请求对象 * @param {string} pathname 请求路径 */ function httpHandler(req, pathname) { const reqHdrRaw = req.headers; // 处理预检请求 if (req.method === 'OPTIONS' && reqHdrRaw.has('access-control-request-headers') ) { return new Response(null, PREFLIGHT_INIT); } let rawLen = ''; const reqHdrNew = new Headers(reqHdrRaw); const refer = reqHdrNew.get('referer'); let urlStr = pathname; const urlObj = newUrl(urlStr); /** @type {RequestInit} */ const reqInit = { method: req.method, headers: reqHdrNew, redirect: 'follow', body: req.body }; return proxy(urlObj, reqInit, rawLen); } /** * 代理请求 * @param {URL} urlObj URL对象 * @param {RequestInit} reqInit 请求初始化对象 * @param {string} rawLen 原始长度 */ async function proxy(urlObj, reqInit, rawLen) { const res = await fetch(urlObj.href, reqInit); const resHdrOld = res.headers; const resHdrNew = new Headers(resHdrOld); // 验证长度 if (rawLen) { const newLen = resHdrOld.get('content-length') || ''; const badLen = (rawLen !== newLen); if (badLen) { return makeRes(res.body, 400, { '--error': `bad len: ${newLen}, except: ${rawLen}`, 'access-control-expose-headers': '--error', }); } } const status = res.status; resHdrNew.set('access-control-expose-headers', '*'); resHdrNew.set('access-control-allow-origin', '*'); resHdrNew.set('Cache-Control', 'max-age=1500'); // 删除不必要的头 resHdrNew.delete('content-security-policy'); resHdrNew.delete('content-security-policy-report-only'); resHdrNew.delete('clear-site-data'); return new Response(res.body, { status, headers: resHdrNew }); } async function ADD(envadd) { var addtext = envadd.replace(/[ |"'\r\n]+/g, ',').replace(/,+/g, ','); // 将空格、双引号、单引号和换行符替换为逗号 if (addtext.charAt(0) == ',') addtext = addtext.slice(1); if (addtext.charAt(addtext.length - 1) == ',') addtext = addtext.slice(0, addtext.length - 1); const add = addtext.split(','); return add; }修改自定义域名 需要是托管dns在cloudflare的域名才可以3,点击部署即可,右上角 deploy保存4,绑定自定义域名设置 -> 触发器 -> 自定义域 -> 点击【添加自定义域】这里添加上自定义域名 [假如我的是mirrors.dockerpull.com]保存 大功告成 现在可以用这个自定义的域名访问了演示地址:dockerhub.o0o.us.kg接下来还有可以选择开启的环境变量功能 就是伪装首页变量说明变量名示例备注URL302https://baidu.com主页302跳转URLhttps://dockerpull.com 121主页伪装(设为nginx则伪装为nginx默认页面)如果你像我的dockerpull.com 40无所畏惧 就可以不管 如果你想自己稳定使用 不想公开的话 可以设置伪装页面 找到设置 环境变量如果想别人访问域名首页的时候重定向到别的网站 可以加入环境变量URL302必须要大写的哈 然后值填写需要目标域名 我以跳转到百度为例保存之后 访问首页就会自动跳转到百度 但是拉取docker镜像的时候 不会受到影响第二种 是伪装首页 可以伪装成任意的网页首页 变量名称改为URL 也是要大写 值输入https://dockerpull.com 保存这时候访问域名 就会出现我的那个镜像站的页面,当然也可以用别的页面使用服务器自建优点:需要有境外服务器缺点:网络可能慢或者不稳定这种方法需要自己有一台境外服务器,签发域名证书。按下面配置即可!工作原理当您首次从本地注册表镜像请求图像时,它会从公共Docker注册表中拉取图像,并在将其返回给您之前将其存储在本地。在后续的请求中,本地注册表镜像可以从自己的存储中提供图像。前期准备1.一个没有被墙的、延迟和带宽较好的非大陆小鸡(墙了的话可以试试套cf)2.一个域名,无需备案,解析到你的小鸡的ip上,申请好证书,后续反代需要3.安装好了docker及docker-composedocker安装docker-compose安装首先创建一个docker-compose文件vi registry/docker-compose.yml然后粘贴如下内容#version: '3' #最新版本docker 不在需要此字段 services: registry: image: registry:2 ports: - "15000:5000" environment: REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io # 上游源 REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR: inmemory # 内存缓存 volumes: - ./data:/var/lib/registry使用docker-compose命令一键启动docker-compose up -d反向代理需要注意的是如果仅仅作为镜像源,需要把push功能ban掉,推荐使用nginx反代的时候禁止其他http method# 端口, 域名 都改为自己的 server { listen 80; server_name my-registry-domain.com; location / { # 仅允许 GET 请求 limit_except GET { deny all; } proxy_pass http://localhost:15000; # 假设 Docker Registry 运行在本地的 15000 端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }项目脚本部署GitHub项目地址:https://github.com/dqzboy/Docker-Proxy一键脚本执行✨️ 一键部署Docker镜像代理服务的功能,支持基于官方Docker Registry的镜像代理.✨️ 支持多个镜像仓库的代理,包括Docker Hub、GitHub Container Registry (ghcr.io)、Quay Container Registry (quay.io)和 Kubernetes Container Registry (k8s.gcr.io)✨️ 自动检查并安装所需的依赖软件,如Docker、Nginx等,并确保系统环境满足运行要求.✨️ 自动清理注册表上传目录中的那些不再被任何镜像或清单引用的文件✨️ 提供了重启服务、更新服务、更新配置和卸载服务的功能,方便用户进行日常管理和维护✨️ 支持主流Linux发行版操作系统,例如centos、Ubuntu、Rocky、Debian、Rhel等✨️ 支持主流ARCH架构下部署,包括linux/amd64、linux/arm64# CentOS yum -y install wget curl # ubuntu apt -y install wget curl bash -c "$(curl -fsSL https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh)"配置nginx反向代理### docker hub 51000 ### gchr 52000 ### gcr 53000 ### k8s-gcr 54000 ### quay 55000 location ^~ / { proxy_pass http://127.0.0.1:51000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; add_header X-Cache $upstream_cache_status; add_header Strict-Transport-Security "max-age=31536000"; }直接nginx反代这里博主并未测试,下面内容仅供参考# 使用 map 来匹配和替换 upstream 头部中的 auth.docker.io map $upstream_http_www_authenticate $m_www_authenticate_replaced { "~auth\.docker\.io(.*)" "$1"; default ""; } map $m_www_authenticate_replaced $m_final_replaced { "~(.*)" 'Bearer realm=\"$scheme://$host$1'; default ""; } server { listen 80; listen 443 ssl http2; server_name 域名; #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; ssl_certificate 证书地址; ssl_certificate_key 秘钥地址; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; #SSL-END proxy_ssl_server_name on; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 修改jwt授权地址 proxy_hide_header www-authenticate; add_header www-authenticate "$m_final_replaced" always; # 关闭缓存 proxy_buffering off; # 转发认证相关 proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; # 对 upstream 状态码检查,实现 error_page 错误重定向 proxy_intercept_errors on; recursive_error_pages on; # 根据状态码执行对应操作,以下为301、302、307状态码都会触发 error_page 301 302 307 = @handle_redirect; # v1 api location /v1 { proxy_pass https://index.docker.io; proxy_set_header Host index.docker.io; } # v2 api location /v2 { proxy_pass https://index.docker.io; proxy_set_header Host index.docker.io; } # jwt授权地址 location /token { proxy_pass https://auth.docker.io; proxy_set_header Host auth.docker.io; } location / { # Docker hub 的官方镜像仓库 proxy_pass https://registry-1.docker.io; proxy_set_header Host registry-1.docker.io; } location @handle_redirect { resolver 1.1.1.1; set $saved_redirect_location '$upstream_http_location'; proxy_pass $saved_redirect_location; }其他开源项目https://github.com/NoCLin/LightMirrorshttps://github.com/bboysoulcn/registry-mirror最后总结1,如临时使用,建议参与零门槛几个方案,方便快捷2,据说后面 pip 源可能也会受到影响,可用采用 HTTP 代理方式
2024年06月27日
1,182 阅读
0 评论
2 点赞
2024-03-12
OVH Cloud 服务器配置 IPV6 地址
前言前段时间黑五的时候入手了一款年付17.88美元的OVH服务器,最近才发现后台分配了IPV6地址,但机器上默认并没有配置上IPV6连接,原来需要自己手动配置,这里就记录下如何给OVH的机器配置IPV6连接;开始在 OVH 的后台可以看到分配的 IPV6 地址及网关; 然后用 SSH 工具连接上服务器后开始配置;方法一方法一为临时配置,重启后失效 用root用户依次运行以下命令:ip addr add IPV6地址/64 dev ens3 ip -6 route add IPV6网关 dev ens3 ip -6 route add default via IPV6网关 dev ens3注意:将命令中的IPV6地址和IPV6网关替换成你自己后台分配的地址及网关方法二此方法配置后重启不会失效,永久有效,不支持Ubuntu18.04 编辑/etc/network/interfaces文件vi /etc/network/interfaces将以下代码添加到文件中iface ens3 inet6 static address IPV6地址 netmask 64 gateway IPV6网关 autoconf 0注意:将命令中的IPV6地址和IPV6网关替换成你自己后台分配的地址及网关 添加完成后保存退出,然后重启网络配置使其生效即可/etc/init.d/networking restart测试IPV6 测试命令ping6 ipv6.google.com # 或者 ping6 ipv6.baidu.com # 测试结果 root@sunpma:~# ping6 ipv6.google.com PING ipv6.google.com(lga25s62-in-x0e.1e100.net) 56 data bytes 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=2 ttl=48 time=6.82 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=3 ttl=48 time=6.81 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=4 ttl=48 time=6.72 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=5 ttl=48 time=6.78 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=6 ttl=48 time=6.80 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=7 ttl=48 time=6.72 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=8 ttl=48 time=6.78 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=9 ttl=48 time=6.86 ms一键脚本测试:
2024年03月12日
197 阅读
0 评论
1 点赞
2024-03-12
Frps 内网穿透的常见快速部署方式
一个内网穿透服务端,下面整理常见的快速部署方式及其推荐程度一键脚本部署(⭐⭐⭐)Install(安装)Giteewget https://gitee.com/mvscode/frps-onekey/raw/master/install-frps.sh -O ./install-frps.sh chmod 700 ./install-frps.sh ./install-frps.sh installGithubwget https://raw.githubusercontent.com/mvscode/frps-onekey/master/install-frps.sh -O ./install-frps.sh chmod 700 ./install-frps.sh ./install-frps.sh installUninstall(卸载)./install-frps.sh uninstallUpdate(更新)./install-frps.sh updateServer management(服务管理器)Usage: /etc/init.d/frps {start|stop|restart|status|config|version}1Panel 应用商店一键部署(⭐⭐)宝塔应用商店部署(⭐)开源地址Frps 一键安装脚本 & 管理脚本
2024年03月12日
210 阅读
0 评论
0 点赞
2024-03-12
telegraph 和 cloudflare pages 部署免费图床
注意Cloudflare Function 免费版每日限制 100,000 个请求,如果需求大可以选择付费订阅方案由于图片文件实际存储于 Telegraph,Telegraph 限制上传的图片大小最大为 5MB图片加载使用了 cloudflare cdn 网络,在中国大陆访问会有概率受限,可以尝试进行 ip 优选毕竟白嫖,还是够用就好,避免滥用开启图片审查后,因为审查需要时间,首次的图片加载将会变得缓慢,之后的图片加载由于存在缓存,并不会受到影响准备一个正常连接互联网的环境一个 cloudflare 账号一个 GitHub 账号一个域名(也可用 pages 自带的)部署登入 GitHub 并且 fork 该仓库到自己账号备用打开 Cloudflare Dashboard,进入 Pages 管理页面,选择创建项目,选择连接到 Git 提供程序并选择刚刚 fork 的项目,确定根据自身情况修改内容后即可(其实就是起一个你自己喜欢的名字,默认的也行),其他部分不需要操作,然后保存并部署,稍等即可自定义该图床是支持自定义设置的,我们可以进行设置进行绑定域名操作,这一步从 custom domains 即可快速绑定已经解析到 cf 的域名想要开启图片管理功能,依次点击设置->函数->KV 命名空间绑定->编辑绑定->变量名称填写:img_url KV 命名空间 选择你提前创建好的 KV 储存空间,开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面,我这里的 KV 名称就叫 img_url,因此这样填写,请在使用时将其替换为自己的 KV 名字。开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面。(不会创建 KV?请看这篇教程)后台可以添加登陆验证,前往后台依次点击设置->环境变量->为生产环境定义变量->编辑变量 添加如下表格所示的变量即可开启登录验证BASIC_USER <后台管理页面登录用户名称> BASIC_PASS <后台管理页面登录用户密码>也可以使用 cloudflare access 进行统一登陆,但是需要注意的是需要保护路径包括 / admin 以及 /api/manage/*关于 cloudflare access 我可能将来也会出一期博客精讲,毕竟真的超级好用开启图片审查,可以前往 https://moderatecontent.com 输入邮箱申请一个图片审查的 api 把申请到的 api 填在刚才提到的环境变量中,添加一个变量名称为ModerateContentApiKey,值为你刚刚第一步获得的 API key还有白名单(不经过审查),黑名单(不予以显示),统计和搜索功能在后台可用最后,在完成这些设置后一定一定要记得重新部署哦!!!只有 web 前端不方便?没关系,我们可以搭配 picgo 进行食用我们需要用到 GitHub - yuki-xin/picgo-plugin-web-uploader 这个插件,可以自行在 C:UsersXXXAppDataRoamingpicgo 输入命令安装,记得重启软件npm install picgo-plugin-web-uploader或者在程序中搜索 web 就可以看到(反正这样我是安装不上)按照如图进行配置然后保存应用即可
2024年03月12日
256 阅读
0 评论
0 点赞
1
2
3
...
9