lscr.io/linuxserver/calibre:9.15.0 (desktop build) running calibre-server as the s6 main service on internal 8090 -> host 8084, auth-gated with a plaintext userdb (mode 600) bootstrapped once by the deploy handler. The desktop GUI is kept on 8080/8182, basic-authed with the same credential pair via the machine-local env file.
4.2 KiB
Calibre
Calibre is the e-book library manager that backs Calibre-Web. It manages metadata, formats, and conversions for the library that Calibre-Web serves.
Host: Dankserver (library directory on host) — Docs: https://calibre-ebook.com
Role in this Stack
Calibre itself is a desktop/GUI application, not a container service. This stack runs Calibre-Web in a container and points it at an existing Calibre library directory on the Dankserver host.
Calibre is used to:
- Import books into the library (drag-and-drop or CLI
calibredb) - Edit metadata (author, title, series, tags, cover art)
- Convert between formats (EPUB → MOBI, MOBI → EPUB, etc.)
- Manage collections and reading lists
The actual library files (.epub, .mobi, .pdf) and the Calibre database (.db file) live on the host filesystem. Calibre-Web reads and writes them through the mounted volume.
Current Version
Calibre 9.2.1 is the version on the live host (9.9.0 is the upstream latest). Major features include:
- Bookshelf view
- Opt-in AI features
- Content server security fix (CVE-2025-7404 equivalent): a bug since v6.16.0 allows any user with server access to read non-Calibre files on the host. Upgrade to 9.9.0+ if serving content to untrusted users.
Library Directory
The live Calibre-Web container bind-mounts the library at /books:
| Purpose | Host path (live) |
|---|---|
| Calibre library | /home/dank/Containers/calibre-web/books → /books in the Calibre-Web container |
(The older /opt/calibre-web/books path was the compose-era location and is
gone; the quadlet unit mounts the Containers data root.)
What the Container Needs
- Read/write access to the library directory. Calibre-Web edits metadata through the database file.
- Ownership matching
PUID=1000/PGID=1000(thedankuser on Dankserver).
Calibre Content Server (running)
Calibre includes a built-in HTTP content server (calibre-server) that serves
the library via OPDS feeds and a web interface:
- OPDS feeds for mobile reading apps (FBReader, Moon+ Reader, KyBook)
- Web UI for browsing, metadata editing, and uploads
- Direct device push (from the GUI, not the content server)
Live shape (deployed 2026-09-21): a rootless Quadlet unit
(dankserver/calibre-server/quadlet/calibre-server.container), boot-persistent
and self-healing, on lscr.io/linuxserver/calibre:9.15.0.
The image is the current desktop build (Selkies web-streamed GUI), not the
headless image the old compose snippet assumed — the dedicated headless images
(ta264/docker-calibre, agentgreen/calibre-server) are dormant (calibre 6.10 /
2017, both below the 9.9.0 content-server fix). The unit therefore runs
calibre-server as the image's s6-overlay main service via Exec= and keeps
the desktop as a bonus:
| Surface | Host port | Auth |
|---|---|---|
| Content server (OPDS + web UI) | 8084 (internal 8090) | HTTP Basic, single admin calibre in the SQLite userdb |
| Desktop GUI (bonus) | 8080 (HTTPS on 8182) | HTTP Basic, same credential |
Port notes: 8080 inside the container is the image's own nginx (the desktop),
so the content server runs on internal 8090; CUSTOM_HTTPS_PORT=8182 avoids
Tautulli's host 8181.
Auth model (calibre 9.x): users live in a SQLite userdb whose pw column
is plaintext — the file is mode 600. The single admin account is
bootstrapped once by the deploy handler
(deploy_calibre_server in scripts/deploy-remote.sh) via
calibre-server --manage-users -- add, the password piped on stdin with
printf (a trailing newline from echo lands in the stored password and
breaks every login). The desktop's basic auth (CUSTOM_USER/CUSTOM_PASSWORD)
reuses the same pair. Both live in the machine-local env file
/home/dank/Containers/calibre-server/env (mode 600); the repo holds no
secrets. --auth-mode=basic is pinned: on a non-SSL port the server defaults
to Digest auth, which rejects plain Basic clients with
400 Unsupported authentication method.
LAN-only (no vhost, no public DNS). The library is mounted read-write — the content server writes metadata, the same library Calibre-Web uses.
See Also
- Calibre-Web — the containerized frontend
- Dankserver Stack
- ARR-Stack — Readarr for automatic ebook downloads