更新Docker
This commit is contained in:
@@ -8,8 +8,8 @@
|
||||
|
||||
| 文件 | 作用 |
|
||||
|---|---|
|
||||
| Dockerfile | 多阶段:golang:1.27-alpine 编译 → alpine:3.20 运行(带时区与证书) |
|
||||
| docker-compose.yaml | admin-server + nginx + mysql + redis 编排 |
|
||||
| Dockerfile | 多阶段:golang:1.27-alpine 编译 → alpine:3.22 运行(非 root、时区与证书、健康检查探 /api/health) |
|
||||
| docker-compose.yaml | admin-server + nginx + mysql + redis 编排;MySQL 首启自动建库、服务健康依赖 |
|
||||
| nginx.conf | upload 直供(temp 封禁、SVG 附件、大小限制) |
|
||||
|
||||
## 生产启动
|
||||
@@ -18,35 +18,38 @@
|
||||
cp .env.example .env # 修改全部密码/密钥/域名
|
||||
# .env 中设置:JWT_SECRET 强随机、各密码、FILE_DOMAIN_URL=https://files.your-domain
|
||||
|
||||
cd deploy
|
||||
docker compose up -d --build
|
||||
|
||||
# 首次初始化数据库
|
||||
docker exec -i easygoadmin-mysql mysql -uroot -p<密码> \
|
||||
easygoadmin.gin.elevue < ../document/mysql/easygoadmin.gin.elevue.sql
|
||||
# 在项目根执行(compose 默认只找 deploy/.env,根目录 .env 须显式传入)
|
||||
docker compose --env-file .env -f deploy/docker-compose.yaml up -d --build
|
||||
```
|
||||
|
||||
:::tip 数据库初始化
|
||||
MySQL 数据卷为空时自动导入 `document/mysql/easygoadmin.gin.elevue.sql` 定稿脚本(仅首次执行一次),
|
||||
无需手工导 SQL;已有数据卷不会补表,需重导时请先备份再清卷。
|
||||
:::
|
||||
|
||||
## 生产环境变量核对
|
||||
|
||||
compose 以 APP_ 规范键注入应用:
|
||||
compose 以 APP_ 规范键注入应用,`.env` 中的友好名经 `environment` 块映射:
|
||||
|
||||
| 环境变量 | 生产要求 |
|
||||
| 环境变量(.env 键) | 生产要求 |
|
||||
|---|---|
|
||||
| APP_APP_PROD | true(compose 中按需追加) |
|
||||
| APP_APP_PROD | true(.env 中取消注释即可,compose 已透传) |
|
||||
| APP_GENERATOR_ENABLE | false(关闭代码生成器) |
|
||||
| APP_API_DOCS / APP_API_METRICS | false(关闭文档/指标端点) |
|
||||
| APP_DATABASE_DEFAULT_* | 内网地址与强密码 |
|
||||
| APP_REDIS_DEFAULT_PASS | 强密码 |
|
||||
| APP_JWT_SECRET | 强随机(非样例值) |
|
||||
| APP_FILE_UPLOADDIR / APP_FILE_DOMAINURL | 卷路径与 https 文件域址 |
|
||||
| APP_JWT_SECRET(友好名 JWT_SECRET) | 强随机(非样例值) |
|
||||
| APP_FILE_UPLOADDIR / APP_FILE_DOMAINURL | 容器路径与 https 文件域址 |
|
||||
|
||||
MySQL/Redis 端口 compose 默认仅绑回环(127.0.0.1)——保持该约束,勿映射到 0.0.0.0。
|
||||
|
||||
## 卷与备份
|
||||
|
||||
| 卷 | 内容 | 备份 |
|
||||
| 卷/挂载 | 内容 | 备份 |
|
||||
|---|---|---|
|
||||
| mysql_data | 数据库 | 定期 mysqldump / 快照 |
|
||||
| redis_data | 缓存 | 可丢(重建即降级恢复) |
|
||||
| upload_data | 上传文件 | 定期同步(应用写 + nginx 只读挂载) |
|
||||
| ../upload(bind,应用 rw / nginx ro) | 上传文件 | 宿主目录定期同步 |
|
||||
|
||||
## 前端容器化(可选)
|
||||
|
||||
@@ -55,8 +58,8 @@ MySQL/Redis 端口 compose 默认仅绑回环(127.0.0.1)——保持该约
|
||||
## 升级
|
||||
|
||||
```bash
|
||||
docker compose pull(如用镜像仓库)或重新 build
|
||||
docker compose up -d --build admin-server # 滚动重建应用
|
||||
docker compose --env-file .env -f deploy/docker-compose.yaml pull # 如用镜像仓库
|
||||
docker compose --env-file .env -f deploy/docker-compose.yaml up -d --build admin-server # 滚动重建应用
|
||||
```
|
||||
|
||||
应用优雅关闭保证在途请求排空。
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
│ ├─ mysql:8.0(127.0.0.1:3306 仅回环绑定)
|
||||
│ └─ redis:7(127.0.0.1:6379 仅回环绑定)
|
||||
│
|
||||
└─ :8081 ──→ nginx(只读挂载 upload 卷,直供上传文件,
|
||||
└─ :8081 ──→ nginx(只读挂载 upload 目录,直供上传文件,
|
||||
temp 目录封禁)
|
||||
```
|
||||
|
||||
@@ -25,13 +25,11 @@
|
||||
cp .env.example .env
|
||||
# 按需修改数据库/Redis 密码、JWT 密钥、文件域名
|
||||
|
||||
# 2. 构建并启动
|
||||
cd deploy
|
||||
docker compose up -d --build
|
||||
# 2. 在项目根构建并启动(根 .env 须经 --env-file 显式传入)
|
||||
docker compose --env-file .env -f deploy/docker-compose.yaml up -d --build
|
||||
|
||||
# 3. 初始化数据库(首次)
|
||||
docker exec -i easygoadmin-mysql mysql -uroot -p<密码> \
|
||||
easygoadmin.gin.elevue < ../document/mysql/easygoadmin.gin.elevue.sql
|
||||
# 3. 数据库无需手工初始化:MySQL 数据卷为空时
|
||||
# 自动导入 document/mysql 定稿脚本(仅首次执行一次)
|
||||
```
|
||||
|
||||
## 环境变量映射
|
||||
@@ -49,24 +47,24 @@ environment:
|
||||
|
||||
## 卷与持久化
|
||||
|
||||
| 卷 | 挂载点 | 说明 |
|
||||
| 卷/挂载 | 挂载点 | 说明 |
|
||||
|---|---|---|
|
||||
| mysql_data | MySQL 数据目录 | 数据库持久化 |
|
||||
| redis_data | Redis 数据目录 | 缓存持久化 |
|
||||
| upload_data | 应用 /data/upload + nginx 只读挂载 | 上传文件,nginx 直供 |
|
||||
| ../upload(bind) | 应用 /data/upload(rw)+ nginx(ro) | 上传文件,nginx 直供;宿主目录已有文件直接可见 |
|
||||
|
||||
## 镜像要点
|
||||
|
||||
`deploy/Dockerfile` 为多阶段构建:
|
||||
|
||||
- 编译阶段:`golang:1.27-alpine`,`CGO_ENABLED=0` + 去符号表压缩体积
|
||||
- 运行阶段:`alpine:3.20` + 时区与证书,仅带二进制、config、resource
|
||||
- 运行阶段:`alpine:3.22` + 时区与证书,非 root 运行,仅带二进制、config、resource、templates;内置健康检查(/api/health)
|
||||
|
||||
## 验证
|
||||
|
||||
```bash
|
||||
docker compose ps # 四容器 healthy
|
||||
curl http://127.0.0.1:8000/api/health # 应用就绪
|
||||
docker compose --env-file .env -f deploy/docker-compose.yaml ps # 四容器 healthy
|
||||
curl http://127.0.0.1:8000/api/health # 应用就绪
|
||||
```
|
||||
|
||||
生产环境的完整部署清单(含 Nginx 站点配置、安全加固)见 [第 11 章 运维部署](/zh/deploy/checklist.html)。
|
||||
|
||||
@@ -41,7 +41,7 @@ location ~* \.svg$ { # SVG 强制附件 + nosniff
|
||||
|
||||
## 容器部署
|
||||
|
||||
docker-compose 把 upload 目录挂为卷(应用写、nginx 只读),并经环境变量覆盖:
|
||||
docker-compose 把宿主 `upload/` 目录 bind 挂载进容器(应用写、nginx 只读),并经环境变量覆盖:
|
||||
|
||||
```text
|
||||
APP_FILE_UPLOADDIR=/data/upload
|
||||
@@ -52,7 +52,7 @@ APP_FILE_DOMAINURL=${FILE_DOMAIN_URL}
|
||||
|
||||
- temp 超过 `tempExpireDays` 自动清理
|
||||
- 正式目录按 `{模块}/{yyyymmdd}` 分桶,便于按日期归档
|
||||
- 备份策略:upload 卷纳入备份清单([11.9 备份与恢复](/zh/deploy/backup.html))
|
||||
- 备份策略:upload 目录(宿主 bind 挂载)纳入备份清单([11.9 备份与恢复](/zh/deploy/backup.html))
|
||||
|
||||
## 常见问题
|
||||
|
||||
|
||||
Reference in New Issue
Block a user