部署指南#
Docker Compose 部署(推荐)#
生产环境部署#
- 克隆项目
git clone https://github.com/yourusername/waterball-interview.git
cd waterball-interview- 配置环境变量
# 创建 .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- 启动服务
docker-compose -f docker-compose.prod.yml up -d --build- 验证部署
# 检查容器状态
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:
RDS 数据库
- 创建 PostgreSQL 16 实例
- 配置安全组规则
- 记录连接信息
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_NAMEVercel (前端) + 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