与仓库根文档的关系:项目总览、快速开始、演示账号等请以 根目录 README.md 为准;本文档侧重 Docker 部署的详细操作。
docker/
├── backend/ # 后端服务配置
│ └── Dockerfile # 后端 Dockerfile(依赖安装 + 代码复制,配合根 .dockerignore)
├── nginx/ # Nginx 配置
│ ├── nginx.conf # Nginx 配置文件
│ ├── ssl/ # SSL 证书目录(放置 server.key / server.pem,.gitignore 已排除)
│ ├── web/ # 前端静态文件(构建后自动放置 dist/)
│ └── app/ + docs/ # 移动端 H5 / 文档站点(按需启用)
├── mysql/ # MySQL 持久化 & 初始化
│ ├── init/ # 首次启动时执行的 SQL 脚本(可选)
│ └── data/ # 数据库数据文件(自动生成)
├── redis/ # Redis 持久化 & 配置
│ ├── conf/
│ │ └── redis.conf # Redis 持久化配置文件
│ └── data/ # Redis 数据文件(自动生成)
├── docker-compose.yaml # Docker Compose 编排文件
├── .env # 环境变量配置文件(.gitignore 已排除)
├── .env.example # 环境变量示例文件
└── README.md # 本文档
.gitkeep仅用于保留空目录结构,不包含任何实际内容。
- Docker (>= 20.10)
- Docker Compose (v2,Docker 内置的
docker compose命令) - 如需构建前端:Node.js (>= 18) 和 npm / pnpm
-
配置环境变量
cp docker/.env.example docker/.env chmod 600 docker/.env # 限制权限,防止其他用户读取密码主要配置项:
变量 必填 默认值 说明 MYSQL_ROOT_PASSWORD是 - MySQL root 密码 MYSQL_DATABASE否 fastapiadmin数据库名 MYSQL_USER否 fastapiadmin数据库用户 MYSQL_PASSWORD是 - 数据库密码 REDIS_PASSWORD是 - Redis 密码 BACKEND_PORT否 8001后端服务宿主机端口 HTTP_PORT否 80HTTP 宿主机端口 HTTPS_PORT否 443HTTPS 宿主机端口 DEPLOY_ENV否 prod部署环境(dev/prod) BACKEND_IMAGE_TAG否 3.0.0后端镜像标签 NGINX_SERVER_NAME否 service.fastapiadmin.comNginx 域名 -
SSL 证书配置(可选,但生产环境必须)
# 自签名证书(测试用): openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout docker/nginx/ssl/server.key \ -out docker/nginx/ssl/server.pem \ -subj "/CN=service.fastapiadmin.com" # 生产环境请使用正规 CA 签发的证书
deploy.sh 同时支持两种模式:
本机单机部署(在仓库根目录,使用本机 Docker):
cp docker/.env.example docker/.env # 填写 MySQL / Redis 密码
./deploy.sh local # docker compose up -d --build生产成品部署(本机构建 → SSH 交付服务器,不在服务器构建源码):
./deploy.sh web # Web 管理后台
./deploy.sh app # 移动端 H5
./deploy.sh backend # MySQL 版后端镜像
./deploy.sh all # 三样全发
./deploy.sh verify # 公网验证
./deploy.sh backups # 查看备份
./deploy.sh rollback web|app|backend
./deploy.sh prune # 清理旧备份/镜像服务器容器管理:
./deploy.sh start
./deploy.sh stop
./deploy.sh restart
./deploy.sh logs
./deploy.sh clean生产模式要求本机可免密 SSH 到服务器,后端构建另需本机 Docker。每次成品部署前自动备份,失败即中止。
cd docker
# 启动所有服务
docker compose --env-file .env up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f [service_name]
# 停止服务
docker compose down
# 仅重建某个服务
docker compose up -d --no-deps --build [service_name]部署完成后,可以通过以下地址访问:
| 服务 | 地址 |
|---|---|
| 前端 | https://your-domain/web |
| Swagger API 文档 | https://your-domain/docs |
| ReDoc API 文档 | https://your-domain/redoc |
| API 健康检查 | https://your-domain/health |
| 后台登录 | 默认账号 admin,密码 123456 |
注意:
docs(官网)和app(移动端 H5)默认不参与部署,如需启用请取消 docker-compose.yaml 中相关卷挂载注释。
| 服务 | CPU 限制 | 内存限制 | 内存预留 |
|---|---|---|---|
| MySQL | 无限制 | 1 GB | 256 MB |
| Redis | 无限制 | 512 MB | 128 MB |
| Backend | 1 核 | 1 GB | 256 MB |
| Nginx | 0.5 核 | 256 MB | 64 MB |
如需调整,修改 docker-compose.yaml 中对应服务的 deploy.resources 字段。
# 查看所有容器日志
./deploy.sh logs
# 查看实时日志
cd docker
docker compose logs -f [服务名]
# 服务名:backend, nginx, mysql, redis各容器的日志会被 Docker 自动轮转,限制为每个容器最多保留 3 个日志文件,每个最大 10MB。可在 docker-compose.yaml 中调整 logging 配置。
构建前端有三种方式:
-
本地构建后手动部署(推荐)
cd frontend/web npm install && npm run build cp -r dist ../docker/nginx/web/
-
使用统一部署脚本
./deploy.sh web # 构建并发布 Web 成品 ./deploy.sh app # 构建并发布移动端 H5 ./deploy.sh local # 本机启动全套容器
- 移除开发卷挂载:生产环境下,在
docker-compose.yaml中注释掉backend服务的volumes挂载,使用镜像内自带的代码 - 使用正规 SSL 证书:将 CA 签发的证书替换
nginx/ssl/下的文件 - 修改域名:在
nginx/nginx.conf和.env中修改server_name - 关闭调试:确保
.env中DEPLOY_ENV=prod - 限制数据库端口:生产环境建议注释 MySQL/Redis 的
ports映射,仅通过容器内部网络访问
| 问题 | 解决方案 |
|---|---|
| 环境变量文件不存在 | 部署脚本会自动从 .env.example 创建,或手动 cp docker/.env.example docker/.env |
| 前端构建失败 | 建议在本地构建前端,将 dist 目录复制到 docker/nginx/web/ 目录 |
| 容器启动失败 | cd docker && docker compose logs [服务名] 查看具体错误 |
| 数据库连接失败 | 确保 .env 中数据库配置正确,MySQL 容器正常运行 |
| 端口冲突 | 修改 .env 中的端口配置,重新部署 |
| MySQL 数据目录权限问题 | sudo chown -R 999:999 docker/mysql/data && sudo chmod -R 755 docker/mysql/data |
| 后端健康检查失败 | 确保 MySQL 和 Redis 容器已就绪,查看后端日志:docker compose logs backend |
- 修改默认密码:部署后请修改
.env中的密码 - 保护
.env文件:已加入.gitignore,请勿手动提交 - 使用正规 SSL 证书:生产中不要使用自签名证书
- 限制端口访问:通过防火墙只开放 80/443 端口
- 及时更新:定期执行部署脚本获取最新版本
git pull && ./deploy.sh local # 拉取最新代码 → 本机构建并重启容器