Skip to content

Adopting an Existing Stack

josh goble edited this page Aug 16, 2026 · 2 revisions

Adopting an existing stack

Most tools of this kind assume a greenfield. Keelarr assumes the opposite: you have a stack, it works, and you are not going to rebuild it to try something new.

Adoption is therefore staged, and every stage before the last is reversible.

1. Scan — read-only

Adoption → Scan Docker.

Keelarr inspects your containers and reports what it found: image, ports, networks, restart policy, mounts, and environment key names only, never values. Nothing is written.

Containers it does not recognise are listed as Unsupported rather than adopted hopefully. That is the point of showing you the list.

The adoption scan listing existing containers and what each was recognised as

2. Preview the managed draft

Preview Draft on a recognised container shows the compose.yml Keelarr would generate for it — before anything exists on disk.

The draft preserves how the container already runs:

  • host networking, or a custom network with a static address
  • named volumes as well as bind mounts
  • entrypoint and command overrides
  • restart policy
  • the environment keys it was started with

This matters because an imported service is usually not shaped like a catalog default. A Radarr keeping /config in a named volume must keep using that volume, not a fresh bind path — otherwise it comes back empty with its database still sitting in the orphaned volume.

A generated managed draft, showing the compose file and an env key count

3. Generate the draft

Writes the Compose files to your stack root. Still nothing has changed about the running container — the draft sits beside it.

At this point you can read the generated files, edit them, or delete them and walk away.

4. Cutover

The only destructive step, and it runs as a job with declared steps:

Step What happens
preflight Verify the draft still matches the live container
backup Save compose, env, docker inspect output, and image identity
stop Stop the live container
rename Rename it to the rollback name, so it still exists
deploy Start the managed Compose service
verify Confirm the replacement is healthy
revert Roll back to the original if it is not
finalize Record managed state

The original container is renamed, not deleted. If the replacement does not come up healthy, the job reverts automatically.

Preflight catches the case where the container changed after you generated the draft — adopting a stale picture of it would be worse than refusing.

5. Revert

Available afterwards, as its own job:

Step What happens
preflight Locate the rollback container
compose-down Remove the managed Compose container
restore Rename and start the original
verify Confirm the original is healthy
finalize Record draft state

What has been proven

Adoption, cutover and revert have run on a live QNAP against Trailarr, Radarr, Sonarr, SABnzbd and Ombi — including host networking and a custom macvlan network with a static address.

What has not been exercised is anything more unusual than that. If your container has an odd network mode, an unusual config location, or a shape Keelarr does not expect, that is exactly the case worth reporting.

Practical advice

Start with the service you would least mind losing. Trailarr is a good first adoption: small database, quick to rebuild, and it proves the SQLite path works.

Take a copy of anything irreplaceable first. Keelarr backs up compose, env and inspect output automatically, and renames rather than deletes the container — but a manual copy of a named volume holding a library database costs nothing.

Adopt one at a time. The whole point of the staged flow is that you can stop after any step.

Clone this wiki locally