Migration Guide¶
This guide covers migrating to HomelabARR CE from other Docker management platforms.
Migrating from Similar Docker Platforms¶
If your existing setup uses /opt/appdata/ for container data and a proxy Docker network with Traefik, the migration is straightforward — HomelabARR CE uses the same structure.
Same appdata? You're 90% done.
If your containers store data in /opt/appdata/, HomelabARR CE picks it up automatically. Your Plex databases, Sonarr configs, Radarr settings — all preserved.
Step 1: Backup Everything¶
Before making any changes:
# Backup your current .env file
cp /opt/appdata/compose/.env /opt/appdata/compose/.env.backup
# Backup your appdata (compress, this may take a while)
sudo tar czf /opt/homelabarr-backup-$(date +%Y%m%d).tar.gz /opt/appdata/
# Note your running containers
docker ps --format "{{.Names}}" > /opt/running-containers.txt
Step 2: Stop Existing Containers¶
# Stop all running containers (your data in /opt/appdata is safe)
docker stop $(docker ps -q)
Don't remove containers yet
Stopping is enough. Don't docker rm anything until you've verified CE works.
Step 3: Migrate Environment Variables¶
HomelabARR CE includes a migration tool that converts your existing .env:
git clone https://github.com/smashingtags/homelabarr-ce.git
cd homelabarr-ce
sudo ln -sf "$(pwd)" /opt/homelabarr
# Run the environment migrator
bash apps/.subactions/envmigrate.sh
Back up your .env first
The migrator rewrites your .env from a template. It preserves the standard variables listed below, but any custom variables you added manually will be dropped. Back up your original .env before running.
This reads /opt/appdata/compose/.env and rewrites it with CE-compatible defaults while preserving these standard values:
- Cloudflare credentials (email, API key, Zone ID)
- Domain configuration
- Plex claim tokens
- VPN settings (Gluetun/WireGuard)
- Container image preferences
- Port configurations
- API keys (IMDB, TVDB, TMDB)
If you have custom environment variables not in this list, copy them from your backup after running the migrator.
Step 4: Install HomelabARR CE¶
You have two options:
Option A: Web GUI (Docker Compose)
curl -o homelabarr.yml https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/homelabarr.yml
export JWT_SECRET=$(openssl rand -base64 32)
export DOCKER_GID=$(getent group docker | cut -d: -f3)
export CORS_ORIGIN=http://$(hostname -I | awk '{print $1}'):8084
docker compose -f homelabarr.yml up -d
Open http://your-server-ip:8084 — you'll see the CE dashboard with 157+ apps ready to deploy. Your existing /opt/appdata data is already there.
Put CE behind Traefik too
If you already have Traefik running, add a route for the CE dashboard so it's accessible at https://homelabarr.yourdomain.com with Authelia protection. Create a file at /opt/appdata/traefik/rules/homelabarr-ce.yml:
http:
routers:
homelabarr-ce:
rule: "Host(`homelabarr.yourdomain.com`)"
entryPoints:
- https
middlewares:
- chain-authelia@file
tls:
certResolver: dns-cloudflare
service: homelabarr-ce
services:
homelabarr-ce:
loadBalancer:
servers:
- url: "http://homelabarr-ce-frontend:8080"
homelabarr pointing to your domain. The CE frontend container must be on the proxy network. Option B: CLI Menu
chmod +x install.sh
find . -name "*.sh" -exec chmod +x {} \;
sudo ./install.sh
The interactive menu lets you:
- Option 1: Set up Traefik + Authelia (if not already running)
- Option 2: Install/Remove/Backup/Restore apps via the terminal menu
Step 5: Redeploy Your Apps (One at a Time)¶
Your app data is already in /opt/appdata. You need to stop each old container and redeploy it through CE. Do this one app at a time — not all at once.
Why one at a time?
If you stop everything and something goes wrong during redeployment, you've lost all your services. Doing it one at a time means you can roll back a single container if needed.
For each app (e.g., Sonarr):
# 1. Stop and remove the OLD container
docker stop sonarr && docker rm sonarr
# 2. Redeploy through CE
# Via Web GUI: Browse catalog → find Sonarr → Deploy (Standard mode)
# Via CLI: Option 2 → Install Apps → mediamanager → sonarr
# 3. Verify it starts and loads your existing config
docker logs sonarr --tail 20
The new container will mount /opt/appdata/sonarr (your existing config) and /mnt (your media) using Docker's native bind mounts — no plugins needed.
What changed under the hood
Your old containers used a local-persist Docker volume plugin to map /mnt. HomelabARR CE uses Docker's built-in local driver with bind mounts instead. Same result, zero plugin dependencies. Your data and paths are unchanged.
Suggested order:
- Non-critical apps first (Tautulli, Heimdall, Dozzle)
- Download clients (NZBGet, qBittorrent, SABnzbd)
- Media managers (Sonarr, Radarr, Lidarr, Prowlarr)
- Media servers (Jellyfin, Plex — these have the biggest configs)
After each app, verify:
- Sonarr/Radarr: Series/movies listed in Mass Editor
- qBittorrent: Torrents resume, download path is correct
- Jellyfin/Plex: Libraries intact, playback works
- Authelia: Users and 2FA preserved (
/opt/appdata/authelia/)
Step 6: Clean Up Legacy Components¶
Once all apps are redeployed through CE:
# Stop the old mount container (it's been failing anyway if you're not using cloud storage)
docker stop mount && docker rm mount
# Stop restic and vnstat if you no longer need them
docker stop restic vnstat && docker rm restic vnstat
# Remove the old local-persist volume (data is safe — it just pointed at /mnt)
docker volume rm compose_unionfs 2>/dev/null
# Remove the local-persist plugin/binary
sudo rm /usr/bin/docker-volume-local-persist 2>/dev/null
sudo rm /run/docker/plugins/local-persist.sock 2>/dev/null
# Clean up old images
docker image prune -a
# Remove your backup if everything works (or keep it!)
# rm /opt/homelabarr-backup-*.tar.gz
Fix Traefik's Docker network setting
Your existing Traefik may be configured to discover containers on the wrong Docker network. CE deploys containers with labels on the proxy network. If Traefik is set to --providers.docker.network=traefik (common in older setups), it will ignore all CE-deployed container labels.
Check your Traefik config:
docker inspect traefik --format '{{json .Args}}' | grep docker.network
If it says docker.network=traefik, you need to recreate Traefik with --providers.docker.network=proxy instead. This is a one-time fix — after this, every container CE deploys with Traefik mode will be discovered automatically via Docker labels. No manual file-based routes needed.
Keep Authelia
Your existing Authelia works with CE out of the box. Don't redeploy it.
Migrating from PGBlitz / PTS / PlexGuide¶
If you're running PGBlitz, PTS (MHA-Team fork), or the original PlexGuide — your setup is older but the migration is straightforward. Your Plex libraries, Sonarr configs, and all your app data will survive the move.
Your data is safe
PGBlitz/PTS stores everything in /opt/appdata/ — the same path HomelabARR CE uses. Your Plex database, Sonarr series, Radarr movies — all of it carries over untouched.
What's Different¶
| PGBlitz/PTS | HomelabARR CE | |
|---|---|---|
| Deployment | Ansible playbooks | Docker Compose or Web GUI |
| Docker network | plexguide | proxy |
| Traefik | v1 (frontend/backend rules) | v2/v3 (routers/services) |
| Media storage | Cloud (Google Drive + rclone + mergerfs) | Local NAS (recommended) or cloud |
| App data | /opt/appdata/ | /opt/appdata/ (same) |
| Volume driver | None (Ansible direct mounts) | Docker native bind mounts |
| Maintenance | Abandoned (last updated 2021) | Actively maintained |
Step-by-Step Migration¶
1. Backup your configs¶
# Backup your rclone config (you may need this later)
cp ~/.config/rclone/rclone.conf ~/rclone.conf.backup
# Backup all app data
sudo tar czf ~/pgblitz-appdata-backup-$(date +%Y%m%d).tar.gz /opt/appdata/
2. Document your current setup¶
Before changing anything, note what you're running:
# List all running containers
docker ps --format "{{.Names}}\t{{.Image}}\t{{.Ports}}" > ~/my-containers.txt
cat ~/my-containers.txt
Save this list — you'll use it to know what to redeploy.
3. Decide: keep cloud storage or go local?¶
If you're keeping cloud storage (Google Drive + rclone): Your rclone mounts at /mnt/unionfs or /mnt will continue working. CE's app templates mount /mnt the same way. Skip to Step 4.
If you're moving to local NAS (recommended): See the Cloud to Local Migration section below for how to download your media and set up NAS mounts. Do this BEFORE proceeding.
4. Install HomelabARR CE¶
# One-line install
sudo wget -qO- https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/install-remote.sh | sudo bash
# Or Docker Compose for the web GUI
curl -o homelabarr.yml https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/homelabarr.yml
export JWT_SECRET=$(openssl rand -base64 32)
export DOCKER_GID=$(getent group docker | cut -d: -f3)
export CORS_ORIGIN=http://$(hostname -I | awk '{print $1}'):8084
docker compose -f homelabarr.yml up -d
5. Create the proxy network¶
PGBlitz uses plexguide network. CE uses proxy. Create it:
docker network create proxy 2>/dev/null || true
6. Redeploy apps one at a time¶
For each app in your my-containers.txt list, stop the old container and redeploy through CE:
# Example: migrate Sonarr
docker stop sonarr && docker rm sonarr
# Redeploy via CE web GUI (http://your-ip:8084) or CLI
sudo homelabarr-cli -i
# → Option 2 → Install Apps → mediamanager → sonarr
The new Sonarr container will: - Mount your existing /opt/appdata/sonarr config (series, settings, history — all preserved) - Mount /mnt for media access - Use Traefik v2/v3 labels (if you set up Traefik) - Work with the proxy network
Do one app at a time
Don't stop everything at once. Migrate one container, verify it works, then move to the next. Start with something non-critical like Tautulli or NZBGet.
7. Handle Traefik¶
PGBlitz uses Traefik v1. CE uses Traefik v2/v3. You have two options:
Option A: Fresh Traefik (recommended) Stop the old Traefik and let CE deploy a new one:
docker stop traefik && docker rm traefik
# Via CLI: Option 1 → Traefik + Authelia
Option B: Keep existing Traefik If you've customized your Traefik v1 setup and don't want to change it, you can keep it — but CE's app templates use v2 labels which won't work with Traefik v1. You'd need to add v1 labels manually to each container.
8. Verify Plex¶
This is the one everyone worries about. After redeploying Plex through CE:
- Open Plex Web (your existing URL or
http://your-ip:32400/web) - Check Settings → Libraries — all libraries should be listed
- Play something — verify transcoding works
- Check Settings → Server → General — your Plex claim token and server name should be intact
Your Plex database, watch history, posters, metadata — everything lives in /opt/appdata/plex and was never touched during the migration.
9. Clean up PGBlitz/PTS¶
Once everything is verified through CE:
# Remove old PGBlitz/PTS installation
sudo rm -rf /opt/plexguide 2>/dev/null
sudo rm -rf /opt/pgblitz 2>/dev/null
sudo rm -rf /opt/pts 2>/dev/null
sudo rm -rf /opt/coreapps 2>/dev/null
sudo rm -rf /opt/communityapps 2>/dev/null
# Remove old plexguide network (after all containers are on proxy)
docker network rm plexguide 2>/dev/null
# Remove old cron jobs
crontab -l | grep -v "plexguide\|pgblitz\|pts" | crontab -
# Clean up old images
docker image prune -a
Keep your rclone config
Even if you moved to local NAS, keep ~/rclone.conf.backup — you might need it to download remaining files from Google Drive later.
Migrating from Saltbox¶
Saltbox is the actively maintained successor to Cloudbox. It's a solid platform, but it's Ansible-based with no GUI — every change requires editing YAML files and running playbooks. If you want a web dashboard to manage your containers or you're tired of Ansible complexity, CE is a straightforward alternative.
Saltbox is still maintained
Unlike Cloudbox and PGBlitz, Saltbox is actively developed. This migration is for users who want to switch to a simpler, GUI-based approach — not because Saltbox is abandoned.
What's Different¶
| Saltbox | HomelabARR CE | |
|---|---|---|
| Deployment | Ansible playbooks | Docker Compose or Web GUI |
| Configuration | YAML files + CLI commands | Web GUI or interactive CLI menu |
| Docker network | saltbox | proxy |
| App data path | /opt/<app>/ | /opt/appdata/<app>/ |
| Media path | /mnt/unionfs/ | /mnt/ (configurable) |
| Traefik | v3.6 | v2/v3 |
| Cloud storage | rclone + Google Drive (default) | Local NAS (recommended), cloud optional |
| GUI | None — CLI and text editors only | Web dashboard with 157+ apps |
| Multiple instances | Built-in (sonarr, sonarr4k, etc.) | Deploy multiple containers manually |
Step-by-Step Migration¶
1. Backup your Saltbox¶
# Use Saltbox's own backup
cd ~/saltbox && sudo ansible-playbook backup.yml
# Also backup manually
cp ~/saltbox/accounts.yml ~/accounts.yml.backup
cp -r /opt/saltbox ~/saltbox-opt-backup
sudo tar czf ~/saltbox-appdata-$(date +%Y%m%d).tar.gz /opt/
2. Move app data to CE's path¶
Saltbox stores configs at /opt/<app>/. CE expects /opt/appdata/<app>/:
sudo mkdir -p /opt/appdata
# Move each app's config
for app in sonarr radarr lidarr readarr prowlarr bazarr plex jellyfin tautulli nzbget sabnzbd qbittorrent overseerr; do
if [ -d "/opt/$app" ]; then
sudo mv /opt/$app /opt/appdata/$app
echo "Moved $app"
fi
done
sudo chown -R 1000:1000 /opt/appdata
Multiple instances
If you run multiple Sonarr/Radarr instances (e.g., sonarr, sonarr4k), move each one separately. CE treats them as independent containers.
3. Handle media paths¶
Saltbox uses /mnt/unionfs/ for combined local + cloud media. If you're keeping this mount structure, create a symlink:
# If /mnt/unionfs already exists and has your media
sudo ln -sf /mnt/unionfs /mnt/media 2>/dev/null || true
If moving to local NAS, see the Cloud to Local Migration section.
4. Create the proxy network¶
docker network create proxy 2>/dev/null || true
5. Install HomelabARR CE¶
# One-line CLI install
sudo wget -qO- https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/install-remote.sh | sudo bash
sudo homelabarr-cli -i
# Or Docker Compose for web GUI
curl -o homelabarr.yml https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/homelabarr.yml
export JWT_SECRET=$(openssl rand -base64 32)
export DOCKER_GID=$(getent group docker | cut -d: -f3)
export CORS_ORIGIN=http://$(hostname -I | awk '{print $1}'):8084
docker compose -f homelabarr.yml up -d
6. Redeploy apps one at a time¶
For each app, stop the Saltbox container and redeploy through CE:
# Example: migrate Sonarr
docker stop sonarr && docker rm sonarr
# Redeploy via CE web GUI or CLI
# Your existing /opt/appdata/sonarr config is picked up automatically
Keep Traefik if it's working
Saltbox uses Traefik v3.6 which is modern and compatible. If your Traefik and Authelia are working, leave them running. CE's app templates use v2/v3 labels that work with your existing Traefik.
7. Update root folders in media apps¶
After redeploying, check the media root folders in each app. Saltbox maps internal paths differently:
| App | Saltbox internal path | Check in app settings |
|---|---|---|
| Sonarr | /tv/ | Settings → Media Management → Root Folders |
| Radarr | /movies/ | Settings → Media Management → Root Folders |
| Plex | /data/TV/, /data/Movies/ | Settings → Libraries |
The paths inside the container may differ from Saltbox's mapping. Update them to match CE's volume mounts if needed.
8. Clean up Saltbox (optional)¶
If you're fully committed to CE:
# Remove Saltbox installation
sudo rm -rf ~/saltbox 2>/dev/null
sudo rm -rf /opt/saltbox 2>/dev/null
sudo rm -rf /srv/git/saltbox 2>/dev/null
# Remove Ansible (if nothing else uses it)
sudo apt remove ansible -y 2>/dev/null
# Remove old network (after all containers are on proxy)
docker network rm saltbox 2>/dev/null
# Clean up
docker image prune -a
Keep your rclone config
Saltbox's rclone configuration lives at ~/.config/rclone/rclone.conf. Keep a backup even if you're moving to local storage.
Migrating from Cloudbox¶
Cloudbox was one of the most popular Ansible-based media server solutions. The project was archived in March 2025 and is no longer maintained. If you're still running it, migrating to HomelabARR CE gives you a modern, actively maintained platform with a web GUI.
Your Plex database and app configs carry over
Cloudbox stores app data in /opt/ (e.g., /opt/sonarr, /opt/plex). HomelabARR CE uses /opt/appdata/. You'll move your configs once and everything works.
What's Different¶
| Cloudbox | HomelabARR CE | |
|---|---|---|
| Status | Archived, unmaintained since 2025 | Actively maintained |
| Deployment | Ansible playbooks | Docker Compose or Web GUI |
| Docker network | cloudbox | proxy |
| App data path | /opt/<app>/ | /opt/appdata/<app>/ |
| Media path | /mnt/unionfs/Media/ | /mnt/ (configurable) |
| Cloud storage | rclone + mergerfs (required) | Local NAS (recommended), cloud optional |
| Traefik | v1 | v2/v3 |
| Install types | Cloudbox / Mediabox / Feederbox | One install, choose what to deploy |
Step-by-Step Migration¶
1. Backup everything¶
# Backup rclone config
cp ~/.config/rclone/rclone.conf ~/rclone.conf.backup
# Backup Cloudbox settings
cp ~/cloudbox/accounts.yml ~/accounts.yml.backup
# Backup all app data
sudo tar czf ~/cloudbox-backup-$(date +%Y%m%d).tar.gz /opt/
2. Move app data to CE's expected path¶
Cloudbox stores configs at /opt/<app>/ (e.g., /opt/sonarr/). CE expects /opt/appdata/<app>/. Create the new structure and move:
sudo mkdir -p /opt/appdata
# Move each app's config
for app in plex sonarr radarr lidarr tautulli jackett nzbget sabnzbd ombi; do
if [ -d "/opt/$app" ]; then
sudo mv /opt/$app /opt/appdata/$app
echo "Moved $app"
fi
done
sudo chown -R 1000:1000 /opt/appdata
Plex path
Cloudbox stores Plex at /opt/plex/. After moving to /opt/appdata/plex/, the Plex database, metadata, and libraries are all intact. The container mounts this as /config regardless of where it lives on the host.
3. Handle media paths¶
Cloudbox uses a specific media structure:
/mnt/unionfs/Media/Movies/
/mnt/unionfs/Media/TV/
/mnt/unionfs/Media/Music/
CE mounts /mnt directly. If your media is at /mnt/unionfs/Media/, you have two options:
Option A: Symlink (quickest)
# If your media is still at /mnt/unionfs/Media
sudo ln -sf /mnt/unionfs/Media /mnt/Media
Option B: Move to local NAS (recommended) See the Cloud to Local Migration section below. Point your NAS mount at /mnt and organize as you like.
4. Create the proxy network¶
docker network create proxy 2>/dev/null || true
5. Install HomelabARR CE¶
# One-line CLI install
sudo wget -qO- https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/install-remote.sh | sudo bash
sudo homelabarr-cli -i
# Or Docker Compose for web GUI
curl -o homelabarr.yml https://raw.githubusercontent.com/smashingtags/homelabarr-ce/main/homelabarr.yml
export JWT_SECRET=$(openssl rand -base64 32)
export DOCKER_GID=$(getent group docker | cut -d: -f3)
export CORS_ORIGIN=http://$(hostname -I | awk '{print $1}'):8084
docker compose -f homelabarr.yml up -d
6. Redeploy apps one at a time¶
# Stop old Cloudbox container
docker stop sonarr && docker rm sonarr
# Redeploy through CE (web GUI or CLI)
# The new container mounts /opt/appdata/sonarr:/config — your existing data
After redeploying each media app, update the media root folders:
| App | Cloudbox path | CE path |
|---|---|---|
| Sonarr | /tv/ → /mnt/unionfs/Media/TV/ | /mnt/Media/TV/ (or wherever your media lives) |
| Radarr | /movies/ → /mnt/unionfs/Media/Movies/ | /mnt/Media/Movies/ |
| Plex | /data/Movies/, /data/TV/ | Libraries point to /mnt/Media/ subdirectories |
7. Clean up Cloudbox¶
# Remove Cloudbox installation
sudo rm -rf ~/cloudbox 2>/dev/null
sudo rm -rf /opt/cloudbox 2>/dev/null
# Remove old network
docker network rm cloudbox 2>/dev/null
# Remove old Ansible
sudo apt remove ansible -y 2>/dev/null
# Clean up old images
docker image prune -a
Migrating from Cloud-Based Setups¶
If you're moving from a cloud-dependent system (Google Drive mounts, rclone cloud storage) to local NAS storage:
Prerequisites¶
- NAS System: UnRAID, TrueNAS, Synology, or local drives
- Network Share: SMB or NFS configured
- Storage: Enough space for your media library
Download Media from Cloud¶
Before switching, get your media local:
# Example: rclone sync from Google Drive to local NAS
rclone sync gdrive:media /mnt/nas/media --progress --transfers 8
Set Up Local Storage¶
# Create mount points for NAS shares
sudo mkdir -p /mnt/nas/{media,downloads,appdata}
# Mount via SMB
sudo mount -t cifs //nas.local/media /mnt/nas/media -o uid=1000,gid=1000,username=user,password=pass
# Or mount via NFS
sudo mount -t nfs nas.local:/volume1/media /mnt/nas/media
Add to /etc/fstab for persistence:
//nas.local/media /mnt/nas/media cifs uid=1000,gid=1000,username=user,password=pass,_netdev 0 0
Update Application Paths¶
After installing CE and redeploying apps, update media paths:
| App | Setting | Old Path | New Path |
|---|---|---|---|
| Plex | Library locations | /mnt/unionfs/media/movies | /mnt/nas/media/movies |
| Sonarr | Root folder | /mnt/unionfs/media/tv | /mnt/nas/media/tv |
| Radarr | Root folder | /mnt/unionfs/media/movies | /mnt/nas/media/movies |
| qBittorrent | Save path | /mnt/unionfs/downloads | /mnt/nas/downloads |
| SABnzbd | Complete folder | /mnt/unionfs/downloads/complete | /mnt/nas/downloads/complete |
Benefits of Local Storage¶
- No API rate limits — process unlimited files simultaneously
- No cloud subscription costs — your storage, your hardware
- Better performance — local I/O is faster than cloud transfers
- Privacy — data stays on your network
- Simpler setup — no rclone configs, mount scripts, or cloud auth
Compatibility Reference¶
HomelabARR CE is compatible with setups that use:
| Component | Expected Path/Value |
|---|---|
| App data | /opt/appdata/ |
| Compose .env | /opt/appdata/compose/.env |
| Docker network | proxy |
| Reverse proxy | Traefik v2/v3 |
| Authentication | Authelia |
| SSL | Let's Encrypt via Cloudflare DNS challenge |
| User/Group ID | 1000:1000 |
If your existing setup matches these conventions, the migration is essentially a drop-in replacement.
Support¶
Having trouble migrating?
- Discord — Ask in the #support channel
- GitHub Issues — Report migration bugs
- Email — michael@mjashley.com