Install Listenarr with Docker Compose

Self-hosted audiobook manager in the *arr style. One Compose file, then point it at your library folder.

Install Listenarr with Docker Compose

Listenarr is a self-hosted audiobook collection manager. It searches indexers, sends releases to a download client, then imports files into a tidy author/title layout with Audible metadata. This how-to is the path we recorded: Docker Compose on port 4545, then the first-run browser setup.

Source: github.com/Listenarrs/Listenarr

Prerequisites

  • Docker Engine with Compose v2
  • A free host port (default 4545)
  • Two host folders: one for the library, one for downloads

This run used image ghcr.io/listenarrs/listenarr:canary (Listenarr 1.5.9). :canary moves; pin a digest or a canary-1.5.9 tag if you need a freeze.

Install

mkdir -p ~/listenarr/audiobooks ~/listenarr/downloads && cd ~/listenarr
export LA_UID=$(id -u) LA_GID=$(id -g)
services:
  listenarr:
    image: ghcr.io/listenarrs/listenarr:canary
    container_name: listenarr
    ports:
      - "4545:4545"
    environment:
      - PUID=${LA_UID}
      - PGID=${LA_GID}
      - UMASK=022
      - LISTENARR_LOG_LEVEL=Information
    volumes:
      - listenarr_data:/app/config
      - ${HOME}/listenarr/audiobooks:/audiobooks
      - ${HOME}/listenarr/downloads:/downloads
    extra_hosts:
      - "host.docker.internal:host-gateway"
    restart: unless-stopped
volumes:
  listenarr_data:

Save that as ~/listenarr/docker-compose.yml, then:

cd ~/listenarr
docker compose config >/dev/null && echo OK
docker compose pull && docker compose up -d
until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:4545/api/v1/system/ready)" = 200 ]; do sleep 2; done
echo READY

Open http://localhost:4545. First run has authentication off. Turn it on before you expose the port.

First-run browser setup

The empty library:

Empty Listenarr library

  1. Settings → Root Folders → Add Root Folder

- Name: Audiobooks - Advanced options → Filesystem behavior: Case-sensitive (Automatic fails on an empty bind mount with HTTP 409) - Path: /audiobooks - Tick Set as default root folder - Save. You should see “Root folder created”.

Add root folder

  1. Add New → search Dune → Execute search. Metadata comes from Audible; no API key.
  2. On the first result, Add to Library. Confirm the destination is /audiobooks/Frank Herbert/Dune, then add it.
  3. Audiobooks shows the cover card. Click the poster for the detail page (cover, duration, narrators, series, monitored path).
  4. System should show API Healthy and Audible/Audnexus Connected.

Library with Dune

Audiobook detail

Verify

curl -s -o /dev/null -w '%{http_code}\n' http://localhost:4545/api/v1/system/ready
# 200

curl -s http://localhost:4545/api/v1/configuration/bootstrap
# authenticationRequired: false on a fresh install

Restart should keep the SQLite database:

cd ~/listenarr
docker compose down && docker compose up -d
until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:4545/api/v1/system/ready)" = 200 ]; do sleep 2; done
docker exec listenarr test -f /app/config/database/listenarr.db && echo DB_PERSISTED

Next steps (not in this demo)

  • Settings → Indexers and Download Clients (qBittorrent, Transmission, SABnzbd, NZBGet)
  • Enable authentication before the host is reachable from outside a trusted LAN

Troubleshooting

SymptomFix
Root folder save returns 409Set filesystem behavior to Case-sensitive, not Automatic
Add to Library lands under /appTick Set as default root folder on /audiobooks
Port already in useChange 4545:4545 to e.g. 4546:4545
Image tag latest missingUse :canary (or pin a digest)
Ready endpoint stays 503docker logs listenarr — often ffprobe download; set LISTENARR_AUTO_INSTALL_FFPROBE=false if the host is offline