Files
oikos/containers/130-grimmory.md
dtoro 41fe34a3c3 migrate: Booklore → Grimmory on new LXC 130
Grimmory (grimmory-tools/grimmory) is the community fork/successor of
Booklore. Moving it off the shared apps LXC (105) onto a dedicated
container (130, 192.168.8.213) to avoid the Portainer-managed stack
footgun that wiped mariadb in April.

- containers/130-grimmory.md: new container doc with compose layout,
  Authentik OIDC notes (PKCE/Public client), media-GID setup
- plans/2026-06-29-grimmory-migration.md: step-by-step runbook for
  DB dump/restore, LXC provisioning, Caddy cutover, Authentik update
- inventory.yaml: add grimmory LXC 130
- containers/105-apps.md: remove Booklore section + hostname entry
- containers/index.md: update 105 row; add 130 row
- infrastructure/media-permissions.md: add LXC 130; update Booklore→Grimmory refs
- README.md: update 105 row; add 130 row

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 01:11:00 +02:00

3.5 KiB

130 — grimmory

Self-hosted digital library (eBooks, comics, audiobooks). Community fork/successor of Booklore, with smart shelves, metadata enrichment, Kobo/KOReader sync, OPDS, and a built-in EPUB/PDF reader. Migrated from apps (105) on 2026-06-29.

At a glance

  • Hostname: grimmory
  • IP: 192.168.8.213 (static DHCP reservation)
  • Privilege: privileged (UID = host UID for /mnt/library media GID)
  • Resources: 1 core / 2 GiB RAM / 16 GiB rootfs (Debian 13)
  • Mounts: /mnt/library
  • Public hostname: books.hubris.network

Service / port map

Service Listen Notes
Grimmory 192.168.8.213:6060 Docker Compose at /opt/grimmory/
MariaDB internal only Sidecar in the same compose stack

Compose

Located at /opt/grimmory/docker-compose.yml. Key points:

  • Image: ghcr.io/grimmory-tools/grimmory:latest
  • Books library: /mnt/library/books/books (read-write; media GID 10000 via GROUP_ID=10000)
  • Bookdrop (watched folder for auto-import): /opt/grimmory/bookdrop/bookdrop
  • App data (covers, DB config): /opt/grimmory/data/app/data
  • MariaDB config: /opt/grimmory/mariadb/config/config (linuxserver/mariadb image)
  • extra_hosts: auth.hubris.network:192.168.8.175 — routes Authentik OIDC discovery to Caddy from inside the container
  • FORCE_DISABLE_OIDC=false — OIDC stays enabled; provider configured via Grimmory admin UI

Credentials live in /opt/grimmory/.env (untracked):

  • DATABASE_PASSWORD / MYSQL_PASSWORD — MariaDB Grimmory user password
  • MYSQL_ROOT_PASSWORD — MariaDB root password

Authentik OIDC

Grimmory uses PKCE (Public client — no client secret required).

  • Authentik provider: Grimmory (updated from old Booklore provider — client type changed to Public)
  • Redirect URI: https://books.hubris.network/oauth2-callback
  • Scopes: openid, profile, email, offline_access
  • Back-channel logout: http://192.168.8.213:6060/api/v1/auth/oidc/backchannel-logout
  • Grimmory admin UI: Settings → Authentication → OIDC
    • Issuer URI: https://auth.hubris.network/application/o/<slug>/ (trailing slash required)
    • Client ID: from Authentik provider
    • Test Connection to verify reachability from within the container

Media permissions

LXC is privileged → in-container UID = host UID. Docker container gets media GID via GROUP_ID=10000 env var (Grimmory/linuxserver pattern). The /mnt/library/books subtree is owned :media mode 2775 (setgid). See media-permissions.

Changelog

2026-06-29 — provisioned; Booklore migrated

LXC 130 created (Debian 13, privileged, 192.168.8.213). Docker installed. Grimmory compose deployed at /opt/grimmory/. MariaDB dump from Booklore (LXC 105) restored — schema-compatible since Grimmory is a direct fork. Caddy books.hubris.network backend updated from 192.168.8.205:6060 to 192.168.8.213:6060. Authentik provider updated: Booklore → Grimmory, Confidential → Public (PKCE). Booklore stack removed from Portainer on LXC 105.