Skip to content

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 logs

2. 下载配置文件

bash
# 下载 docker-compose.yml
curl -O http://ctf-docs.lostpeach.cn/docker-compose.yml

# 下载环境变量示例
curl -O http://ctf-docs.lostpeach.cn/env.example

3. 配置环境变量

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 pull

5. 启动服务

bash
docker compose up -d

6. 初始化数据库

bash
# 等待服务启动
sleep 30

# 初始化数据库
docker exec -it ctf-backend python cli.py db init-db

7. 验证部署

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

故障排查

服务无法启动

  1. 检查日志:
bash
docker compose logs
  1. 检查端口占用:
bash
netstat -tunlp | grep -E '80|3306|6379'
  1. 检查磁盘空间:
bash
df -h
docker system df

数据库连接失败

  1. 检查 MySQL 是否运行:
bash
docker compose ps mysql
  1. 测试数据库连接:
bash
docker exec -it ctf-mysql mysql -u root -p
  1. 检查环境变量:
bash
docker exec ctf-backend env | grep DATABASE_URL

前端无法访问

  1. 检查 Nginx 配置:
bash
docker exec ctf-frontend nginx -t
  1. 查看 Nginx 日志:
bash
docker compose logs frontend
  1. 检查端口映射:
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

下一步

Released under the MIT License.