Kituwa IT · Self-hosting guides

Install Audiobookshelf with Docker Compose

Self-hosted audiobook and podcast server

audiobookspodcastsmulti-user

Audiobookshelf is a self-hosted audiobook and podcast server with proper multi-user support, per-user progress sync, and apps on every platform. Where Jellyfin treats audio as just another media type, this one is built around it — chapters, embedded covers, and a progress bar that follows you between devices.

Category
Media & photos
License
GPL-3.0
Needs
Nothing
Image
ghcr.io/advplyr/audiobookshelf

What it is

Point it at a folder of M4B, MP3 or FLAC and it groups them into libraries by author and series, reads the tags, extracts chapter markers, and serves them with resume-where-you-left-off. Podcasts work too: subscribe to a feed, and new episodes are fetched and kept.

Before you start

  • Needs the audiobookshelf node user and read access to the media directory. If the container can't read the files, you'll see empty libraries rather than an error.
  • Both a metadata and a cover folder are useful. Missing covers means Audiobookshelf queries external metadata providers, which is slow on a cold library and looks like hanging.
  • The transcoding cache lives in a subdirectory of ./config and grows. Mount it separately if your config is on a small volume.

1 — Create the directories

Command / configuration
mkdir -p ~/services/audiobookshelf/{config,metadata,cover,transcodes}
mkdir -p /mnt/bigdisk/audiobooks
cd ~/services/audiobookshelf
id audiobookshelf 2>/dev/null || echo "create this user or use your own uid"

2 — Write the compose file

Command / configuration
services:
  audiobookshelf:
    image: ghcr.io/advplyr/audiobookshelf:latest
    container_name: audiobookshelf
    restart: unless-stopped
    user: "1000:1000"
    ports:
      - "127.0.0.1:13378:80"
    environment:
      - TZ=UTC
      - NODE_ENV=production
      - AUDIOBOOKSHELF_GENERIC_METADATA_LOCATION=/metadata
      - COVER_LOCATION=/cover
    volumes:
      - ./config:/config
      - ./metadata:/metadata
      - ./cover:/cover
      - ./transcodes:/config/transcodes
      - /mnt/bigdisk/audiobooks:/audiobooks
    healthcheck:
      test: ["CMD", "curl", "-fs", "http://localhost:80/healthcheck"]
      interval: 30s
      timeout: 5s
      retries: 3

3 — Start it

Command / configuration
docker compose up -d
docker compose logs -f audiobookshelf | grep -i "listening\|error"

4 — First-run setup

  1. Open http://yourhost:13378 and create the root/admin user. This account sees every library, so use it sparingly.
  2. Add libraries. For audiobooks use Single Folder or Author/Series as the library type — the nested option matches how most people already store M4B files.
  3. Scan the library. With metadata and cover folders populated it's fast; without them it queries providers per item and can take hours for a few thousand books.
  4. Create per-user accounts and restrict each to the libraries they should see. Settings → Users lets you set a per-user storage path too, which is handy for kids with a small allowance.
  5. Install the app on your phone and confirm position sync: play twenty seconds, stop, open the app on another device, and check the progress carried over.

5 — Add podcasts

Command / configuration
# the container can fetch feeds itself; no cron needed
# Library type: Podcast -> add feed URL -> set auto-download on new episodes

Help when you need it

Want help getting this running?

We can help with a supported Linux host, application setup, migration or troubleshooting. Contact us to confirm the software, scope and scheduling before ordering.

Related guides

← Browse all 30 guides · Back to top