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/helm.md.

Helm 部署

CBCTF Chart 位于仓库根目录的 chart/。默认会创建应用 Deployment、Service、Ingress、ServiceAccount、ClusterRole、共享 PVC,以及内置 PostgreSQL 和 Redis。

前置要求

  • Kubernetes 集群可用
  • Helm 可用
  • 集群可以拉取 ghcr.io/0rays/cbctf、PostgreSQL、Redis 以及题目镜像
  • 如启用持久化,集群需要可用 StorageClass
  • 动态附件输入与抓包文件需要平台和运行时 Pod 共享同一 PVC;多节点场景使用 ReadWriteMany
  • VPC 靶机需要提前安装 Kube-OVN 和 Multus CNI
  • KubeVirt VM 靶机需要提前安装 KubeVirt,并确认节点支持虚拟化

安装

添加 Helm Repo

helm repo add cbctf https://cbctf.0rays.club
helm repo update

须使用自定义 values

Helm values 会渲染为容器内 /app/config.yaml。应用 Deployment 固定为单副本、Recreate 策略;ConfigMap 变化触发 Pod 替换,会有短暂中断,并非滚动更新。

helm show values cbctf/cbctf > values.yaml
helm upgrade --install cbctf cbctf/cbctf -n cbctf --create-namespace -f values.yaml --wait --timeout 10m
Info

本文与仓库 Chart 0.0.29 对应。使用仓库代码时可将命令中的 cbctf/cbctf 换成 ./chart;新配置能力需要匹配版本的后端镜像。

运行时设置首次写入数据库后,以数据库为准。修改 values 中的 host、JWT、注册、上传限制或 Kubernetes 运行参数再升级,并不会覆盖已经保存的设置;请到「系统管理」修改并按需重启。参见配置来源与生效时机。

升级和卸载

helm upgrade cbctf cbctf/cbctf -n cbctf -f values.yaml
helm uninstall cbctf -n cbctf

共享 PVC 默认带有保留策略,卸载不会删除 /app/data 中的数据。PostgreSQL 和 Redis 的 PVC 也应在确认备份后再手动清理。

常用 Values

配置项说明示例
image.repository应用镜像仓库ghcr.io/0rays/cbctf
image.tag应用镜像标签latest
imagePullSecrets私有镜像拉取 Secret[{name: regcred}]
imageCredentials.*Chart 自动创建镜像仓库 Secret 的内联凭据registry: ghcr.io
timezone容器时区Asia/Shanghai
service.typeService 类型ClusterIP
service.portService 端口8000
ingress.enabled是否启用 Ingresstrue
ingress.classNameIngressClassnginx
ingress.hosts域名和路径ctf.example.com
ingress.tlsTLS Secret 配置cbctf-tls
resources应用 Pod 资源限制requests.cpu: 500m
persistence.enabled是否创建共享 PVCtrue
persistence.storageClass共享 PVC 的 StorageClassnfs-client
persistence.accessMode访问模式ReadWriteMany
persistence.size共享 PVC 容量20Gi
persistence.existingClaim复用已有 PVCcbctf-data

应用配置

图片、题目附件和题解的大小限制分别使用 cbctf.gin.upload.picture、cbctf.gin.upload.challenge、cbctf.gin.upload.writeup。

