BAUER GROUP Coolify migration toolkit — failsafe, resumable project and instance migration with byte-exact volume mirroring
Project description
BAUER GROUP - Coolify Migration Toolkit
Today, Tomorrow, Together | Building Better Software Together
Moves a Coolify project — with its data — between servers, and relocates a whole Coolify instance to a new host. Failsafe, resumable, and rollback-capable.
Coolify can clone a resource to another server but deliberately will not move the
data. VolumeCloneJob and CloneMe's cloneVolumeData flag exist upstream, but
PR #4777 shipped them disabled. The maintainer's stated blockers — permission
damage, job-queue spam at 50+ resources, no progress tracking, large-volume
failures — are all consequences of running inside Coolify's Laravel queue. An
external orchestrator has none of those constraints. That is what this is.
Repository Information
- Version: v2.7.0
- Repository: bauer-group/IP-CoolifyMigration
- Branch: main
- Architecture: Pure-logic cores with thin IO shells; saga engine with a crash-safe journal
Features
- Application-unaware mirroring — a cleanly stopped stack makes a volume just bytes. No per-engine logic, no supported-database allowlist. Postgres, MySQL, MariaDB, MongoDB, Redis, KeyDB, Dragonfly, ClickHouse and anything else you run are all handled the same way, because none of them are special once stopped.
- Byte-exact —
rsync -aHAXS --numeric-ids, parallelised, with SHA-256 and metadata verification on both sides. Neverchown. - Failsafe — every step has a compensating action, journalled to disk. The
source is never destroyed until you explicitly say so, so rollback is always
available.
resumereconciles against reality, not against the journal. - DNS gate — extracts every Traefik/Caddy hostname and refuses to start the target while DNS still resolves to the old server, with an actionable cutover checklist.
- Honest about drift — the target is built exactly as the source is
configured, but a tag is a pointer and a branch moves. We detect a floating
latestthat could cross a database major, or a HEAD that has moved, and put the concrete question to you rather than deciding for you. - Server migration — relocate the whole Coolify instance, with the
APP_KEYtreated as a first-class, asserted artifact rather than a lucky side effect. - Proven, not assumed — an integration rig of two real sshd containers
asserts that uid 999, hardlinks, xattrs, sparse files and symlinks survive an
actual rsync, and that a wrong
chownis caught by verification.
Architecture
| Layer | Role |
|---|---|
domain/ |
Pure logic: classification, compose analysis, volume pairing, drift, state machine |
api/ |
Coolify REST client with per-endpoint request whitelists |
discovery/ |
Docker + API reconciliation; the label-based quiesce gate |
transfer/ |
asyncssh, rsync planning, checksum verification |
journal/ |
Append-only crash-safe state |
dns/ |
FQDN extraction, authoritative resolution, cutover gate |
ui/ |
Rich dashboard, wizard, and a plain non-TTY fallback |
Requires the instance API switched on (Settings > API — off by default) and a token with
rootorread:sensitive. Without the switch every call is403 "API is disabled.", which looks like a token problem but is not. Without the scope, Coolify'sApiSensitiveDatamiddleware silently omitsvalue,real_valueanddocker_compose_rawfrom responses — no error, no redaction marker. The tool checks both at startup and fails closed.
Quick start
pip install bg-coolify-migrate
export COOLIFY_URL="https://coolify.example.com"
export COOLIFY_TOKEN="..." # root or read:sensitive
coolify-migrate doctor # verify token scope + server reachability
coolify-migrate list # everything: server -> project -> env -> resource
coolify-migrate list my-project # limited to one project
# Scope with a selector: project / project/environment / project/environment/resource
coolify-migrate plan my-project --to target-server # whole project (dry run)
coolify-migrate run my-project/production --to target-server # one environment
coolify-migrate run my-project/production/api --to target-server # one resource
Omit the selector in a terminal and plan/run open an interactive picker.
Interrupted? coolify-migrate resume <id>. Regret it? coolify-migrate rollback <id>.
Server migration
coolify-migrate server plan --to new-host.example.com
coolify-migrate server run --to new-host.example.com
Documentation
See docs/: installation, configuration, cli, architecture, safety,
server-migration, troubleshooting.
License
MIT © BAUER GROUP
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bg_coolify_migrate-2.7.1.tar.gz.
File metadata
- Download URL: bg_coolify_migrate-2.7.1.tar.gz
- Upload date:
- Size: 325.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a1819fd794ba6c6185e1277ceda63a3c830d8568bcd0010c23590006ee9e9fa
|
|
| MD5 |
748a3b27dfaacea2f9bd7d8b98338b7d
|
|
| BLAKE2b-256 |
32ea67a789582116960b9fd1705c9df23ea3754fa5ce001a8dbbe3591ed030d5
|
File details
Details for the file bg_coolify_migrate-2.7.1-py3-none-any.whl.
File metadata
- Download URL: bg_coolify_migrate-2.7.1-py3-none-any.whl
- Upload date:
- Size: 202.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2df1e941ebdec4429be0fdbbcd96171567f75e797d067357d1e43ce8098750b6
|
|
| MD5 |
b0844c9b37c558a8ae55d13a08bd627c
|
|
| BLAKE2b-256 |
cfe2abbc7f3945e2edf1e9a93ce23b6ba51b6a8be61609644a4a83cae51ac4ad
|