首页
关于
Search
1
AdGuardHome 安装及部署教程
45,599 阅读
2
关于微软Azure学生白嫖指南
11,583 阅读
3
Oracle开放全部端口并关闭防火墙
11,316 阅读
4
搭建基于telegram的无限网盘
11,060 阅读
5
最新Cloudflare免费自选IP教程(非Partner)
9,960 阅读
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
登录
找到
22
篇与
docker
相关的结果
- 第 2 页
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
597
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
3,240
2
2023-11-28
解决Docker容器 iptables问题
一、问题现象 最近在研究Docker容器日志管理时,启动容器出现iptables相关报错,具体问题如下 运行容器 [root@node-11 ~]# docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd出现如下报错 docker: Error response from daemon: driver failed programming external connectivity on endpoint quizzical_thompson (c2b238f6b003b1f789c989db0d789b4bf3284ff61152ba40dacd0e01bd984653): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.3 --dport 24224 -j ACCEPT: iptables: No chain/target/match by that name. (exit status 1)).二、解决办法 经过查阅资料得知是docker0网桥的原因,解决上面报错问题需要进行一下步骤 1.kill掉docker所有进程 [root@node-11 ~]# pkill docker 2.清空nat表的所有链 [root@node-11 ~]# iptables -t nat -F3.停止docker默认网桥docker0 [root@node-11 ~]# ifconfig docker0 down4.删除docker0网桥 apt install bridge-utils brctl delbr docker05.重启docker服务 [root@node-11 ~]# systemctl restart docker至此,成功运行docker容器 [root@node-11 ~]# docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd 644e43d03b9a2b30c062c8b5cde972b5514e6eef8a8ae95a6ab8c8004af6db5b技术分享图片
默认分类
# docker
# iptables
admin
2年前
0
198
2
2023-11-20
Docker搭建headscale和derp异地组网完整教程
目前国家工信部在大力推动三大运营商发展 IPv6,对家用宽带而言,可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址,也是个大内网地址,根本不是真正的公网 IP,访问家庭内网的资源将会变得越来越困难。 部分小伙伴可能会选择使用 frp 等针对特定协议和端口的内网穿透方案,但这种方案还是不够酸爽,无法访问家庭内网任意设备的任意端口。更佳的选择还是通过 VPN 来组建大内网。至于该选择哪种 VPN,毫无疑问肯定是 WireGuard,WireGuard 就是 VPN 的未来。 WireGuard 目前最大的痛点就是上层应用的功能不够健全,因为 WireGuard 推崇的是 Unix 的哲学,WireGuard 本身只是一个内核级别的模块,只是一个数据平面,至于上层的更高级的功能(比如秘钥交换机制,UDP 打洞,ACL 等),需要通过用户空间的应用来实现。 Tailscale 是什么? Tailscale 是一种基于 WireGuard 的虚拟组网工具,和 Netmaker 类似,最大的区别在于 Tailscale 是在用户态实现了 WireGuard 协议,而 Netmaker 直接使用了内核态的 WireGuard。所以 Tailscale 相比于内核态 WireGuard 性能会有所损失,但与 OpenVPN 之流相比还是能甩好几十条街的,Tailscale 虽然在性能上做了些许取舍,但在功能和易用性上绝对是完爆其他工具: 开箱即用 无需配置防火墙 没有额外的配置 高安全性/私密性 自动密钥轮换 点对点连接 支持用户审查端到端的访问记录 在原有的 ICE、STUN 等 UDP 协议外,实现了 DERP TCP 协议来实现 NAT 穿透 基于公网的控制服务器下发 ACL 和配置,实现节点动态更新 通过第三方(如 Google) SSO 服务生成用户和私钥,实现身份认证 简而言之,我们可以将 Tailscale 看成是更为易用、功能更完善的 WireGuard。 img图片 Tailscale 是一款商业产品,但个人用户是可以白嫖的,个人用户在接入设备不超过 20 台的情况下是可以免费使用的(虽然有一些限制,比如子网网段无法自定义,且无法设置多个子网)。 Tailscale 终究是第三方平台,如该平台发生数据泄露、异常崩溃、服务终止等,就无能为力。或许,我们可以自己建一个类似的私有平台? Headscale 是什么? Headscale 旨在实现一个自托管、开源的Tailscale控制服务器替代方案,可以实现较小范围内和实现单个Tailnet的功能,通常可用于设置为单个组织、家庭或个人使用。 一、搭建headscale服务端 Headscale 部署很简单,推荐直接在 Linux 主机上安装。 1.创建相关文件并配置 这里需要手动创建 db.sqlite,这是根服务器的数据库文件。另外,还需要下载官网给的配置文件示例,然后需要修改一部分。 mkdir -p /home/docker/headscale/config && \ mkdir -p /home/docker/headscale/data && \ touch /home/docker/headscale/data/db.sqlite && \ wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /home/docker/headscale/config/config.yaml修改相关配置文件,比如配置文件中配置 127.0.0.1 的话,那么就只能本机访问。这里修改为 0.0.0.0 那么就所有的 ip 都能访问。 sed -i 's/127.0.0.1/0.0.0.0/g' /home/docker/headscale/config/config.yaml这将修改以下几个地方 # 1. server_url: http://0.0.0.0:8080 # 2. listen_addr: 0.0.0.0:8080 # 3. metrics_listen_addr: 0.0.0.0:9090 # 4. grpc_listen_addr: 0.0.0.0:50443<!--/* 修改配置文件两个注意地方: a、hs的监听端口号,要和docker-compose.yaml里定义的端口一致,默认是8080 b、没有部署中继服务器,但derp部分不能删除,把enabled项设为fasle即可,否则后面headscale-webui进行overview时会出现服务器错误。--> 其中server_url还需要另外修改:server_url是对外访问和登录的地址,如果你需要使用域名并开启https,那么照我如下配置。如果你仅仅使用ip,那么这个地址修改为ip+端口的方式即可。 域名填自己的 sed -i 's#http://0.0.0.0:8080#https://headscale.yourname.com#g' /home/docker/headscale/config/config.yaml修改 dns 配置文件,如果不进行修改,那么登录时选择接受服务器的 dns 地址就会出现域名无法解析的情况。注意,这里的 dns 地址可以有多个,如果有需要自行添加即可。 sed -i 's/1\.1\.1\.1/119.29.29.29/g' /home/docker/headscale/config/config.yaml客户端可以通过 主机名 + 用户 + 基础域名 访问任意一台终端,所以这里修改下基础域名[根域名],根据自己的实际域名进行填写。 域名填自己的 sed -i 's/example.com/yourname.com/' /home/docker/headscale/config/config.yaml设置客户端随机端口,这里是听见有说不开机随机端口可能出现只能加入一台客户端的情况,为了保险还是选择开启。 sed -i 's/randomize_client_port: false/randomize_client_port: true/' /home/docker/headscale/config/config.yaml可自定义私有网段,也可同时开启 IPv4 和 IPv6: ip_prefixes: # - fd7a:115c:a1e0::/48 - 10.1.0.0/162、启动headscale服务端 docker run -d \ --name headscale \ --restart always \ -v /home/docker/headscale/config:/etc/headscale/ \ -v /home/docker/headscale/data:/var/lib/headscale \ -p 8080:8080 \ -p 9090:9090 \ --restart always \ headscale/headscale:0.22.3 \ headscale serve下面是一些相关的命令: 以前是 namespace 的概念,现在似乎改为 user 了 # 查看用户 docker exec -it headscale headscale users ls # 创建用户 docker exec -it headscale headscale users create hz # 生成apikey docker exec -it headscale headscale apikey create # 查询apikey docker exec -it headscale headscale apikey ls3、搭建web-ui docker run -d \ --name headscale-webui \ --restart always \ -v /home/docker/headscale/config:/etc/headscale/:ro \ -v /home/docker/headscale/web-ui/data:/data \ -u root \ -p 5000:5000 \ -e HS_SERVER=https://headscale.amjun.com \ # -e DOMAIN_NAME=https://headscale.amjun.com \ # 反向代理后的域名,必须要先设置好! -e SCRIPT_NAME=/admin \ -e AUTH_TYPE=Basic \ -e BASIC_AUTH_USER=admin \ -e BASIC_AUTH_PASS=admin \ -e KEY="2uHP6BSVocX+wcWU5mzuXA7JvnZA70UaTadB8L1heOo=" \ --restart always \ ifargle/headscale-webui:latest其中 /home/docker/headscale/config 为上面服务端的映射目录,这两个目录需要一致。HS_SERVER 和 DOMAIN_NAME 填写自己的域名1。KEY 是用来加密待会需要保存的 apikey 的字符串,使用命令 openssl rand -base64 32 生成。 接下来需要创建 headscale 服务器的 api-key,这里设置一个比较久的过期时间。 4、配置nginx和web-ui NPM配置nginx 在 Nginx Proxy Manager 中配置一下反向代理,并且配置下 SSL。需要注意的是,要把 Websockets Support 打开,否则客户端会无法登录。 img图片 如果 webui 跟 Headscale 使用了同一个域名,需要配置一下 Custom locations。 img图片 最后访问下 Headscale 的域名,如果返回了 404,说明部署成功。 保存配置后重启 nginx,如果配置正确,那么通过 https://域名/admin 应该可以访问到 web-ui 界面,输入容器启动时配置的用户名密码即可进入。 宝塔面板Nginx配置 server { listen 443 ssl; listen [::]:443 ssl; server_name headscale.amjun.com; ssl_certificate /etc/nginx/conf.d/cert/amjun.com.cer; ssl_certificate_key /etc/nginx/conf.d/cert/amjun.com.key; location ^~/ { proxy_pass http://localhost:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $server_name; proxy_redirect https:// https://; proxy_buffering off; 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 $http_x_forwarded_proto; } location ^~/admin/ { proxy_pass http://localhost:5000/admin/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 80; server_name headscale.amjun.com; rewrite ^(.*)$ https://$host:443$1 permanent; }配置web-ui 上面提示输入 apikey,这个需要 headscale 服务端生成,这里设置一个比较长的时间,根据自己的需要即可。 docker exec -it headscale headscale apikeys create -e 10000d运行命令后将生成的 key 输入,点击 save 即可,概览页面如下: img图片 image-20231120182150172图片 5、创建用户和授权密钥 headscale 个人理解是用户就是命名空间,进行网络隔离,所以需要先创建用户。 # 创建用户 docker exec -it headscale headscale users create hz授权密码的作用是,客户端登陆时不需要再服务端进行确认,阿蛮君总是喜欢使用简单的方式,所以就选择这种方式了。 # reusable 参数代表可以重复使用,不加的话密钥只能用来一个客户端加入 docker exec -it headscale headscale preauthkeys create -e 10000d --reusable -u hz # 查看密钥 docker exec -it headscale headscale preauthkeys list -u hz这里记得记录好授权密钥,下面将会用到。 二、搭建Derp服务端 由于 Tailscale 官方的 DERP 服务在中国大陆地区并没有服务提供,并且使用的人也非常的多,以至于中继的体验并不好,因此可以自建一个中继服务来改善这个问题。 1、使用如下命令即可搭建 derp 服务器: docker run -d \ --name derper \ -p 12345:12345 \ -p 3478:3478/udp \ -e DERP_ADDR=:12345 \ -e DERP_DOMAIN=derper.your-domain.com \ -e DERP_VERIFY_CLIENTS=false \ --restart always \ yangchuansheng/derper有几点需要注意: 能用 443 端口尽量用 443 端口,实在不行再用别的端口; 默认情况下也会开启 STUN 服务,UDP 端口是 3478; 防火墙需要放行端口 12345 和 3478; 准备好 SSL 证书; derper.your-domain.com 修改为自己的域名。设置环境变量 DERP_VERIFY_CLIENTS 是为了验证域名,这里考虑到有些人不一定需要所以设置为 false,如果真正自己使用还是建议设置为 true。 目前 derper 运行一段时间就会崩溃,暂时还没有更好的解决方案,只能通过定时重启来解决,比如通过 crontab 来设置每两小时重启一次容器: 0 */2 * * * docker restart derper &> /dev/null2. 配置nginx server { listen 443 ssl; listen [::]:443 ssl; server_name derper.your-domain.com; ssl_certificate /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.cer; ssl_certificate_key /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.key; location / { proxy_pass http://localhost:12345/; proxy_redirect https:// https://; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header Content-Security-Policy upgrade-insecure-requests; } } server { listen 80; server_name derper.your-domain.com; rewrite ^(.*)$ https://$host:443$1 permanent; }设置了强制跳转 https,如果有需要可以不设置,如果没有域名请不需要配置。 配置修改后,记得重启下 nginx,这里需要使用域名或者 ip + 端口能够访问到 derp 页面。 image-20231120185118955图片 在 Nginx Proxy Manager 中配置一下反向代理,这个也需要开启 Websockets Support ,否则客户端中会无法连接 DERP 服务。 如果自建了 DERP 服务,可以把 Tailscale 官方的公共服务禁用,只用自己的服务。修改 config.yaml 3. 创建derp.yaml 需要告诉 headscale 服务器我们创建的 derp 节点的地址,否则客户端不知道地址将无法使用。 如果你是按照我之前的教程搭建的 headscale,那么运行如下命令,否则需要自己注意配置文件的位置。 cat << EOF > /home/docker/headscale/config/derp.yaml regions: 900: regionid: 900 regioncode: ts regionname: Tencent Shanghai nodes: - name: 900a regionid: 900 hostname: derper.your-domain.com # ipv4: ip stunport: 3478 stunonly: false derpport: 443 EOF这里的域名替换为自己的域名,如果没配置域名就使用 ip。另外需要注意的是,如果你使用域名配置了 https,那么这里的 derpport 一般填写 443,否则应该使用上面启动容器时指定的 12345 端口。 记得开放3478端口!!! regions 是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即 nodes。 每个可用区的 regionid 不能重复。 每个 node 的 name 不能重复。 regionname 一般用来描述可用区,regioncode 一般设置成可用区的缩写。 ipv4 字段不是必须的,如果你的域名可以通过公网解析到你的 DERP 服务器地址,这里可以不填。如果你使用了一个二级域名,而这个域名你并没有在公共 DNS server 中添加相关的解析记录,那么这里就需要指定 IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了)。 stunonly: false 表示除了使用 STUN 服务,还可以使用 DERP 服务。 regions: 901: regionid: 901 regioncode: jp regionname: Aliyun Japan nodes: - name: 901a regionid: 901 hostname: 'derper.yourdomain1.com' ipv4: '' stunport: 3478 stunonly: false derpport: 443 902: regionid: 902 regioncode: cn regionname: Aliyun Guangzhou nodes: - name: 902a regionid: 902 hostname: 'derper.youdomain2.com' ipv4: '' stunport: 3478 stunonly: false derpport: 4434. 修改headscale配置文件 修改 config.yaml 文件,paths 指定 derp.yaml 文件的位置,urls 下面的链接是官方提供的中继服务器,根据自己判断是否需要注释。 # /etc/headscale/config.yaml derp: # List of externally available DERP maps encoded in JSON urls: # - https://controlplane.tailscale.com/derpmap/default # Locally available DERP map files encoded in YAML # # This option is mostly interesting for people hosting # their own DERP servers: # https://tailscale.com/kb/1118/custom-derp-servers/ # # paths: # - /etc/headscale/derp-example.yaml paths: - /etc/headscale/derp.yaml # If enabled, a worker will be set up to periodically # refresh the given sources and update the derpmap # will be set up. auto_update_enabled: true # How often should we check for DERP updates? update_frequency: 24h修改文件后记得重启 headscale。 docker restart headscale5、验证 再次执行 netcheck 命令,可以看见自己搭建的 derp 节点,如果是使用国内的服务器搭建,那么一般这个服务器是最近的。 # docker 运行的客户端 docker exec -it tailscaled tailscale netcheck # 非 docker 运行的客户端 tailscale netcheck三、客户端安装 目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器。 OS是否支持 HeadscaleLinuxYesOpenBSDYesFreeBSDYesmacOSYesWindowsYes 参考 Windows 客户端文档Android支持,参考 这个 PRiOS暂不支持1、Linux 1.1脚本安装 curl -fsSL https://tailscale.com/install.sh | sh && \ tailscale login --login-server https://headscale.amjun.com --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --accept-dns=false --accept-routes这里仅仅安装方式不同,登录的命令完全一样 1.2Docker安装 docker run -d \ --name=tailscaled \ -v /home/docker/tailscale/:/var/lib \ -v /dev/net/tun:/dev/net/tun \ -e TS_STATE_DIR=/var/lib/state/ \ --network=host \ --restart always \ --privileged tailscale/tailscale:v1.44.0 \ tailscaled --tun=tailscale0 -debug=:8088 -no-logs-no-support=true这里需要将 TS_STATE_DIR 指定的文件夹持久化,否则删除容器再新建后,在服务端能看见重复的设备。并且需要指定 --tun=tailscale0,不然似乎不能在宿主机创建网卡。 然后使用如下命令进行登录: docker exec tailscaled tailscale login --login-server https://headscale.amjun.com --accept-dns=false --accept-routes=false --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --advertise-routes=172.21.9.0/24,172.30.1.0/24,172.26.1.0/24,172.20.2.0/23根据自己网络情况设置 --advertise-routes,我这是需要通过这台内网机器访问公司其他网络。 如果出现如下错误: running [/sbin/ip6tables -t filter -N ts-input --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory ip6tables v1.8.8 (legacy): can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?) Perhaps ip6tables or your kernel needs to be upgraded执行以下命令: # 防止探测ip6table sudo modprobe ip6table_filter1.3 手动安装 Tailscale 官方提供了各种 Linux 发行版的软件包,但国内的网络你懂得,软件源根本用不了。好在官方还提供了 静态编译的二进制文件,我们可以直接下载。例如: wget https://pkgs.tailscale.com/stable/tailscale_1.22.2_amd64.tgz解压: tar zxvf tailscale_1.22.2_amd64.tgz将二进制文件复制到官方软件包默认的路径下: cp tailscale_1.22.2_amd64/tailscaled /usr/sbin/tailscaled cp tailscale_1.22.2_amd64/tailscale /usr/bin/tailscale将 systemD service 配置文件复制到系统路径下: cp tailscale_1.22.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service将环境变量配置文件复制到系统路径下: cp tailscale_1.22.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled启动 tailscaled.service 并设置开机自启: systemctl enable --now tailscaled查看服务状态: systemctl status tailscaledTailscale 接入 Headscale: # 将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名 tailscale up --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS。如果你对 DNS 有需求,可自己研究官方文档,这里不再赘述。 执行完上面的命令后,会出现下面的信息: To authenticate, visit: http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704 1150d8462、其他 Linux 发行版 除了常规的 Linux 发行版之外,还有一些特殊场景的 Linux 发行版,比如 OpenWrt、威联通(QNAP)、群晖等,这些发行版的安装方法已经有人写好了,这里就不详细描述了,我只给出相关的 GitHub 仓库,大家如果自己有需求,直接去看相关仓库的文档即可。 OpenWrt: https://github.com/adyanth/openwrt-tailscale-enabler 群晖: https://github.com/tailscale/tailscale-synology 威联通: https://github.com/ivokub/tailscale-qpkg 3、Android Android 客户端从 1.30.0 版本开始支持自定义控制服务器(即 coordination server),你可以通过 Google Play 或者 F-Droid 下载最新版本的客户端。国内本地下载 安装完成后打开 Tailscale App,会出现如下的界面: img图片 点开右上角的“三个点”,你会看到只有一个 About 选项: img图片 接下来就需要一些骚操作了,你需要反复不停地点开再关闭右上角的“三个点”,重复三四次之后,便会出现一个 Change server 选项: img图片 点击 Change server,将 headscale 控制服务器的地址填进去: img图片 然后点击 Save and restart 重启,点击 Sign in with other,就会跳出这个页面: img图片 将其中的命令粘贴到 Headscale 所在主机的终端,将 NAMESPACE 替换为之前创建的 namespace,然后执行命令即可。注册成功后可将该页面关闭,回到 App 主页,效果如图: docker exec -it headscale headscale nodes register --user hz --key nodekey:xxxximg图片 4、Windows tailscale 客户端下载地址:https://tailscale.com/download/ 4.1 安装客户端 下载 windows 客户端并进行安装。 4.2 安装注册表 访问 https://headscale.amjun.com/windows,可以看见配置的教程。 提示需要修改注册表,这里可以直接 curl https://headscale.amjun.com/windows/tailscale.reg 下载文件后,双击运行文件进行安装即可。 4.3 登录 在 tailscale 的安装目录下使用 cmd 打开,输入命令: tailscale login --login-server https://headscale.amjun.com --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --accept-dns=false --accept-routes这里的 authkey 是第四步生成的,然后在服务器使用命令查看。 docker exec -it headscale headscale nodes ls总结 目前从稳定性来看,Tailscale 比 Netmaker 略胜一筹,基本上不会像 Netmaker 一样时不时出现 ping 不通的情况,这取决于 Tailscale 在用户态对 NAT 穿透所做的种种优化,他们还专门写了一篇文章介绍 NAT 穿透的原理, 中文版翻译自国内的 eBPF 大佬赵亚楠,墙裂推荐大家阅读。放一张图给大家感受一下: img图片
技术搬砖
# docker
# 内网穿透
# headscale
# derp
admin
2年前
0
3,980
1
2023-08-19
Docker的网络代理配置
在国内用docker去拉取image时会很慢, 此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如: 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址) 网易云加速器 https://hub-mirror.c.163.com 百度云加速器 https://mirror.baidubce.com 一、配置加速器 vim /etc/docker/daemon.json{ "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。 之后重新启动服务 sudo systemctl daemon-reload sudo systemctl restart docker二、docker pull代理 在执行docker pull时,是由守护进程dockerd来执行。 因此,代理需要配在dockerd的环境中。 而这个环境,则是受systemd所管控,因此实际是systemd的配置 sudo mkdir -p /etc/systemd/system/docker.service.dsudo touch /etc/systemd/system/docker.service.d/proxy.conf在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容: [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"之后重新启动服务 sudo systemctl daemon-reload sudo systemctl restart docker三、Container代理 1、用户级代理 vim ~/.docker/config.json{ "proxies": { "default": { "httpProxy": "http://192.168.0.54:7890", "httpsProxy": "http://192.168.0.54:7890", "noProxy": "localhost,127.0.0.1,.example.com" } } }这种方法默认在所有配置修改后启动的容器生效 2、容器级代理 容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。docker-compose的是要配置environment 格式如下: web: environment: HTTP_PROXY: 'http://192.168.0.54:7890' HTTPS_PROXY: 'http://192.168.0.54:7890' NO_PROXY: 'localhost, *.test.lan'四、docker build代理 虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数 docker build . \ --build-arg "HTTP_PROXY=http://192.168.0.54:7890" \ --build-arg "HTTPS_PROXY=http://192.168.0.54:7890" \ --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \ -t your/image:tag
技术搬砖
# docker
# proxy
admin
2年前
0
1,526
3
2023-07-15
青龙面板安装及常见问题解决
支持Python3、JavaScript、Shell、Typescript的定时任务管理平台 开源地址:https://github.com/whyour/qinglong img图片 一、功能 支持多种脚本语言(python3、javaScript、shell、typescript) 支持在线管理脚本、环境参数、配置文件 支持在线查看任务日志 秒级支持任务设置 支持系统级通知 支持暗黑模式 支持手机端操作 二、青龙面板安装 # curl -sSL get.docker.com | sh docker run -dit \ -v $PWD/ql/data:/ql/data \ -p 5700:5700 \ -e QlBaseUrl="/" \ # 部署路径非必须,以斜杠开头和结尾,比如 /test/ --name qinglong \ --hostname qinglong \ --restart unless-stopped \ whyour/qinglong:latest三、手动安装(在面板里安装的依赖-个人推荐) 1、NodeJs下 crypto-js prettytable dotenv jsdom date-fns tough-cookie tslib ws@7.4.3 ts-md5 jsdom -g jieba fs ds form-data json5 global-agent png-js @types/node require typescript js-base64 axios moment2、Python3下 requests canvas ping3 jieba pycryptodome bs4 rsa PyExecJS aiohttp redis Crypto fake-useragent json53、Linux下 bizCode bizMsg lxml libc-dev python3-dev --no-cache build-base g++ cairo-dev gcc pango-dev giflib-dev四、部分依赖问题解决方法 1.一般出现这种错误:(缺依赖) Error: Cannot find module ‘xx’2.一般出现这种错误:(缺文件) Error: Cannot find module ‘./xx’解决方法:一般是拉库命令不完整,请检查或复制完整的拉库命令重新拉库。 3.一般出现这种错误:(缺py依赖) ModuleNotFoundError: No module named ‘xxx’.py解决方法:docker exec -it 容器名 pip3 install xxx 4.遇到这种问题:(脚本问题) TypeError: Cannot read property ‘xxxx’ of undefined这种脚本问题、IP问题、服务器网络、京东接口修改或者账号活动被限制等!导致的脚本无法正常运行。 解决方法:此类问题较为复杂根据实际情况解决吧。最好搞动态IP。
技术搬砖
# docker
# 青龙
admin
2年前
0
2,136
1
2023-07-14
玩客云刷机-玩机教程
玩客云是17年的一款矿渣产品,当时入手价499可以挖矿换话费和备份手机照片、使用迅雷高速下载,阿里云盘出来后不限速,也没有下载需求了,吃灰良久。 Armbian是轻量级的Debian系统和为ARM开发板专门发行并重新编译的Debian系统。 最近折腾了玩客云刷机Armbian作为Linux的方案,把它最后当做一个下载器和学习Linux的工具来玩了 一、玩客云硬件参数 CPU是晶晨S805 ,32位,ARM 4核1.5GHz 1G(DDR3)+8G(eMMC) 两个USB 2.0,HDMI接口,一个千兆网口(RJ45 ) 二、刷机准备工具 WIN10电脑一台 矿渣玩客云 双公头USB线一根【用于连接电脑和玩客云,用于刷底层包】 螺丝刀,一把金属镊子,用来短接用(用金属线也是可以的) 闲置 U 盘一个,或者读卡器配合存储卡也行【U盘用于刷 Armbian 系统】 晶晨刷机软件 USB Burning Tool,update.img 文件为安卓底包,zip 文件为 armbian 固件 三、刷机包基本常识 1、**直刷包**:直接刷,刷完就OK可以直接使用 优点: (1)方便快捷,不用U盘等工具 (2)速度快,省去中间过程 缺点: (1)再次刷机可能需要重新短接 (2)换系统可能需要重新对emmc进行大量读写 2、**底包**:用于对设备进行引导,引导设备启动USB设备上的系统(类似于PE系统),一般搭配U盘刷机包使用 优点: (1)可以随便换系统,一个U盘一个系统 (2)在没将系统输入emmc之前可以不用拆机 缺点: (1)系统性能受限于USB设备与接口,稳定性难绷(USB2.0的接口我也不好说什么了) (2)占用一个USB接口 注:如果你将U盘内系统写入emmc的话那基本和直刷包没区别了 3、镜像包:直刷包的内包含了系统镜像,直刷直用 底包和系统镜像分离,底包包含引导,镜像包包含系统镜像,镜像包也就是U盘刷机包 4、选择:如果你身边没有U盘等设备,那肯定只有用直刷包了 当然如果你选择的固件只有U盘刷机包那种,那也只能找一个U盘了 如果你的数据线或者因为成色而导致直刷用的那个USB接口不稳定,那建议用刷底包的方式 底包因为只包含引导或者部分驱动会刷得很快,而直刷包就需要一个漫长的过程,如果不稳定的话 就会导致刷机失败以至于要重新刷,那就得不偿失了 同样的,如果你用来U盘引导的那个接口不稳定(用来直刷和引导系统的那个接口不一样) 所以没有哪个更好的说法,全部看实际情况和你选择的固件包 四、刷机教程 1、拆机及注意 玩客云的拆机十分简单,有接口那一侧,外层塑料挡板是双面胶粘上去的,使用撬棒或者一字批起子之类,从缝隙入手,慢慢转圈撬开即可,挡板弹性挺大, 并不容易搞坏。 然而二层挡板就是 6 颗螺丝下掉完事,主板是卡在壳子的卡槽里的,可以捏住 SD 卡槽部分的主板空白位,用点力即可把主板拔出来。 img图片 2、刷入安卓底包 玩客云要刷 armbian 的话,需要先刷一个安卓固件作为过渡包 使用USB线一头连接玩客云靠近hdmi接口的usb接口,一头连接至电脑,台式机请连接后面的USB口,暂时不要通电! 安装并打开 USB Burning Tool,导入 update.img 镜像,勾选 “擦除flash” 和 “擦除bootloader” 并点击 “开始” 【开始】按钮变成显示【停止】状态,此时晶晨刷机工具正在准备刷机,等待设备接入 推荐大佬编译的eMMC.burn.img,eMMC.burn.img,启动顺序:U盘—SD卡—eMMC img图片 关键步骤:先短接触点,再接通玩客云主板电源 用啥都行,镊子或者找根导线剥掉两头外皮都可以,玩客云有两种版本,它们的短接位置也是不一样的: img图片 img图片 新版短接点1图片 短接焊点稳定以后usb插入玩客云「靠近HDMI的接口」、另一头接入电脑usb、通电 如果顺利的话,刷机软件会发现设备,自动开始刷入流程。 观察电脑上晶晨刷机工具提示。“叮咚”一声,界面开始出现进度条表示短接成功,短接成功还有个显著的提示,就是主板指示灯不会亮。 短接失败了也不会怎么样,软件没反应而已,可以放心大胆的多次尝试,如果有错误,换一个usb接口,多试几次 这个固件很小,很快就会写完,一般几秒钟,提示烧录成功后,先点”停止“,然后关闭,拔掉电源、拔掉USB。 img图片 img图片 提示:设备短接一次成功刷入底包后,有几率按住重置键烧录 直接插双公头usb数据线「靠近HDMI的接口」,先不要接通电源,长按住重置键,再接通电源,发现硬件即可刷机,如果出错 1.多试几次 2.换个USB口 3.重启机器 4.换个机器 3、U盘先刷入armbian5.88系统 打开 balenaEtcher 工具,并选择 armbian5.88.img 镜像,选择写入设备为 U 盘(一定要确认以一下),点击 ”Flash“ 开始写入。 balenaEtcher刷入U盘界面图片 等待几分钟,写入速度和U盘传输速度有关,一般是几分钟,提示成功后,关闭软件,拔出U盘。 img图片 把U盘插入玩客云靠近网口的USB,然后通电,指示灯会蓝色→绿色→蓝紫闪烁→蓝色,证明刷机成功,过程好几分钟,多等下。全程不插入网线,armbian5.88系统写入完成后,直接断电,然后拔u盘 4、U盘再刷入armbian5.9系统 打开 balenaEtcher 工具,并选择 WKY-Armbian_20.12_5.9.0.img 镜像,选择写入设备为 U 盘(一定要确认以一下),点击 ”Flash“ 开始写入。 推荐大佬专用库,一直在更新,Armbian for onecloud. 玩客云用armbian 主机名: onecloud 账号: root 密码: 1234 提示:这里推荐Armbian_23.11.0-trunk_Onecloud_bookworm_edge_6.4.16_minimal.img.xz,可以安装Docker bookworm表示Debian12,bullseye表示Debian11,带burn标志的代表可线刷烧录,前提需要先解压 armbian5.9系统写入完成后,U盘不要动,用网线接入路由器LAN口,进入路由,查看新加入的设备 img图片 过一会打开路由器后台,找到”aml-s812“的设备IP地址,复制 打开 putty (也可以使用其他工具)输入连接IP地址,默认密码是:1234,第一次登录需要修改一个密码(要包含大写字母、小写字母、数字、符号)。 img图片 img图片 从欢迎信息中可以看到 Linux 5.9.0-rc7-aml-s812 可知目前我们刷写的系统版本为 Armbian 5.9.0。 现在系统时从 U 盘启动的,拔掉 U 盘就无法启动了,接下来还需把系统写入到 EMMC 中。 想要写入emmc的,下载下面的文件,放入u盘的boot分区:emmc-install 整个仓库拉下来,重命名为install,放入boot分区,u盘系统启动后 在 SSH 命令面板中输入以下命令 cd /boot/install ./install.sh刷入系统时灯会 蓝 / 紫 闪烁,表示正在写入 EMMC img图片 img图片 完成后,拔电源,拔掉U盘,终于ARMBIAN系统刷机完成。 启动完成即可用你刚刚设置的密码登陆进去了。 五、安装Docker 1、换Debian源 mv /etc/apt/sources.list /etc/apt/sources.list.bk vi /etc/apt/sources.list2、粘贴 deb https://mirrors.ustc.edu.cn/debian/ bullseye main non-free contrib deb-src https://mirrors.ustc.edu.cn/debian/ bullseye main non-free contrib deb https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main deb-src https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main deb https://mirrors.ustc.edu.cn/debian/ bullseye-updates main non-free contrib deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-updates main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ bullseye-backports main non-free contrib deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-backports main non-free contrib可以进入清华大学Debian软件源官网定制源 image-20240104201115982图片 更新源报错的解决方法 (E: The repository 'http://apt.armbian.com stretch Release' does not have a Release file.) 编辑 /etc/apt/sources.list.d/armbian.list,将 http://apt.armbian.com 替换为以下链接 https://mirrors.tuna.tsinghua.edu.cn/armbian或者可以由以下命令完成 sed -i.bak 's#http://apt.armbian.com#https://mirrors.tuna.tsinghua.edu.cn/armbian#g' /etc/apt/sources.list.d/armbian.list3、保存并更新软件 apt-get update && apt-get upgrade4、安装Docker docker和iptables不兼容,建议安装前执行 update-alternatives --set iptables /usr/sbin/iptables-legacy update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy如果报错:update-alternatives: error: no alternatives for iptables 尝试更新iptables再执行以上两行命令 apt install iptables完成之后,执行Docker安装可视化一键脚本 bash <(curl -sSL https://linuxmirrors.cn/docker.sh)5、安装Docker面板 docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce:2.19.0@sha256:df464e724255c2c3db304b343bec82d4510e507c77893e8ed61e122b9fa42bf1六、安装FRPC客户端内网穿透 1、创建frp.ini文件并创建目录 mkdir /frp vim /frp/frpc.ini2、编辑frpc.ini配置文件 [common] server_addr = x.x.x.x server_port = 7000 token = XXXXX [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 60003、拉取镜像 docker pull snowdreamtech/frpc4、启动docker容器 docker run --restart=always --network host -d -v /frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc七、永久性挂载硬盘 1、查看硬盘名称 fdisk -l查看刚刚接入的U盘/硬盘并记下其设备名称 img图片 Device:对应硬盘名称 -Size:对应硬盘大小- Type:对应硬盘格式 2、格式化硬盘 Linux硬盘格式需要Etx4,我这个硬盘已经格式化了,再演试一次,使用命令: mkfs -t ext4 /dev/sda1 #格式化硬盘选择ext4文件系统此过程会提示Proceed anyway? (y,N),问你是否继续格式化,输入y回车继续,后面提示其它回车就OK img图片 3、挂载硬盘/U盘 接下来开始挂载硬盘,查看硬盘的UUID,输入: blkid 硬盘名称(例如blkid /dev/sda1)UUID="这里面就是UUID"复制下来 img图片 使用ftp工具连接玩客云找到/etc/fstab文件打开编辑(我使用的finalshell自带ftp工具,如果你装了宝塔直接在宝塔文件里找也可以,当然你也可以使用VI命令行直接编辑) 在fstab文件后面追加: UUID=改为你的硬盘UUID /mnt/随便命名后面创建对应的文件夹最好时英文/ ext4 defaults 0 0img图片 编辑后保存上传回去,在/mnt/文件夹下创建你刚刚设置的文件夹名称,例如我刚刚设置的是/mnt/Disk,就创建一个Disk文件夹 回到命令行窗口输入reboot重启玩客云,等1-2分钟重启成功,登录宝塔,在首页就可以看到刚刚挂载的硬盘
技术搬砖
# docker
# 玩客云
# NAS
admin
2年前
0
5,563
2
2023-07-13
搭建Frp内网穿透服务
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 开源地址:FRP github网址 通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括: 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间 代理组间的负载均衡 端口复用,多个服务通过同一个服务端端口暴露 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作 一、服务端部署 Docker部署 1.debian、ubuntu、Centos系统一键安装docker curl -fsSL get.docker.com -o get-docker.sh curl -sSL https://get.daocloud.io/docker | sh sudo sh get-docker.sh --mirror Aliyun2.创建frp.ini文件并创建目录 mkdir /frp vim /frp/frps.ini3.编辑frps.ini配置文件 [common] bind_port = 7000 # 启用面板 dashboard_port = 7500 # 面板登录名和密码 dashboard_user = admin dashboard_pwd = xxxxxx # 使用http代理并使用80端口进行穿透 vhost_http_port = 80 # 使用https代理并使用443端口进行穿透 vhost_https_port = 443 # 日志路径 log_file = ./frps.log # 日志级别 log_level = info # 日志最大保存天数 log_max_days = 2 # 认证超时时间 authentication_timeout = 900 # 认证token,客户端需要和此对应 token=123123123 # 最大连接数 max_pool_count = 5 max_ports_per_client = 0官方发现发布 0.52.0 版本后,取消了原有 INI 配置文件,改为 TOML 新格式,完整frps配置 bindPort = 7000 auth.method = "token" auth.token = "12345678" webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin123456"4.拉取镜像 docker pull snowdreamtech/frps:latestdocker安装frp图片 5.启动docker容器 #0.52.0版本之前 docker run --restart=always --network host -d -v /frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps #0.52.0版本之后 docker run --restart=always --network host -d -v /etc/frp/frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps运行容器图片 6.直接访问dashboard,输入账号密码 img图片 dashboard界面图片 可以直接访问,说明部署成功 本地文件部署 1、下载程序包 前往GitHub Releases页面下载: 图片 根据自己实际情况选择,我的是x64的windows系统,服务器也是x64架构,选择图中两项。玩客云是armv7架构,选择linux_arm包 解压如下: image图片 2、配置文件 官方发现发布 0.52.0 版本后,取消了原有 INI 配置文件,改为 TOML 新格式,完整frps配置,完整frpc配置 # frps.toml bindPort = 7000 # 服务端与客户端通信端口 auth.token = "public" # 身份验证令牌,frpc要与frps一致 transport.tls.force = true # 服务端将只接受 TLS链接 # Server Dashboard,可以查看frp服务状态以及统计信息 webServer.addr = "0.0.0.0" # 后台管理地址 webServer.port = 7500 # 后台管理端口 webServer.user = "admin" # 后台登录用户名 webServer.password = "admin" # 后台登录密码# frpc.toml transport.tls.enable = true # 从 v0.50.0版本开始,transport.tls.enable的默认值为 true serverAddr = "x.x.x.x" serverPort = 7000 # 公网服务端通信端口 auth.token = "public" # 令牌,与公网服务端保持一致 [[proxies]] name = "test-http" type = "tcp" localIP = "127.0.0.1" # 需要暴露的服务的IP localPort = 9000 # 将本地9000端口的服务暴露在公网的6060端口 remotePort = 6060 # 暴露服务的公网入口 [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000注意: 访问的端口一定要开放 3、系统守护启动 如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它: # 使用 yum 安装 systemd(CentOS/RHEL) yum install systemd # 使用 apt 安装 systemd(Debian/Ubuntu) apt install systemd使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。 vim /etc/systemd/system/frps.service写入内容 [Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动frps的命令,/path/to需修改为您的frps的安装路径 ExecStart = /path/to/frps -c /path/to/frps.toml [Install] WantedBy = multi-user.target使用 systemd 命令管理 frps 服务 # 开机启动frp systemctl enable frps # 启动frp sudo systemctl start frps # 停止frp sudo systemctl stop frps # 重启frp sudo systemctl restart frps # 查看frp状态 sudo systemctl status frps或者:也可以使用任意方式编辑 /usr/lib/systemd/system/frps.service 并添加如下内容,其中 path_alist 为 frp 所在的路径 但需要执行 systemctl daemon-reload 重载配置 二、Windows客户端部署 内网穿透工具:配置生成 Windows客户端下载 压缩包里包含以下文件 frp客户端图片 配置客户端文件,找到压缩包里的frpc.ini。 配置客户端图片 打开frp客户端,运行 打开frpc.bat 即可打开 img图片 三、Android客户端部署 首先下载Frpc客户端 GitHub开源项目:https://github.com/mainfunx/frpc_android 下载仓库最新的(虽说frps须与frpc版本一致,但frps不配置token还是可以跨版本使用的): https://github.com/mainfunx/frpc_android/releases/download/0.39.1.1/frpc_adnroid-v0.39.1.1.apk 下载安装好就是这个样子 photo_2023-02-22_17-31-14图片 photo_2023-02-22_17-31-17图片 配置文件如下:(根据个人需求进行修改,切勿照搬) [common] server_addr = 54.180.101.36 server_port = 55185 [web] type = tcp local_ip = 127.0.0.1 local_port = 9978 remote_port = 7080 [web02] type = tcp local_ip = 127.0.0.1 local_port = 5245 remote_port = 7081点保存名字随便取 photo_2023-02-22_17-31-20图片 四、Magisk-FRPC部署 用于在 Android 设备上运行 FRPC 的 Magisk 模块。 如果您的终端设备使用WEB服务或者其他需要远程访问的服务,那么该模块将是您不错的选择。 Magisk-FRPC:https://github.com/Yang2635/Magisk-FRPC/releases 模块支持arm、arm64、amd64、x86架构。安装时自动判断设备指令架构并应用。 使用模块携带的 Busybox 程序中 crond 命令建立定时任务检测状态。 FRPC 配置文件修改后会自动检测并重载配置文件。 Magisk 模块页面自动显示模块状态信息。 检验文件完整性,防止模块被破坏。(感谢 Riru 模块提供的灵感)。 可在 Magisk 模块中开启或关闭来控制 FRPC 程序启动与结束。 设备电量低于 20% 且未在充电自动终止 FRPC 程序,请保持设备电量充足! 在模块目录创建 screen 文件则表示息屏检测,反之不检测。 模块安装完成后,请到 Android/frpc 目录下浏览并编辑 frpc.ini 配置文件文件。然后重启设备,设备运行后,会在你的设备上运行 FRPC 守护程序。 模块仅在设备 Android/frpc 目录释放额外工作需要的文件(不含 frpc 日志自定义其它路径设置),若模块卸载时未执行 uninstall.sh 脚本,请手动清除 Android/frpc 目录内文件。
技术搬砖
# docker
# FRP
# Magisk
admin
2年前
0
1,785
0
2022-07-11
Check酱:监测网页内容变化
Check酱:监测网页内容变化,并发送异动到微信。亦支持http status、json和rss监测。配合自架云端,关电脑后也能运行。Check酱图片 ⚠️ 浏览器插件不开源,docker目录下的代码仅供安全核查和编译多平台镜像,采用附加条件的GPLV3授权: 不得修改或删除默认对接的Server酱通道。 不得对接其他消息通道后再次发布。 满足以上两个条件后,遵从GPLv3协议。 最新版本 插件·Chrome/Edge:2022.06.26.14.42 下载 (Github下载地址,无需注册) Docker镜像(云端+远程桌面二合一):2022.06.26.14.22 Docker Hub 文档:2022.06.26.14.49 更新日志:GitHub Docker镜像安装命令请参阅后文云端架设一节什么是「Check酱」 Check酱是方糖气球出品的网页内容监测工具,它包含一个Edge/Chrome浏览器插件和可以自行架设的云端。 基于浏览器插件,它通过可视化选择器理论上可以监控网页上的任意内容(文本)、除了浏览器通知,还可以配合Server酱将异动推送到微信或手机。 图片 Check酱的原理是,通过浏览器插件后台打开网页进行监测,从而完全模拟用户的真实行为,可以监控绝大部分复杂的动态网页,需要登录的各种后台页面,并(在绝大多数情况下)自动延续登录态。 除了支持网页内容(Dom)的监测,还支持HTTP状态(通过GET监测)、JSON和RSS方式。 enter description here图片 配合可以自行架设的云端,可以将监测任务同步到服务器,这样当浏览器和电脑关掉以后,监测任务依然可以定时运行 enter description here图片 一、插件的安装和使用 插件可以独立使用,只是关掉后定时监测任务不执行。 1、 安装 目前Check酱正在内测,尚未上架Edge商店,只能通过手工方式载入下载插件ZIP包(Github下载地址,无需注册),解压为目录(后文称其为A)。 打开Edge的插件页面,打开「开发者模式」,点击「Load Unpacked」,选择上边解压得到的目录A。 enter description here图片 成功载入的话,就可以看到Check酱界面了。如果失败,通常是因为解压时多了一层目录导致的,可以试试重新选择A目录的下一级目录 2、使用 添加网页监控点 安装插件后,打开要监控的网页,在网页上点击右键,可以看到「定位监测对象」一项 enter description here图片 点击后,开始初始化可视化选择器 enter description here图片 移动鼠标可以看到高亮区域,放到要监控的文字上点击鼠标左键。 注意,选择区域必须包含文本,否则会返回空。有很多文本是印在图片上的,这种也会返回空。 enter description here图片将转向到添加页面。 enter description here图片 可以修改名称、设置监控间隔时间、延迟、最大重试次数。在保存之前,最好点击CSS选择器路径一栏后的测试按钮进行测试。 如果提示「检测内容为空」,说明存在问题。再次点击进行观察: 如果发现页面打开后favicon没有出来就关了,可以增加「延迟读取」的秒数;如果打开后还是返回空,那么刚才自动生成的选择器路径可能不正确。 可以更换为浏览器自动生成的,方法如下: ① 在要检测的文本上点右键,选择「inspect/审查元素 enter description here图片 ② 这时候会自动打开开发者工具,并自动选中源码中元素的对应行。在高亮的行上点击右键,选择「复制/Copy」→ 「复制选择器/Copy selector」 enter description here图片 ③ 将复制到的剪贴板的路径填入到「CSS选择器路径」一行后,再次点击「测试」按钮进行测试。 测试通过后,点击「提交」保存监测点。 通过Server酱推送到微信和其他设备 enter description here图片 在添加和修改监测点时,填入Sendkey即可将消息推送到Server酱。 3、监测周期限制 有些任务只需要在特定的时间段执行,为了节省资源,我们添加了「监测周期限制」功能。比如某动画每周五上午十点更新,那么我们可以将「监测周期限制」设置如下: enter description here图片 这样其他时间段就不再启动监测。对于无法预知事件段的任务,使用默认的「每分钟」即可。 注意在「监测周期限制」之上,还有「监控间隔时间」。 enter description here图片 如果 「监测周期限制」 为每分钟,而「监控间隔时间」为60分钟,那么每分钟都会尝试监测,而一旦监测成功一次,那么下次监测将是60分钟后。 同时,因为执行监测任务本身也耗费时间,所以「监控间隔时间」为1分钟时,往往每隔一分钟(即每两分钟)才会运行一次任务。 4、日志查看和错误定位 为了更清楚的了解定时任务的执行情况,你可以打开「开发者工具」(F12)在 Console 标签页中可以看到任务产生的日志 enter description here图片 错误信息也会在这里以红色高亮的行显示,遇到Bug时提供日志错误截图可以帮助我们更快的定位到问题。 5、更新浏览器插件 上架商店后,可以自动升级,在此之前需要手动升级。升级方式为下载zip包解压后覆盖原有文件,再在浏览器的插件管理面板中「reload」一下。 enter description here图片 二、镜像的安装和使用 新版镜像已经将云端和远程桌面版本集成,只需一次安装都可以使用。 云端:配合自行架设的服务器,可以将任务同步到云端执行,即使关掉浏览器和电脑后监测任务也会一直运行。 远程桌面:在Docker中封装了Chrome浏览器,可以通过VNC和Web界面像在电脑上一样使用。 ⚠️ 特别说明:因为云端的网络、环境都和本机不同,所以并不保证本机能运行的任务都能在云端运行成功,一些复杂网页和有较多动态效果的网页可能失败。1、安装 架设自架版云端需要技术基础,非技术用户建议购买我们的官方版云端(将在内测完成后发布)需要docker环境。如果你没有云服务器,可以看看腾讯云轻量服务器。 2、 通过 Docker-compose 启动 登录服务器(假设其IP为IPB),在要安装的目录下新建目录 data,并使其可写: mkdir data && chmod 0755 data新建一个 docker-compose.yml 文件,将下边的内容按提示调整后粘贴保存: version: '3' services: chrome: image: easychen/checkchan:latest volumes: - "./data:/checkchan/data" environment: - "CKC_PASSWD=<这里是远程桌面的密码,写一个你自己想的>" - "VDEBUG=OFF" - "VNC=ON" #- "WIN_WIDTH=414" #- "WIN_HEIGHT=896" #- "XVFB_WHD=500x896x16" - "API_KEY=<这里是云端的API KEY,写一个你自己想的>" - "ERROR_IMAGE=NORMAL" # NONE,NORMAL,FULL #- "SNAP_URL_BASE=<开启截图在这里写服务器地址(结尾不用加/),不开留空>..." #- "SNAP_FULL=1" - "TZ=Asia/Chongqing" # - WEBHOOK_URL=http://... # 云端 Webhook地址,不需要则不用设置 ports: - "5900:5900" - "8080:8080" - "8088:80"将其中<这里是远程桌面的密码,写一个你自己想的>和 <这里是云端的API KEY,写一个你自己想的> 换成别人不知道的密码(下文称密码C和D)。注意不要包含$字符,替换完后也不再有两边的尖括号<>。 如果不希望启动远程桌面,请将 VNC=ON 改为 VNC=OFF。 保证Docker用户对此目录有写权限,并在同一目录下运行以下命令: docker-compose up -d如提示docker服务未安装/找不到/未启动,可在 docker-compose 前加 sudo 再试等待初始化完成后,访问 http://$BBB:8080( 将$BBB替换为IP B),看到 NoVNC Web界面说明容器已经启动。 服务所在的端口为: 云端:8088 远程桌面(VNC): 5900 远程桌面的Web界面(NoVNC): 8080 3、通过 Docker 启动 你也可以将 docker-compose 中的参数传给 docker 来启动: docker run -d -p 8088:80 -p 8080:8080 -p 5900:5900 -v ${PWD}/data:/checkchan/data -e API_KEY=123 -e VDEBUG=OFF -e VNC=ON -e SNAP_URL_BASE=http://localhost:8088 -e CKC_PASSWD=123 -e TZ=Asia/Chongqing easychen/checkchan:latest请将上述命令中的123替换为你想要设定的密码、将SNAP_URL_BASE换成服务器的外网IP(如果想通过手机查看截图)。 4、更新镜像 Check酱云端镜像更新后,你可以将正在运行的云端服务升级到最新版。方式如下: 首先停现有的容器: 通过 docker-compose 启动的运行: docker-compose down通过 docker 直接启动的运行 docker ps 查询到容器id,通过 docker stop 容器id 停止。 然后运行 docker pull 拉取最新版: docker pull easychen/checkchan:latest完成后再启动服务即可。 三、云端的使用 将浏览器插件对接云端 enter description here图片 点击插件右上方菜单中的云端服务。 在服务器地址一栏输入 http://$BBB:8088(将$BBB替换为IP B,这里的URL不用加key参数);在API_KEY一栏输入密码C。 点击保存,连接成功后,配置完成。 同步本地任务到云端 配置好云端以后回到列表页,每行最右边会多出来一个「电脑」图标,点击后会变成「云」图标,该任务将改为在云端执行。 enter description here图片 点击右上角 「云+箭头」的按钮,可以主动同步任务到云端。 enter description here图片 Check酱也会每十分钟自动同步一次 云端截图 Check酱自架云端支持对网页(dom)类型任务进行截图,可以通过给镜像传递环境变量来开启: SNAP_URL_BASE=<开启截图在这里写服务器地址,不开留空> #如 http://ip.com/ SNAP_FULL=1 #完整网页长图 可参考上文的docker-compser.yml。添加环境变量后重启服务即可。 注意 截图功能需要较大的内存,部分服务器可能会报错 云端网络和本地不同,可能会超时失败,请适当增加延时,并将取消完整截图 云端任务的安全性 Check酱云端任务的原理是将cookie同步到云端,然后用浏览器查看,本质和用户操作一样。但因为出口IP可能是机房和数据中心,频次太高也有被风控的可能。如果将云端部署在家里,则和在家用电脑访问效果一样。 云端错误排查 通常来讲,出现本地任务可以执行,云端不能执行的问题,是因为两者网络环境、浏览器软件存在差异,比如: 页面结构每次都会变动:比如一些网站的首页,建议进入分类列表页面选择监控点 电脑网络和云端网络不同:在浏览器中可以访问的内容,在数据中心可能访问不到 CDN更新延迟:电脑和云端CDN节点刷新未完成,会造成一边可用一边不可用,等待更新完成后再监控 浏览器插件改变了网页结构:比如本地通过 AdBlock 过滤了广告,但云端没有,造成结构不同,监测失败 由于服务器内存通常没大家电脑大,所以很多在本地执行OK的任务同步到云端后会因为「延迟读取」秒数太小中途停止而失败。如果遇到类似情况,请尝试增加「延迟读取」
技术搬砖
# docker
# 网页变化
# 监控
admin
3年前
0
3,252
2
2021-04-28
用宝塔面板Docker管理器,自建Bitwarden个人密码服务器
bitwarden 是一款开源的密码管理器,支持 Web、Chrome,很快将要发布 Firefox、Opera 以及 Edge 浏览器插件,拥有 iOS、Android 客户端,采用本地加密,云同步的方式宝塔安装Docker 进入到宝塔面板的软件商店,搜索docker安装即可。 01图片 获取镜像 打开docker管理器,点击获取镜像,输入Bitwarden_rs的官方镜像bitwardenrs/server后点击获取镜像。 02图片 创建容器 点击创建容器按钮 填写端口映射中的容器端口:80,服务端口:6666(6666可以自定义) 填写目录映射中的服务器目录:/www/wwwroot/bitwarden.liubing.me(该目录可以自定义),容器目录:/data 填写内存配额,根据自己服务器的配置按需填写 提交创建容器 点击容器名称,修改容器名称为Bitwarden以方便辨认 端口映射和目录映射填写完成后一定要点击+号进行添加03图片 04图片 添加站点 一般可以添加一个二级域名,按自己需要起名字即可,由于我用的cloudflare的服务,所以以这个为演示,阿里云、百度云等其他厂商添加二级域名都是差不多的。 添加一个A记录,名字为bitwarden,指向的IP为你服务器VPS的IP地址,最后的访问地址就是bitwarden.liubing.me了。 05图片 域名准备好后,在宝塔里面添加一个站点,FTP、数据库均不用创建,PHP版本选择纯静态。 06图片 网站添加完成后设置SSL,自己准备证书,或者用免费的,我用的一直是cloudflare颁发的证书。 设置完毕后开启强制Https 07图片 最后添加一个反向代理,名称随意填,目标URL为http://127.0.0.1:6666,端口号和上面创建容器时服务端口保持一直。 08图片 完成自建 上述步骤都做完后别忘了在宝塔面板安全-防火墙中放行端口6666。 最后不出意外的话访问https://bitwarden.liubing.me就能看到界面了。 首次完成安装页面是英文的,自己可以创建一个账号登录进去,在设置-选项-语言中设置语言。 09图片 10图片 其他问题 一般自建的服务都是自己用的,所以如果想关闭注册的话可以按照下面的方法做: 在docker管理器中点击刚才创建的容器的状态绿色图标,停止容器运行,然后删除容器(删除容器后不会删除数据) 11图片 在VPS中运行下面的命令重新运行容器,其中Bitwarden为容器的名字,SIGNUPS_ALLOWED=false代表禁止注册,/www/wwwroot/bitwarden.liubing.me为上面创建容器时所写的服务器目录,/data为容器目录,6666:80代表上面创建容器时的服务端口:容器端口 docker run -d --name Bitwarden \ -e SIGNUPS_ALLOWED=false \ -v /www/wwwroot/bitwarden.liubing.me/:/data/ \ -p 6666:80 \ bitwardenrs/server:latest 12345SHELL 运行完成后在容器列表里就又能看到了。 然后再去试下创建账号就会出现一个不能创建账号的错误提示。 12图片 其他配置 参考项目的wiki即可: https://github.com/dani-garcia/bitwarden_rs/wiki 插件及App下载 可以到bitwarden官网自行下载:https://bitwarden.com/#download 连接自建的服务 以CHrome的插件为例子,如果之前有安装及登录过,可以在设置中退出登录。 点击左上角的设置图标,填写自建服务器的URL保存后登录即可。 13图片 14图片 结语 最后就可以愉快的在浏览器和手机上愉快的使用了,顺便说句:我的密码存储我做主,再也不用害怕密码忘记的事了,也可以记录些银行卡等隐私信息,随时复制。 15图片 16图片
技术搬砖
# docker
# Bitwarden
admin
4年前
0
3,567
1
上一页
1
2
3
下一页