ci: publish production image to Volcengine registry
This commit is contained in:
+36
-37
@@ -13,7 +13,7 @@
|
||||
|
||||
- Docker
|
||||
- Docker Compose v2
|
||||
- AWS CLI v2
|
||||
- Docker CLI registry login support
|
||||
- Node.js 22+ (前端 SSR 服务)
|
||||
- PM2 (前端进程管理)
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
```bash
|
||||
docker --version
|
||||
docker compose version
|
||||
aws --version
|
||||
node --version # 需要 >= 22.12.0
|
||||
pm2 --version
|
||||
```
|
||||
@@ -58,23 +57,13 @@ Internet → Nginx (443)
|
||||
deploy/.env
|
||||
```
|
||||
|
||||
必须包含 AWS ECR 镜像定位变量:
|
||||
生产镜像固定从火山云镜像仓库拉取:
|
||||
|
||||
```text
|
||||
AWS_ACCOUNT_ID=<你的 AWS 账号 ID>
|
||||
AWS_REGION=<ECR 所在区域>
|
||||
ECR_REPOSITORY=<ECR 仓库名>
|
||||
linksy-docker-cn-beijing.cr.volces.com/eryao/eryao-backend:latest
|
||||
```
|
||||
|
||||
如果本目录下的 `.env` 是从项目根目录 `.env` 复制过来的,通常还需要手动追加以上三个变量。
|
||||
|
||||
默认镜像地址会拼接为:
|
||||
|
||||
```text
|
||||
${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPOSITORY}:latest
|
||||
```
|
||||
|
||||
如果要手动指定完整镜像地址,可以在 `.env` 中设置:
|
||||
如果要手动指定完整镜像地址,可在 `.env` 中设置:
|
||||
|
||||
```text
|
||||
ERYAO_BACKEND_IMAGE=<完整镜像地址>
|
||||
@@ -116,7 +105,7 @@ ERYAO_WEB__WORKERS=2
|
||||
ERYAO_WORKER__GROUPS__AGENT__CONCURRENCY=2
|
||||
```
|
||||
|
||||
## 登录 ECR
|
||||
## 登录火山云镜像仓库
|
||||
|
||||
进入部署目录,并把 `.env` 加载到当前 shell:
|
||||
|
||||
@@ -127,12 +116,14 @@ set -a
|
||||
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"
|
||||
printf '%s' "$VOLCENGINE_REGISTRY_PASSWORD" \
|
||||
| docker login \
|
||||
--username "$VOLCENGINE_REGISTRY_USERNAME" \
|
||||
--password-stdin \
|
||||
linksy-docker-cn-beijing.cr.volces.com
|
||||
```
|
||||
|
||||
## 启动服务
|
||||
@@ -180,28 +171,36 @@ docker logs -f eryao-prod-redis
|
||||
|
||||
当前 CI/CD 会在 `main` 分支构建后自动部署到生产机器:
|
||||
|
||||
- 推送前清空 ECR 仓库旧镜像,只保留新推送的 `latest`。
|
||||
- 在 Gitea runner 构建后端镜像,并推送到火山云 `eryao` 命名空间,同时保留 commit SHA 和 `latest` 标签。
|
||||
- 通过 `DEPLOY_SSH_KEY` 登录生产机器。
|
||||
- 在生产机器执行 ECR 登录、`docker compose pull`、`docker compose up -d`。
|
||||
- 在生产机器登录火山云仓库,执行 `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
|
||||
VOLCENGINE_REGISTRY_USERNAME
|
||||
VOLCENGINE_REGISTRY_PASSWORD
|
||||
DEPLOY_SSH_KEY
|
||||
DEPLOY_HOST
|
||||
DEPLOY_USER
|
||||
```
|
||||
|
||||
`DEPLOY_SSH_KEY` 是已加入生产机器 `ubuntu` 用户 `~/.ssh/authorized_keys` 的部署专用私钥。
|
||||
当前生产机器对应:`DEPLOY_HOST=18.218.38.213`,`DEPLOY_USER=ubuntu`。
|
||||
`DEPLOY_SSH_KEY` 是已加入生产机器 `root` 用户 `~/.ssh/authorized_keys` 的部署专用私钥。
|
||||
当前生产机器对应:`DEPLOY_HOST=47.239.107.213`,`DEPLOY_USER=root`。
|
||||
|
||||
CI 的 AWS 用户需要至少允许 ECR 登录、建仓库、推送镜像、列出镜像,以及为了覆盖式清理旧镜像所需的 `ecr:BatchDeleteImage`。如果缺少 `ecr:BatchDeleteImage`,部署仍可继续推送 `latest`,但 ECR 旧镜像不会被清空。
|
||||
部署脚本会在每次发布前把后端数据库连接更新为觅爻港区 RDS:
|
||||
|
||||
```text
|
||||
ERYAO_DATABASE__HOST=pgm-j6ckocm243gd2997.pg.cnhk.rds.aliyuncs.com
|
||||
ERYAO_DATABASE__PORT=5432
|
||||
ERYAO_DATABASE__NAME=supabase_db
|
||||
ERYAO_DATABASE__USER=postgres
|
||||
```
|
||||
|
||||
`ERYAO_DATABASE__PASSWORD` 保留生产服务器现有值,不写入仓库或 CI 日志。
|
||||
|
||||
`VOLCENGINE_REGISTRY_USERNAME` 当前为 `洵觅科技2025@2101878614`。`VOLCENGINE_REGISTRY_PASSWORD` 必须配置为火山云仓库访问密码;CI 会先登录 registry,再向 `eryao/eryao-backend` 推送镜像,推送失败时部署停止。
|
||||
|
||||
如需手动更新,在生产机器执行:
|
||||
|
||||
@@ -246,13 +245,13 @@ PUBLIC_API_URL=https://api.meeyao.com npm run build
|
||||
|
||||
```bash
|
||||
# 上传构建产物
|
||||
rsync -avz -e "ssh -i xunmee.pem" web/dist/ ubuntu@18.218.38.213:/home/ubuntu/deploy/web/
|
||||
rsync -avz -e "ssh -i 觅爻港区密钥对.pem" web/dist/ root@47.239.107.213:/root/deploy/web/
|
||||
|
||||
# 上传依赖配置
|
||||
rsync -avz -e "ssh -i xunmee.pem" web/package.json web/package-lock.json ubuntu@18.218.38.213:/home/ubuntu/deploy/web/
|
||||
rsync -avz -e "ssh -i 觅爻港区密钥对.pem" web/package.json web/package-lock.json root@47.239.107.213:/root/deploy/web/
|
||||
|
||||
# 安装生产依赖
|
||||
ssh -i xunmee.pem ubuntu@18.218.38.213 "cd /home/ubuntu/deploy/web && npm install --omit=dev"
|
||||
ssh -i 觅爻港区密钥对.pem root@47.239.107.213 "cd /root/deploy/web && npm install --omit=dev"
|
||||
```
|
||||
|
||||
### PM2 管理
|
||||
@@ -287,13 +286,13 @@ server {
|
||||
|
||||
# 静态资源直接从 client 目录提供
|
||||
location /_astro {
|
||||
root /home/ubuntu/deploy/web/client;
|
||||
root /root/deploy/web/client;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
location /images {
|
||||
root /home/ubuntu/deploy/web/client;
|
||||
root /root/deploy/web/client;
|
||||
expires 30d;
|
||||
}
|
||||
|
||||
@@ -316,8 +315,8 @@ server {
|
||||
cd web && PUBLIC_API_URL=https://api.meeyao.com npm run build
|
||||
|
||||
# 2. 上传
|
||||
rsync -avz -e "ssh -i xunmee.pem" dist/ ubuntu@18.218.38.213:/home/ubuntu/deploy/web/
|
||||
rsync -avz -e "ssh -i 觅爻港区密钥对.pem" dist/ root@47.239.107.213:/root/deploy/web/
|
||||
|
||||
# 3. 重启服务
|
||||
ssh -i xunmee.pem ubuntu@18.218.38.213 "pm2 restart meeyao-web"
|
||||
ssh -i 觅爻港区密钥对.pem root@47.239.107.213 "pm2 restart meeyao-web"
|
||||
```
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name: eryao-prod
|
||||
|
||||
x-backend-common: &backend-common
|
||||
image: ${ERYAO_BACKEND_IMAGE:-${AWS_ACCOUNT_ID:?AWS_ACCOUNT_ID is required}.dkr.ecr.${AWS_REGION:?AWS_REGION is required}.amazonaws.com/${ECR_REPOSITORY:?ECR_REPOSITORY is required}:latest}
|
||||
image: ${ERYAO_BACKEND_IMAGE:-linksy-docker-cn-beijing.cr.volces.com/eryao/eryao-backend:latest}
|
||||
env_file:
|
||||
- path: ./.env
|
||||
required: true
|
||||
|
||||
Reference in New Issue
Block a user