配置项说明示例
cbctf.host平台公开访问地址,不要带尾部 /https://ctf.example.com
cbctf.gin.modeGin 运行模式release
cbctf.gin.host容器内监听地址0.0.0.0
cbctf.gin.port容器内监听端口8000
cbctf.gin.upload.picture图片上传大小限制,单位 MiB8
cbctf.gin.upload.challenge题目附件上传大小限制,单位 MiB8
cbctf.gin.upload.writeup题解上传大小限制,单位 MiB8
cbctf.gin.proxies可信代理 IP 或 CIDR10.244.0.0/16
cbctf.gin.origins允许的浏览器请求 Originhttps://ctf.example.com
cbctf.gin.ratelimit.global全局限流100
cbctf.gin.jwt.secretJWT 签名密钥change-me-long-random
cbctf.gin.metrics.whitelist允许访问 /metrics 的 IP 或 CIDR10.0.0.0/8
cbctf.gin.pprof.whitelist允许访问 /debug/pprof/* 的 IP 或 CIDR127.0.0.1
cbctf.asynq.queues.traffic靶机流量解析任务并发2
cbctf.registration.enabled是否允许公开注册true
cbctf.registration.default_group新用户默认分组 ID,0 表示不指定0
cbctf.cheat.ip.whitelist作弊检测 IP 白名单10.0.0.0/8
cbctf.webhook.whitelistWebhook 目标白名单example.com

JWT、PostgreSQL 和 Redis 密钥会写入 /app/config.yaml。

管理后台不能修改 PostgreSQL/GORM、Redis、数据目录、Gin 监听地址和监听端口。

PostgreSQL 和 Redis

配置项说明示例
postgres.enabled是否部署内置 PostgreSQLtrue
postgres.auth.database数据库名cbctf
postgres.auth.username用户名cbctf
postgres.auth.passwordPostgreSQL 密码example-postgres-password
postgres.persistence.enabledPostgreSQL 数据持久化true
postgres.persistence.sizePostgreSQL PVC 容量5Gi
postgres.extraConfig追加到 postgresql.conf 的配置max_connections = 500
redis.enabled是否部署内置 Redistrue
redis.auth.passwordRedis 密码example-redis-password
redis.persistence.enabledRedis 数据持久化true
redis.persistence.sizeRedis PVC 容量1Gi

关闭内置组件时必须设置 externalHost,地址按原值使用,不追加命名空间。认证和端口仍使用对应的 auth 与 service.port:

postgres:
  enabled: false
  externalHost: postgres.example.com
  service:
    port: 5432
  auth:
    database: cbctf
    username: cbctf
    password: replace-with-database-password
redis:
  enabled: false
  externalHost: redis.example.com
  service:
    port: 6379
  auth:
    password: replace-with-redis-password
cbctf:
  gorm:
    postgres:
      sslmode: true

PostgreSQL 需允许安装 pg_trgm 扩展,并提供足够的连接数。使用数据库连接代理时,请选择直连或 session pooling;transaction pooling 不适用于平台的任务协调。Redis 支持地址、端口和密码配置,需提供可直接连接的单实例地址。

内置 PostgreSQL 的 auth 变量仅初始化空数据目录;对已有 PVC 修改 values 中的密码不会执行数据库 ALTER ROLE,应先协调修改数据库凭据。关闭任一数据库的 persistence.enabled 后使用 emptyDir,Pod 重建会丢失对应数据。

共享数据卷与镜像凭据

  • 平台挂载 /app/data,默认 PVC 为 {namespace}-shared-volume。persistence.existingClaim 可以指定同命名空间已有 PVC,Chart 同时写入后端 k8s.shared_volume_claim,使生成器和抓包容器使用同一卷。
  • persistence.enabled: false 仅使平台数据使用临时卷,不会为运行时 Pod 创建共享 PVC;这不适用于需要动态附件或抓包的部署。
  • imagePullSecrets 与 imageCredentials 用于 Chart 管理的平台、PostgreSQL 和 Redis Pod。后端创建的题目、生成器、FRPC 和预热 Job 不会继承应用 Pod 的凭据;这些 Pod 使用运行命名空间的 default ServiceAccount,可将所需 Secret 配置到该 ServiceAccount。VM 的 containerDisk 私有镜像还需按 KubeVirt 的拉取凭据机制单独验证。
  • Chart 的 nodeSelector、tolerations、affinity、resources 作用于平台 Pod,不等于题目调度和资源配置;题目资源来自 Compose。

Kubernetes 靶机配置

配置项说明示例
serviceAccount.create是否创建应用 ServiceAccounttrue
cbctf.k8s.capture流量捕获镜像ghcr.io/domcyrus/rustnet:latest
cbctf.k8s.captureEnabled是否开启抓包容器true
cbctf.k8s.priorityClassName普通 Pod 的已有 PriorityClass,当前不应用到 VM""
cbctf.k8s.workerImage独立 worker 镜像地址,与主程序版本分开配置ghcr.io/0rays/cbctf-worker:latest
cbctf.k8s.generatorPoolSize每比赛、每动态题的生成器池容量2
cbctf.k8s.frp.on是否启用 FRP 端口暴露false
cbctf.k8s.frp.frpcFRP client 镜像ghcr.io/fatedier/frpc:v0.69.0
cbctf.k8s.frp.nginxFRP 转发辅助 Nginx 镜像nginx:latest
cbctf.k8s.frp.frpsFRPS 服务端、token 和端口池host: frps.example.com

Chart 使用命名空间 Role 管理 Pod、Service、Job、NetworkPolicy、ConfigMap、Multus NAD 和 VM,使用 ClusterRole 管理节点读取及 Kube-OVN 集群级资源。Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。

API groupResourcesVerbs用途
corepodscreate, get, list, watch, delete, deletecollection创建靶机、生成器、FRPC Pod,并等待状态和清理
corepods/execcreatePod 终端操作;附件 worker 不使用 Exec
corepods/logget读取 Pod 日志
coreservicescreate, list, delete创建 ClusterIP / NodePort 暴露
coreconfigmapscreate, get, list, watch, delete, deletecollection题目文件配置与资源清理
corepersistentvolumeclaimsget启动时检查共享 PVC
corenamespacesget启动时检查靶机命名空间
corenodeslist枚举节点镜像和预拉取目标节点
batchjobscreate创建镜像预拉取 Job
networking.k8s.ionetworkpoliciescreate, deletecollection创建和清理靶机网络策略
discovery.k8s.ioendpointslicesdeletecollection清理 Service 产生的 EndpointSlice
authorization.k8s.ioselfsubjectaccessreviewscreate启动时执行权限自检
k8s.cni.cncf.ionetwork-attachment-definitionscreate, get, deletecollectionVPC 模式下创建和清理 Multus NAD
kubevirt.iovirtualmachinescreate, get, list, watch, deletecollectionVM 创建、状态检查及清理
kubeovn.iosubnetscreate, get, deletecollectionVPC 模式下创建和清理 Kube-OVN 子网
kubeovn.iovpcscreate, get, list, watch, delete, deletecollectionVPC 资源树及级联删除确认
kubeovn.ioipsdeletecollection清理 Kube-OVN IP 分配

Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。

如果使用自定义 ServiceAccount 或外部 RBAC,可以用下面的命令提前检查关键权限:

kubectl auth can-i create pods -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i watch pods -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create selfsubjectaccessreviews.authorization.k8s.io --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create network-attachment-definitions.k8s.cni.cncf.io -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create virtualmachines.kubevirt.io -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create subnets.kubeovn.io --as=system:serviceaccount:cbctf:cbctf

Ingress 示例

cbctf:
  host: "https://ctf.example.com"
  gin:
    origins:
      - "https://ctf.example.com"
    proxies:
      - "10.244.0.0/16"
    pprof:
      whitelist:
        - "127.0.0.1"
        - "10.244.0.0/16"
    jwt:
      secret: "change-me-long-random-secret"

postgres:
  auth:
    password: "replace-with-database-password"
redis:
  auth:
    password: "replace-with-redis-password"
persistence:
  storageClass: nfs-client

ingress:
  enabled: true
  className: nginx
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "16m"
  hosts:
    - host: ctf.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: cbctf-tls
      hosts:
        - ctf.example.com

安装后检查

kubectl get pods -n cbctf
kubectl logs -n cbctf deployment/cbctf
kubectl get pvc -n cbctf
kubectl get ingress -n cbctf

检查初始管理员密码:

kubectl logs -n cbctf deployment/cbctf | grep "Init Admin"

如果 Pod 反复重启,优先检查日志中的数据库、Redis、RBAC、PVC、KubeVirt、Kube-OVN/Multus 相关错误。

启动时资源检查

Helm 安装后,应用启动时只检查以下资源,不自动创建命名空间或 PVC:

  • 命名空间:{namespace}
  • 共享存储 PVC:k8s.shared_volume_claim,未指定时为 {namespace}-shared-volume
  • Kubernetes API 权限:上方 RBAC 表中的所有 verbs
Warning

命名空间或必需 RBAC 缺失会使启动失败;PVC 缺失会记录警告,随后动态附件和启用抓包的靶机可能无法启动。KubeVirt 资源不会在启动时创建,只有启动包含 x-kubevirt: true 的 VM 靶机时才会创建对应 VirtualMachine。