How to Self-Host Audiobookshelf on Proxmox LXC — Complete Setup Guide 2026
Home Lab

How to Self-Host Audiobookshelf on Proxmox LXC — Complete Setup Guide 2026

Ricardo Gil
October 19, 2026
13 min read
#proxmox #self-hosting #lxc #audiobookshelf #homelab

If you've built up a library of DRM-free audiobooks from Libro.fm, LibriVox, Audible's export tool, or your local library's Libby app, you don't need a subscription service to listen to them on every device. What you need is Audiobookshelf — a self-hosted server that tracks your progress, fetches metadata, and syncs playback position across iOS, Android, and the web. In this guide I'll walk through the full setup on a Proxmox LXC container: creating the container, installing ABS via its official Ubuntu PPA, binding your audiobook storage, enabling HTTPS with a reverse proxy, and connecting the mobile apps.

All package behavior, port defaults, and configuration paths referenced in this guide come from the official Audiobookshelf documentation.

What Is Audiobookshelf?

Audiobookshelf (ABS) is an open-source, self-hosted audiobook and podcast server developed by advplyr. Per the official docs, it supports multiple library types (audiobooks, podcasts, and ebooks in the same interface), chapter navigation, bookmarks, and sleep timers. Automatic metadata fetching pulls cover art, chapter data, and descriptions from Audible, OpenLibrary, and Google Books. Progress syncs in real time across devices via native iOS and Android apps, and multi-user support means every person in your household gets separate playback tracking on the same library.

The server footprint is minimal. Unlike Jellyfin or Plex, which need CPU cycles to transcode video, ABS streams audio files in their native format — M4B, MP3, OPUS, FLAC, and others are all passed through as-is. Per the ABS documentation, no transcoding happens server-side unless you specifically request a format conversion for a client that can't play the original codec. In practice, CPU usage during playback sits near zero, making this a natural fit for a lightweight LXC container on a mini PC.

The main hardware consideration for ABS is storage. A single audiobook runs anywhere from 150 MB for a short novel to over 2 GB for a long multi-part series. If you're planning to grow a serious library, a NAS-class drive like the Seagate IronWolf 4TB (~$90) — rated for always-on operation — is a better long-term choice than a desktop drive. For the Proxmox host itself, a budget mini PC like the GMKtec G3 PRO mini PC (~$199) handles ABS alongside several other self-hosted services without breaking a sweat.

Prerequisites

Before starting, you'll need a Proxmox VE host with an Ubuntu 22.04 LXC template downloaded (Debian 12 works as well). If you're new to LXC containers on Proxmox, the Proxmox LXC complete self-hosting guide covers all the groundwork. You'll also need storage for your audiobook files — a local directory on the Proxmox host, an NFS share from a NAS, or a USB drive mounted to the container all work.

For remote access over HTTPS, you'll want a reverse proxy. I'll show the configuration for both Traefik v3 and Nginx Proxy Manager — pick whichever you're already running. A domain name and Cloudflare DNS are optional but make remote mobile access much smoother than dealing with raw IP addresses and self-signed certificates.

One thing worth noting upfront: Audiobookshelf uses WebSockets for real-time progress sync. Your reverse proxy must be configured to pass WebSocket connections through — I'll call this out at the relevant step. Getting this wrong is the most common cause of the mobile app appearing to work but not saving your playback position.

Step 1: Create the Proxmox LXC Container

In the Proxmox web UI, click Create CT. ABS is lightweight, so you don't need to over-provision. Here's a sensible starting configuration:

SettingValue
TemplateUbuntu 22.04 (ubuntu-22.04-standard)
CPU1 core (2 cores for comfort)
RAM512 MB minimum; 1 GB recommended for large libraries
Disk8 GB for OS and ABS config — audiobooks go on a bind mount
UnprivilegedYes
NestingOff — not needed for native install
NetworkStatic IP (e.g. 192.168.1.52)

Start the container and open a console. Run the usual base update first:

bash
apt update && apt upgrade -y
apt install -y curl gnupg2

That's all the container setup needed. Because we're using the official PPA rather than Docker, there's no need to enable nesting or privileged mode — the ABS service runs as its own system user inside the standard unprivileged container.

Step 2: Install Audiobookshelf via the Official PPA

Audiobookshelf publishes an official Debian/Ubuntu PPA that handles installation and future updates through apt. Per the official Linux installation docs, here is the full sequence:

bash
# Add the GPG key
curl -fsSL https://advplyr.github.io/audiobookshelf-ppa/KEY.gpg \
  | gpg --dearmor \
  | tee /usr/share/keyrings/audiobookshelf.gpg > /dev/null

# Add the repository
echo "deb [signed-by=/usr/share/keyrings/audiobookshelf.gpg] https://advplyr.github.io/audiobookshelf-ppa ./" \
  | tee /etc/apt/sources.list.d/audiobookshelf.list

# Install
apt update && apt install audiobookshelf -y

The installer creates an audiobookshelf system user, registers a systemd service, and writes a default configuration file at /etc/default/audiobookshelf. Per the official docs, the default listening port is 3000. Start and enable the service:

