200 lines
4.2 KiB
Markdown
200 lines
4.2 KiB
Markdown
# 觅爻生产部署指南
|
||
|
||
## 目录说明
|
||
|
||
`deploy/` 用于存放生产环境启动所需文件:
|
||
|
||
- `docker-compose.prod.yml`:生产 Docker Compose 启动配置,只拉取已有镜像,不负责构建。
|
||
- `.env`:生产环境变量文件,本文件包含敏感信息,不应提交到 Git。
|
||
|
||
## 前置条件
|
||
|
||
生产机器需要安装:
|
||
|
||
- Docker
|
||
- Docker Compose v2
|
||
- AWS CLI v2
|
||
|
||
确认命令:
|
||
|
||
```bash
|
||
docker --version
|
||
docker compose version
|
||
aws --version
|
||
```
|
||
|
||
## 环境变量
|
||
|
||
`docker-compose.prod.yml` 默认从当前目录读取 `.env`:
|
||
|
||
```bash
|
||
deploy/.env
|
||
```
|
||
|
||
必须包含 AWS ECR 镜像定位变量:
|
||
|
||
```text
|
||
AWS_ACCOUNT_ID=<你的 AWS 账号 ID>
|
||
AWS_REGION=<ECR 所在区域>
|
||
ECR_REPOSITORY=<ECR 仓库名>
|
||
```
|
||
|
||
如果本目录下的 `.env` 是从项目根目录 `.env` 复制过来的,通常还需要手动追加以上三个变量。
|
||
|
||
默认镜像地址会拼接为:
|
||
|
||
```text
|
||
${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPOSITORY}:latest
|
||
```
|
||
|
||
如果要手动指定完整镜像地址,可以在 `.env` 中设置:
|
||
|
||
```text
|
||
ERYAO_BACKEND_IMAGE=<完整镜像地址>
|
||
```
|
||
|
||
Web 服务端口使用项目环境变量:
|
||
|
||
```text
|
||
ERYAO_WEB__PORT=5775
|
||
```
|
||
|
||
默认只绑定本机回环地址:
|
||
|
||
```text
|
||
ERYAO_DEPLOY_BIND_HOST=127.0.0.1
|
||
```
|
||
|
||
如果生产机器没有 Nginx、ALB 或其他反向代理,需要直接对外暴露端口,可改为:
|
||
|
||
```text
|
||
ERYAO_DEPLOY_BIND_HOST=0.0.0.0
|
||
```
|
||
|
||
### 进程配置建议
|
||
|
||
生产 Compose 只启动一个 `worker-agent` 容器。Agent 任务、低频通用任务和反馈日报任务共用 `agent` 队列,不再单独常驻 `worker-general` 进程。
|
||
|
||
2 核 2G 机器建议使用:
|
||
|
||
```text
|
||
ERYAO_WEB__WORKERS=1
|
||
ERYAO_WORKER__GROUPS__AGENT__CONCURRENCY=2
|
||
```
|
||
|
||
4G 以上机器可按流量提高 Web 或 Agent worker 数量:
|
||
|
||
```text
|
||
ERYAO_WEB__WORKERS=2
|
||
ERYAO_WORKER__GROUPS__AGENT__CONCURRENCY=2
|
||
```
|
||
|
||
## 登录 ECR
|
||
|
||
进入部署目录,并把 `.env` 加载到当前 shell:
|
||
|
||
```bash
|
||
cd deploy
|
||
set -a
|
||
. ./.env
|
||
set +a
|
||
```
|
||
|
||
在生产机器上配置好 AWS 凭据后执行:
|
||
|
||
```bash
|
||
aws ecr get-login-password --region "$AWS_REGION" \
|
||
| docker login --username AWS --password-stdin \
|
||
"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
|
||
```
|
||
|
||
## 启动服务
|
||
|
||
启动 Web、Redis 和 worker:
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers pull
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers up -d
|
||
```
|
||
|
||
只启动 Web 和 Redis:
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml up -d
|
||
```
|
||
|
||
## 健康检查
|
||
|
||
如果 `ERYAO_WEB__PORT=5775`:
|
||
|
||
```bash
|
||
curl http://127.0.0.1:5775/health
|
||
```
|
||
|
||
期望返回:
|
||
|
||
```json
|
||
{"status":"ok"}
|
||
```
|
||
|
||
## 查看状态和日志
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers ps
|
||
docker logs -f eryao-prod-backend
|
||
docker logs -f eryao-prod-worker-agent
|
||
docker logs -f eryao-prod-redis
|
||
```
|
||
|
||
## 更新版本
|
||
|
||
当前 CI/CD 会在 `main` 分支构建后自动部署到生产机器:
|
||
|
||
- 推送前清空 ECR 仓库旧镜像,只保留新推送的 `latest`。
|
||
- 通过 `DEPLOY_SSH_KEY` 登录生产机器。
|
||
- 在生产机器执行 ECR 登录、`docker compose pull`、`docker compose up -d`。
|
||
- 健康检查通过后清理 7 天前未使用的本地 Docker 镜像。
|
||
|
||
Gitea Secrets 需要包含:
|
||
|
||
```text
|
||
AWS_ACCESS_KEY_ID
|
||
AWS_SECRET_ACCESS_KEY
|
||
AWS_REGION
|
||
AWS_ACCOUNT_ID
|
||
ECR_REPOSITORY
|
||
DEPLOY_SSH_KEY
|
||
DEPLOY_HOST
|
||
DEPLOY_USER
|
||
```
|
||
|
||
`DEPLOY_SSH_KEY` 是已加入生产机器 `ubuntu` 用户 `~/.ssh/authorized_keys` 的部署专用私钥。
|
||
当前生产机器对应:`DEPLOY_HOST=18.218.38.213`,`DEPLOY_USER=ubuntu`。
|
||
|
||
如需手动更新,在生产机器执行:
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers pull
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers up -d
|
||
```
|
||
|
||
## 停止服务
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers down
|
||
```
|
||
|
||
如需连 Redis 数据卷一起删除:
|
||
|
||
```bash
|
||
cd deploy
|
||
docker compose --env-file ./.env -f docker-compose.prod.yml --profile workers down -v
|
||
```
|
||
|
||
谨慎使用 `down -v`,它会删除 Redis 持久化数据。
|