Docker Compose 手动部署:完全掌控每一步

雅卡团队 · 2026-10-20T17:00

如果你需要「每一步都自己掌控」——指定端口、外接数据库、把前端挂到 CDN、只重启某一个服务 —— 那就走手动编排这条路。交付包里的 docker-compose.yml 就是完整拓扑,没有隐藏步骤。

一、四个容器各干什么

服务作用备注
postgres唯一的数据来源(业务表 + 系统表)命名卷 pg-data,默认 512M 内存上限
new-api原生网关底座(官方镜像,零代码改动)不对外暴露端口,只在内网被调用
yaka-ext扩展层:计费、订阅、支付、发票、素材、站点设置等业务 API健康检查依赖数据库
nginx统一入口:静态资源 + API 反代 + TLS只暴露 HTTP_PORT / HTTPS_PORT

二、拉包并准备 .env

sudo mkdir -p /opt/yaka && cd /opt/yaka
sudo curl -fsSLO https://yaka-dist.tos-cn-beijing.volces.com/releases/latest/yaka-instance.tar.gz
sudo tar -xzf yaka-instance.tar.gz && cd yaka-instance-*

cp .env.example .env
vi .env

必改项(其余保持默认即可):

变量怎么填
PUBLIC_BASE_URL对外地址,带协议,例如 https://ai.example.com。支付回调、邮件链接都按它拼
PG_PASSWORD强随机口令,别用默认的「请改成强口令」
DB_DSN必须与 PG_PASSWORD 同步改,否则扩展层连不上库
SESSION_SECRET随机会话密钥,泄露等于会话可伪造
NATIVE_ADMIN_PASSWORD原生底座管理员口令,装完立刻改
HTTP_PORT80 被占用时改(如 8088)
DEPLOY_EDITIONstandard 或 premium;高级版必须同时把 BOOT_GRANT_REQUIRED 设为 1

generate 一个强口令: openssl rand -base64 24。不要在多个环境复用同一个。

三、启动

docker compose up -d
docker compose ps          # 等 postgres / yaka-ext 变 healthy

启动顺序由 compose 的 depends_on + 健康检查保证:数据库先就绪,扩展层再起,最后网关接入。 如果 yaka-ext 反复重启,先看它的日志,不要盲改配置:

docker compose logs -n 100 yaka-ext

四、改配置的正确姿势

这是最容易翻车的地方:改完 .env 必须重建容器。

# ✗ 错:restart 不会重新注入环境变量
docker compose restart yaka-ext

# ✓ 对:只重建这一个服务,不动数据库
docker compose up -d --no-deps --force-recreate yaka-ext

--no-deps 很关键:不加它,compose 会把依赖链上的容器一并重建, 在跑着的业务会被顺带重启一遍。

五、升级与回滚

# 升级前先备份
./backup.sh

# 替换 build/ 下的二进制 / 前端 / 迁移脚本后,只重建扩展层
docker compose up -d --no-deps --force-recreate yaka-ext

前端是挂载目录而不是打进镜像的,所以换前端产物不用重建镜像,清空目录再解包即可。 回滚 = 把备份里的 build/ 放回去再重建一次容器。

六、踩坑清单

现象原因与处置
yaka-ext 一直 unhealthy,日志报连接数据库失败 DB_DSN 里的口令与 PG_PASSWORD 不一致。两处必须同步改。
口令里带 @ : / # % 导致连库失败 DSN 是 URL 结构,特殊字符必须百分号编码(如 @ → %40)。 拿不准就生成一个只含字母数字的口令。
改 .env 没生效用了 restart。必须 --force-recreate。
反代到容器名后偶发 502 后端容器重启换了 IP,而反代缓存了旧 IP。给容器固定 ipv4_address, 或干脆反代到 127.0.0.1:HTTP_PORT 走网关。
2G 内存机器上 OOM 把 PG_MEM_LIMIT 调到 512m、EXT_MEM_LIMIT 调到 384m; 同时确认机器有 swap。
数据没了执行过 down -v。命名卷被删,只能从备份恢复。