Files
worldquant-alpha-system/.scratch/gitea-deployment/spec.md
T
2026-09-25 00:00:08 +08:00

4.0 KiB
Raw Blame History

Gitea 生产部署

当前部署方式(2026-09-24)

本节替代下方历史记录中的同机构建部署方案。A 运行 Gitea/Packages,Runner 构建并推送两个提交标签镜像,通过 SSH 在 B 的独立发布目录执行 pull、预检、互斥迁移及健康检查;生产 Compose 不含 build。现有数据库、项目名、端口和 Gitea 应用配置沿用。

数据库独立部署在 C,B 的 backend 和 migrate 通过 DATABASE_URL 使用 C 的内网地址。生产 Compose 使用默认网络,移除 DATABASE_NETWORK 外部网络声明及工作流、部署脚本的传递和必填校验。

SSH 采用用户指定的 Gitea Secrets:PROD_SSH_KEY、PROD_HOST、PROD_USER,补充主机公钥校验 PROD_KNOWN_HOSTS 与可选端口 PROD_PORT。镜像前缀、B 部署目录和构建平台可配置。应用环境经 SSH stdin 传递,不生成应用凭据文件;SSH 和 Docker 认证临时目录结束时清理。

Runner 为 ARM64、B 为 x86_64,目标仍为 linux/amd64。工作流先初始化 QEMU,再在临时 Docker/Buildx 配置下创建独立构建器,显式用于两个镜像,结束时清理;QEMU 步骤要求构建机 Docker 允许特权容器注册 binfmt。

任务与验证见 两机镜像部署。本任务只修改本地文件及进行隔离验证,不推送镜像或操作真实 B。

历史方案

采用已选择的 compound 经验 1,经当前项目核验:复用锁定依赖的 Dockerfile、单 worker 和数据库健康接口;新增独立生产 Compose、外部 PostgreSQL 配置、同机 host Runner 工作流。生产凭据通过 Gitea Secrets 注入,非敏感配置通过 Variables 注入,不生成凭据文件。数据库网络为可配置参数,不沿用旧项目常量作为强制约定。

部署在构建完成后停止写入、执行一次性迁移,再启动健康检查。固定项目名与按提交标记镜像;使用宿主机文件锁串行化。保留本地和独立公网部署的现有行为。不执行远程部署、不修改知识库。

验证:Compose 展开及缺失配置拒绝、脚本语法、镜像构建、隔离数据库上的迁移和 HTTP 健康检查。真实服务器 Runner、数据库、TLS 入口需首次部署验收。

验证结果(2026-09-09)

  • Docker Engine 29.6.2 / Compose 5.3.1:默认和 jobs profile 配置校验通过;5 个必填配置缺失时均拒绝展开。
  • 前后端生产镜像构建通过(前端依赖 lottie-web 存在既有 eval 构建警告)。
  • 独立测试项目、临时 PostgreSQL 17、独立外部网络:首次迁移、页面/API 健康、管理员登录与 Secure/HttpOnly Cookie、重复迁移和重启均通过。测试容器、卷和网络已清理,未操作现有应用数据库。
  • Bash 语法与 workflow YAML 解析通过;模拟 Docker 验证成功流程及构建、预检、迁移、健康失败分支,确认提前失败不停止服务、迁移失败不启动服务、失败不记录成功版本。
  • 实际 Gitea/Runner、Linux flock 互斥、公网 TLS、生产库与恢复流程未在目标服务器验证。本机存在用户并行前端改动,本任务未修改这些文件。
  • 经验 1 已应用;后端无可写 named volume,未添加不适用的卷初始化 Job;凭据按用户最新要求由 Gitea 注入。知识库未修改。

Gitea Secrets 调整

按用户确认改为步骤级 Secrets/Variables 注入;删除生产环境示例文件和相关忽略例外,不再依赖服务器凭据文件。脚本显式使用 /dev/null 作为 env-file,5 个必填值缺失时立即停止;锁与版本记录独立保存在 /opt/wq-alpha。

本轮验证:Compose 默认/jobs 展开、5 个缺失配置拒绝、真实隔离容器内特殊字符密码完整性、Bash 语法和工作流映射均通过。模拟 Docker 验证成功、锁冲突、缺失变量和构建/预检/迁移/健康失败分支;未输出密钥。未重新运行未变化的迁移和前端构建;真实 Gitea 注入仍待服务器运行确认。