Skip to main content
Always: read the release notes, take a Postgres backup (backups.md), and see the change before applying it:
apply only upgrades releases whose rendered manifests changed. Limit it to one release with -l name=atoll.

The platform

  1. Build and push the new server and builder images (install.md).
  2. Set atoll.tag and atoll.builderImage in your site file, then helmfile ... apply -l name=atoll.
The server Deployment rolls one pod at a time (maxUnavailable: 0) and applies database migrations on start. Deployments that are building on a replica that stops are marked failed (“Interrupted because the server running it stopped”) and must be deployed again, so upgrade when no builds are running:
Running user apps are not touched by an upgrade. Upgrading from a release where build pods called the server on port 8080: build pods now use the internal port 8081 (/internal answers 404 on 8080), the build and publish containers get separate tokens, and app env vars move into one Secret per app (<app>-env) on each app’s next deployment. The chart handles all of it; check that a custom urls.internal uses port 8081 and that your own NetworkPolicies let atoll-builds reach it. Builds running during the upgrade fail and must be deployed again. Upgrading to a release with build runners: the server needs ATOLL_RUNNERS_SEAL_KEY and stops at startup without it. Add it to the env keys Secret before upgrading:

Dependencies

Chart versions are pinned in helmfile.yaml.gotmpl. To move one forward, change its version, read the chart’s upgrade notes, and apply -l name=<release>. Notes per component:

k3s

Upgrade one node at a time, servers first, staying within one minor version per step:
Draining respects the PodDisruptionBudgets (atoll-server, Traefik, cert-manager, CloudNativePG), so a three-node cluster keeps serving. Build pods on a drained node are killed, failing their deployments. For many nodes, the system-upgrade-controller automates the same steps.