# Production Deploy Package 本目录是单机 `docker compose` 的生产交付包,架构为: - 应用层:`litellm + web + worker-critical + worker-default + worker-bulk + init-job` - 中间件:`redis` - 数据与认证:云 Supabase(通过环境变量访问) - 反向代理:由服务器侧 nginx 托管(不在本目录编排) ## 交付物 1. `deploy/build-prod-image.sh`:构建并导出生产镜像。 2. `deploy/docker-compose.prod.yml`:生产 Docker Compose 编排。 3. `deploy/.env.prod.example`:生产环境变量模板。 4. `deploy/README.md`:部署说明书。 ## 安全基线 - `deploy/.env.prod.example` 仅作为模板,真实密钥请在服务器上填写到 `deploy/.env.prod`,不要提交仓库。 - Redis 密码必填;为空时容器会启动失败。 - 后端镜像默认使用非 root 用户运行。 - 容器间通信仅走 Docker 内网(`redis`、`litellm` 服务名)。 ## 目录结构 ```text deploy/ ├── build-prod-image.sh ├── docker-compose.prod.yml ├── .env.prod.example └── README.md ``` ## 一次性交付:构建生产镜像 在仓库根目录执行: ```bash bash deploy/build-prod-image.sh ``` 成功后会产出: - 镜像名:`social-app-backend:prod`(可用 `SOCIAL_BACKEND_IMAGE` 覆盖) - 归档文件:`deploy/social-app-backend-prod.tar.gz` 如果你要把镜像拷贝到另一台服务器,传输该 `.tar.gz` 后执行: ```bash gunzip -c social-app-backend-prod.tar.gz | docker load ``` ## 启动流程(生产) ### 1) 检查环境变量 先创建生产环境变量文件: ```bash cp deploy/.env.prod.example deploy/.env.prod ``` 确认 `deploy/.env.prod` 至少包含以下关键变量(云 Supabase 与数据库连接): - `SOCIAL_SUPABASE__PUBLIC_URL` - `SOCIAL_SUPABASE__ANON_KEY` - `SOCIAL_SUPABASE__SERVICE_ROLE_KEY` - `SOCIAL_SUPABASE__JWT_SECRET` - `SOCIAL_DATABASE__HOST` - `SOCIAL_DATABASE__PORT` - `SOCIAL_DATABASE__NAME` - `SOCIAL_DATABASE__USER` - `SOCIAL_DATABASE__PASSWORD` - `SOCIAL_REDIS__PASSWORD` 说明: - 容器内通信统一使用 Docker 内网:`SOCIAL_REDIS__HOST=redis`、`SOCIAL_LITELLM__HOST=litellm`。 - `SOCIAL_WEB__HOST`/`SOCIAL_LITELLM__BIND_HOST` 是容器内监听地址,生产建议保持 `0.0.0.0`。 ### 2) 启动常驻服务 ```bash docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml up -d redis litellm-config-job docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml up -d litellm web worker-critical worker-default worker-bulk ``` ### 3) 执行一次性 bootstrap ```bash docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml run --rm init-job ``` ### 4) 查看状态与日志 ```bash docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml ps docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml logs -f web ``` ## 停止与重启 停止: ```bash docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml down ``` 重启: ```bash docker compose --env-file deploy/.env.prod -f deploy/docker-compose.prod.yml up -d ``` ## nginx 对接建议 - 反向代理到 `127.0.0.1:${SOCIAL_WEB__PORT}`(默认 `5775`)。 - 仅开放 nginx 对外端口;应用容器仅发布到本机回环地址。 - 如果 nginx 运行在宿主机,`web` 需要保留 `127.0.0.1:host_port:container_port` 端口映射。 - 如果 nginx 也运行在 Docker 同网络内,可以移除 `web.ports`,改为容器内反向代理(例如 `proxy_pass http://web:5775`)。 ### App 安装包下载代理(必须配置) 在 nginx 增加静态目录映射:`location /releases/ { alias /你的项目绝对路径/deploy/static/releases/; }`,这样 `https://你的域名/releases/xxx.apk` 可直接下载安装包。并在 `deploy/.env.prod` 设置 `SOCIAL_APP_VERSION__DOWNLOAD_BASE_URL=https://你的域名` 与 `SOCIAL_APP_VERSION__RELEASE_PATH_PREFIX=releases`,确保 `check-updates` 返回的 `download_url` 指向该路径。 ## 已知约束 - LiteLLM 配置由 `litellm-config-job` 一次性生成到共享 volume(`litellm_config`)。若更新了 LLM 目录或 Provider Key,需重新执行 `up -d litellm-config-job` 后重启 `litellm`。 - `init-job` 为一次性任务,不长期驻留。