bash
systemctl enable --now audiobookshelf
systemctl status audiobookshelf

You should see active (running) in green. Open a browser and navigate to http://<container-ip>:3000. On first load, ABS presents a setup wizard — create your admin account here. Keep these credentials somewhere safe; they're the only way to access the server management panel.

Step 3: Bind-Mount Your Audiobook Storage

ABS reads files in place — it doesn't copy or move them. The cleanest arrangement on Proxmox is a bind mount that maps a directory on the Proxmox host directly into the container. Your files live outside the container and survive any container rebuild or reinstall.

First, create and permission the directory on the Proxmox host (not inside the container):

bash
# Run on the Proxmox HOST
mkdir -p /mnt/storage/audiobooks
chown -R 1000:1000 /mnt/storage/audiobooks

UID 1000 matches the default unprivileged user inside the LXC. Now add the bind mount. You can do this in the Proxmox web UI (Container → Resources → Add → Mount Point) or directly in the container config file:

bash
# On the Proxmox HOST — replace 100 with your actual CTID
nano /etc/pve/lxc/100.conf

# Add this line at the bottom:
mp0: /mnt/storage/audiobooks,mp=/audiobooks

Restart the container (pct restart 100). The directory /audiobooks is now visible inside the container. To confirm, run ls /audiobooks from inside the container — you should see your existing audiobook files if any are already in place.

Back in the ABS web UI, go to Settings → Libraries → + Add Library. Name it "Audiobooks", set the type to Audiobooks, and add /audiobooks as a folder path. Save — ABS will begin scanning immediately. For large libraries this takes a few minutes; you can watch progress in the sidebar.

Step 4: Adjust the Default Port (Optional)

If port 3000 conflicts with another service on your network, the /etc/default/audiobookshelf file is where you change it. Per the official docs, the file looks like this after a fresh PPA install:

bash
PORT=3000
CONFIG_PATH=/home/audiobookshelf/.audiobookshelf
METADATA_PATH=/home/audiobookshelf/.audiobookshelf/metadata
SOURCE=apt

Change PORT=3000 to any available port. After editing, restart the service:

bash
systemctl restart audiobookshelf

The CONFIG_PATH and METADATA_PATH values can also be moved to a bind-mounted location if you want config to survive container wipes — just create the directory on the host first, bind-mount it into the container, and point these variables at the mounted path.

Step 5: Set Up HTTPS with a Reverse Proxy

Plain HTTP on your local network is fine for initial testing, but for mobile access from outside your home — and for the iOS/Android app to trust the connection — you want a valid TLS certificate. Both Traefik and Nginx Proxy Manager work well here.

For Nginx Proxy Manager, add a new Proxy Host with these settings:

  1. Domain: abs.yourdomain.com
  2. Scheme: http | Forward Hostname: 192.168.1.52 | Port: 3000
  3. Toggle Websockets Support ON — ABS uses WebSockets for real-time progress sync, and without this the mobile app will appear to sync but position data may not save correctly
  4. Under the SSL tab, request a Let's Encrypt certificate and enable Force SSL

For Traefik v3, add these labels to a Docker service definition or a file provider dynamic config (adjust the service IP as needed):

yaml
http:
  routers:
    audiobookshelf:
      rule: "Host(`abs.yourdomain.com`)"
      entryPoints:
        - websecure
      service: audiobookshelf
      tls:
        certResolver: letsencrypt
  services:
    audiobookshelf:
      loadBalancer:
        servers:
          - url: "http://192.168.1.52:3000"

Traefik passes WebSockets through automatically — no extra configuration needed. Once the proxy is live, test HTTPS in your browser before moving on to the mobile apps.

Step 6: Connect the Mobile Apps

Audiobookshelf has free, open-source iOS and Android apps. After installing from the App Store or Google Play, the connection process is the same on both platforms:

  1. Tap the server icon on the login screen
  2. Enter your server URL: https://abs.yourdomain.com
  3. Log in with the admin credentials from the setup wizard

The app syncs playback position in real time when on the same network, and catches up on reconnect when you're remote. Per the ABS docs, each user account tracks individual progress — if someone else in your household shares the server, their position in any given book won't overwrite yours.

For remote access without a public domain, Tailscale is a clean option. If you're running Headscale on Proxmox as your VPN control plane, reach the ABS container directly via its Tailscale IP and use http://<tailscale-ip>:3000 — no HTTPS certificate needed because Tailscale's network is already encrypted.

Library Organization and Metadata

ABS expects a specific folder structure, documented on the official site. The recommended layout for audiobooks is one folder per author, one subfolder per book, with all audio files inside the book folder:

bash
/audiobooks/
  Brandon Sanderson/
    The Way of Kings/
      The Way of Kings.m4b
      cover.jpg          # optional — ABS fetches covers automatically
  Terry Pratchett/
    Good Omens/
      Good Omens Part 1.mp3
      Good Omens Part 2.mp3
      cover.jpg

Per the ABS docs, every folder inside an author's folder is treated as a separate book, and every audio file inside a book folder is treated as a chapter or part. Books ripped from multiple CDs or downloaded as split files work fine — put all parts in the same book folder and ABS handles ordering by filename.

