Skip to main content
  • Site values for the helmfile (deploy/selfhost/environments/default.yaml, copied to your own file). They describe the site and are turned into values for each chart.
  • Chart values of deploy/helm/atoll. The helmfile sets them in deploy/selfhost/values/atoll.yaml.gotmpl; override any of them with atoll.values in your site file.

Site values (helmfile)

Chart values

Values of the chart in deploy/helm/atoll. Settings map to the server’s environment variables; see values.yaml for every key. Server permissions, by namespace:

Feature settings

Each platform feature reads its own ATOLL_<AREA>_* variables. The chart passes them through without knowing them, so new settings need no chart change:
The chart refuses a config key without the area’s prefix, which catches typos.

Panel host

The panel signs in with the atoll_session cookie, set host-only on the panel host (Secure when urls.panel is https), and calls /api on that same host. Two rules follow:
  • The panel host (and the API host) must not be urls.appsDomain or below it. Apps under the wildcard run user code and could set cookies for a parent domain they share with the panel. The chart fails the install otherwise. Prefer an apps domain on a different registrable domain altogether.
  • If the panel gets its own host (urls.panel different from urls.public), the chart adds it to the atoll-server Ingress. atoll-server serves the panel’s static files itself, so by default the whole host goes to it; ingress.panelService can send everything but /api to a separate Service instead.
Behind the ingress the server trusts X-Forwarded-For/-Proto (ATOLL_AUTH_TRUST_FORWARDED=true) for client IPs (rate limits, audit) and the https scheme. That is safe because Traefik overwrites those headers from clients it does not trust, and the atoll-server NetworkPolicy keeps everything but the controller and the release namespace away from the API port. Build pods run untrusted code and could send any header, so they only reach the internal port 8081, which serves the build protocol (/internal) and nothing else; /internal in turn answers 404 on the API port.

Network policies

k3s enforces them with its built-in controller. Other clusters need a CNI that enforces NetworkPolicies. Egress is restricted for build and app pods (untrusted code); platform components keep open egress.

Ingress controllers

Traefik is the default. Two details are handled by the chart:
  • Traefik ranks routers by rule length, and the wildcard rule *.apps... is longer than short exact hosts, so the wildcard atoll-sites Ingress gets router.priority: 1 and app Ingresses always win.
  • App Ingresses have TLS without a secret. A Traefik TLSStore named default serves the wildcard certificate for them (certManager.traefikDefaultCertificate).
With ingress.controller: nginx the chart adds ingress-nginx annotations (512m uploads, 300 s timeouts) instead; set the wildcard certificate as --default-ssl-certificate. ingress-nginx no longer gets security fixes, so prefer Traefik.