Skip to content

Migrating from Atelier to Opsting

Atelier is becoming Opsting. This guide covers what changes, and how to move an existing installation across.

Before you start

Use a second host if you possibly can. Install Opsting alongside your existing Atelier box rather than over it. The old install keeps serving while you verify the new one, and rollback costs nothing — you just keep using the old box. Migrating in place means downtime and no easy way back.

Set aside a couple of hours for a dozen or so apps, most of it waiting on builds.

You do not need to stop your Atelier install to take the backups below. Every step here reads from running pods.

What changes

AtelierOpsting
Kubernetes namespacesatelier, atelier-appsopsting, opsting-apps
Resource labelsatelier.io/*opsting.io/*
API token prefixatl_…ops_…existing tokens stop working
Environment variablesATELIER_*OPSTING_*
Config filesatelier.toml, atelier-spec.yamlopsting.toml, opsting-spec.yamlyou must rename the spec in each repo
In-cluster registryregistry.atelier.localregistry.opsting.local
Agent skillsatelier-build, atelier-operateopsting-build, opsting-operateagents must reinstall them
Installer binaryatelier-installopsting-install
MCP server nameatelier (tools mcp__atelier__*)rename it in your MCP host config

The three that need action on your side rather than the platform’s are the token prefix (re-mint any tokens your agents use), the skills (reinstall under their new names), and app URLs if you change your portal domain.

Step 1 — Preserve your data

Take an independent copy before touching anything, even if you have backups configured. These commands read from the running system.

Your app source

Every app’s source lives in the platform’s Gitea. This is the important one — with the repos you can always rebuild an app.

Terminal window
kubectl exec -n atelier deploy/gitea -- \
tar czf - -C /data/git repositories > gitea-repos.tar.gz

The platform database

Terminal window
POD=$(kubectl get pods -n atelier -l app=atelier-core -o name | head -1)
kubectl exec -n atelier ${POD#pod/} -c atelier-core -- \
sh -c 'cd /data && tar czf - atelier.db atelier.db-wal' > atelier-db.tar.gz

Your app data

Terminal window
POD=$(kubectl get pods -n atelier-apps -l atelier.io/app=<app> -o name | head -1)
kubectl exec -n atelier-apps ${POD#pod/} -- \
sh -c 'cd /data && tar czf - --exclude=lost+found .' > <app>-data.tar.gz

Three things that will bite you here:

  • Check the mount path. Not every app mounts at /data. Confirm with kubectl get pod <pod> -o jsonpath='{.spec.containers[*].volumeMounts[*].mountPath}'.
  • Some containers have no shell. Minimal or distroless images have no sh, so kubectl exec fails outright. For those, scale the app to 0 and mount the volume in a temporary pod instead.
  • tar exits non-zero on a live directory (“file changed as we read it”). The archive is still fine — just don’t chain the next command with &&.

For PostgreSQL apps, use pg_dump. A file copy of a live Postgres data directory is not consistent:

Terminal window
kubectl exec -n atelier-apps <postgres-pod> -- sh -c \
'PGPASSWORD=$(printenv POSTGRES_PASSWORD) pg_dumpall -h 127.0.0.1 \
-U $(printenv POSTGRES_USER)' > <app>-postgres.sql

Your secrets and config

Terminal window
kubectl get secrets,configmaps -n atelier-apps -o yaml > app-config.yaml
chmod 600 app-config.yaml

Verify every transfer

Terminal window
# in the pod
kubectl exec ... -- sha256sum /tmp/archive.tar.gz
# locally
sha256sum archive.tar.gz

Step 2 — Install Opsting

Follow the install guide on your new host. Nothing carries over from the old machine — new install, new credentials, new tokens.

Step 3 — Bring your apps back

For each app you want to keep:

1. Create it. Use scaffold, which makes an empty app plus a Git repo with a build-on-push webhook.

2. Rename your spec file, if the app has one.

3. Push your archived source into the new app’s repo, authenticating with an Opsting API token as the git password.

4. Push one more commit.

5. Wait for it to build, then check the app reports as running.

Apps deployed from a published image (rather than built from source) don’t need any of this — re-import them with the same image reference.

Step 4 — Restore app data

For each app that has data:

Terminal window
# 1. stop the app so nothing is writing
kubectl scale deploy/<app> -n opsting-apps --replicas=0
# 2. restore into the volume (via a temporary pod mounting the PVC)
# - untar your archive into the mount path
# - DELETE any stale *-shm file the fresh app created
# 3. start it again
kubectl scale deploy/<app> -n opsting-apps --replicas=1

Step 5 — Finish up

  • Re-mint API tokens. The prefix changed, so old tokens are invalid.
  • Reinstall the agent skills. They are now opsting-build and opsting-operate. Remove the old ones — an agent holding both will get conflicting instructions, and the old skills describe endpoints and a token prefix that no longer exist.
  • Update your MCP host config. If you registered the server as atelier, rename the entry; tools surface as mcp__<server-name>__*, so anything referring to mcp__atelier__* needs to follow.
  • Re-point external integrations — webhooks, bots, anything calling into your apps — at the new URLs.
  • Update your hosts file or DNS for the new portal domain.

Step 6 — Retire the old install

Keep the old box running until you’re satisfied. There’s no rush, and while it exists you have a complete, working fallback.

Keep your Step 1 archives even after you decommission it.

If you get stuck

Ask on Discord. If you hit something this guide doesn’t cover, tell us — this guide was written from a real migration, and it improves every time someone finds a new edge.