chore(deploy): 成品部署链路、依赖分组与运维基建

部署方式:服务器不再接收源码、不执行构建,改为本地构建成品后交付
- deploy-artifacts.sh:构建→备份→校验→原子替换,支持回滚、镜像/备份轮转、
  mysql 与 postgres 双变体镜像;后端以 docker save|ssh|docker load 交付
- 依赖分组:requirements/{base,storage}.txt + db/{mysql,postgres,sqlite}.txt,
  镜像按所选数据库只装对应驱动(MySQL 变体 565MB → 521MB)

编排与运行时加固
- compose:MySQL/Redis/backend 端口仅绑 127.0.0.1;密钥(SECRET_KEY、
  DATA_ENCRYPTION_KEY、DATA_ENCRYPTION_OLD_KEYS)、PROD_CORS_ORIGINS、
  FORWARDED_ALLOW_IPS、DEMO_ENABLE 一律由 docker/.env 注入
- Dockerfile:对齐依赖分组、以非 root(uid=1000) 运行;.dockerignore 排除全部真实 .env.*
- nginx:静态资源长缓存、隐藏文件拒绝、接口文档仅内网可访问、放行 ACME http-01 校验路径

工程基建
- 新增 CI:backend(uv sync + ruff + pytest)与 frontend(web type-check+vitest、app type-check)
- 新增 DEPLOYMENT.md 运维手册(部署/回滚/密钥轮换/每日巡检/证书/排查)
This commit is contained in:
zhangtao
2026-10-04 04:26:03 +08:00
parent 0cf2e24b92
commit ce9401196a
20 changed files with 851 additions and 91 deletions
+28 -12
View File
@@ -1,28 +1,44 @@
# Docker 部署环境变量(案例)
# ============================================================================
# Docker 部署环境变量示例
# 用法:cp docker/.env.example docker/.env 然后改成真实值(.env 不会被提交)
# 注意:本文件会被提交到仓库,只放占位符,不要写真实口令
# ============================================================================
# 数据库配置
MYSQL_ROOT_PASSWORD=your_mysql_root_password
# ---------- 数据库(MySQL)----------
MYSQL_ROOT_PASSWORD=change_me_root_password
MYSQL_DATABASE=fastapiadmin
MYSQL_USER=fastapiadmin
MYSQL_PASSWORD=your_mysql_password
MYSQL_PASSWORD=change_me_app_password
MYSQL_PORT=3306
# 说明:compose 把 MySQL 端口绑定在 127.0.0.1(只对本机开放),
# 容器之间通过 app_network 互联,不依赖宿主机端口。
# Redis配置
REDIS_PASSWORD=your_redis_password
# ---------- Redis ----------
REDIS_PASSWORD=change_me_redis_password
REDIS_PORT=6379
# 后端配置
# ---------- 后端 ----------
BACKEND_PORT=8001
# 使用的后端镜像 tag:
# 3.0.0 表示「当前线上版本」(deploy-artifacts.sh 部署时写入)
# mysql-<时间戳> MySQL 驱动变体
# postgres-<时间戳> PostgreSQL 驱动变体(切换数据库时手动指定)
BACKEND_IMAGE_TAG=3.0.0
# 日志级别(DEBUG/INFO/WARNING/ERROR)
LOGGER_LEVEL=INFO
# 运行环境,对应 backend/env/.env.{dev,prod}
DEPLOY_ENV=prod
# 数据库类型(仅当使用外部数据库、不靠 compose 注入时才有意义)
# DATABASE_TYPE=mysql
# Nginx配置
# ---------- Nginx ----------
HTTP_PORT=80
HTTPS_PORT=443
# nginx 镜像版本(由 docker-compose.override.yaml 读取;留空用 1.27-alpine)
NGINX_TAG=1.27-alpine
# 项目配置
# ---------- 项目 ----------
PROJECT_NAME=FastapiAdmin
# 部署环境
DEPLOY_ENV=prod
# ---------- 部署方式 ----------
# 健康检查宽限期(秒):容器首次启动需要跑迁移,慢机器上可调大
HEALTHCHECK_START_PERIOD=40s