Helm 部署

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

前置要求

  • Kubernetes 集群可用
  • Helm 可用
  • 集群可以拉取 ghcr.io/0rays/cbctf、PostgreSQL、Redis 以及题目镜像
  • 如启用持久化,集群需要可用 StorageClass
  • 动态附件建议使用支持 ReadWriteMany 的共享存储
  • VPC 靶机需要提前安装 Kube-OVN 和 Multus CNI
  • KubeVirt VM 靶机需要提前安装 KubeVirt,并确认节点支持虚拟化

安装

添加 Helm Repo

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

须使用自定义 values

初次安装后,系统配置将以数据库中内容为准,尽可能一次性配置正确,不再从 values 中读取(但在连接数据库时会使用 values 中地址)

helm show values cbctf/cbctf > values.yaml
helm install cbctf cbctf/cbctf -n cbctf --create-namespace -f values.yaml

升级和卸载

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.picturecbctf.gin.upload.challengecbctf.gin.upload.writeup。旧的 cbctf.gin.upload.max 不再生效。

配置项说明示例
cbctf.host平台公开访问地址,不要带尾部 /https://ctf.example.com
cbctf.log.level应用日志级别info
cbctf.log.save是否持久化日志false
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.corsCORS 允许来源https://ctf.example.com
cbctf.gin.ratelimit.global全局限流100
cbctf.gin.jwt.secretJWT 签名密钥,留空时 Chart 自动生成并复用change-me-long-random
cbctf.gin.metrics.whitelist允许访问 /metrics 的 IP 或 CIDR10.0.0.0/8
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

Chart 会把 JWT 密钥写入 Secret,并通过 CBCTF_GIN_JWT_SECRET 注入容器。数据库和 Redis 密码也通过 Secret 注入。

PostgreSQL 和 Redis

配置项说明示例
postgres.enabled是否部署内置 PostgreSQLtrue
postgres.auth.database数据库名cbctf
postgres.auth.username用户名cbctf
postgres.auth.password密码,留空时自动生成并复用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
Info

当前 Chart values 中没有外部 PostgreSQL 或外部 Redis 的 externalHost 配置项。如果需要使用外部数据库,需要同步调整 Chart 模板或用等价的 Service 名称接入。

Kubernetes 靶机配置

配置项说明示例
serviceAccount.create是否创建应用 ServiceAccounttrue
cbctf.k8s.capture流量捕获镜像ghcr.io/domcyrus/rustnet:latest
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 创建的 ClusterRole 包含 Pod、Service、Job、NetworkPolicy、EndpointSlice、Multus NAD、KubeVirt VirtualMachine、Kube-OVN Subnet/VPC/IP 等资源权限。Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。

Ingress 示例

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

ingress:
  enabled: true
  className: nginx
  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 安装后,应用启动时会检查或创建以下资源:

  • 命名空间:{namespace}
  • 共享存储 PVC:{namespace}-shared-volume
Warning

PVC 缺失会导致动态附件不可用。KubeVirt 资源不会在启动时创建,只有启动包含 x-kubevirt: true 的 VM 靶机时才会创建对应 VirtualMachine