Service Catalogue
- Type: Reference
- Status: Current
- Scope: Fleet services declared by this repository
- Canonical sources:
hosts/*/default.nix,hosts/*/databases/,modules/services/,modules/databases/,modules/containers/, and evaluated NixOS options- Last verified: Source commit
937e7fd02aad450a006b49f592c156e75888db7a(2026-09-14); new Vega service checked against incremental source changes since556df88494686003b1c4f20c8e0b99b5afc16a6e- Review triggers: Service enablement or placement changes, native/container migrations, listener or firewall changes, ingress changes, database moves, authentication changes, or backup-path changes
This catalogue answers five operational questions: which host owns a service, how clients reach it, where its durable state lives, what protects it, and how its state enters the backup system. It describes declared configuration, not momentary process health. Use live monitoring for the latter.
Use the Host Inventory for machine capabilities, the Network and Access Topology for route classes, and the Storage and Data Map for data authority and recovery coverage.
Reading the catalogue
- Public via Newt means the application has a restricted local listener and Pangolin supplies the public HTTPS edge through that host's Newt client.
- Public via SWAG means the retained Lyra Docker reverse-proxy estate reaches
a host listener. The route itself is mutable state under
/srv/stacks, not a Nix declaration in this repository. - Mesh means the Nebula listener and interface firewall are the intended trust boundary. A mesh listener is not automatically authenticated.
- Backup intent means the path is contributed to
nixosConfig.backup.dataPathsor is beneath a host backup root. It does not by itself prove that a recent off-host snapshot completed successfully. - Secret file names and authentication mechanisms are documented; secret values never belong in the wiki.
User-facing applications
| Service | Owner and form | Reachability | Durable state and database | Authentication | Backup intent | Canonical source |
|---|---|---|---|---|---|---|
| BookStack | Vega, native NixOS | wiki.nimmog.uk via Newt to 127.0.0.1:80 |
/mnt/storage/bookstack; local MariaDB under the system MySQL data directory |
Pocket ID OIDC; SOPS-backed application and database credentials | Application files only; no MariaDB dump or MySQL data path is currently declared | modules/services/bookstack.nix |
| TriliumNext | Vega, native NixOS | Mesh 10.10.0.2:37840; its public URL is supplied in the secret-backed OAuth configuration |
/var/lib/trilium; application SQLite state |
Pocket ID OAuth plus Trilium's own application controls | Entire data directory | modules/services/trilium-web.nix |
| Karakeep | Vega, native NixOS | links.nimmog.uk via Newt; no host firewall opening is declared |
/var/lib/karakeep; SQLite and crawled assets; Meilisearch is rebuildable derived state |
Application session/auth configuration from a SOPS environment file | /var/lib/karakeep |
modules/services/karakeep.nix |
| FreshRSS | Vega, native NixOS | news.nimmog.uk via Newt to the newt_default bridge gateway on port 8082; not exposed on LAN interfaces |
/var/lib/freshrss; PostgreSQL database freshrss on Vega |
Pocket ID at the local Apache edge; database/admin secrets from SOPS | Application state enters Backrest; database has local logical dumps that are not currently in Vega's Backrest paths | modules/services/freshrss.nix |
| Paperless-ngx | Vega, native NixOS | documents.nimmog.uk via Newt to 127.0.0.1:28981 |
/mnt/storage/paperless; PostgreSQL database paperless on Vega |
Pocket ID via django-allauth; SOPS-backed admin, database, and application secrets | Entire state root enters Backrest; database has local logical dumps that are not currently in Vega's Backrest paths | modules/services/paperless.nix |
| Navidrome | Vega, native NixOS | Host port 4533; reachable through Newt and over Nebula for Plexdrome |
/var/lib/navidrome; music library at /mnt/media/Music on the NAS |
Navidrome application accounts; separate SOPS credentials for integrations | Navidrome state; NAS media is outside host-owned state | modules/services/navidrome.nix |
| SillyTavern | Vega, native NixOS | Newt-dependent service on 127.0.0.1:8384 |
/var/lib/SillyTavern, including mutable source configuration and plugins |
Application whitelist/auth policy in mutable configuration | Entire application state | modules/services/sillytavern.nix |
| SABnzbd | Vega, native NixOS | Host port 8383, URL base /sabnzbd; reverse-proxy routing is external to its module |
Configuration under /srv/services/sabnzbd; incomplete downloads under /mnt/partial; completed media under /srv/media |
Declared web login is disabled; the route must rely on its ingress/network boundary. SOPS supplies API and upstream-service configuration | Service configuration through /srv/services; media/storage follows its own storage policy |
modules/services/sabnzbd.nix |
| Jellyfin | Lyra, native NixOS | Host port 8096, reached by the retained SWAG proxy |
NixOS Jellyfin data directory; media at /mnt/media on the NAS |
Jellyfin application accounts | Jellyfin data directory; NAS media is outside host-owned state | modules/services/jellyfin.nix |
| Immich | Lyra application with Vega database | Host port 2283, reached by the retained SWAG proxy |
Media at /mnt/immich from the NAS; PostgreSQL database immich on Vega |
Immich application accounts; SOPS-backed database credential | Database has local logical dumps on Vega that are not currently in Backrest; NAS media follows NAS policy | modules/services/immich.nix, modules/databases/immich.nix |
| Tdarr | Lyra native server and two local nodes; Vega native Intel node | Lyra ports 8265 (web) and 8266 (server); nodes use Nebula for the server connection |
Per-host /srv/services/tdarr; shared cache and media on NAS mounts |
Tdarr authentication is currently disabled in evaluated configuration; restrict by network placement | Per-host Tdarr state; NAS content follows NAS policy | modules/services/tdarr.nix, both server host files |
| Redview | Lyra, native NixOS with NVIDIA runtime | Application port 3210; current ingress is part of Lyra's retained proxy/network estate rather than declared in this module |
/var/lib/redview; library content below an NFS mount from NAS appdata |
Application controls plus SOPS-backed Reddit/BDFR credentials | /var/lib/redview; mounted NAS content follows NAS policy |
modules/services/redview.nix |
| SynthSeek | Chaos, OCI container | seek.nimmog.uk via Newt to 127.0.0.1:4400 |
/srv/stacks/synthseek; reads music and incoming downloads from the NAS-backed /srv/media |
SOPS-backed session secret; Plex access through Plexdrome | Covered by Chaos /srv/stacks; NAS media follows NAS policy |
modules/containers/synthseek.nix |
| slskd | Chaos, OCI container | Web UI on 127.0.0.1:5030; Soulseek peer port 50300 is opened separately |
/srv/stacks/slskd; downloads and music are NAS-backed |
SOPS-backed Soulseek, web, and API credentials | Covered by Chaos /srv/stacks; NAS media follows NAS policy |
modules/containers/slskd.nix |
The secret files required by slskd, SynthSeek, and Plexdrome exist in the repository's encrypted secret set. Older comments saying these services remain dormant until those files exist no longer describe the declared composition. That does not substitute for checking their live container health.
Internal services and control plane
| Service | Owner and form | Listener or relationship | State / database | Access control | Backup intent | Canonical source |
|---|---|---|---|---|---|---|
| Attic binary cache | Vega and Lyra, native NixOS backends | Each backend listens on 127.0.0.1:8081; Pangolin/Newt load-balances attic.nimmog.uk |
Cache objects on NAS at /srv/attic/storage; configured database URL supplied by SOPS |
Attic tokens and restricted allowed hosts | Cache is reproducible/garbage-collected; database protection depends on the configured database target | modules/services/atticd.nix |
| PostgreSQL application cluster | Vega, native NixOS | 10.10.0.2, loopback, and the dedicated Whisparr bridge on port 5432 |
/mnt/storage/postgresql; serves Immich, FreshRSS, Paperless and retained application databases |
SCRAM on permitted networks; role passwords from service-scoped SOPS files | Daily local logical dumps at /mnt/storage/postgresql-backups; that path is not currently in Vega's Backrest plan |
hosts/vega/databases/postgresql.nix |
| PostgreSQL / Adminer cluster | Cosmos, native NixOS | Mesh-only 10.10.0.8:5432; Adminer at 10.10.0.8:8050 |
NixOS PostgreSQL data directory; restored/migrated application databases | SCRAM and SOPS-managed role credential; Nebula boundary | Daily logical dumps at /var/backups/postgresql, then Backrest |
hosts/cosmos/default.nix |
| Engram Cloud | Vega, native NixOS | 10.10.0.2:18080 is the client endpoint; the process is configured on 0.0.0.0:18080 with a host firewall opening |
/var/lib/engram-cloud; local PostgreSQL database engramcloud |
SOPS-rendered Engram Cloud environment; clients use the configured machine identity/token | PostgreSQL enters Vega's local logical dumps, but neither those dumps nor /var/lib/engram-cloud is an explicit Backrest path |
modules/services/engram-cloud.nix |
| Forgejo MCP | Vega, native service plus TCP proxy | Mesh 10.10.0.2:8780, proxied to a loopback upstream |
Ephemeral MCP process state | The backend authenticates to Forgejo as the scoped bot token; the listener itself relies on the Nebula boundary | No unique durable application state | modules/services/forgejo-mcp.nix |
| Navidrome MCP | Vega, native systemd service | Mesh 10.10.0.2:18808/mcp; calls local Navidrome |
Runtime state under /var/lib/navidrome-mcp |
Bearer token for MCP clients; SOPS-backed Navidrome service account | No authoritative data beyond Navidrome | modules/services/navidrome-mcp.nix |
| ytdl-sub | Vega, native NixOS scheduled downloader | Hourly timer; no inbound service listener | Disk-backed working and subscription archive state under /var/lib/ytdl-sub; Critical Role episodes written to the NAS at /mnt/media/ytdl-sub/Critical Role/Season NN for Jellyfin |
No network listener; output directory requires the media mount | /var/lib/ytdl-sub is contributed to Backrest; completed NAS media follows the external NAS policy |
hosts/vega/ytdl-sub.nix, modules/services/ytdl-sub.nix |
| Paseo daemons | Vega and Lyra, native NixOS | Evaluated listeners are 10.10.0.2:6767 and 10.10.0.3:6767; daemons register with the TLS relay at code.nimmog.uk:443; host firewall is not opened by the module |
/srv/services/paseo on each host |
SOPS-backed Paseo password plus relay TLS | Covered by each host's /srv/services backup intent |
modules/services/paseo-daemon.nix |
| Paseo relay | Chaos primary container; Vega fallback container retained during cutover investigation | Public WebSocket path through Pangolin; Chaos publishes loopback 8411, while Vega's fallback shares its Newt Docker network |
No authoritative application state | Relay protocol and public TLS boundary | None required | modules/containers/paseo-relay.nix, hosts/vega/default.nix |
| Paseo web UI | Chaos, OCI container | Public route through Pangolin/Newt to 127.0.0.1:8088; container port 80 |
Static web bundle; endpoint selected at runtime | Authentication occurs against the selected daemon/relay | None required | modules/containers/paseo-webui.nix |
| Plexdrome | Chaos, OCI compatibility service | No host port; SynthSeek reaches alias plexdrome:32400 on the private slskd-net network |
/srv/stacks/plexdrome is prepared, but the container is intended as a stateless bridge |
SOPS-backed Plex and Navidrome credentials | Covered by /srv/stacks if state appears |
modules/containers/plexdrome.nix |
| Rangarr and Killarr | Chaos, OCI automation containers | No host ports declared | Shared mutable configuration /srv/stacks/rangarr/config.yaml |
Configuration-file policy; no separately declared network auth | Covered by Chaos /srv/stacks |
modules/containers/rangarr.nix, modules/containers/killarr.nix |
| Ollama | Lyra native NVIDIA service; Electra specialisations provide local instances | Lyra serves 0.0.0.0:11434; Electra instances are local and manually started |
Lyra models at /srv/models; Electra models follow its profile configuration |
Ollama has no native authentication; firewall and host placement are the boundary | Models are replaceable artefacts and are not described as primary backed-up state | modules/profiles/ollama.nix, relevant host files |
| Wyoming speech | Lyra, native faster-whisper and Piper | 0.0.0.0:10300 and 0.0.0.0:10200 |
Downloaded models/voices and runtime cache | Wyoming endpoints have no application authentication; network placement is the boundary | No authoritative user data | modules/services/whisper.nix |
| Newt clients | Vega, Lyra, and Chaos, native NixOS | Outbound connection to Pangolin; the Pangolin-side route definitions are not visible in this repository | Secret-backed client environment | Newt identity from host-scoped SOPS file; TLS to Pangolin | No authoritative state | modules/services/newt.nix |
Configuration findings to carry forward
These are durable observations from the declared configuration, not claims of an active incident:
- BookStack's application files enter Vega's backup plan, but its local MariaDB data does not currently have a declared logical dump or backup path.
- Vega's PostgreSQL cluster produces daily logical dumps, but its dump directory is not currently included in Vega's composed Backrest paths. Cosmos does back up its own logical-dump directory.
- Engram Cloud listens on all interfaces and opens port
18080globally, even though configured clients use the Vega Nebula address. - Tdarr's evaluated server authentication is disabled. SABnzbd's declared web login is also disabled; both therefore depend on their network/ingress boundaries.
- Paseo daemon listeners currently evaluate to the Vega and Lyra Nebula addresses. Older descriptions of loopback-only daemons are stale.
These findings should feed the Security Baseline and its review gates. Changing the configuration is outside the scope of this reference page.
Fleet-wide supporting services
The common and server profiles also install operational services that should not be confused with end-user applications:
| Capability | Placement | Purpose and ownership |
|---|---|---|
| Backrest/restic | Enabled when a host contributes home or data paths | Off-host backup execution and retention for the paths listed above; credentials are delivered with systemd credentials |
| PostgreSQL logical backup | Vega and Cosmos | Produces self-contained daily SQL backup sets; Cosmos passes its dump path to Backrest, while Vega's is currently local-only |
| Beszel agent | Every registered host | Live health and inventory evidence; current availability belongs in Beszel, not in this page |
| Auto-update consumer | Every registered host | Pulls approved fleet generations from the update control plane; Nova's staged configuration proposes the future producer role |
| Service failure monitor | Server hosts, with explicit unit lists | Publishes selected systemd failures to host-specific notification topics |
| Docker report | Lyra | Periodic reporting for the retained mutable Docker estate |
Transitional and external boundaries
Three boundaries require deliberate treatment in later pages and runbooks:
- Lyra's retained Docker/SWAG estate. Nix declares Docker, mounts,
firewall ports, and some native replacements, but
/srv/stacksremains the source for other container definitions and reverse-proxy routes. Those workloads cannot be claimed as fully declarative from this repository. - Paseo relay cutover. Chaos declares the primary relay and web UI, while Vega intentionally retains a fallback relay. Removing either is an operational change, not documentation cleanup.
- External infrastructure. Pangolin, the NAS, Proxmox, public DNS, and the public Nebula lighthouse are dependencies and trust boundaries but are not configured by this repository.
The Network and Access Topology owns the cross-service route map. The Storage and Data Map owns retention, restore authority, and NAS boundaries. Procedures belong in Service Migration and Cutover and the Operations and Runbooks, while rationale belongs in Architecture Decisions. ADR-002 defines how native services, local integration modules, wrapper repositories, and OCI containers are chosen. Return to the System Atlas.