App Migration (Fleet)
App Migration lets you relocate a running containerised app from source node A to target node B with a deterministic, orchestrated flow. Free on every plan — this is the compute-moving primitive under every other fleet feature.
When to use it
- You added a beefier node and want to shift database workloads onto it.
- The source node is going in for maintenance.
- You are re-balancing storage after adding drives.
- You want to hand an app over to a different geo region.
The state machine
Every migration progresses through six states:
pending → snapshotting → transferring → restoring → cutover → done
\ \ \ \
+-----------+------------+-----------+--> failed- pending — the CP has recorded the request, nothing has happened on disk yet.
- snapshotting — the source node exports the container image + its
named volumes into a tarball under
/var/lib/quazzar/migrations/<migration-id>.tar. On CoW pools (btrfs/zfs) the snapshot is taken atomically from the Phase 3 storage backend; otherwise Quazzar falls back todocker export+tar. - transferring — the orchestrator moves the archive from source to target (rsync / scp / shared NFS depending on your fleet topology).
- restoring — the target node loads the archive and creates a stopped container so the cutover can flip traffic in one step.
- cutover — source stops the old container, target starts the new container, and the Phase 1 reverse-proxy route repoints the domain at the new upstream atomically.
- done — terminal success. The old volumes are kept on the source node as a safety net until you delete them manually.
- failed — any non-terminal state can land here if a node reports a problem. The reason shows up in the migration list.
Starting a migration
- Open Control Panel → Fleet → Migrations.
- Type the App id (the container name or compose stack root).
- Pick Source node and Target node.
- Click Start migration. The row appears with a six-step progress bar that updates every 5 s.
- If anything goes wrong, the Abort button marks the migration
failedand leaves both nodes untouched.
Rollback
done is not undoable through the UI — to revert, start a new
migration in the opposite direction. The source-side archive is kept
for seven days so you can replay from it.
Related APIs
POST /api/migrations— create.GET /api/migrations— list.POST /api/migrations/{id}/advance— state-machine tick.POST /api/migrations/{id}/fail— abort.POST /api/agent/v1/migration/snapshot— node-side (CP-driven).POST /api/agent/v1/migration/restore— node-side (CP-driven).POST /api/agent/v1/migration/cutover— node-side (CP-driven).