背景 先打个招呼:下文里的「大鹅」「大鹅蛋」「喵喵内核」,分别对应大家熟悉的那套透明代理组合。 之前我在 Cudy TR3000 上吃过大鹅蛋。实习租房那会儿宽带只有 200Mbps,测下来代理下行能跑满,CPU 也看着还行,一度觉得这台小路由自己扛透明代理就够了。 离职回家以后带宽粗了不少,Cudy 就开始露馅:直连能跑满的速度,一走代理就掉下来。网口挺体面,真干活还是那颗小 SoC 扛不住加密解密和规则匹配。 内存也是坑。Cudy 只有 512MB,挂美西这种高延迟节点时,TCP 窗口会跟着 RTT 往上抬,缓冲区吃得很凶。同样的协议,亚太低延迟节点更容易把带宽打满,美西反而跑不满——最开始我还以为是节点质量问题,后来才发现小路…
阅读全文
02本站是用 Nuxt v4 + Nuxt Content v3 + i18n 搭出来的纯 SSG 博客。开站时随手定了一个看似无关紧要的策略——所有页面 URL 以 / 结尾。 听起来一行配置就该完事的事,做下来才发现 Nuxt 在尾斜杠这件事上至今没有一个统一的官方开关(nuxt/nuxt#15462 这个 issue 从 2022 年挂到现在),整套策略最后是靠六个不同层面拼出来的。这篇就把站点里所有跟 trailing slash 相关的配置完整盘一遍,留作给自己和后人的备忘。 为什么要尾斜杠 简单提一句动机: 同一篇文章 /2026/05/28/foo 和 /2026/05/28/foo/ 在搜索引擎眼里理论上是两个 URL,…
阅读全文
03深夜的“冲动”消费 前几天深夜 0 点,躺在床上百无聊赖刷着京东,居然奇迹般地逮到了这台常年断货的 Xiaomi Book Pro 14 2026 顶配版的现货!这突然弹出来的购买按钮,简直像是在跟我招手。虽然脑子里天人交战了一番,最后我的手还是非常诚实地按下了付款键。 虽说错过了首发折扣,原价 10499 让人隐隐有些肉疼,但好在还能叠一波本地的国补,实付 8999 拿下的价格也算是“真香”了。仔细想想一点也不亏,毕竟也是时候让我那台任劳任怨、被我折腾了四年的老伙计 ThinkPad T14 Gen2i 顺理成章地退居二线享清福啦。 Linux 兼容性:一场“赌博”与测试计划 这台本子在近一个月的自媒体测评中表现亮眼,我也不过多介…
阅读全文
04在去年的 11 月,我入手了一台新的国行版的小米 15 作为我的主力机。其实之前手上的 Redmi K70 Ultra 与这台小米 15 是同一年发布的产品,性能上也不相上下,但我在 Gap Year 期间在全国多地旅行,意识到没能将自己所见的夜景拍下是一件挺可惜的事,于是就想换一台拍照更好的手机。新发布的小米 17 在价格上正处于高位,且相对于 15 来说并没有太大的提升,所以我就直接入了小米 15。 入手以后,我按照自己的使用习惯打开了设置中的「谷歌基础服务」,安装好「Google Play」后便正常使用。但就在这几个月的使用过程中,我发现我的 fcm 推送——无论是 outlook 邮件通知,还是某外观形似纸飞机的即时通讯软件…
阅读全文
05如果大家对目前中国大陆境内的网络环境足够了解,应该就会知道 dl.google.com 在很多情况下是可以直连访问的。比如,你可以通过 google.cn/chrome/?standalone=1 这个 URL 直接在境内的网络环境下下载 Chrome 的离线安装包,最终的下载域名就是 dl.google.com。 我平常的使用习惯是 24 小时开启代理工具的 TUN,让所有流量先经过一张虚拟网卡,再根据分流规则自动判断要不要走代理。这个习惯大部分时候都挺省心的——直到最近我用 yay 滚 Arch 的时候,突然遇到了 dl.google.com 的 SSL 连接建立失败。 而且不止是 yay,我的浏览器也返回了相同的结果: 当时我…
阅读全文
06Vercel 默认的缓存配置其实并不合理,但鲜有人注意。 先看效果 分析 测试方案 这两张图都是我博客在 PageSpeed Insights 上测得的,测试步骤如下: 部署 在 PageSpeed Insights 进行第一次测试 等待 120s,防止 PageSpeed Insights 拿之前的结果糊弄你 进行第二次测试,取第二次测试的结果 取第二次结果的目的是为了让 PageSpeed Insights 所命中的 Vercel CDN 节点完成回源,并将内容缓存在 CDN 节点上,这样第二次访问的时候就会直接从 CDN 的缓存中得到结果,不需要回源。 那我们看图一的测试结果,正常吗?针对首页的单个 html 加载时长达到了…
阅读全文
07背景 在我的一台优化线路 vps 上,我的 443 端口要承担两个职责 作为我博客对中国大陆境内访客的服务提供者,同时承担 https 流量加解密和 static server 的职责 把某些特殊用途的流量特征通过一些手段伪装成某些知名、常见、且被广泛允许的站点的 https 流量 (没错,是 Reality) 因此,我需要一个能够在同一台服务器的同一端口上同时处理这两种职责的方案。 方案选择 其实我很早就知道 Nginx 的 stream 关键词可以实现 Layer 4 (即 TCP 字节流原样转发)下基于 SNI 识别实现的分流功能,但我其实一直是 Caddy 的忠实用户,写了不少 Caddy 相关的博文。因此,尽管 Nginx…
阅读全文在上一篇博客中,我提到过一个核心观点——对于流量少、访客的地理位置不集中的小型站点,DNS 冷启动不是偶发的“意外”,而是一种被动的“常态”。 对于大多数站长而言,自己的站点流量不是一时半刻就能提上去的,因此我们的访客大概率都要走完一遍完整的 DNS 解析过程。上一篇博客中我提到过更改为距离访客物理位置更近的权威 DNS 服务器来提升速度,但 TLD(域名后缀)的 Nameservers 是我们无法改变的,也就是下图中红色背景的那一段解析过程。 sequenceDiagram autonumber participant User as 用户/浏览器 participant Local as 本地DNS递归解析器 participa…
阅读全文
09当我们谈论网站性能时,我们通常关注前端渲染、资源懒加载、服务器响应时间(TTFB)等。然而,在用户浏览器真正开始请求内容之前,有一个至关重要却鲜少在性能优化方面被提及的部分—— DNS 解析。对于默默无闻的小型站点而言,“DNS Cache Miss”(缓存未命中)或我称之为“DNS 冷启动”,会成为绕不过去的性能瓶颈,也就是本文标题所提到的“西西弗斯之石”。 神话的隐喻:DNS 解析的漫长旅程 要理解这块“石头”的重量,我们必须重温 DNS 解析的完整路径。这并非一次简单的查找,而是一场跨越全球的接力赛: 起点:公共 DNS 服务器 — 用户发出请求,公共 DNS 服务器尝试在缓存中寻找答案。 首次“推石”:根服务器 — 缓存缺失…
阅读全文我最近一阵子在重构我的博客,恰巧之前一阵子准备秋招的时候背八股时看到了 HTTP/2 的服务端推送,于是便尝试在部署阶段为我的博客配置好 HTTP/2 的服务端推送,试图以此来进一步优化首屏加载速度。 HTTP/2 服务端推送为什么能提升首屏加载速度 如下图,在传统的 HTTP/1.1 中,浏览器会先下载 index.html 并完成第一轮解析,然后再从解析出的数据中拿到 css/js 资源的 url,再进行第二轮请求,在 tcp/tls 连接建立后最小需要两个 RTT 才能取回完整渲染页面所需的资源。 sequenceDiagram participant Browser participant Server Browser-&g…
阅读全文Nuxt Content 是 Nuxt 生态中用于处理 Markdown、YAML 等内容的强大模块。最近,我在使用 Nuxt v4 + Nuxt Content v3 重构博客(原为 Hexo)时,遇到了一个棘手的问题:v3 版本的默认查询 API 并未直接提供对数组字段进行“包含”($contains)操作的支持。 例如,这是我的正在写的这篇博客的 Front Matter: --- title: Nuxt Content v3 中数组字段的筛选困境 date: 2025-10-20 21:52:59 sticky: tags: - Nuxt - Nuxt Content - JavaScript --- 我的目标是创建一个 T…
阅读全文
122023 年 8 月,CA/Browser Forum 通过了一项投票——不再强制要求 Let’s Encrypt 等公开信任的 CA 设立 OCSP Server 2024 年 7 月,Let's Encrypt 发布博客,披露其计划关闭 OCSP Server 同年 12 月,Let's Encrypt 发布其关闭 OCSP Server 的时间计划表,大致情况如下: 2025 年 1 月 30 日 - Let’s Encrypt 不再接受新的包含 OCSP Must-Staple 扩展的证书签发请求,除非你的账号先前申请过此类证书 2025 年 5 月 7 日 - Let's Encrypt 新签发的证书将加入 CRL URL…
阅读全文在今年八月的时候,我这边所在的一个 Github Organization 在私有项目开发阶段频繁触发 CI,耗尽了 Github 为免费计划 (Free Plan) 提供的每月 2000 分钟 Action 额度(所有私有仓库共享,公有仓库不计)。大致看了下,CI 流设置得是合理的,那么就要另寻他法看看有没有办法去提供更宽裕的资源,因此也就盯上了文章标题中所提到的 Github Action Self-hosted Runner。 对于这个 Self-hosted Runner,与 Github 官方提供的 runner 相比,主要有以下几个优势 针对私有仓库,拥有无限制的 Action 运行时长 可以自行搭配更强大的硬件计算能力…
阅读全文
14去年夏天,我花了不少时间搭建博客图床,核心目标是分地区解析 DNS,让国内外访客都能快速加载图片。技术方案看起来完美无缺,直到最近群友反馈首次访问时图片加载很慢,我才发现问题所在。 955 毫秒的 DNS 解析时长! 这个数字让我大吃一惊。访客点开博客后,光是确定图片服务器位置就要等将近一秒,这完全抵消了 CDN 优化的效果。 为什么之前没发现? 主要是 DNS 缓存的"功劳"。它会为后续访问记住解析结果,让我的本地测试和复访测试看起来都很正常。直到用户反馈,结合最近准备秋招复习的 DNS 解析流程(递归查询、权威查询、根域名、顶级域名等),我才定位到问题:首次访问时的 DNS 解析延迟。 DNS 解析流程分析 让我们看看访客访问…
阅读全文
15上回回顾:当 morphdom 遇上 Vue 在上一篇文章中,我们经历了一场 Markdown 渲染的性能优化之旅。从最原始的 v-html 全量刷新,到按块更新,最终我们请出了 morphdom 这个“终极武器”。它通过直接比对和操作真实 DOM,以最小的代价更新视图,完美解决了实时渲染中的性能瓶颈和交互状态丢失问题。 然而,一个根本性问题始终存在:在 Vue 的地盘里,绕过 Vue 的虚拟 DOM (Virtual DOM) 和 Diff 算法,直接用一个第三方库去“动刀”真实 DOM,总感觉有些“旁门左道”。这就像在一个精密的自动化工厂里,引入了一个老师傅拿着锤子和扳手进行手动修补。虽然活干得漂亮,但总觉得破坏了原有的工作流,…
阅读全文需求背景 在最近接手的 AI 需求中,需要实现一个类似 ChatGPT 的对话交互界面。其核心流程是:后端通过 SSE(Server-Sent Events)协议,持续地将 AI 生成的 Markdown 格式文本片段推送到前端。前端负责动态接收并拼接这些 Markdown 片段,最终将拼接完成的 Markdown 文本实时渲染并显示在用户界面上。 Markdown 渲染并不是什么罕见的需求,尤其是在 LLM 相关落地产品满天飞的当下。不同于 React 生态拥有一个 14k+ star 的著名第三方库——react-markdown,Vue 这边似乎暂时还没有一个仍在活跃维护的、star 数量不低(起码得 2k+ 吧?)的 mar…
阅读全文
17更新目标 node-sass -> sass ( dart-sass ) 减少影响面,非必要不更新其他依赖的版本 在前两条基础上,看看能否提升 node.js 的版本 抛弃 node-sass 的理由 node-sass 已经停止维护,dart-sass 是 sass 官方主推的继任者 node-sass 在 windows 下的安装非常麻烦,npm 安装时需要开发机上同时装有 python2 和 Microsoft Visual C++ 在安装 node-sass 时,需要从 Github 拉取资源,在特定网络环境下成功率并不高 项目依赖版本现状 node@^12 vue@^2 webpack@^3 vue-loader@^…
阅读全文前端「量子态」现象的首次观测 这事说来也邪乎,半个月前吃着火锅唱着歌,在工位上嘎嘎写码,发现一个诡异的 bug。作为如假包换的人类程序员,写出 bug 是再正常不过的事情了,但这 bug 邪门就邪门在我一打开 F12 的 DevTools 观察相关的 dom 结构,这 bug 就自动消失了;再把 DevTools 一关,Ctrl + F5 一刷新页面,Bug 又出现了。 下面是使用 iframe 引入的 demo 这 Bug 给我整得脑瓜子嗡嗡的,我又不是物理学家,写个前端怎么量子力学的观察者效应都给我整出来了(? 观测者效应(Observer effect),是指“观测”这种行为对被观测对象造成一定影响的效应。 在量子力学实验中,…
阅读全文
19事情的起因是需要在网页上展示一个时长约为 5 分钟的产品展示视频,拿到的 H264 编码的原文件有 60MB 大。高达 1646 Kbps 码率的视频文件通过网络传输,烧 cdn 流量费用不说,对于弱网环境下的用户体验也绝对不会好。因此必须在兼顾浏览器兼容性(太好了不用管 IE)的情况下,使用更现代的视频压缩算法进行压缩。 哪些压缩算法是目前的主流? AV1 AV1 作为目前压缩效率最高的主流视频编码格式,在 2025 年的今天已经在 YouTube、Netflix、Bilibili 等视频网站全面铺开,毫无疑问是最值得优先考虑的选择;除了优异的压缩效率以外,AV1 免版税的优势使得各硬件厂商和浏览器内核开发者可以无所顾忌的将 AV…
阅读全文
20这是精弘内部的图床开发时遇到的事情,大一的小朋友反馈说 el-image 和 el-table 打架了。 demo 的 iframe 引入 看到后面的表格透出 el-image 的预览层,我的第一反应是叫小朋友去检查 z-index 是否正确,el-image 的 mask 遮罩的 z-index 是否大于表格。 经过我本地调试,发现 z-index 的设置确实没问题,但后面的元素为什么会透出来?谷歌搜索一番,找到了这篇文章 给 el-table 加一行如下代码即可 .el-table__cell { position: static !important; } 经本地调试确认,这一方案确实能解决问题,但为什么呢?这就涉及到 Sta…
阅读全文
21基础原理 如果你尝试在搜索引擎上检索本文的标题,你搜到的文章大概会让你使用下面两个 API。我希望你用的搜索引擎不至于像某度一样灵车到 2025 年还在让你使用基于 Flash 的 ZeroClipboard 方案 document.execCommand 2012 年不止有世界末日,还有 IE 10。随着 IE 10 在当年 9 月 4 日发布,execCommand 家族迎来了两个新的成员—— copy/cut 命令(此说法来自 Chrome 的博客,而 MDN 认为 IE 9 就已经支持了)。三年之后,随着 Google Chrome 在 2015 年 4 月 14 日的发布的 42 版本对 execCommand 的 cop…
阅读全文
22事情的起因是因为精弘的前技术总监抱怨学校的内网服务器无法连接外网,从而导致 apt 安装与更新异常困难,需要手动从源中下载软件包、软件包的依赖及其依赖的依赖。。。然后将这些包通过 sftp/rsync 一类的手段传到服务器上手动安装。 于是本文应运而生,我们可以在本机使用 Caddy (Nginx 当然也行)反代一个 APT 源镜像站,通过 ssh 隧道建立端口转发,这样就可以在内网服务器上访问到本地的 Caddy 服务器,进而访问到外网的镜像站。 前提条件 主控机(你自己的电脑)能够通过 ssh 直接连接电脑(可以是使用一些网络工具),而不是先通过 ssh 登陆到一台中转机,再从中转机登陆到目标服务器。后面这种情况当然也可以使用类…
阅读全文
23缘起 前不久在京东自营看到我馋了很久的 Cudy TR3000 有 ¥153 的折扣价,虽然比起 ¥130 的史低价(甚至 ¥110 的凑单史低价)还有些距离,但已经到我的可接受范围内了,于是果断下单剁手了这台我心心念念的 Cudy TR3000 迷你路由器,以此来缓解我的开学前综合症(一种精神性疾病) 这台路由器使用 Type-C 供电,拥有一个 2.5Gbps 的 WAN 口和一个 1Gbps 的 LAN 口,在此基础上还有一个 USB 口可用于打印机共享、挂载外接存储、安卓手机 USB 共享网络等多种用途。更让我心动的地方在于其小巧的体型,非常适合出差、旅行、短期租房等场景。考虑到接下来一段实习可能会有租房需求,于是便趁此机会…
阅读全文
24确信,是 cloudflare workers 用上瘾了 在「使用 Github Action 更新用于 rpm 打包的 spec 文件」一文中,我利用 Github Action 实现了自动化的 spec 版本号更新,配合 Fedora Copr 的 webhook 就可以实现 Copr 软件包更新的自动化构建。看似很完美,但缺少了一个构建状态的监控机制,这导致出现构建错误的时候我不能及时得到通知(无论构建错误是 spec 本身的问题或者是构建时的网络环境问题)。 西木野羰基 提出 notifications.fedoraproject.org 可以配置通知,Filters 的 Applications 选项中有 copr,但很可…
阅读全文
25起因 受一些客观因素的影响,微精弘前一阵子针对学校教务系统的数据爬取服务状态出现了非常不稳定的状态,而后端在设计初并没有考虑到异常告警机制,恰逢现任员工都身陷期末周的痛苦之中,我这种计院 Lite 专业的精弘老人就打算实现一个针对「微精弘主后端 <-> funnel 爬虫服务 <-> 教务系统」这一条链路的告警机制。旨在短期内(即期末周结束之前)填补微精弘的后端服务告警机制的空白,让运维人员能够及时收到并处理排查后端网络链路的异常情况,尽最大努力保证服务在线率,保障工大本科生在期末周内使用体验。 需求分析 如果你不知道微精弘的具体架构实现,这里有一篇由前技术总监提笔并由现任技术总监完善的架构杂谈「微精弘 |…
阅读全文
26起因 早在去年 10 月,我就写过一篇《创建 b23.tv 追踪参数移除 bot》。记录了部署 b23.tv 的追踪参数移除 Bot 的部署方案。其中提到的 TG Bot 随着服务器到期不再续费也一同落灰了——公益服务总是这样,开始时满腔热血,随着时间散去没有多少人能坚持投入成本,徒留下一地鸡毛。 大概半个月前,我在群里看见 Asuka Minato 开发的群消息总结 Bot,整体部署在 Cloudflare Workers 上,在保证零运营成本的情况下有着相当非常不错的在线率保证,因此便考虑将这个 Bot 迁移到 Cloudflare Workers 上。选用免费的 serverless 能够有效延长服务的可持续性,它不需要额外投…
阅读全文
27小试一下? 在开始阅读后面的内容之前,或许你可以试试看你正在使用的浏览器能不能访问下面两个链接: https://digicert-tls-ecc-p384-root-g5-revoked.chain-demos.digicert.com/ https://revoked-isrgrootx1.letsencrypt.org/ 这两个链接分别是由 digicert 和 Let's Encrypt 维护的,特意维持了一个证书没过期,但被 CA 吊销的状态。 在我的 Firefox for Linux 上,两个链接我都无法打开。 这是预期行为。Firefox 在与目标站点建立 https 链接之前,先向 CA 提供的 OCSP 服务器打…
阅读全文
28写在前面 一个月前,我发现小爱课程表中针对我学校的教务系统导入系统年久失修,因此我便决定自己另立门户、独立维护一版针对 ZJUT 教务系统课表信息导入的适配项目。 整个流程不难,如果你对于 js 代码和爬虫技术有简单的了解,那么很快就可以上手,我大概只花了 2 小时就完成了 阅读文档-编写代码-自测通过-提交审核 的过程,并在一周内正式上架,得到了身边同学的认可。 在适配过程中,一定要仔细阅读官方文档,所有技术性问题几乎都能通过官方文档解决。这篇博客我尽量详细记录了使用 fetch 打请求获取 json 的正方教务系统适配方案,仅供参考。 官方文档地址: 小爱课程表开发者工具使用教程 我的代码: Github 运行原理 小爱课表获取…
阅读全文
29waline 更新到 V3 版本已经是九个月前的事情了,眼瞅着 hexo fluid 主题并没有带我更新的意思,我就打算自己更新到最新版,结果遇到了两个坑,写文供大家参考。 在 Hexo 目录下的 _config.fluid.yml 文件中找到 waline 的 cdn,将版本号指向最新版。 - waline: https://registry.npmmirror.com/@waline/client/2.15.8/files/dist/ + waline: https://registry.npmmirror.com/@waline/client/^3/files/dist/ 插曲一——waline 不加载 再次部署博客,我遇到了…
阅读全文
30前两天给自己的 N100 小主机重装成了最近发布的 Fedora 41 ( KDE ),也是花了不少时间把整个系统调成自己熟悉的样子,因此开一篇博客记录一下。以下仅为我个人的 HomeServer 小主机使用,不具有普适性。 换官方源 我这里比较适合用上交的源,直接参考他们的文档。 sudo sed -e 's/^metalink=/#metalink=/g' -e 's|^#baseurl=http://download.example/pub/|baseurl=https://mirror.sjtu.edu.cn/|g' -i.bak /etc/yum.repos.d/{fedora.repo,fedora-updates.re…
阅读全文前言 Follow 从今天开始不需要邀请码就可以开始使用部分功能了,除了只能订阅五个订阅源、成就系统没开放、签到不能获得 power 以外,还有部分功能没有解锁(如下图) 我注意到 Follow 的认证机制目前对于 Hexo 用户还是相对不友好的,起码对于 Hexo 用户来说。 「内容」方案要我们在网页(也可能是 rss,follow 没有给出非常明确的指示)上添加非常明显的一段文本,我并不是很喜欢这种行为。 This message is used to verify that this feed (feedId:56144913816835091) belongs to me (userId:70410173045150720)…
阅读全文
32前一阵子收到了这么一条来自 waline 的评论提醒。 New comment on 竹林里有冰的博客 【网站名称】:竹林里有冰的博客 【评论者昵称】:专业数据库 【评论者邮箱】:rakhiranijhhg@gmail.com 【内容】:总之,优化专业数据库对于保持数据准确性、提高系统性能和推动业务成功至关重要。通过遵循本文中概述的策略,您可以提高数据库操作的效率并释放新的增长机会。 【地址】:https://zhul.in/2021/04/04/yay-more/#66f7a8889ab78865d5f5ae19 评论的内容不仅透露着一股 AI 味,还和文章内容可谓是一点关系都没有,点开评论者的网站一看,一股塑料机翻味,怕是又是个…
阅读全文
33为什么要换掉随机图片 API 因为 API 太慢了。根据 PageSpeed 的测速,使用 API 的图片加载时间来到了整整 2.5s,这似乎有些不可忍受。 Vercel 冷启动问题 当初年少无知,为了实现 banner 随机背景图,选择了使用 vercel 创建随机图片 API。这带来了一些问题,首先 vercel 在站点一段时间没人访问以后会进入一种类似休眠的模式,下一次启动将会经历一个冷启动(cold start)的过程。我认为这对于一个图片背景的随机 API 而言是不可忍受的。 观察图上就可以发现,第一次访问时花费了 1.9 秒,第二次只需要 0.5 秒,这是因为第一次是冷启动,需要花费更多时间。 多一次网络请求 抛开冷启动…
阅读全文
34我宿舍里入口处有一张公用的桌子,上面有一个烧水壶。根据生活经验,当用手摸烧水壶外壳能感受到明显热量时,水壶内的水大概是两小时内烧的,绝对能喝;但如果用手摸烧水壶外壳感受不到明显热量时,水壶内的水就不知道是什么时候烧的了,可能是三小时前,也可能是三天前。此时,在不寻求外部科学仪器介入的情况下,唯一能做的是询问寝室成员上一次水是谁烧的,是什么时候烧的。但寝室成员并不总是能够及时回答,可能在睡觉,也可能不在寝室里,还有可能出现记忆错乱。 因此,我们需要一种可靠的方案获取上一次烧水时间。 前两天陪黄老板出门吃宵夜的时候和他提到了这个难题,我提出在烧水壶附近加装物理按钮,按动时向局域网内的 HomeServer 发送请求记录准确的烧水时间。他…
阅读全文
35几个月前,由于众所周知的原因,中国大陆境内失去了所有公共的 dockerhub 镜像(或者说是反代)。网上随即涌现了一批自建 dockerhub 反代的,有用 Cloudflare Workers 的,也有用 nginx 的,甚至还有自建 registry 的。 我使用 caddy 去反代 dockerhub 的原因很简单,一是配置简单,二是通过一台国内访问质量良好的境外服务器进行反向代理的访问质量会比 Cloudflare 减速器好很多。 在网上一阵搜索后,并没有发现任何使用 caddy 去反向代理 dockerhub 的文章, 于是本文应运而生。 遇事不决先抓包 为了弄清楚 docker 从 dockerhub 拉取镜像的过程,…
阅读全文
36这次迁移主要是两方面原因,一来是我安装了 Arch Linux 的 VPS 要过期了,续费价格过高,没有续费的动力;二来是手上的 VPS 越来越多,逐渐意识到 Arch Linux 作为滚动发行版,每次安装新的软件都要 Syu 甚至重启系统,实在没有太多的精力去维护,这也是为什么 Arch Linux 仅适合桌面发行版。 原本在 Arch Linux 上部署的 rustdesk server 我是按照这篇文章「(水文)在archlinux上部署rustdesk服务端」部署的。本身没什么技巧,直接从 AUR 安装现成的 rustdesk-server-bin,使用 systemctl 启用 rustdesk-server-hbbr.s…
阅读全文
37自建的图床自 8 月 13 日正式启用以来,已经过去一周多了,具体的费用是多少呢?原先设计的 0 额外投入有没有实现呢? 这是我的博客访问统计,在这一周多的时间内,一共有 1.27k 次页面访问,被 671 个访客访问了 769 次,平均下来每天也有一百多次的页面访问。 Cloudflare Workers 和 Cloudflare R2 的免费额度全部够用,用量全部小于免费额度的 1%。 又拍云联盟每年可以领取 67 元的代金券,平均每天控制在 0.18 元内即可实现白嫖。 可以看到,这一套图床在我博客当前和可见的未来的访客情况下,在不被人恶意刷流量的情况下,是不需要投入除域名续费以外的其他成本的。
阅读全文
38前面三篇小记分别讲述了图床的整体架构、用 Workers 构建 Restful API 和 自动更新部署 SSL 证书,这一篇c处理由此带来的图片上传问题,主要是要为 Typora 编写自动上传脚本,并为博客原有的图片进行迁移。 自动上传脚本 主要还是给 Typora 用,实现这种效果 #!/bin/bash HOST="upload.example.com" CDN_HOST="cdn.example.com" UPLOAD_PATH="uploads/$(date +%Y/%m/%d)" AUTH_TOKEN="1145141919810" webp=false markdown=false force=false keep=f…
阅读全文
39为什么要自动更新? 众所周知,为站点开启 https 访问需要获得对应 host 的 ssl 证书,而如果希望证书被访客的浏览器所信任,需要拿到由 Certificate Authority (CA) 签发的 ssl 证书。在前一阵子那波 BAT 等大厂提供的云服务停止发放免费的由 TrustAsia/DigiCert 签发的一年有效期免费 ssl 证书之后,市面上已经没有被广泛信任的 CA 签发的免费的一年有效期的 ssl 证书了,于是不得不用回由 Let's Encrypt/ZeroSSL 等 CA 签发三个月免费证书。 但话又说回来,三个月有效期确实不太够,一年有效期的证书就一年一更,手动申请部署也不麻烦;三个月有效期的证书手…
阅读全文
40访问 R2 的两种方式 一般来说,想要访问 Cloudflare R2 中的文件,会有两种方式。 一种是在 R2 的设置界面设置自定义域 另一种是通过 Cloudflare Workers 进行访问 那么应该选择哪种?选择 Cloudflare Workers! 为什么是 Cloudflare Workers? 要回答这个问题比较困难,但可以回答另一个问题——「为什么不设置自定义域实现直接访问?」 自定义域的访问存在限制 设置自定义域的访问方式存在较多的限制,让我们先来复习一下上一篇博客中提到的 DNS 解析方案 1 在这里,我们需要将图床访问域名通过 NS 接入 DnsPod 实现境内外的分流,但 R2 所允许设置的自定义域必须是…
阅读全文
41一直以来,我使用的都是使用付费的第三方图床,可惜最近几年为了节省成本,境内的稳定性出现了一些问题。过去一年中光是我本人遇到的无法访问的情况就有三四次,其中两次持续时间超过 2 小时,甚至有网友特意来 at 我告知我博客使用的图床出问题了,还有两次是在我作品验收前 24 小时内出现,幸亏我及时切换了资源链接。此外,境外 CDN 也从原先的 Cloudflare 换掉了,目前海外的解析结果似乎只有一个在美国的节点,其余地区(尤其是日本香港新加坡等常用的落地地区)的访问质量不佳,Google 的 page speed test 甚至提示我的图片拖慢了网站加载速度。 基于上述种种原因,我开始选择自建图床,前前后后折腾了快一周后,新图床终于投…
阅读全文
42纵使安卓下有小黄鸟 HttpCanary 这种抓包神器,但手机一块 6 英寸的小屏实在是不方便分析流量情况,还得是 PC 的屏幕更大一些,处理起流量信息来更得心应手一些。 把话说在前面,目前的安卓抓包有不小的限制 Android 7 以下的版本: 直接以普通用户的权限安装 ssl 证书即可被信任 Android 7 以上的版本: 安全性较低的应用: 需要使用 root 权限将证书移动至 /system/etc/security/cacerts使证书被系统信任 安全性较高的应用(比如微信 7.0 以上的版本): 在满足上一条条件的情况下,需要阻止第三方应用使用自带的 ssl 证书信任范围(绕过 SSL Pinning)。通常情况下需要…
阅读全文
43因为收到通知,寝室过两天要断电 20 分钟,所以需要打开 N100 家里云的来电自启功能。 正常关机短暂等待数秒后,开机,狂按 Delete 键进入 BIOS。 在 Advanced 选项中选择「OEM Configuration」 可以在最后一行「AC Power Loss」中选择模式。 Power Off: 关闭相关功能。 Power On: 传统意义上的来电自启,只要接通电源就会自启动。 Last State: 只有在上次关机是意外断电导致时,接通电源才会自启动。
阅读全文
442024.08.20更新 我将境外的 Github Pages 解析停了,所有流量全部指向我的 HK 的 vps。 访问对方站点 /?about/ 时,在我服务器 /about/ 收到了一个奇怪的请求,访问对方别的路径时也会在我服务器的对应路径收到请求,UA 伪装成了 Google 家的爬虫: (关于为什么有 Mozilla 字段,可以参见 《是的,所有现代浏览器都假装自己是火狐》) 这个 ip 的归属地是新加坡 Cogent,合理怀疑是对方的源站 IP(也有可能只是对方用于请求的爬虫 ip)。直接通过 ip 访问对方站点,发现是 lnmp 的安装成功提示: 我注意到对方站点在 html 结尾处加了如下字段 xxfseo.com 似…
阅读全文
45在今年的早些时候,我在 COPR 看到了一个新出现的名为「allow SSH」的按钮。 我在 COPR 的 User Documentation 中找到了对应的描述。 Sometimes it is useful to manually debug failed builds not locally but within the Copr infrastructure. That’s why it is possible to allow SSH access to a copr builder. More information in the SSH access to Copr builders blog post. COPR…
阅读全文
46我寝室有一台使用 wifi 连接的 HP Laser 103w 打印机,这些天刚好布置了新的 HomeServer,因此来记录一下这台打印机的配置过程,根据 HP 官网驱动包的名字「HP Laser 100 and HP Color Laser 150 Printer series Print Driver」推断,此过程应该能适用于所有的 HP Laser 100 及 HP Color Laser 150 系列的打印机。 打印机联网 首先使用 Windows 操作系统完成打印机的联网工作,在路由器的网页管理界面可以看到这台打印机的局域网 ip 是 192.168.123.20 ,记录备用。如果有条件的话,尽量将打印机的 MAC 地址…
阅读全文
47最近跟风整了一台 n100 的迷你主机装了个 Archlinux 当 HomeServer,搭配上了显卡欺骗器,平常一直远程使用,因此需要实现稳定的远程桌面连接。开源软件 Rustdesk 本身对 Linux 的适配尚可,可惜官方提供的服务器位于境外,且前一阵子因为诈骗相关的风波使得官方对连接做出了一些限制,应当使用自建服务器或者 ip 直连。 单从网络安全的角度出发,最佳实践应该是通过 wireguard 或者别的协议先接入局域网,然后使用局域网内的 ip 直连,这是最稳妥的,但我有点懒,而且我可能会在多个设备上都有控制 HomeServer 的需求,给所有设备配置 wireguard 是一件挺麻烦的事情,因此我决定放弃安全性,直…
阅读全文
48起因 最近在某家公司实习,公司内部的 git 部署在内网环境上,需要通过虚拟专用网的客户端(天翼云的 AONE)才能够正常访问。很可惜,客户端只提供了 Windows 和 MacOS 的版本。 工作的代码总是要提交的,我也不想改变我的开发环境,又不希望在 Windows 上使用 git-for-windows 这个近乎简陋的工具进行代码提交,更别说还有一些别的内网服务接下来可能也会用到。所以最好的办法就是在 Linux 下也配置好能够访问内网的环境。 理论 在 Windows 下使用 AONE 的网络拓扑是这样的 而我的方案则是使用 Windows 虚拟机开启 AONE,并在这台虚拟机上开一个 socks5 server 负责代理…
阅读全文
49在 Redhat 系的发行版上打包软件的时候,会发现与 Archlinux 完全不同的思路。 Fedora 所代表的 Redhat 阵营一看就是那种宏大叙事的大型发行版,rpmbuild 在默认情况下会在 $HOME/rpmbuild 下的一系列文件夹进行构建过程。使用 rpmdev-setuptree 命令会创建好下面这些目录进行构建。 $ tree rpmbuild rpmbuild ├── BUILD ├── BUILDROOT ├── RPMS ├── SOURCES ├── SPECS └── SRPMS Fedora 将所有的软件的构建都集中在一个 rpmbuild 目录中,BUILD 是编译时使用的,BUILDROOT…
阅读全文
50有一些软件包的上游本身就是使用 Github Action 发版的,每次 commit 都会触发 Github Action 去构建并分发新版本,使用构建时的时间日期作为版本号。针对这种包,手动更新费时费力,而规范的 specfile 应当是更新 %changelog 的,因此应当是使用 rpmdev-bumpspec 命令。只不过 rpmdev-bumpspec 需要在 rpm 系发行版或者装有 rpm 系列依赖包的发行版下执行,这不是随随便便一个 Linux 环境就能运行的。 我找到了 netoarmando/rpmdev-bumpspec-action 这个 Github Action,它通过启动一个 Fedora 的 doc…
阅读全文