Docker 部署
本文档详细介绍如何使用 Docker 部署 Ocean CTF 平台。
架构说明
Ocean CTF 采用微服务架构,包含以下容器:
┌─────────────┐
│ Frontend │ Nginx + React/Vue (端口 80)
└─────────────┘
↓
┌─────────────┐
│ Backend │ FastAPI (端口 8000)
└─────────────┘
↓
┌─────────────┐ ┌─────────────┐
│ MySQL │ │ Redis │
└─────────────┘ └─────────────┘
↓
┌─────────────┐ ┌─────────────┐
│Celery Worker│ │ Celery Beat │
└─────────────┘ └─────────────┘镜像说明
后端镜像
peach0214/ctf-backend:latest特点:
- 基于 Python 3.11
- 代码已编译为 .pyc 字节码
- 包含所有依赖
- 大小约 500MB
前端镜像
peach0214/ctf-frontend:latest特点:
- 基于 Nginx Alpine
- 包含管理端和用户端
- 大小约 50MB
docker-compose.yml
完整的 docker-compose.yml 配置:
yaml
services:
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: ctf-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- ctf-network
# Redis 缓存
redis:
image: redis:7-alpine
container_name: ctf-redis
restart: always
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
ports:
- "6379:6379"
networks:
- ctf-network
# 后端服务
backend:
image: peach0214/ctf-backend:latest
container_name: ctf-backend
restart: always
environment:
- DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE}
- REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
- SECRET_KEY=${SECRET_KEY}
- FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD}
volumes:
- backend_data:/app/data
- backend_static:/app/static
- backend_logs:/app/logs
depends_on:
- mysql
- redis
networks:
- ctf-network
# Celery Worker
celery-worker:
image: peach0214/ctf-backend:latest
container_name: ctf-celery-worker
restart: always
command: celery -A app.core.celery_app worker --loglevel=info
environment:
- DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE}
- REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
- SECRET_KEY=${SECRET_KEY}
volumes:
- backend_data:/app/data
- backend_static:/app/static
- backend_logs:/app/logs
depends_on:
- mysql
- redis
networks:
- ctf-network
# Celery Beat
celery-beat:
image: peach0214/ctf-backend:latest
container_name: ctf-celery-beat
restart: always
command: celery -A app.core.celery_app beat --loglevel=info
environment:
- DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE}
- REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
- SECRET_KEY=${SECRET_KEY}
volumes:
- backend_data:/app/data
- backend_logs:/app/logs
depends_on:
- mysql
- redis
networks:
- ctf-network
# 前端服务
frontend:
image: peach0214/ctf-frontend:latest
container_name: ctf-frontend
restart: always
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
ports:
- "80:80"
depends_on:
- backend
networks:
- ctf-network
volumes:
mysql_data:
redis_data:
backend_data:
backend_static:
backend_logs:
networks:
ctf-network:
driver: bridge环境变量配置
创建 .env 文件:
bash
# MySQL 配置
MYSQL_ROOT_PASSWORD=your_strong_root_password
MYSQL_DATABASE=ctf_db
MYSQL_USER=ctf_user
MYSQL_PASSWORD=your_strong_password
# Redis 配置
REDIS_PASSWORD=your_redis_password
# 后端配置
SECRET_KEY=your_very_long_secret_key_at_least_32_characters
FIRST_SUPERUSER_PASSWORD=admin部署步骤
1. 准备环境
bash
# 创建部署目录
mkdir -p /opt/ctf-platform
cd /opt/ctf-platform
# 创建必要的子目录
mkdir -p nginx data logs2. 下载配置文件
bash
# 下载 docker-compose.yml
curl -O http://ctf-docs.lostpeach.cn/docker-compose.yml
# 下载环境变量示例
curl -O http://ctf-docs.lostpeach.cn/env.example3. 配置环境变量
bash
# 复制示例文件
cp env.example .env
# 编辑配置文件,修改所有密码
vim .env必须修改的配置项:
MYSQL_ROOT_PASSWORD- MySQL root 密码MYSQL_PASSWORD- MySQL 用户密码REDIS_PASSWORD- Redis 密码SECRET_KEY- 后端密钥(至少 32 位随机字符串)FIRST_SUPERUSER_PASSWORD- 管理员密码
4. 拉取镜像
bash
docker compose pull5. 启动服务
bash
docker compose up -d6. 初始化数据库
bash
# 等待服务启动
sleep 30
# 初始化数据库
docker exec -it ctf-backend python cli.py db init-db7. 验证部署
bash
# 检查服务状态
docker compose ps
# 查看日志
docker compose logs -f常用命令
服务管理
bash
# 启动所有服务
docker compose up -d
# 停止所有服务
docker compose down
# 重启服务
docker compose restart
# 重启特定服务
docker compose restart backend日志查看
bash
# 查看所有日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f backend
docker compose logs -f celery-worker
# 查看最近 100 行日志
docker compose logs --tail=100 backend进入容器
bash
# 进入后端容器
docker exec -it ctf-backend bash
# 进入数据库容器
docker exec -it ctf-mysql mysql -u root -p数据备份
bash
# 备份数据库
docker exec ctf-mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} ctf_db > backup_$(date +%Y%m%d).sql
# 备份数据卷
docker run --rm -v ocean-ctf_mysql_data:/data -v $(pwd):/backup alpine tar czf /backup/mysql_data.tar.gz /data数据恢复
bash
# 恢复数据库
docker exec -i ctf-mysql mysql -u root -p${MYSQL_ROOT_PASSWORD} ctf_db < backup_20260304.sql版本更新
更新到新版本
bash
# 1. 备份数据
docker exec ctf-mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} ctf_db > backup_before_update.sql
# 2. 拉取新版本镜像
docker pull peach0214/ctf-backend:v1.1.0
docker pull peach0214/ctf-frontend:v1.1.0
# 3. 更新 docker-compose.yml 中的版本号
vim docker-compose.yml
# 4. 停止服务
docker compose down
# 5. 启动新版本
docker compose up -d
# 6. 执行数据库迁移(如需要)
docker exec -it ctf-backend python cli.py db upgrade故障排查
服务无法启动
- 检查日志:
bash
docker compose logs- 检查端口占用:
bash
netstat -tunlp | grep -E '80|3306|6379'- 检查磁盘空间:
bash
df -h
docker system df数据库连接失败
- 检查 MySQL 是否运行:
bash
docker compose ps mysql- 测试数据库连接:
bash
docker exec -it ctf-mysql mysql -u root -p- 检查环境变量:
bash
docker exec ctf-backend env | grep DATABASE_URL前端无法访问
- 检查 Nginx 配置:
bash
docker exec ctf-frontend nginx -t- 查看 Nginx 日志:
bash
docker compose logs frontend- 检查端口映射:
bash
docker compose ps frontend性能优化
资源限制
在 docker-compose.yml 中添加资源限制:
yaml
backend:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G日志轮转
yaml
backend:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"增加 Worker 数量
yaml
celery-worker:
command: celery -A app.core.celery_app worker --loglevel=info --concurrency=4