For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt, and this page is available as Markdown at /deploy/settings.md.

配置说明

CBCTF 从内置默认值和 config.yaml 读取配置。Helm 会把 values 渲染成 /app/config.yaml,优先级高于内置默认值。

启动前请准备可读的配置文件,默认路径为 config.yaml,也可通过 -c <文件> 指定。使用 Helm 时通过 values 配置;应用设置不支持用环境变量覆盖。

以下项目需通过部署配置修改:

  • PostgreSQL/GORM 配置:gorm.*
  • Redis 连接信息:redis.*
  • 数据存储目录:path
  • Gin 监听地址和端口:gin.host、gin.port
  • 运行时共享 PVC:k8s.shared_volume_claim(空值回退到 {namespace}-shared-volume)

可在线修改的运行设置在首次启动时采用配置文件中的初始值,之后通过「系统管理」维护。升级 Helm values 不会覆盖已经保存的在线设置,在线修改也不会写回配置文件。

数据库和任务日志级别分别使用 gorm.log.level、asynq.log.level。平台日志的查看与长期留存见监控与日志。

保存与生效

在「系统管理」保存后,不同设置的生效时机如下:

设置生效时机
注册开关、默认分组、公开地址、Webhook/作弊白名单当前平台实例的后续操作使用新值
抓包开关、worker 镜像、生成器池容量、FRP 镜像等后续新建工作负载使用;已有实例不自动重建
Gin 模式、可信代理、CORS、上传限制、全局限流;任务并发;Kubernetes 命名空间需要在后台执行「重启」
固定部署配置修改文件/values 后重新创建 Pod;后台重启不会重新读取配置文件

多副本部署需要让各副本重新加载配置。迁移命名空间时,请同时准备目标命名空间的授权、PVC,并安排已有靶机与生成器的清理;Helm 部署通常使用 Release 所在命名空间。

图片、题目附件和题解分别通过 gin.upload.picture、gin.upload.challenge、gin.upload.writeup 设置大小上限。

常用配置项

配置项说明示例
host平台对外访问地址,用于根路径跳转、邮件链接、OAuth 回调等,不要带尾部 /https://ctf.example.com
path数据根目录,存放附件、动态附件、流量文件、GeoIP 数据库等./data
gin.modeGin 模式release
gin.hostHTTP 监听地址0.0.0.0
gin.portHTTP 监听端口8000
gin.proxies可信代理 IP 或 CIDR10.244.0.0/16
gin.upload.picture图片上传大小限制,单位 MiB8
gin.upload.challenge题目附件上传大小限制,单位 MiB8
gin.upload.writeup题解上传大小限制,单位 MiB8
gin.ratelimit.global全局每分钟限流100
gin.ratelimit.whitelist跳过限流的 IP 或 CIDR127.0.0.1
gin.origins允许的浏览器请求 Origin,用于跨域请求与认证 cookie 判断https://ctf.example.com
gin.jwt.secretJWT 签名密钥,生产环境必须替换默认值change-me-long-random
gin.metrics.whitelist允许访问 /metrics 的 IP 或 CIDR10.0.0.0/8
gin.pprof.whitelist允许访问 /debug/pprof/* 的 IP 或 CIDR127.0.0.1
gorm.postgres.hostPostgreSQL 地址postgres.cbctf.svc
gorm.postgres.portPostgreSQL 端口5432
gorm.postgres.userPostgreSQL 用户名cbctf
gorm.postgres.pwdPostgreSQL 密码example-postgres-password
gorm.postgres.dbPostgreSQL 数据库名cbctf
gorm.postgres.sslmode布尔值,false 为 disable,true 为 requirefalse
redis.hostRedis 地址redis.cbctf.svc
redis.portRedis 端口6379
redis.pwdRedis 密码example-redis-password
registration.enabled是否允许公开注册true
registration.default_group新用户默认分组 ID,0 表示不指定0

异步任务配置

Redis 同时用于缓存和 Asynq 任务队列。以下配置影响后台任务并发:

配置项说明示例
asynq.log.levelAsynq 日志级别warning
asynq.queues.victim靶机启动、停止各自的任务并发8
asynq.queues.traffic靶机流量解析任务并发2
asynq.queues.generator动态附件生成器启停任务并发3
asynq.queues.attachment附件 worker 分发并发上限32
asynq.queues.email邮件任务并发10
asynq.queues.webhookWebhook 任务并发15
asynq.queues.image图片处理任务并发10

当靶机启动、附件生成或邮件发送堆积时,先检查 Redis 状态和任务日志,再根据资源情况调整对应队列并发。

Kubernetes 配置

配置项说明示例
k8s.namespace靶机、生成器等资源所在命名空间cbctf
k8s.shared_volume_claim平台和运行时工作负载共用的 PVC;部署参数,后台不修改cbctf-data
k8s.capture流量捕获 sidecar 镜像ghcr.io/domcyrus/rustnet:latest
k8s.capture_enabled是否创建抓包容器及相关挂载true
k8s.priority_class_name普通 Pod 使用的已有 PriorityClass,当前不应用到 VM""
k8s.worker_image含 /app/worker 的独立 worker 镜像ghcr.io/0rays/cbctf-worker:latest
k8s.generator_pool_size每比赛、每动态题的 generator 目标池容量2
k8s.frp.on是否启用 FRP 暴露靶机端口false
k8s.frp.frpcFRP client 镜像ghcr.io/fatedier/frpc:v0.69.0
k8s.frp.nginxFRP 辅助 Nginx 镜像nginx:latest
k8s.frp.frpsFRPS 地址、端口、token、端口池host: frps.example.com

抓包开关、Pod PriorityClass、worker 镜像和生成器池容量均可在「系统管理 → Kubernetes 配置」中查看和修改,保存到数据库后供后续新建实例及补池使用。已有实例不会自动重建或缩容,其他平台副本需重新加载配置。

预热、调度、缓存与回收机制见工作负载调度。启用 FRP 时使用 ClusterIP,否则使用 NodePort。

Helm 与配置文件的关系

Helm 会把以下值渲染进 ConfigMap:

Values说明
cbctf.gin.jwt.secretJWT 签名密钥
postgres.auth.password数据库密码
redis.auth.passwordRedis 密码

上述值保存在应用配置 ConfigMap 中,请妥善限制其访问权限。镜像仓库拉取凭据另由 Secret 管理。

首次启动行为

  • 自动准备平台所需的数据表和初始设置
  • 提供默认品牌、角色、分组、定时任务和第三方登录配置
  • 管理员组中没有用户时,创建 admin 账号并在日志中输出初始密码;首次登录后请修改密码

在线配置

管理后台会展示固定部署参数;PostgreSQL/GORM、Redis、数据目录、Gin 监听地址和监听端口只能通过部署配置修改。

GeoLite2-City 数据库可通过管理后台上传,保存到 {path}/GeoLite2-City.mmdb。

固定部署参数修改后需要重新创建 Pod。registration.default_group: 0 表示不指定注册用户组;应先到 RBAC 页面查看实际分组 ID,再选择普通用户分组,避免新用户没有参赛权限。

安全配置建议

:::warning

  • 生产环境不要使用默认 gin.jwt.secret
  • 数据库、Redis、SMTP、OAuth、FRP token 使用强密码或随机密钥
  • host、Ingress 域名应与用户访问地址一致,gin.origins 应包含前端页面的实际 Origin
  • 部署在反向代理后时正确设置 gin.proxies
  • /metrics 只允许 Prometheus 或可信来源访问
  • 只将必要的目标加入 webhook.whitelist :::