一键启动 = docker compose up -d。Server 启动时自动:
- 等 MySQL 健康
- 跑
goose up应用所有迁移(包含用户表、账号池、审计、备份元数据等) - 启动 HTTP 服务(
:8080)
cd deploy
cp .env.example .env # 修改 JWT_SECRET / CRYPTO_AES_KEY / MySQL 密码
docker compose up -d --build
docker compose logs -f server # 观察迁移 + 启动日志默认暴露端口:
| 服务 | 端口 | 说明 |
|---|---|---|
| server | 8080 |
OpenAI 兼容网关 + 后台 API |
| mysql | 3306 |
业务数据库 |
| redis | 6379 |
锁 / 限流 / 缓存 |
mysql_data:MySQL 物理数据redis_data:Redis AOFbackups:/app/data/backups—— 数据库备份文件(.sql.gz)落盘目录./logs:宿主机deploy/logs—— server 日志
数据库备份和宿主机数据是两条独立路径:
- 管理员在后台"数据备份"里点"立即备份"会把
mysqldump压缩写入backups卷; backups卷也可以挂回宿主机目录来做 rsync 异地冷备。
以下必须在 .env 中显式覆盖(生产禁用默认值):
JWT_SECRET:至少 32 字符随机串CRYPTO_AES_KEY:严格 64 位 hex(32 字节 AES-256 key)MYSQL_ROOT_PASSWORD/MYSQL_PASSWORD
后端对高危操作的保护:
| 操作 | 权限常量 | 额外要求 |
|---|---|---|
| 列出/下载备份 | system:backup |
- |
| 创建备份 | system:backup |
- |
| 删除备份 | system:backup |
X-Admin-Confirm: <password> |
| 上传备份 | system:backup |
X-Admin-Confirm: <password> |
| 恢复数据库 | system:backup |
backup.allow_restore=true(默认 false)+ X-Admin-Confirm |
| 调整用户积分 | user:credit |
自动落审计 |
凡是 /api/admin/* 的写操作(POST/PUT/PATCH/DELETE)都会被 audit.Middleware 自动记录到 admin_audit_logs 表,管理员可在"审计日志"页查看。
因为 restore 会直接覆盖现库,默认关闭。启用方式:
- 在
.env中BACKUP_ALLOW_RESTORE=true docker compose up -d server(重启生效)- 在后台点"恢复",输入管理员密码二次确认
- 完成后把
.env改回false再重启,锁回常态
# 手动触发一次迁移(平时容器启动时会自动跑)
docker compose exec server goose -dir /app/sql/migrations mysql \
"$GPT2API_MYSQL_DSN" up
# 查看当前迁移状态
docker compose exec server goose -dir /app/sql/migrations mysql \
"$GPT2API_MYSQL_DSN" status
# 进入 MySQL
docker compose exec mysql mysql -ugpt2api -p gpt2api
# 冷备份(API 之外的兜底方式)
docker compose exec server mysqldump -hmysql -ugpt2api -p \
--single-transaction --quick gpt2api | gzip > gpt2api-$(date +%F).sql.gz当前 compose 配置针对单机部署。后续要做多副本:
server可直接docker compose up -d --scale server=3(需前面加 nginx/traefik)backups卷改成共享存储(NFS / S3 fuse),否则每个副本只能看到自己创建的备份- Redis 分布式锁已天然支持多副本,MySQL 和 JWT 密钥需统一