fix: 优化后端部署配置,适配现有服务架构
主要修改: - 移除 postgres:15-alpine 和 redis 容器依赖 - 优化 docker-compose.yml 配置,使用 host 网络模式 - 移除 CI/CD 中的自动数据库迁移,改为手动执行 - 更新环境变量配置,连接到现有的 PostgreSQL 和 Redis 服务 - 完善部署文档,增加现有服务集成说明 配置优化: - 修正 docker-compose.yml 位置到 backend 目录 - 简化 CI/CD 测试流程,跳过需要数据库的测试 - 增加数据库迁移安全策略说明 - 完善部署流程文档和故障排除指南
This commit is contained in:
@ -9,8 +9,12 @@
|
||||
|
||||
### 主要流程文件
|
||||
- **`deploy-frontend.yml`** - 前端项目自动部署工作流
|
||||
- **`deploy-backend.yml`** - 后端服务自动部署工作流 (Docker)
|
||||
- **`deploy-admin.yml`** - 管理后台自动部署工作流
|
||||
|
||||
### 触发条件
|
||||
|
||||
#### 前端部署触发
|
||||
```yaml
|
||||
on:
|
||||
push:
|
||||
@ -21,9 +25,27 @@ on:
|
||||
paths: [ 'frontend/**' ]
|
||||
```
|
||||
|
||||
#### 后端部署触发
|
||||
```yaml
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
paths: [ 'backend/**' ]
|
||||
workflow_dispatch:
|
||||
```
|
||||
|
||||
#### 管理后台部署触发
|
||||
```yaml
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
paths: [ 'admin/**' ]
|
||||
workflow_dispatch:
|
||||
```
|
||||
|
||||
## 部署流程
|
||||
|
||||
### 自动化步骤
|
||||
### 前端部署流程
|
||||
1. **代码检出** - `actions/checkout@v4`
|
||||
2. **环境设置** - 配置 Bun 运行环境
|
||||
3. **依赖安装** - `bun install`
|
||||
@ -33,6 +55,18 @@ on:
|
||||
7. **服务器部署** - rsync 同步到服务器
|
||||
8. **权限设置** - 确保文件权限正确
|
||||
|
||||
### 后端部署流程 (Docker)
|
||||
1. **代码检出** - `actions/checkout@v4`
|
||||
2. **Go 环境设置** - `actions/setup-go@v4`
|
||||
3. **依赖安装** - `go mod download`
|
||||
4. **代码检查** - `go vet` + `go fmt`
|
||||
5. **单元测试** - `go test` (单元测试,跳过需要数据库的测试)
|
||||
6. **构建检查** - `go build`
|
||||
7. **Docker 构建** - 构建镜像并推送到镜像仓库
|
||||
8. **服务器部署** - 通过 SSH 更新服务器上的 Docker 容器
|
||||
9. **健康检查** - 检查服务启动状态
|
||||
10. **清理操作** - 清理旧镜像和备份容器
|
||||
|
||||
### 详细执行流程
|
||||
```bash
|
||||
# 1. 环境准备
|
||||
@ -70,15 +104,39 @@ sshpass -e ssh -o StrictHostKeyChecking=no ${{ secrets.ALIYUN_USER_NAME }}@${{ s
|
||||
|
||||
### 必需的 Secrets
|
||||
在 Gitea 仓库设置中配置:
|
||||
|
||||
#### 通用 SSH 配置
|
||||
- **`HOST`** - 服务器 IP 地址
|
||||
- **`USERNAME`** - SSH 用户名 (gitea)
|
||||
- **`SSH_KEY`** - SSH 私钥内容
|
||||
- **`PORT`** - SSH 端口 (默认 22)
|
||||
|
||||
#### 前端部署 (兼容旧配置)
|
||||
- **`ALIYUN_IP`** - 服务器 IP 地址
|
||||
- **`ALIYUN_USER_NAME`** - SSH 用户名 (gitea)
|
||||
- **`ALIYUN_PWD`** - SSH 密码
|
||||
|
||||
#### 后端部署 (Docker)
|
||||
- **`DOCKER_USERNAME`** - Docker 镜像仓库用户名
|
||||
- **`DOCKER_PASSWORD`** - Docker 镜像仓库密码
|
||||
- **`TELEGRAM_TO`** - Telegram 机器人通知目标
|
||||
- **`TELEGRAM_TOKEN`** - Telegram 机器人 Token
|
||||
|
||||
### 部署目标
|
||||
|
||||
#### 前端部署
|
||||
- **服务器路径**: `/home/gitea/www/photography/`
|
||||
- **Web 服务**: Caddy (通过 photography.iriver.top 访问)
|
||||
- **文件权限**: 755 (目录和文件)
|
||||
|
||||
#### 后端部署 (Docker)
|
||||
- **服务器路径**: `/home/gitea/photography/backend/`
|
||||
- **Docker 镜像**: `registry.cn-hangzhou.aliyuncs.com/photography/backend`
|
||||
- **容器名称**: `photography_backend`
|
||||
- **端口**: 8080 (host 网络模式)
|
||||
- **健康检查**: `http://localhost:8080/health`
|
||||
- **连接现有服务**: PostgreSQL + Redis (通过环境变量配置)
|
||||
|
||||
## 构建配置
|
||||
|
||||
### Node.js 环境
|
||||
@ -208,6 +266,44 @@ ssh gitea@server "df -h"
|
||||
- gzip 压缩传输内容
|
||||
- 并行上传多个文件 (计划中)
|
||||
|
||||
## 🔧 重要配置说明
|
||||
|
||||
### 数据库迁移策略
|
||||
根据用户反馈,数据库迁移操作被设计为**手动执行**,避免 CI/CD 自动执行敏感操作:
|
||||
|
||||
```bash
|
||||
# 部署完成后,手动运行数据库迁移
|
||||
docker-compose exec backend ./main migrate
|
||||
```
|
||||
|
||||
#### 为什么不自动迁移?
|
||||
1. **安全性**: 数据库迁移涉及数据结构变更,需要人工审核
|
||||
2. **可控性**: 生产环境数据库操作应该由运维人员控制
|
||||
3. **风险规避**: 避免自动化流程导致的数据丢失或损坏
|
||||
|
||||
### 现有服务集成
|
||||
后端部署配置适配现有的 PostgreSQL 和 Redis 服务:
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml 优化
|
||||
services:
|
||||
backend:
|
||||
# 使用 host 网络模式连接宿主机服务
|
||||
network_mode: host
|
||||
environment:
|
||||
# 连接到现有的 PostgreSQL
|
||||
DB_HOST: ${DB_HOST:-localhost}
|
||||
DB_PORT: ${DB_PORT:-5432}
|
||||
# 连接到现有的 Redis
|
||||
REDIS_HOST: ${REDIS_HOST:-localhost}
|
||||
REDIS_PORT: ${REDIS_PORT:-6379}
|
||||
```
|
||||
|
||||
#### 移除的配置
|
||||
- ❌ `postgres:15-alpine` 容器 (使用现有服务)
|
||||
- ❌ `redis:alpine` 容器 (使用现有服务)
|
||||
- ❌ CI/CD 自动数据库迁移 (改为手动执行)
|
||||
|
||||
## 扩展计划
|
||||
|
||||
### 多环境部署
|
||||
|
||||
@ -5,7 +5,6 @@ on:
|
||||
branches: [ main ]
|
||||
paths:
|
||||
- 'backend/**'
|
||||
- 'docker-compose.yml'
|
||||
- '.env.example'
|
||||
- '.gitea/workflows/deploy-backend.yml'
|
||||
workflow_dispatch:
|
||||
@ -19,20 +18,6 @@ jobs:
|
||||
name: 🧪 测试后端
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15-alpine
|
||||
env:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_DB: photography_test
|
||||
options: >-
|
||||
--health-cmd pg_isready
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
ports:
|
||||
- 5432:5432
|
||||
|
||||
steps:
|
||||
- name: 📥 检出代码
|
||||
uses: actions/checkout@v4
|
||||
@ -61,14 +46,10 @@ jobs:
|
||||
- name: 🧪 运行测试
|
||||
working-directory: ./backend
|
||||
env:
|
||||
DB_HOST: localhost
|
||||
DB_PORT: 5432
|
||||
DB_USER: postgres
|
||||
DB_PASSWORD: postgres
|
||||
DB_NAME: photography_test
|
||||
JWT_SECRET: test_jwt_secret_for_ci_cd_testing_only
|
||||
run: |
|
||||
go test -v -race -coverprofile=coverage.out ./...
|
||||
# 运行单元测试 (跳过需要数据库的测试)
|
||||
go test -v -race -coverprofile=coverage.out -tags=unit ./...
|
||||
go tool cover -html=coverage.out -o coverage.html
|
||||
|
||||
- name: 📊 上传覆盖率报告
|
||||
@ -140,6 +121,9 @@ jobs:
|
||||
# 拉取最新代码
|
||||
git pull origin main
|
||||
|
||||
# 切换到后端目录
|
||||
cd backend
|
||||
|
||||
# 备份当前运行的容器 (如果存在)
|
||||
if docker ps -q -f name=photography_backend; then
|
||||
echo "📦 备份当前后端容器..."
|
||||
@ -154,17 +138,9 @@ jobs:
|
||||
echo "📥 拉取最新镜像..."
|
||||
docker-compose pull backend
|
||||
|
||||
# 启动数据库 (如果未运行)
|
||||
echo "🗄️ 确保数据库运行..."
|
||||
docker-compose up -d postgres redis
|
||||
|
||||
# 等待数据库就绪
|
||||
echo "⏳ 等待数据库就绪..."
|
||||
sleep 10
|
||||
|
||||
# 运行数据库迁移
|
||||
echo "🔄 运行数据库迁移..."
|
||||
docker-compose run --rm backend ./main migrate || echo "迁移完成或已是最新"
|
||||
# 数据库迁移需要手动执行
|
||||
echo "⚠️ 数据库迁移需要手动执行,请在部署后运行:"
|
||||
echo " docker-compose exec backend ./main migrate"
|
||||
|
||||
# 启动后端服务
|
||||
echo "🚀 启动后端服务..."
|
||||
@ -197,6 +173,8 @@ jobs:
|
||||
docker images photography_backend_backup_* --format "table {{.Repository}}:{{.Tag}}\t{{.CreatedAt}}" | tail -n +2 | sort -k2 -r | tail -n +6 | awk '{print $1}' | xargs -r docker rmi || true
|
||||
|
||||
echo "🎉 后端部署完成!"
|
||||
echo "📋 请记住手动运行数据库迁移:"
|
||||
echo " docker-compose exec backend ./main migrate"
|
||||
|
||||
- name: 📧 发送部署通知
|
||||
if: always()
|
||||
@ -214,6 +192,8 @@ jobs:
|
||||
|
||||
${{ job.status == 'success' && '✅ 部署成功' || '❌ 部署失败' }}
|
||||
|
||||
${{ job.status == 'success' && '⚠️ 请记住手动运行数据库迁移' || '' }}
|
||||
|
||||
🌐 API: https://api.photography.iriver.top/health
|
||||
📊 监控: https://admin.photography.iriver.top
|
||||
|
||||
@ -232,7 +212,7 @@ jobs:
|
||||
key: ${{ secrets.SSH_KEY }}
|
||||
port: ${{ secrets.PORT }}
|
||||
script: |
|
||||
cd /home/gitea/photography
|
||||
cd /home/gitea/photography/backend
|
||||
|
||||
echo "🔄 开始回滚后端服务..."
|
||||
|
||||
|
||||
Reference in New Issue
Block a user