Metadata fetching runs automatically during the library scan. ABS queries Audible and OpenLibrary by title and author. For commercially published audiobooks the match rate is high. For LibriVox recordings, public domain titles, or anything with an unusual name format, do a manual match inside the web UI: open the book, click the edit icon, and use the Match function to search by ASIN, ISBN, or title. This also lets you pin to a specific Audible edition if the automatic match grabbed the wrong one.

Backups and Updates

Your audiobook files are on the bind mount and already safe from container loss. What needs backing up is the ABS config directory — by default /home/audiobookshelf/.audiobookshelf — which contains the SQLite database, user accounts, playback progress, and cached covers. A simple approach from the Proxmox host:

bash
# Replace 100 with your container ID
pct exec 100 -- tar czf /tmp/abs-backup.tar.gz /home/audiobookshelf/.audiobookshelf
pct pull 100 /tmp/abs-backup.tar.gz /mnt/storage/backups/abs-$(date +%Y%m%d).tar.gz

Add that to a cron job or an n8n workflow and you've got daily config snapshots without any manual effort.

For updates, the PPA handles everything through standard apt:

bash
apt update && apt upgrade audiobookshelf -y
systemctl restart audiobookshelf

ABS releases updates frequently — the changelog is on GitHub. The PPA typically tracks releases within a day or two of each upstream tag.

Hardware Considerations

Because ABS does no transcoding, it barely registers on the CPU graph even with multiple users streaming simultaneously. If your homelab runs other services alongside ABS — Jellyfin, Nextcloud, a local LLM — the bottleneck will be RAM rather than CPU. The Beelink SER5 mini PC (~$299) with its Ryzen 5 5500U and 16 GB of RAM handles a full homelab stack well. If you want more headroom, a Crucial 32GB DDR4 SODIMM (~$59) upgrade gives all your LXC containers room to breathe without a new machine.

Network throughput is another non-issue. Per the ABS documentation, audio files stream at their native bitrate — a typical M4B audiobook runs at 128 kbps, which is negligible on a home LAN or even a modest internet connection. Multiple simultaneous users would need to hit extreme numbers before network bandwidth became a bottleneck.

Where hardware does matter is disk I/O, specifically when ABS scans a large library for the first time. A library of a few thousand files on a slow spinning disk can take several minutes to index. An NVMe drive for the Proxmox host's operating system speeds up the container's metadata operations considerably, even when the audiobook files themselves live on a separate HDD.

Troubleshooting Common Issues

Files not showing after scan: From inside the container, run ls /audiobooks. If the directory is empty or not found, the bind mount isn't attached — verify the Proxmox host directory exists and that you restarted the container after editing the config file. Also confirm the path in ABS Settings → Libraries matches the exact mount point.

Permission errors on scan: The audiobookshelf system user needs read access to the bind-mounted files. On the Proxmox host, run chmod -R 755 /mnt/storage/audiobooks. If your files are owned by a different user, chown -R 1000:1000 /mnt/storage/audiobooks aligns ownership with the unprivileged LXC's default user mapping.

Mobile app not syncing position: The most common cause is a missing WebSocket configuration in the reverse proxy. For Nginx Proxy Manager, toggle "Websockets Support" on in the proxy host Advanced tab. For Traefik, no extra config is needed — websockets pass through by default.

High memory after library scan: Per the ABS docs, the server caches metadata and cover images in memory during a scan. Memory returns to baseline once scanning completes. On a library of several hundred books, expect the process to take 5–10 minutes before resource usage normalizes.

Closing Thoughts

Audiobookshelf is one of those self-hosted apps that feels genuinely polished — the mobile clients are smooth, metadata matching is reliable, and the server needs almost no maintenance once it's running. The PPA install on Proxmox LXC keeps the setup clean: no Docker layer, no compose files to maintain, and apt upgrade handles every future update in seconds.

The use case that makes ABS particularly compelling for homelab setups is multi-format library ownership. You can point it at a mix of M4B purchases, MP3 rips, OPUS downloads from YouTube-dl, and FLAC recordings — all in the same library, browsed through the same interface. ABS reads them all natively and presents them uniformly to the mobile app.

If you want to run ABS alongside other media services, the Proxmox LXC complete self-hosting guide covers the multi-service architecture. ABS slots in cleanly next to Jellyfin, Navidrome, or Immich — each in its own container, each updated independently, sharing the same underlying Proxmox host. The entire audio and video stack can run on a single mini PC with room to spare.

Want this kind of setup for your business?

I deploy private, self-hosted infrastructure on Proxmox: AI, automation and internal tools on hardware you own, documented and handed off. See the Private AI Stack →

Not sure what you need? Book a free discovery call.

Ricardo Gil is a full-stack developer (.NET/Angular) with 6+ years of experience. He runs a personal homelab on a Beelink mini PC with Proxmox VE, self-hosting everything from Jellyfin to local LLMs with Ollama. More about Ricardo →
📬Weekly Newsletter

Get the best home lab & AI content

No spam. One email per week. Unsubscribe anytime.

Share this article