Linux / LXC (no Docker)¶
Use this on Debian, Ubuntu, or a Proxmox LXC when you prefer not to use Docker.
Sonarr and the rest still run as processes under AIO — you do not create a systemd unit per app.
What you need¶
- Python 3.11+
- Poetry
- Node.js 22 (build the dashboard once)
ffmpeg(for transcoding / some media apps); for Jellyfin HW usejellyfin-ffmpeg7from repo.jellyfin.org when possible- Optional VPN:
wireguardoropenvpn, plusiproute2
On LXC: enablenesting=1and/dev/net/tun
Create folders over SSH¶
ssh user@host
LOGIN_USER="${SUDO_USER:-$(id -un)}"
HOME_DIR="$(getent passwd "${LOGIN_USER}" | cut -d: -f6)"
DATA="${HOME_DIR}/aio-media-manager"
sudo useradd --system --create-home --home-dir /opt/aio-media-manager --shell /usr/sbin/nologin amm || true
sudo mkdir -p \
/opt/aio-media-manager \
/var/lib/aio-media-manager/config \
/var/lib/aio-media-manager/config/vpn \
/var/lib/aio-media-manager/backups \
"${DATA}/downloads" \
"${DATA}/media"
sudo chown -R amm:amm /opt/aio-media-manager /var/lib/aio-media-manager "${DATA}"
id amm
Downloads and media stay in the login user's home (~/aio-media-manager) so the desktop file manager can see them. Config stays under /var/lib. To use existing library paths, keep downloads and media as siblings on the same filesystem and point .env at those directories.
Install¶
sudo -u amm git clone https://github.com/Qballjos/aio-media-server-manager.git /opt/aio-media-manager
cd /opt/aio-media-manager
sudo -u amm cp .env.example .env
LOGIN_USER="${SUDO_USER:-$(id -un)}"
HOME_DIR="$(getent passwd "${LOGIN_USER}" | cut -d: -f6)"
DATA="${HOME_DIR}/aio-media-manager"
sudo sed -i \
-e "s|^AMM_CONFIG_DIR=.*|AMM_CONFIG_DIR=/var/lib/aio-media-manager/config|" \
-e "s|^AMM_DOWNLOAD_DIR=.*|AMM_DOWNLOAD_DIR=${DATA}/downloads|" \
-e "s|^AMM_MEDIA_DIR=.*|AMM_MEDIA_DIR=${DATA}/media|" \
-e "s|^# AMM_BACKUP_DIR=.*|AMM_BACKUP_DIR=/var/lib/aio-media-manager/backups|" \
/opt/aio-media-manager/.env
Point AMM_CONFIG_DIR, AMM_DOWNLOAD_DIR, AMM_MEDIA_DIR, and AMM_BACKUP_DIR in .env at the directories you created (~/aio-media-manager/downloads and ~/aio-media-manager/media by default). Put AMM_BACKUP_DIR on another disk or mount if you can. Set PUID/PGID to id amm (or your media user). Set TZ (or AMM_TIMEZONE) to your IANA timezone. Optional GITHUB_TOKEN and update-schedule variables are documented in .env.example; you can also set them in Settings after first-run.
sudo -u amm poetry install --only main --no-interaction
sudo -u amm bash -lc 'cd frontend && npm ci && npm run build'
sudo cp deploy/aio-media-manager.service /etc/systemd/system/
LOGIN_USER="${SUDO_USER:-$(id -un)}"
HOME_DIR="$(getent passwd "${LOGIN_USER}" | cut -d: -f6)"
sudo sed -i "s|/home/YOURUSER|${HOME_DIR}|g" /etc/systemd/system/aio-media-manager.service
sudo systemctl daemon-reload
sudo systemctl enable --now aio-media-manager
Open http://<host>:8080. Installed apps update later from Settings → Updates (schedules default to off). Updating this checkout and restarting the service updates AIO itself. On a native install, Home's Server card already sees the host's network cards.
If systemd-managed Python is 3.14+, install a 3.13 interpreter for Bazarr (AMM_CHILD_PYTHON pointing at python3.13) or Bazarr will fail on missing PIL / unsupported Python.
Host packages by application¶
Install only what you will run. On ARM64, skip Chromium — Flaresolverr is x86_64-only and is hidden from the catalog.
| Packages | Applications |
|---|---|
jellyfin-ffmpeg7 (preferred) or ffmpeg, libfontconfig1 |
Jellyfin, Plex |
libicu*, libssl3, libsqlite3-0, sqlite3, libgssapi-krb5-2, zlib1g |
Sonarr, Radarr, Lidarr, Prowlarr, NeutArr |
git |
Recyclarr (clones TRaSH Guides) |
unrar (RAR 5+), p7zip-full, par2cmdline-turbo as par2 |
SABnzbd, NZBGet |
Python 3.13, libxml2, libxslt1.1, libjpeg62-turbo, python3-dev, build-essential |
Bazarr, SABnzbd, NeutArr |
Manager Python 3.14, python3-dev, build-essential |
Shelfmark (upstream requires Python >= 3.14) |
| Node.js 22 | Seerr |
JRE 25, mariadb-server |
Grimmory |
chromium, xvfb, fonts-liberation |
Flaresolverr (x86_64 only) |
iproute2, openvpn, wireguard-tools |
Optional VPN (qBittorrent, Prowlarr, Flaresolverr) |
Service file¶
aio-media-manager.service starts /opt/aio-media-manager/.venv/bin/python main.py. If Poetry placed the venv elsewhere, update ExecStart (poetry env info -p). The unit’s download/media paths must match the login home (sed in the install steps above).
LXC notes¶
- Unprivileged containers cannot create VPN network namespaces; skip VPN or use a privileged CT.
- Bind-mount media into the CT under the login home (
~/aio-media-manager); keep downloads and media on the same dataset for hardlinks.
Donate
🤖 AI writes some code. I break it. We fix it together.
Can’t spare a few bucks? Drop a star on GitHub instead. It feeds the ego, and that’s almost as good.