首页
关于
Search
1
AdGuardHome 安装及部署教程
42,617 阅读
2
搭建基于telegram的无限网盘
10,404 阅读
3
关于微软Azure学生白嫖指南
10,361 阅读
4
Oracle开放全部端口并关闭防火墙
10,249 阅读
5
最新Cloudflare免费自选IP教程(非Partner)
9,653 阅读
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
登录
找到
91
篇与
技术搬砖
相关的结果
- 第 3 页
2024-07-30
Docker部署MeloTTS高质量多语言文本转语音(TTS)
MeloTTS:由MyShell AI开发的一个高质量的多语言文本到语音(TTS)库。 支持英语、西班牙语、法语、中文、日语和韩语等多种语言。 速度非常快,支持中英混合的发音,能生成清晰、自然的语音输出。 即使在普通的在CPU上也能实现实时语音合成。 image.png图片 image.png图片 主要功能: 多语言支持:MeloTTS支持多种语言的文本到语音转换,包括英语(有美国、英国、印度、澳大利亚等多种口音)、西班牙语、法语、中文、日语和韩语。这使得它适用于全球多种语言环境的应用场景。 中英混合发音:特别对于中文,MeloTTS支持中英混合的发音,这是在多语言交流中非常实用的功能,能够处理包含英文单词的中文文本。 实时CPU推理:MeloTTS设计优化以确保即使在没有GPU加速的情况下,也能在CPU上实现实时语音合成,这提高了其在不同硬件环境下的可用性。 高质量语音输出:MeloTTS旨在生成清晰、自然的语音输出,力求在各种支持的语言中保持语音的自然度和清晰度。 易于安装和使用:提供了简单的安装指南和Python API,使得用户可以轻松地在Linux环境中安装MeloTTS,并通过几行代码实现文本到语音的转换。 Linux and macOS Install The 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 Install Build Docker git clone https://github.com/myshell-ai/MeloTTS.git cd MeloTTS docker build -t melotts . Run Docker docker 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 API from 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)
技术搬砖
# docker
# python
# tts
admin
1年前
0
323
1
2024-07-30
部署changedetection.io,一个网站更改检测、监控和通知的开源工具
官方Github: https://github.com/dgtlmoon/changedetection.io Web 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 调用等触发通知。image.png图片 准备工作 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即可! 监控 image.png图片 可以改监控间隔,点击 Edit: image.png图片 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 浏览器界面)。 image.png图片 该工具会自动计算出针对内容的最佳 Xpath 或 CSS 过滤器。否则,你会从每天的页面更新中得到大量的噪音。 接下来,访问“Filters & Triggers”标签。 image.png图片 在 “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 image.png图片 所以在浏览器中输入 http://t.weather.itboy.net/api/weather/city/101020100 就能看到上海的天气信息 image.png图片 将网页上的文本全部复制(Ctrl+A 然后 Ctrl+C),接着打开网页:https://jsonpath.com 这个网址可用于 JSON 的语法测试将前面复制的内容粘贴到左侧的 Inputs,因为希望返回所有的数据,所以在 JSONPath Syntax 中输入了 $ image.png图片 右侧的 Evaluation Results 不仅返回了所有的数据,并且对 JSON 数据进行了格式化处理,更易于阅读 如果只是需要获取温度,可以在 JSONPath Syntax 中输入 $.data.wendu image.png图片 准备工作到这里就差不多了,返回到 Changedetection 新增一个监控,分别填入下面的内容后,点 Watch 网址:http://t.weather.itboy.net/api/weather/city/101020100 tag:天气 image.png图片 image.png图片 在 CSS/JSON Filter 中输入 json:$.data.wendu,其中前缀 json: 是必须要的 image.png图片 通知 邮箱推送 点右上角的 SETTINGS 是 default global settings,只需要在 Notification URL List 中设置通知方式 Changedetection 采用了 apprise 项目来实现 通知 功能,可惜除了 邮件 ,老苏没找到手机上已经安装的应用 所有支持的通知方式都在这里:https://github.com/caronc/apprise邮件发送的 URL 地址是
技术搬砖
# docker
# 网页监控
admin
1年前
0
280
0
2024-07-30
不绑信用卡,设置 Cloudflare 团队账户(Zero Trust)
image.png图片 绑定或不绑定信用卡,申请 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 官网: image.png图片 2、输入邮箱和密码 image.png图片 3、验证邮箱: image.png图片 第二步:Zero Trust 设置 1、登录 CF 登录后,点击 Zero Trust 开始进入设置 image.png图片 2、输入团队名称 团队名称可任意起名,系统会验证是否重名。注册 Cloudflare 后第一次登陆,进入 Zero Trust 时会看到下面的页面。 image.png图片 如果已经添加过团队名称会看到下面的页面 image.png图片 3、选择免费计划(Free $0 / user / month) 输入团队名称后,点击 Next 进入付费计划选择页面,选免费计划。 image.png图片 图片 4、选择继续支付(proceed to payment) 这块不用担心,由于我们选择的是免费计划,输入信用卡信息点击支付时不会扣费。免费计划支持 50 个用户登陆访问。 image.png图片 5、添加支付方式 点 Add payment method 按钮进入支付信息填写页面 image.png图片 下面的步骤需要绑定信用卡,想绑定信用卡的朋友接着往下看,不想绑定信用卡的朋友跳到【第五步】 [](#89252ce1df494d9b88bd553d96488dc9 "6、添加支付信息")6、添加支付信息 信用卡需使用可以支付外币的信用卡,比如带 VISA/MASTER 标识的信用卡卡。 用户名称用汉语拼音填写,与信用卡一致,地址信息照实填写就行,也可以找一个虚拟地址。 image.png图片 图片 7、点下一步支付 这里我们可以看到,费用是零。这里也可看到,团队用户计划中,可以允许 50 个用户登陆访问。 image.png图片 第三步:设置客户端验证规则 1、Settings 进入客户端设置 点击 Settings,再点 WARP Client image.png图片 2、点击 Manage 进入客户端规则设置 注意:只有绑定了支付信息的用户,才能看到 WARP Client 下的 Manage 按钮。 image.png图片 3、点击 Add a rule 添加规则 在这里添加的规则面对的是想登录的客户端用户 image.png图片 4、设置用户登录规则 Rule name:规则名称,名称可以任意填写 Rule action:规则动作,保持默认(Allow) Selector:选择约束条件,这里选择以邮箱后缀最为约束条件(Emails ending in) Value:允许登录的邮箱后缀。如下图中添加了四个邮箱后缀,表示只有这四类邮箱才可以注册登录。 Save:添加完成后,一定要记得保存 image.png图片 第四步:下载客户端 Cloudflare 支持五种客户端,macOS、windows、iOS、Android、Linux 点 Downloads 进入客户端下载页面。也可打开 https://1.1.1.1 页面下载 image.png图片 image.png图片 第五步:无卡注册步骤 1、链接设备 从支付信息填写页面退出后,点击 My Team 下的 Devices 调出 Connect a device 按钮。第一次进入时看不到 Connect a device 按钮,需按照下面方法操作。 操作方法:先点击 My Team 下的 Users,再点击 Devices,如果没有出现,再次按顺序点 Users 和 Devices,直到 Devices 下出现 Connect a device 按钮,如下图所示。 image.png图片 2、添加验证规则 点击【 Connect a device 】打开添加登陆规则页面,点击【Create an enrollment policy】按钮 image.png图片 3、输入登陆规则 系统默认以邮箱后缀作为客户端的验证规则。这里填写需要验证的邮箱后缀(如:@hotmail.com),然后点 save 保存。 image.png图片 4、获取团队名称 点击页面中的 Windows 按钮,系统会自动打开一个页面,不用管。 image.png图片 image.png图片 5、复制团队名称 5.1、点击选项卡,返回之前的页面 image.png图片 5.2、返回后会看到团队名称。复制团队名称,复制完成后这个页面不要关闭,一直保持这个状态。 image.png图片 第六步:客户端设置 1、安装客户端 此处以 windwos 版安装为例。除了 Win 版,Cloudflare 还提供了 macOS、安卓版、苹果版、Linux 版。 安装非常简单,双击运行安装文件,按照提示点击下一步完成安装即可。 image.png图片 image.png图片 image.png图片 安装完成后,会在右下角看到一个类似云朵的图标。点击右下角的 Cloudflare 图标,按照提示点击下一步,并同意并接受协议。 image.png图片 image.png图片 image.png图片 2、设置团队账户(Zero Trust) 2.1、点击右下角 Cloadflare 图标,点击齿轮图标 image.png图片 2.2、添加偏好设置 image.png图片 2.3、点击账户→ 使用 Cloudflare Zero Trust 登陆 image.png图片 2.4、点下一步并同意隐私条款 image.png图片 image.png图片 2.5、输入团队名称并确定 image.png图片 2.6、发送验证码 输入要登陆的邮箱地址后,点击发送按钮(send me a code),系统会发一串验证码到这个邮箱。 image.png图片 2.7、接受验证码并验证 image.png图片 image.png图片 验证成功后 image.png图片 点击右下角的 Cloadflare 图标,稍等片刻后,图标由红色的 warp + 改为蓝色的 Zero Trust,注册完成。 image.png图片 点击按钮后显示已连接,表示已经成功联网,可以科学上网了。 image.png图片 绑定信用卡与未绑定的不同 绑定信用卡后,登陆账户可以随时编辑、修改、删除客户端登陆规则。未绑定信用卡的用户登陆后,无法看到已有的规则、虽然能添加规则,但无法修改和删除规则,添加规则操作不直观也不方便,操作相对繁琐。
技术搬砖
# Cloudflare
# warp
# zeroTrust
admin
1年前
0
2,056
0
2024-06-27
国内无法访问下载 Docker 镜像的多种解决方案
image.png图片 简介 2023 年 5 月, hub.docker.com "不知" 何种原因国内均无法正常访问了。当时只是官网不能访问,但不影响 pull 镜像。 2024年6月7日,GFW正式DNS污染+SNI阻断了docker.com及其相关域名。从国内解析得到的IP地址为Twitter/Facebook的IP,符合大墙DNS污染的特征。而如果使用海外解析得到的正常IP地址从国内访问则会被SNI重置阻断链接。 image.png图片 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,重启 Docker systemctl daemon-reload systemctl restart docker4,检查环境变量是否生效 systemctl show --property=Environment docker高门槛 Cloudflare 反向代理 优点:只需有 CF 账号就行,自己专属,不用自己签发证书 缺点:CF 在国内有 DNS 污染,可能无法正常访问 简要步骤: 1,登录到 CF https://dash.cloudflare.com/ 2,创建Workers 控制台面板 -> 左侧 Workers 和 Pages -> 创建应用程序 -> 创建 Worker -> 点击保存 -> 点击完成 -> 编辑代码 image.png图片 image.png图片 image.png图片 image.png图片 image.png图片 image.png图片 image.png图片 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的域名才可以 image.png图片 image.png图片 3,点击部署即可,右上角 deploy保存 image.png图片 4,绑定自定义域名 设置 -> 触发器 -> 自定义域 -> 点击【添加自定义域】 image.png图片 这里添加上自定义域名 [假如我的是mirrors.dockerpull.com] image.png图片 保存 大功告成 现在可以用这个自定义的域名访问了 演示地址:dockerhub.o0o.us.kg 接下来还有可以选择开启的环境变量功能 就是伪装首页 变量说明 变量名示例备注URL302https://baidu.com主页302跳转URLhttps://dockerpull.com 121主页伪装(设为nginx则伪装为nginx默认页面)如果你像我的dockerpull.com 40无所畏惧 就可以不管 如果你想自己稳定使用 不想公开的话 可以设置伪装页面 找到设置 环境变量 image.png图片 如果想别人访问域名首页的时候重定向到别的网站 可以加入环境变量URL302必须要大写的哈 然后值填写需要目标域名 我以跳转到百度为例 image.png图片 保存之后 访问首页就会自动跳转到百度 但是拉取docker镜像的时候 不会受到影响 第二种 是伪装首页 可以伪装成任意的网页首页 变量名称改为URL 也是要大写 值输入https://dockerpull.com 保存 image.png图片 这时候访问域名 就会出现我的那个镜像站的页面,当然也可以用别的页面 使用服务器自建 优点:需要有境外服务器 缺点:网络可能慢或者不稳定 这种方法需要自己有一台境外服务器,签发域名证书。按下面配置即可! 工作原理 当您首次从本地注册表镜像请求图像时,它会从公共Docker注册表中拉取图像,并在将其返回给您之前将其存储在本地。在后续的请求中,本地注册表镜像可以从自己的存储中提供图像。 前期准备 1.一个没有被墙的、延迟和带宽较好的非大陆小鸡(墙了的话可以试试套cf) 2.一个域名,无需备案,解析到你的小鸡的ip上,申请好证书,后续反代需要 3.安装好了docker及docker-compose docker安装 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/LightMirrors https://github.com/bboysoulcn/registry-mirror 最后总结 1,如临时使用,建议参与零门槛几个方案,方便快捷 2,据说后面 pip 源可能也会受到影响,可用采用 HTTP 代理方式
技术搬砖
# docker
# cf_workers
# 加速
admin
1年前
0
2,056
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一键脚本测试: 图片
技术搬砖
# ovh
# ipv6
admin
1年前
0
234
1
2024-03-12
Frps 内网穿透的常见快速部署方式
一个内网穿透服务端,下面整理常见的快速部署方式及其推荐程度 一键脚本部署(⭐⭐⭐) Install(安装) Gitee wget https://gitee.com/mvscode/frps-onekey/raw/master/install-frps.sh -O ./install-frps.sh chmod 700 ./install-frps.sh ./install-frps.sh installGithub wget 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 应用商店一键部署(⭐⭐) image.png图片 宝塔应用商店部署(⭐) image.png图片 开源地址 Frps 一键安装脚本 & 管理脚本
技术搬砖
# 一键
# frps
admin
1年前
0
243
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 的项目,确定 image.png图片 根据自身情况修改内容后即可(其实就是起一个你自己喜欢的名字,默认的也行),其他部分不需要操作,然后保存并部署,稍等即可 自定义 该图床是支持自定义设置的,我们可以进行设置 进行绑定域名操作,这一步从 custom domains 即可快速绑定已经解析到 cf 的域名 image.png图片 想要开启图片管理功能,依次点击设置->函数->KV 命名空间绑定->编辑绑定->变量名称填写:img_url KV 命名空间 选择你提前创建好的 KV 储存空间,开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面,我这里的 KV 名称就叫 img_url,因此这样填写,请在使用时将其替换为自己的 KV 名字。开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面。(不会创建 KV?请看这篇教程) image.png图片 image.png图片 后台可以添加登陆验证,前往后台依次点击设置->环境变量->为生产环境定义变量->编辑变量 添加如下表格所示的变量即可开启登录验证 BASIC_USER <后台管理页面登录用户名称> BASIC_PASS <后台管理页面登录用户密码>image.png图片 也可以使用 cloudflare access 进行统一登陆,但是需要注意的是需要保护路径包括 / admin 以及 /api/manage/* 关于 cloudflare access 我可能将来也会出一期博客精讲,毕竟真的超级好用 image.png图片 开启图片审查,可以前往 https://moderatecontent.com 输入邮箱申请一个图片审查的 api 把申请到的 api 填在刚才提到的环境变量中,添加一个变量名称为ModerateContentApiKey,值为你刚刚第一步获得的 API key image.png图片 还有白名单(不经过审查),黑名单(不予以显示),统计和搜索功能在后台可用 最后,在完成这些设置后一定一定要记得重新部署哦!!! 只有 web 前端不方便?没关系,我们可以搭配 picgo 进行食用 我们需要用到 GitHub - yuki-xin/picgo-plugin-web-uploader 这个插件,可以自行在 C:\Users\XXX\AppData\Roaming\picgo 输入命令安装,记得重启软件 npm install picgo-plugin-web-uploader或者在程序中搜索 web 就可以看到(反正这样我是安装不上) image.png图片 按照如图进行配置然后保存应用即可 image.png图片
技术搬砖
# 图床
# telegraph
# picgo
admin
1年前
0
294
0
2023-12-03
Linux挂载硬盘并自启动
一、查看当前已经分配磁盘的空间情况 df -hroot@******# df -h Filesystem Size Used Avail Use% Mounted on udev 126G 0 126G 0% /dev tmpfs 26G 35M 26G 1% /run tmpfs 126G 0 126G 0% /dev/shm /dev/sdb1 454G 31G 401G 8% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 126G 0 126G 0% /sys/fs/cgroup tmpfs 26G 28K 26G 1% /run/user/117 tmpfs 26G 28K 26G 1% /run/user/1000发现新加的硬盘并没有挂载上来, 其中,系统默认磁盘是在/dev/sdb1上 二、查看当前磁盘的大小 fdisk -lroot@****# fdisk -l Disk /dev/sda: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdb: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe8caedc1 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 968802303 968800256 462G 83 Linux /dev/sdb2 968804350 976771071 7966722 3.8G 5 Extended /dev/sdb5 968804352 976771071 7966720 3.8G 82 Linux swap / Solaris其中/dev/sda磁盘发现并未使用 三、对该磁盘进行分区并格式化 fdisk /dev/sda1、通过提示,command,输入m img图片 2、根据提示,输入n,新增一个分区 这里的 /dev/sda 是步骤(1)中 查询出来的硬盘识别文件地址。如果你在步骤(1)中要格式化的硬盘存在于其他地址请相应改变。 在提示信息引导下,我选择(n) “add a new partition” 将硬盘划分为一个新分区。 然后选择(e) “extended” 作为扩展分区。 因为我整个硬盘只作为一个分区,所以接下来的Partition number,我默认(1)。 指定柱面直接默认回车,接下来其他操作也默认回车即可,如果自己有需求自行按照说明选择。 最后再输出(p)确认下自己创建的分区表信息是否正确。确认无误后(w)保存。 *如果成功,系统会提示“The partition table has been altered” 分区表已更改完毕 。* 3、再次查看磁盘分区情况,已经有一个/dev/sda1的磁盘 fdisk -l4、对磁盘进行格式化,使用ext4格式,该操作耗时几分钟,耐心等待结束; mkfs -t ext4 /dev/sda1四、挂载新硬盘到文件目录 1、新建文件夹 我将其保存在本地用户目录下新建文件夹中。创建文件夹命令样例为: mkdir <文件夹路径>2 、挂载硬盘到目录 mount /dev/sda1 <文件夹路径>但是发现文件夹权限不足,因此赋予其和其他普通文件夹相同权限: chmod 777 <文件夹路径>权限如有需求相应调整,777是最高权限,然后进入文件夹新硬盘已经可以正常操作使用。 五、开机自动挂载 1、查看硬盘UUID: blkid这里/dev/vda1的UUID为468f89f6-32b7-432f-bd98-34d6fd8ad375,文件系统类型为ext4 2、向/etc/fstab写入文件系统的信息 echo UUID=468f89f6-32b7-432f-bd98-34d6fd8ad375 <挂载文件夹路径> ext4 defaults 0 0 >> /etc/fstab3、查看新分区信息 cat /etc/fstab最后reboot重启,验证开机是否自动挂载
技术搬砖
# Linux
# 磁盘
# 挂载
admin
2年前
0
92
0
2023-11-28
搭建一个自己的IP信息工具箱
这是一个完全开源的 IP 信息查看器,可以查询本机 IP、查询任意 IP、查询国内外网站可用性等。这是我第一次用 Vue.js 练手的项目。如果你看着 https://ip.skk.moe 眼馋,那就用这个程序搭建一个属于自己的吧。主要功能 看自己的 IP:从多个 IPv4 和 IPv6 来源检测显示本机的 IP 看 IP 信息:显示所有 IP 的相关信息,包括国家、地区、ASN、地理位置等 可用性检测:检测一些网站的可用性:Google, Github, Youtube, 网易, 百度等 WebRTC 检测:查看使用 WebRTC 连接时使用的 IP DNS 泄露检测:查看 DNS 出口信息,以便查看在 VPN/代理的情况下,是否存在 DNS 泄露隐私的风险 暗黑模式:根据系统设置自动切换暗黑/白天模式,也可以手动切换 简约模式:为移动版提供的专门模式,缩短页面长度,快速查看最重要的信息 查任意 IP 信息:可以通过小工具查询任意 IP 的信息 根据可用性检测结果,返回目前是否可以访问全世界网络的提示 搭建教程 建立站点 我这里用的是宝塔面板,其他面板或者裸 nginx 自行添加即可。 填写你的域名,并且做好解析和 SSL 证书。 image-20231127194622726图片 注意这里 PHP 版本选择纯静态即可,因为此项目是一个 Vue.JS 纯前端项目,不涉及 PHP。 2.上传源代码 源代码下载地址: https://github.com/jason5ng32/MyIP 远程 URL 直链: https://github.com/jason5ng32/MyIP/archive/refs/heads/main.zip 进入到网站根目录,删除掉宝塔自动创建的文件后下载代码包。 我的服务器是有宝塔面板,所以我这里直接使用 远程下载 功能。 image-20231127195048905图片 3.解压代码,安装步骤即完成。非常简单,开箱即用。 image-20231127195349155图片 4.访问你的解析域名地址 查看预览效果。 image-20231127200135498图片 优化调整 对接 Bing Map 也可以选择使用对接 Google Map 是永久免费的,但是 Google Maps 因为长城的缘故也无法国内使用。 所以我选择去申请一个 Bing Maps 的 API,也是免费的,但是一年只能发起 12 万次请求,个人公益使用完全够用。 如果想做更大的请求的话,去使用 Google Map 或者国内的 API 吧~ a.进入到 Bing Maps 官网,使用 Microsoft 登录,但是注意 Bing 是单独的部门,还是要注册的。 b.注册登录之后来到 My Keys 选项卡。 img图片 c.填写信息创建一个 key。 image-20231127201558458图片 d.复制 Key 并且添加到 app.js 中。 image-20231127201848201图片 图片 e.现在我们就可以在主界面中看到地图了。 2、IP数据显示错误 image-20231127205914651图片 这应该是一个小 Bug,原作者的编写平台可能是 MacOS,这是一个 emoji 表情,但是在 Windows 平台上会显示一个小方块。 解决办法也很简单,在 index.html 中搜索 IP 数据。将
技术搬砖
# ip
admin
2年前
0
445
2
2023-11-26
Debian一键换源
一键切换国内源 网站教程:网站:https://linuxmirrors.cn/ 开源:开源:https://github.com/SuperManito/LinuxMirrors bash <(curl -sSL https://linuxmirrors.cn/main.sh)海外使用: bash <(curl -sSL https://linuxmirrors.cn/main.sh) --abroad 一键安装Docker: bash <(curl -sSL https://linuxmirrors.cn/docker.sh)一键切换官方源 cp -r /etc/apt/sources.list /etc/apt/sources.list.bak;echo -e "deb http://deb.debian.org/debian buster main\ndeb-src http://deb.debian.org/debian buster main\ndeb http://security.debian.org/debian-security buster/updates main\ndeb-src http://security.debian.org/debian-security buster/updates main" > /etc/apt/sources.list;cat /etc/apt/sources.list;apt-get update;如果出现问题: 1、Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable' apt-get --allow-releaseinfo-change update2、GPG error: http://deb.debian.org/debian buster-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 E: The repository 'http://deb.debian.org/debian buster-backports InRelease' is not signed. 说明仓库没有签名,缺PUBKEY,按以下方法解决 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUB_KEY1> <PUB_KEY2>……比如上面那个就可以这样:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 3、添加PUBKEY时提示,gpg: failed to start the dirmngr `'/usr/bin/dirmngr'`: No such file or directory 我们只需要在系统上安装dirmngr包 apt install dirmngr --install-recommends -y4、如果出现E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation 那你还需要先装个gnupg apt-get install gnupg -y
技术搬砖
# 换源
# Debian
# 一键
admin
2年前
0
165
0
上一页
1
2
3
4
...
10
下一页