Refactor Gitea production deployment process to utilize SSH for remote operations
Deploy production / deploy (push) Failing after 8s

- Updated deployment specification to reflect the new architecture involving servers A, B, and C.
- Revised README to describe the new deployment method using Gitea Runner and SSH.
- Modified `compose.production.yaml` to remove build context and use image tags directly.
- Enhanced deployment documentation to clarify configuration steps and environment variable requirements.
- Introduced `deploy-remote.sh` script for handling remote deployment tasks over SSH.
- Added unit tests for deployment scripts to ensure robustness and error handling.
- Updated `deploy-production.sh` to streamline image pulling and deployment processes.
This commit is contained in:
yuxuanhui
2026-09-24 23:47:07 +08:00
parent 69c19ed25f
commit 99bc36439e
9 changed files with 491 additions and 76 deletions
@@ -0,0 +1,30 @@
# 两机镜像部署
Type: task
Status: ready-for-agent
## 要求
- Runner 构建 backend/web 并推送 A 的 Gitea Packages,两个镜像成功后通过 SSH 部署 B。
- B 仅接收 Compose、部署脚本和环境,拉取镜像后预检、互斥迁移及健康启动。
- 数据库位于 C,B 通过 `DATABASE_URL` 连接 C 的内网地址,不再依赖 `DATABASE_NETWORK`。
- 沿用 Gitea 应用配置及用户指定的 `PROD_SSH_KEY`、`PROD_HOST`、`PROD_USER` Secrets。
- 保留原有本地/公网 Compose、数据库及单 worker 限制;更新部署说明。
## 验收
校验工作流与 Compose 配置、B 部署脚本的失败分支、SSH 环境特殊字符传输、临时认证文件清理。真实 A 推送及 B 部署不在本地验收中执行。
## Comments
- 2026-09-24:已开始实施,真实服务器连接参数由用户在 Gitea 配置。
- 2026-09-24:本地实现完成。生产 Compose 改为纯镜像引用;工作流构建推送后通过 SSH 传递部署文件和环境,B 拉取、预检、加锁、迁移并等待健康状态。说明已同步。
- 2026-09-24:按用户确认适配 B 应用/C 数据库分离,移除外部数据库网络及 `DATABASE_NETWORK` 的传递、必填校验;说明和测试同步更新。未设置该变量时,Compose 5.3.1 默认/jobs profile 校验通过,backend/migrate/web 均使用默认网络,远程数据库 URL 保持一致;8 个必填配置拒绝、Bash/工作流检查和 8 项模拟部署测试通过。未连接真实 B/C,实际容器到 C 的连通性仍需部署验收。
## 初次镜像部署验证结果(数据库拆分前)
- 本机 Docker Compose 5.3.1 默认/jobs profile 展开通过;确认所有服务无 build、backend 与 migrate 共用提交镜像、外部数据库网络及回环端口保留,9 个必填 Compose 配置缺失均拒绝。
- Workflow YAML、SSH Secrets 映射及 Bash 语法检查通过;模拟构建步骤验证成功顺序与 login/build/push 失败传播、认证目录清理。
- `python3 -m unittest discover -s scripts/tests -v`:8 项通过,覆盖前置失败保护旧服务、锁归属、迁移失败不启动、健康失败返回非零、缺失配置、SSH 特殊字符传递与环境隔离、远端失败传播和临时文件清理。
- 独立只读核验完成;停服后失败仍需人工处理,沿用既有迁移策略,避免未知 schema 状态下自动回退。
- `git diff --check` 通过。Dockerfile/业务代码未改变,未重建真实镜像;真实 Gitea 推送、B SSH 身份与权限、数据库迁移和公网健康仍需首次运行工作流验收。
+12
View File
@@ -1,5 +1,17 @@
# 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 认证临时目录结束时清理。
任务与验证见 [两机镜像部署](issues/01-remote-deployment.md)。本任务只修改本地文件及进行隔离验证,不推送镜像或操作真实 B。
## 历史方案
采用已选择的 compound 经验 1,经当前项目核验:复用锁定依赖的 Dockerfile、单 worker 和数据库健康接口;新增独立生产 Compose、外部 PostgreSQL 配置、同机 host Runner 工作流。生产凭据通过 Gitea Secrets 注入,非敏感配置通过 Variables 注入,不生成凭据文件。数据库网络为可配置参数,不沿用旧项目常量作为强制约定。
部署在构建完成后停止写入、执行一次性迁移,再启动健康检查。固定项目名与按提交标记镜像;使用宿主机文件锁串行化。保留本地和独立公网部署的现有行为。不执行远程部署、不修改知识库。