https://gzctf.gzti.me/zh/guide/start/quick-start
按照上面的部署,得到下面的平台
https://desctf2026.wetolink.com
服务器本身配置尚可,16H24G。

早上来了大概一千人不到参加比赛,挂了。
排查服务器,负载本身不高,但 Postgres 数据库挂了,GZCTF本身 dotnet 进程占用也不高。
最后发现是 Postgres 没调优+GZCTF没开多实例,特此记录,以作复盘。
这个其实一开始有开。
GZCTF的 appsettings.json 里打开缓存设置。
{
"ConnectionStrings": {
"RedisCache": "cache:6379,abortConnect=false"
}
}
然后 compose.yml 里加上缓存服务。
services:
cache:
# It is recommended to use garnet, you can also use redis:alpine
image: ghcr.io/microsoft/garnet-alpine:latest
command: ["--bind", "0.0.0.0"]
restart: always
docker compose up -d 启动。
打开 data/db/18/docker/postgresql.conf 文件,尾部添加这些,调优 Postgres。
# 连接
listen_addresses = '*'
max_connections = 200
# 内存
shared_buffers = 4GB
work_mem = 16MB
maintenance_work_mem = 512MB
autovacuum_work_mem = -1
effective_cache_size = 8GB
# WAL / checkpoint
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
# autovacuum
autovacuum = on
track_counts = on
autovacuum_max_workers = 5
autovacuum_naptime = 30s
# 日志(调试阶段)
log_min_duration_statement = 200ms # >200ms 的语句记录日志
log_statement = 'none'
log_connections = 'all'
log_disconnections = off
docker compose restart 重启。
这个是重点,踩坑在这里,多实例没开,没撑住,默认GZCTF只会用到单核,性能没发挥出来。
编辑 compose.yml
services:
gzctf:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "80:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
gzctf1:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "81:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
gzctf2:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "82:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
gzctf3:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "83:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
gzctf4:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "84:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
gzctf5:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "85:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
gzctf6:
image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=xxx"
# choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
- "LC_ALL=zh_CN.UTF-8"
ports:
- "86:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
# - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
depends_on:
- db
- cache
然后 docker compose up -d 拉起,然后前面的反代(比如Nginx,Caddy)配置上这些后端,负载均衡即可。
人傻了,忘记要对数据库调优和开多实例了,栽了跟头。
GZCTF本身要配置正确,性能真的蛮好的。