diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..34ce92f --- /dev/null +++ b/Caddyfile @@ -0,0 +1,7 @@ +oncolit.gonsun.com { + reverse_proxy frontend:80 +} + +gitea.oncolit.gonsun.com { + reverse_proxy gitea:3000 +} diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 6922ba4..0277bbc 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -246,7 +246,7 @@ services: environment: VITE_API_BASE: /api/v1 ports: - - "80:80" + - "127.0.0.1:8080:80" volumes: - /var/log/scilit/nginx:/var/log/nginx depends_on: @@ -272,18 +272,39 @@ services: GITEA__database__NAME: gitea GITEA__database__USER: gitea GITEA__database__PASSWD: gitea_pass_2026 - GITEA__server__DOMAIN: 123.207.9.209 + GITEA__server__DOMAIN: gitea.oncolit.gonsun.com GITEA__server__HTTP_PORT: 3000 - GITEA__server__ROOT_URL: http://123.207.9.209:3000 - GITEA__server__START_SSH_SERVER: "true" - GITEA__server__SSH_DOMAIN: 123.207.9.209 + GITEA__server__ROOT_URL: https://gitea.oncolit.gonsun.com/ + GITEA__server__START_SSH_SERVER: true + GITEA__server__SSH_DOMAIN: gitea.oncolit.gonsun.com GITEA__server__SSH_PORT: 2222 GITEA__server__SSH_LISTEN_PORT: 22 ports: - - "3000:3000" - - "2222:22" + - 3000:3000 + - 2222:22 + + + caddy: + image: caddy:2-alpine + networks: + - scilit + ports: + - "80:80" + - "443:443" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - caddy_data:/data + - caddy_config:/config + restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" volumes: + caddy_data: + caddy_config: pgdata: redisdata: esdata: diff --git a/docs/16-部署运维方案.md b/docs/16-部署运维方案.md index abc521b..120e837 100644 --- a/docs/16-部署运维方案.md +++ b/docs/16-部署运维方案.md @@ -1,10 +1,11 @@ # 部署运维方案:生产工程化(一期 + 二期) -> **日期:** 2026-08-08(v16 更新于 2026-08-10) -> **版本:** v16.0(当前) **状态:** 一期 3 项已执行(磁盘/备份/TLS)+ 构建加速(Dockerfile 卫生)+ gitea TLS,其余待执行 +> **日期:** 2026-08-08(v17 更新于 2026-08-10) +> **版本:** v17.0(当前) **状态:** 一期 3 项已执行(磁盘/备份/TLS)+ 构建加速(Dockerfile 卫生)+ gitea TLS,其余待执行 > **关联:** [docs/10-生产部署文档.md](10-生产部署文档.md)、[docs/11-20260717部署事故分析.md](11-20260717部署事故分析.md)、[docs/12-部署实际操作记录.md](12-部署实际操作记录.md)、[docs/17-生产数据迁移.md](17-生产数据迁移.md)(24 迁移专项,2026-08-09) > > **版本记录:** +> - **v17** — 2026-08-10:§7 补「服务器本地改动必须回流 gitea」环节(TLS/Caddy 改动从未提交,git-ify checkout 会丢 HTTPS——回流后服务器 git pull 才安全,与 §2 闭环) > - **v16** — 2026-08-10:§3 补批量迁移执行序 + destructive ordering(批次 1 日期收窄须与发代码同窗口);§7 补 gitea TLS 落地;§6 补构建加速落地(腾讯 pip/npm 源 + BuildKit,详见记忆 docker_build_optimization) > - **v1** — 初稿(生产工程化框架,一期 + 二期) > - **v2** — 吸收三档补强:破坏性迁移硬判定、backup.sh 上机查清、扩对盘、compose 范围澄清、挂卷后 logrotate、pre-deploy 快照留存、registry token 轮换、alembic head 采集、增强级 @@ -130,6 +131,7 @@ - **验证**:`curl -k https://oncolit.gonsun.com` → 200 + 前端 HTML;`/health` 经 Caddy→nginx→backend 返回 `db: ok`;证书 CN=oncolit.gonsun.com,90 天自动续期 - **⚠️ frontend 宿主 8080 已收紧(2026-08-09)**:`8080:80` → **`127.0.0.1:8080:80`**(只绑回环,公网无法直连绕过 Caddy;排障时本机 `curl 127.0.0.1:8080` 仍可用;Caddy 经 Docker 网络走 `frontend:80` 不受影响)。安全组仍建议只放行 80/443(禁 3000/2222 对公网),在腾讯云控制台配置 - **✅ gitea TLS 已落地(2026-08-09)**:DNS 已加 `gitea.oncolit.gonsun.com` → `123.207.9.209`;Caddyfile gitea 子站块已启用(`gitea.oncolit.gonsun.com { reverse_proxy gitea:3000 }`),证书经 tls-alpn-01 自动签发;gitea `ROOT_URL`/`DOMAIN`/`SSH_DOMAIN` 已改 `https://gitea.oncolit.gonsun.com`。**⚠️ 本地 git remote 需同步改 https**:`http://123.207.9.209:3000/scilit/backend` → `https://gitea.oncolit.gonsun.com/scilit/backend`;SSH clone 地址变为 `gitea.oncolit.gonsun.com:2222` +- **⚠️ 服务器本地改动必须回流 gitea(v17 补,2026-08-10)**:TLS/Caddy 全链路改动(compose frontend→8080、caddy 服务+卷、Caddyfile、gitea 域名、`127.0.0.1:8080` 收紧)是 **2026-08-09 直接在服务器上手改的,从未提交到 gitea**(实测:服务器 `docker-compose.prod.yml` 与仓库版 diff 35 行,仓库版还是 `80:80` + `123.207.9.209` + 无 caddy 服务;`Caddyfile` 服务器 8-09 版也不在仓库根)。**后果**:服务器一旦 git-ify checkout 仓库版,这些改动被覆盖 → **HTTPS/Caddy/gitea 域名全丢**。**环节(v17 新增,与 §2"服务器 git pull"闭环)**:①把服务器 `docker-compose.prod.yml`(TLS 版)取回本地覆盖仓库版、`Caddyfile` 加入仓库根 → 提交 `chore: prod compose 同步 TLS/Caddy + gitea 域名` → `git push`(gitea 成为权威,含 TLS);②服务器 git-ify:`yum install git` + `git init -b main` + `remote add origin` + `git fetch && git checkout --force origin/main`(被跟踪文件覆盖为最新,未跟踪的 `.env`/`tmp_*.py` 保留)→ `docker compose config --quiet` 验证 caddy 服务仍在。**此后日常更新 = `git pull`,杜绝手工改与仓库不一致**(对齐 hotfix.sh 的"强制回流"纪律) - **未做**:registry 的 TLS(二期 §2——registry 走明文 HTTP,公网 IP 下 token 有嗅探面,须监听内网或加 TLS)。前端 nginx 容器内直接终止的路线①未采用 - **⚠️ 域名前提**:Caddy 自动 HTTPS 要求域名 DNS 已解析到本机(oncolit.gonsun.com → 123.207.9.209 ✓)