部署指南#

Docker Compose 部署(推荐)#

生产环境部署#

  1. 克隆项目
git clone https://github.com/yourusername/waterball-interview.git
cd waterball-interview
  1. 配置环境变量
# 创建 .env 文件
cat > .env << EOF
# 数据库配置
DB_HOST=postgres
DB_PORT=5432
DB_NAME=waterball_academy
DB_USERNAME=postgres
DB_PASSWORD=your_secure_password

# JWT 配置(必须 >= 32 字符)
JWT_SECRET=your_very_long_and_secure_secret_key_here_32chars_min

# CORS 配置
CORS_ORIGINS=https://your-domain.com

# Google OAuth (可选)
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret

# 前端 API URL
NEXT_PUBLIC_API_URL=https://your-domain.com
NEXT_PUBLIC_GOOGLE_CLIENT_ID=your_google_client_id
EOF
  1. 启动服务
docker-compose -f docker-compose.prod.yml up -d --build
  1. 验证部署
# 检查容器状态
docker-compose ps

# 查看日志
docker-compose logs -f

开发环境部署#

docker-compose up --build

生产环境注意事项#

1. 安全配置#

JWT Secret

  • 必须 >= 32 字符
  • 使用强随机字符串
  • 定期轮换
# 生成安全的 JWT secret
openssl rand -base64 32

数据库密码

  • 使用复杂密码
  • 不要使用默认密码

2. CORS 配置#

docker-compose.prod.yml 中设置允许的域名:

environment:
  CORS_ORIGINS: "https://waterball.yorukaru.com,https://www.waterball.yorukaru.com"

3. HTTPS 配置#

推荐使用 Nginx + Let’s Encrypt:

server {
    listen 443 ssl http2;
    server_name waterball.yorukaru.com;

    ssl_certificate /etc/letsencrypt/live/waterball.yorukaru.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/waterball.yorukaru.com/privkey.pem;

    # 前端
    location / {
        proxy_pass http://localhost:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 后端 API
    location /api {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

云平台部署#

AWS 部署#

使用 AWS ECS + RDS:

  1. RDS 数据库

    • 创建 PostgreSQL 16 实例
    • 配置安全组规则
    • 记录连接信息
  2. ECS 服务

    • 创建 ECS 集群
    • 定义任务定义(使用 docker-compose.yml)
    • 配置环境变量
    • 设置负载均衡器

Google Cloud Platform#

使用 Cloud Run + Cloud SQL:

# 构建并推送镜像
gcloud builds submit --tag gcr.io/PROJECT_ID/waterball-frontend
gcloud builds submit --tag gcr.io/PROJECT_ID/waterball-backend

# 部署到 Cloud Run
gcloud run deploy waterball-frontend \
  --image gcr.io/PROJECT_ID/waterball-frontend \
  --platform managed \
  --region asia-east1

gcloud run deploy waterball-backend \
  --image gcr.io/PROJECT_ID/waterball-backend \
  --platform managed \
  --region asia-east1 \
  --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME

Vercel (前端) + Heroku (后端)#

前端部署到 Vercel:

cd frontend
vercel --prod

后端部署到 Heroku:

cd backend
heroku create waterball-backend
heroku addons:create heroku-postgresql:hobby-dev
git push heroku main

数据备份#

自动备份脚本#

#!/bin/bash
# backup.sh

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups"

# 备份数据库
docker exec waterball-db pg_dump -U postgres waterball_academy > \
  $BACKUP_DIR/db_backup_$TIMESTAMP.sql

# 压缩备份
gzip $BACKUP_DIR/db_backup_$TIMESTAMP.sql

# 删除 7 天前的备份
find $BACKUP_DIR -name "db_backup_*.sql.gz" -mtime +7 -delete

echo "Backup completed: $BACKUP_DIR/db_backup_$TIMESTAMP.sql.gz"

设置定时任务:

# 每天凌晨 2 点备份
0 2 * * * /path/to/backup.sh

监控和日志#

日志查看#

# 查看所有服务日志
docker-compose logs -f

# 查看特定服务日志
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f postgres

健康检查#

docker-compose.yml 中已配置健康检查:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
  interval: 30s
  timeout: 10s
  retries: 3

故障排查#

容器无法启动#

# 查看详细错误
docker-compose logs backend

# 重启服务
docker-compose restart backend

数据库连接失败#

# 检查数据库容器状态
docker-compose ps postgres

# 进入数据库容器
docker-compose exec postgres psql -U postgres -d waterball_academy

前端无法连接后端#

检查环境变量 NEXT_PUBLIC_API_URL 是否正确设置。

更新部署#

# 拉取最新代码
git pull origin main

# 重新构建并启动
docker-compose down
docker-compose up -d --build

# 清理旧镜像
docker image prune -f