文章列表

Phorge 现代化改造实战(七):迁移邮件服务,先分清哪些失败不该重试

, , , , , , ,
本文是“Phorge 现代化改造实战”系列第七篇,记录把 `gorge-mailer` 迁进单仓库、接回 SMTP 与五家外部 provider 的过程,重点是三处静默故障:永久失败被当成临时错误、没有后端的进程仍然健康、两层配置只完成一层。 阅读全文

Phorge 现代化改造实战(六):替换实时通知服务,为什么 HTTP 501 反而表示正常

本文是“Phorge 现代化改造实战”系列第六篇,记录用 `gorge-notification` 替换 Phorge 自带的 Node.js 常驻服务 Aphlict 的过程:长连接、内存状态和集群扇出怎么做兼容,以及那些坏掉之后仍然返回 200 的协议约定。 阅读全文

Phorge 现代化改造实战(五):替换 diff 子进程,兼容不等于逐字一致

, , , , , ,
本文是“Phorge 现代化改造实战”系列第五篇,记录把第二个纯计算模块 diff 迁入 Gorge 的过程:复现 `diff -U65535`、用参照实现验证 8.6% 的不一致,以及区分“实现就绪”和“宿主已经切换”。 阅读全文

Phorge 现代化改造实战(四):拆分模块到 Gorge,无侵入改造不等于不碰文件

, , , , , ,
本文是“Phorge 现代化改造实战”系列第四篇,记录把语法高亮从 Phorge 拆到常驻 Go 服务 `gorge-render` 的过程,以及怎样让这个 fork 不因此变成每次同步上游都要手工合并的负担。 阅读全文

Phorge 现代化改造实战(三):接入 Stargate,把 Forward Auth 的信任边界做完整

本文是“Phorge 现代化改造实战”系列第三篇,把视角从容器内部移到入口,记录让 Phorge 运行在 Traefik Forward Auth 之后并识别网关传递的用户身份的过程。 阅读全文

Phorge 现代化改造实战(二):改进容器化的七个细节

, , , , , ,
本文是“Phorge 现代化改造实战”系列第二篇,记录把上一篇的最小可运行容器从“能跑起来”改进到“可配置、可持久化、可观测”的过程。 阅读全文

Phorge 现代化改造实战(一):从没有官方镜像到 Docker Compose 跑起来

, , , , , ,
Phabricator 停止维护后,社区 fork 出的 Phorge 接过了后续维护,但截至 2026 年 9 月仍未提供官方 Dockerfile 和容器镜像。本文是“Phorge 现代化改造实战”系列第一篇,记录我把自己 fork 的源码做成最小可运行容器基线的过程。 阅读全文

三年后,我重写了 Nginx Formatter

, , , ,
2023 年,我借助 AI 把两百多行 beautifier.js 嵌入 Go、通过 goja 执行,快速做出了 soulteary/nginx-formatter。三年后,为了让它在 CI 中更可靠,我用原生 Go 的 Lexer、Parser、AST 和 Printer 重写了格式化内核。本文记录 v2.0.0 到 v2.2.0 的三步重构:替换内核、支持单文件、用 Cobra 拆出 format、serve、version 子命令,并复盘转义丢失、单引号 JSON、Lua RawBlock 等历史问题的处理结果。 阅读全文

用 splitdns 管理 macOS 的开发域名解析

, , , ,
延续之前用 Split DNS 提升跨系统双机开发体验的做法,手工维护 macOS 的 /etc/resolver 配置在设备和项目变多后越来越麻烦:覆盖前要备份、改完要刷新缓存、排错要在 dig、scutil 和 dscacheutil 之间来回切换。本文介绍我为此写的开源小工具 soulteary/splitdns,用来创建、修改和检查 Mac 上的 resolver 配置,并覆盖双机联动与单机使用两种场景。 阅读全文

使用 portmap 转发 Rootless Podman 的低位端口

, , , ,
从 Docker Desktop 换到 Podman 后,Linux Rootless Podman 用 pasta 发布 80、443、22、53 这类低位端口时会因权限不足失败,把宿主机端口换成 8080 才能启动。本文介绍我为此写的小工具 soulteary/portmap:让 Rootless Podman 继续发布高位端口,再由宿主机上一个功能单一的进程提供标准端口入口。 阅读全文