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
| Atelier | Opsting | |
|---|---|---|
| Kubernetes namespaces | atelier, atelier-apps | opsting, opsting-apps |
| Resource labels | atelier.io/* | opsting.io/* |
| API token prefix | atl_… | ops_… — existing tokens stop working |
| Environment variables | ATELIER_* | OPSTING_* |
| Config files | atelier.toml, atelier-spec.yaml | opsting.toml, opsting-spec.yaml — you must rename the spec in each repo |
| In-cluster registry | registry.atelier.local | registry.opsting.local |
| Agent skills | atelier-build, atelier-operate | opsting-build, opsting-operate — agents must reinstall them |
| Installer binary | atelier-install | opsting-install |
| MCP server name | atelier (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.
kubectl exec -n atelier deploy/gitea -- \ tar czf - -C /data/git repositories > gitea-repos.tar.gzThe platform database
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.gzYour app data
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.gzThree things that will bite you here:
- Check the mount path. Not every app mounts at
/data. Confirm withkubectl get pod <pod> -o jsonpath='{.spec.containers[*].volumeMounts[*].mountPath}'. - Some containers have no shell. Minimal or distroless images have no
sh, sokubectl execfails outright. For those, scale the app to 0 and mount the volume in a temporary pod instead. tarexits 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:
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.sqlYour secrets and config
kubectl get secrets,configmaps -n atelier-apps -o yaml > app-config.yamlchmod 600 app-config.yamlVerify every transfer
# in the podkubectl exec ... -- sha256sum /tmp/archive.tar.gz# locallysha256sum archive.tar.gzStep 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:
# 1. stop the app so nothing is writingkubectl 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 againkubectl scale deploy/<app> -n opsting-apps --replicas=1Step 5 — Finish up
- Re-mint API tokens. The prefix changed, so old tokens are invalid.
- Reinstall the agent skills. They are now
opsting-buildandopsting-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 asmcp__<server-name>__*, so anything referring tomcp__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.