目录

GZCTF Docker Compose 部署教程(Ubuntu 22.04)含镜像加速与比赛创建演示

使用 docker 搭建一个GZCTF平台

# 0 前言与适用范围

请注意文章时效性,以下演示均在本地虚拟机进行

悦读官方文档一定是最好的选择:【快速上手】 (opens new window)

提示

GZCTF官网:GZCTF 通过 Docker 镜像的方式提供,你可以通过 docker-compose 的方式快速部署一个功能完善的 CTF 平台。请注意,这并不是唯一的部署方式,我们更推荐使用 Kubernetes 的方式部署

所以如果docker可用,可以拉取镜像快速搭建一个GZCTF平台

适用范围

系统:Ubuntu 22.04
部署方式:Docker Compose
目标:本地测试或小规模比赛环境
1
2
3

# 1、环境准备

  • vmware虚拟机
  • ubuntu server 22.04
  • 1c2g的配置(1核CPU,2G内存或更多)
  • tabby ssh工具

# 2、系统换源

在一个新的ubuntu系统时,更换到阿里源加快下载

换源

echo 'deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ jammy universe
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates universe
deb http://mirrors.aliyun.com/ubuntu/ jammy multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ jammy-security universe
deb http://mirrors.aliyun.com/ubuntu/ jammy-security multiverse' | sudo tee /etc/apt/sources.list > /dev/null
1
2
3
4
5
6
7
8
9
10

更新软件列表

sudo apt update
1

# 3、安装 Docker 与 Compose

使用腾讯云镜像源,安装docker

添加 Docker 软件源

sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
1
2
3
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
1
2
3
4
5

安装docker

sudo apt-get install docker-ce docker-ce-cli  docker-compose containerd.io docker-buildx-plugin docker-compose-plugin -y
1

验证是否安装成功

docker -v
docker compose version
1
2

启动docker

sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
1
2
3

添加当前用户到docker组

sudo usermod -aG docker $USER
newgrp docker
1
2

# 4、配置镜像加速

推荐使用 Github 项目 https://github.com/SuperManito/LinuxMirrors,如果你使用了本文以外的系统,也可以尝试使用这个项目来安装docker以及配置镜像加速,我这里已经手动安装了docker,所以直接配置镜像加速即可

Docker 更换镜像加速器

curl -fsSL https://linuxmirrors.cn/docker.sh -o docker.sh
sudo bash docker.sh --only-registry
rm -f docker.sh
1
2
3

# 5、一键生成配置(.env + appsettings.json)

在根目录//home方便找到的目录都可以,选择当前用户家目录,避免权限问题

cd ~
mkdir GZCTF
cd GZCTF
1
2
3

根据官方文档要求做

警告

为了后续的配置,请准备好如下的初始化参数:

  • GZCTF_ADMIN_PASSWORD:初始管理员密码,在数据库未初始化时生效,需要在第一次启动时进行设置,配置在 compose.yml 中。
  • POSTGRES_PASSWORD: 数据库密码,需要配置在 compose.yml 中及 appsettings.json 中。
  • XOR_KEY: 用于加密比赛私钥的随机字符串,需要配置在 appsettings.json 中。
  • PUBLIC_ENTRY: 外部访问地址,可以是 IP 或域名,需要配置在 appsettings.json 中,用于提供给选手访问题目容器的地址。

准备生成强密码脚本

cat > setup.sh << 'EOF'
#!/bin/bash

# 检查openssl是否安装
command -v openssl >/dev/null || { echo "请先安装 openssl: sudo apt install openssl -y"; exit 1; }

# 生成随机字符串函数
gen_pass() {
  openssl rand -base64 24 | tr -d "=+/" | cut -c1-20
}

GZCTF_ADMIN_PASSWORD=$(gen_pass)
POSTGRES_PASSWORD=$(gen_pass)
XOR_KEY=$(gen_pass)

read -p "请输入服务器公网或内网IP: " PUBLIC_ENTRY

cat > .env <<INNER_EOF
GZCTF_ADMIN_PASSWORD=$GZCTF_ADMIN_PASSWORD
POSTGRES_PASSWORD=$POSTGRES_PASSWORD
XOR_KEY=$XOR_KEY
PUBLIC_ENTRY=$PUBLIC_ENTRY
INNER_EOF

