Files
oikos/knowledge/wiki/containers/130-grimmory.md
dtoro 4efddb8bed docs: fix pre-existing broken links surfaced by docs-lint
Problem: docs-lint (added in the wiki-hq reorg) surfaced 126 broken relative
links that predated this session — a container rename, incident/plan docs
that moved into archive/done subfolders without their inbound links being
updated, and a handful of relative-depth bugs in files nested under
containers/archive/ and plans/done/.

Fixes applied, by category:
- 124-authentik.md -> 106-auth-outpost.md (container was renamed; ~40 refs).
- investigations/{2026-04-21-hubris-crash-loop,2026-05-31-authentik-vps-migration}.md
  -> archive/ prefix (both moved to investigations/archive/ previously).
- plans/{2026-06-01-slate-ax-to-sodola-migration,2026-06-04_130000-deprecate-claudio-bot,
  2026-06-25-yuvomi-deployment}.md -> plans/done/ prefix.
- Depth bugs in files nested one level deeper than their siblings assumed
  (investigations/archive/*, knowledge/wiki/containers/archive/*,
  plans/done/*) — corrected relative-path depth.
- Destroyed containers with no surviving page (126-plato) delinked to the
  containers/index.md archaeology row instead of a 404.
- ludo-mini.yaml -> strong.yaml (host was renamed, same physical machine).
- netbird-vps.md (no narrative page exists) -> netbird-vps.yaml (substrate
  record, matching the existing convention for hosts without a wiki page).
- runbook-dpkg-interrupted.md refs -> .agents/skills/runbook-dpkg-interrupted/SKILL.md
  (missed in the phase-4 runbook move because the referencing files used a
  bare filename, not a runbooks/ prefix).
- One dangling forward-reference to a never-written investigation delinked
  to the actual incident record it was describing.

Left alone: two links in knowledge/wiki/containers/101-jellyfin.md into
devops/homelab-authentik-admin/ — an intentional reference to a sibling repo,
not present in this checkout.

Verification: broken-link count 126 -> 2 (real remainder is the cross-repo
reference above); gen-topology.py --check still exit 0; build_host_files.py
still idempotent; all inventory.yaml doc_page targets still resolve.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 17:53:35 +02:00

3.6 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.247
  • Host: strong (migrated from hubris 2026-07-05)
  • Privilege: privileged (UID = host UID for /mnt/library media GID)
  • Resources: 1 core / 2 GiB RAM / 16 GiB rootfs (Debian 13)
  • Mounts: /mnt/media_local/mnt/library
  • Public hostname: books.hubris.network

Service / port map

Service Listen Notes
Grimmory 192.168.8.247: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

Uses Confidential client (client secret stored in Grimmory's DB — migrated from Booklore). The OIDC config carried over in the database dump; no manual re-entry needed.

  • Authentik provider: Provider for Grimmory (renamed from Provider for Booklore on migration)
  • Client ID: L1u0eFsNhbKgiIvvFeIr2mvZdbtFyzidCq2h6thL
  • Client type: Confidential (client secret in oidc_provider_details in MariaDB app_settings)
  • Redirect URI: https://books.hubris.network/oauth2-callback
  • Scopes: openid, profile, email, offline_access
  • Back-channel logout: http://192.168.8.247:6060/api/v1/auth/oidc/backchannel-logout
  • Application slug: booklore → Issuer URI: https://auth.hubris.network/application/o/booklore/

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.