Phorge 现代化改造实战(一):从没有官方镜像到 Docker Compose 跑起来
内容提要
本文介绍Phorge容器化改造的第一步。Phorge是Phabricator的社区fork,官方无Docker镜像。作者从源码构建最小可运行版本,解决Arcanist依赖、base-uri校验、数据库探活等问题,最终通过Docker Compose成功启动服务。文章指出当前方案仍存在进程管理、版本固定等不足,为后续优化奠定基础。
延伸解读
容器化改造的切入点:官方镜像缺失的启示
Phorge 官方未提供 Docker 镜像,这看似不便,实则迫使维护者深入理解其运行拓扑。通过分析官方升级脚本,可发现 Phorge 并非单一 PHP 应用,而是由 Web、phd 守护进程及可选 aphlict 组成。这种理解是构建可靠容器基线的前提,也解释了为何简单补一个 Dockerfile 并不足够。
健康检查的陷阱:客户端差异导致误判
作者在等待数据库就绪时,使用 MariaDB 命令行客户端探活,却因 TLS 证书问题持续失败,而应用实际使用的 PHP mysqli 却能正常连接。这提醒我们,健康检查应尽量与应用使用相同的协议栈和驱动,否则检查结果可能反映的是客户端自身配置问题,而非应用依赖的真实状态。
本地开发与生产约束的平衡
Phorge 出于 Cookie 安全考虑,拒绝无点号的主机名(如 localhost),这对本地开发不友好。作者采用 127.0.0.1 作为本地 base-uri,既满足校验又便于测试。同时,文章强调生产环境应使用真实域名并配置 HTTPS,体现了开发便利与生产安全之间的权衡。
容器生命周期的初步处理与遗留问题
作者通过 exec "$@" 让 Apache 成为 PID 1 以接收停止信号,但 phd 后台进程仍未被统一管理,容器生命周期尚不完美。此外,启动时自动执行数据库迁移在单实例下可行,但横向扩展时需改为独立步骤。这些遗留问题为后续优化指明了方向。
Q&A
Phorge 是什么?它与 Phabricator 有什么关系?
Phorge 是 Phabricator 停止维护后的社区 fork,继续提供代码审查、仓库托管、缺陷跟踪、项目管理等功能。
Phorge 官方提供 Docker 镜像吗?
截至 2026 年 9 月,Phorge 官方源码仓库没有提供 Dockerfile、docker-compose.yml 或其他容器编排文件,也没有正式发布的容器镜像。
Phorge 的基本运行拓扑包含哪些部分?
Phorge 至少包含三个部分:Web Server(Apache/Nginx/php-fpm)、后台守护进程 phd,以及可选的 aphlict(用于 WebSocket 实时通知)。
为什么 Phorge 源码旁边必须有 Arcanist?
Phorge 的类加载体系依赖 Arcanist 提供的基础库,缺少相邻的 arcanist 目录会导致 bin/config、bin/storage、bin/phd 等命令无法启动。
为什么 Phorge 拒绝 http://localhost:8088/ 这样的 base-uri?
因为该 URI 不包含点号(TLD),部分浏览器不会为没有 TLD 的域名设置 Cookie,可能导致登录状态无法保持。
数据库探活时为什么 MariaDB 客户端连接失败而 PHP mysqli 成功?
因为 MariaDB 客户端默认校验 TLS 证书,而 MySQL 8 自动生成的证书无法通过校验,导致连接失败;PHP mysqli 则能正常连接。
如何通过 Docker Compose 启动 Phorge?
使用提供的 docker-compose.yml,包含 mysql 和 phorge 两个服务,执行 docker compose up -d --build 即可启动。
当前 Phorge 容器化方案存在哪些不足?
存在进程生命周期管理不完善、aphlict 未启用、邮件未接入、依赖版本未固定、凭据以环境变量传入、健康检查不独立、权限过宽、数据库迁移与启动绑定、备份恢复测试缺失等问题。