echo "✅ 随机密码已生成并写入 .env 文件"
echo "管理员密码: $GZCTF_ADMIN_PASSWORD"
echo "数据库密码: $POSTGRES_PASSWORD"
echo "XOR_KEY: $XOR_KEY"

# 写入appsettings.json
cat > appsettings.json <<APPSETTINGS_EOF
{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=$POSTGRES_PASSWORD"
  },
  "EmailConfig": {
    "SenderAddress": "",
    "SenderName": "",
    "UserName": "",
    "Password": "",
    "Smtp": {
      "Host": "localhost",
      "Port": 587
    }
  },
  "XorKey": "$XOR_KEY",
  "ContainerProvider": {
    "Type": "Docker",
    "PortMappingType": "Default",
    "EnableTrafficCapture": false,
    "PublicEntry": "$PUBLIC_ENTRY",

    "DockerConfig": {
      "SwarmMode": false,
      "Uri": "unix:///var/run/docker.sock"
    }
  },
  "RequestLogging": false,
  "DisableRateLimit": true,
  "RegistryConfig": {
    "UserName": "",
    "Password": "",
    "ServerAddress": ""
  },
  "CaptchaConfig": {
    "Provider": "None",
    "SiteKey": "<Your SITE_KEY>",
    "SecretKey": "<Your SECRET_KEY>",
    "GoogleRecaptcha": {
      "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
      "RecaptchaThreshold": "0.5"
    }
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 7,
    "ForwardLimit": 1,
    "TrustedNetworks": ["192.168.12.0/8"]
  }
}
APPSETTINGS_EOF
echo '✅ appsettings.json 已生成,请手动检查内容是否正确'

# 权限收紧
chmod 600 .env
chmod 600 appsettings.json
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

执行脚本生成随机密码并写入.env文件,过程会提示输入服务器公网或内网IP地址

警告

注意修改入口ip PublicEntry参数为你的实际ip,不要照抄

bash setup.sh
1

检查 appsettings.json 文件内容是否正确,尤其是PublicEntry 参数

# 关于 .env 与变量替换

  • Docker Compose 只会读取 compose.yml 中的 ${变量}
  • 不会自动替换 appsettings.json
  • 因此本教程使用脚本生成真实 appsettings.json
  • 修改 .env 后需使用 docker compose up -d --force-recreate

# 6、编写 compose.yml 并启动服务

创建compose.yml文件,写入内容,Docker Compose 默认会读取当前目录下的 .env 文件,用于替换 compose.yml 中的 ${变量}。

要注意的是,这里使用的是 develop 版本的镜像,在实际的生产环境或比赛环境,建议使用稳定版本的镜像。

tee compose.yml > /dev/null <<'EOF'
services:
  gzctf:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:develop
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=${GZCTF_ADMIN_PASSWORD}"
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "80:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
    depends_on:
      - db

  db:
    image: postgres:alpine
    restart: always
    environment:
      - "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}"
    volumes:
      - "./data/db:/var/lib/postgresql/data"
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

docker compose 启动服务

docker compose -f compose.yml up -d
1

# 7、部署验证

访问http://192.168.209.136,可以看到已经搭建成功

可以通过 .env 文件找到 GZCTF 的管理员账号密码,使用 admin 账号登录创建比赛,发布题目等等

安装neofetch(毫不相干)

sudo apt install neofetch -y
neofetch
1
2

# 8、比赛创建演示

管理员账号点击管理

新建比赛

可以对比赛信息进行修改

点击题目管理,新建题目

以 sqli-labs 靶场为例

在 docker labs找到热门的sqli-labs镜像,填到题目的容器镜像地址

https://hub.docker.com/r/acgpiano/sqli-labs

镜像地址 acgpiano/sqli-labs:latest

保存题目,也可以直接先测试题目

访问测试题目地址

发布题目

# 9、FAQ(收集中)

注意,本文并非GZCTF官方文档,可能存在过时或不适用的内容,请以官方文档为准。

  • Q: 怎么自定义 GZCTF 端口
  • A: 修改 compose.yml 中的 ports 配置,例如 - "8080:8080" 将主机的8080端口映射到容器的8080端口。

# 10、推荐项目

CTF比赛 docker 常用基础模板

linux 镜像加速

Ciallo ~(∠・ω< )⌒★

参考、致谢:

最后一次更新于: 2026/02/21, 12:33:00