@@ -9,3 +9,141 @@ are available, where to deploy them to, and what credentials to use for building
99and deploying them.
1010
1111This will always be at ` /rcds.yaml ` in the challenges repository.
12+
13+ Available fields:
14+
15+ [[ toc]]
16+
17+ ## ` flag_regex `
18+
19+ Regex for the flag format. This is used to validate challenges' flags, and in
20+ the future will be sent to the scoreboard to help validate submissions.
21+
22+ ``` yaml
23+ flag_regex : ' example{.+}'
24+ ` ` `
25+
26+ ## ` registry`
27+
28+ Challenge container registry config. This is where the container images will be
29+ stored. This registry should be kept private in order to prevent leaks of
30+ challenge secrets or hidden challenges.
31+
32+ ` ` ` yaml
33+ registry:
34+ domain: registry.io/myctf
35+ tag_format: "{{domain}}/{{challenge}}-{{container}}:{{profile}}"
36+ build:
37+ user: pushuser
38+ pass: fakepassword
39+ cluster:
40+ user: pulluser
41+ pass: alsofake
42+
43+ ` ` `
44+
45+ # ## `domain`
46+
47+ This is the shared portion of the container image spec for the registry that
48+ will be used in the `tag_format` template. This should include the hostname and
49+ any persistent components.
50+
51+ Examples : ` docker.io/yourorg` , `ghcr.io/examplesec`
52+
53+ # ## `tag_format`
54+
55+ Specifies the container image and tag that challenge containers will be built
56+ as. This is used as a template with the challenge information to produce the
57+ final container image and tag for each challenge. Almost all registries work
58+ with the default format string.
59+
60+ Default, works for most registries (Docker, GHCR, DigitalOcean, self-hosted, ...) :
61+ - ` "{{domain}}/{{challenge}}-{{container}}:{{profile}}"`
62+
63+ For registries like AWS ECR that require all image registries to be precreated
64+ ahead-of-time, this keeps all the challenge info in the tag so only one ECR
65+ registry needs to be created :
66+ - ` "{{domain}}:{{challenge}}-{{container}}-{{profile}}"`
67+
68+ Format : Jinja-style double-braces around field name (`{{ field_name }}`)
69+
70+ The required and only fields are :
71+
72+ - `domain` : the domain config field above; the repository base URL
73+ - `challenge` : challenge name, slugified
74+ - `container` : name of the specific pod in the challenge this image is for
75+ - `profile` : the current deployment profile, for isolating images between environments
76+
77+ If setting a custom format, you must use all four of these fields in order for challenge images to not overwrite each other.
78+
79+ Example :
80+
81+ For challenge `pwn/notsh`, chal pod container `main`, profile `prod`, and domain `registry.io/myctf` :
82+
83+ ` ` ` yaml
84+ registry:
85+ domain: registry.io/myctf
86+ # default tag_format
87+ # --> registry.io/myctf/pwn-notsh-main:prod
88+ ` ` `
89+
90+ ` ` ` yaml
91+ registry:
92+ domain: registry.gitlab.com/ourteam/challenges-2025
93+ tag_format: "{{domain}}/{{challenge}}/{{container}}:{{profile}}"
94+ # --> registry.gitlab.com/ourteam/challenges-2025/pwn-notsh/main:prod
95+ ` ` `
96+
97+ # ## `build`
98+
99+ Registry credentials that will be used locally to push up challenge container images. This must have push permissions.
100+
101+ Format : ` { user: "registry-username", pass: "registry-password" }`
102+
103+ ` ` ` yaml
104+ registry:
105+ build:
106+ user: fakeuser
107+ pass: notrealpass
108+ ` ` `
109+
110+ # ## `cluster`
111+
112+ Registry credentials that will be used in the Kubernetes cluster to pull the challenge container images. This must have pull permissions, but does not need push.
113+
114+ Format : ` { user: "registry-username", pass: "registry-password" }`
115+
116+ ` ` ` yaml
117+ registry:
118+ cluster:
119+ user: alsofake
120+ pass: stillnotreal
121+ ` ` `
122+
123+ # # `defaults`
124+
125+ # ## `difficulty`
126+
127+ # ## `resources`
128+
129+
130+ # # `points`
131+
132+
133+ # # `deploy`
134+
135+
136+ # # `profiles`
137+
138+ # ## `frontend_url`
139+ # ## `frontend_token`
140+ # ## `challenges_domain`
141+ # ## `kubeconfig`
142+ # ## `kubecontext`
143+ # ## `s3`
144+ # ### `bucket_name`
145+ # ### `endpoint`
146+ # ### `region`
147+ # ### `access_key`
148+ # ### `secret_key`
149+ # ## `dns`
0 commit comments