Files
truenas-stacks/docs/architecture/ARCHITECTURE_OVERVIEW.md
2026-05-05 14:43:09 -05:00

3.4 KiB

Homelab Architecture Overview

Primary Docker Host

Host: PlausibleDeniability (TrueNAS Scale)

Production Docker workloads run on PlausibleDeniability via standalone Docker Compose stacks. TrueNAS Apps (ix-app format) have been fully migrated to compose stacks.

Repository Layout

Repo root: /mnt/docker-ssd/docker/compose Remote: git@github.com:Paccoco/truenas-stacks.git Gitea mirror: https://gitea.paccoco.com/fizzlepoof/truenas-stacks.git

Stack directories:

  • databases/ = shared-postgres, shared-mariadb, shared-redis — deploy FIRST
  • infrastructure/ = newt, homepage, uptime-kuma, dockhand, netdata, tailscale — deploy SECOND
  • media/ = plex, tautulli, audiobookshelf, seerr, calibre-web-automated
  • photos/ = immich server + machine learning
  • home/ = kitchenowl, donetick, dakboard bridge, shlink, shlink-web-client, qui
  • dev/ = gitea, rackpeek
  • ai/ = ollama, openwebui
  • meshtastic/ = meshmonitor, mqtt-proxy, tileserver, meshtastic-map

Storage Model

Local SSD

Mounted at: /mnt/docker-ssd

  • Docker data root: /mnt/docker-ssd/docker/docker-data
  • Databases: /mnt/docker-ssd/docker/databases/
  • Write-heavy appdata: /mnt/docker-ssd/docker/appdata/
  • GPU/model storage
  • Apps that perform chown or aggressive startup writes
  • SQLite-backed apps

Notable appdata on SSD:

  • plex, tautulli, audiobookshelf, seerr, dockhand, rackpeek
  • immich, immich-ml, ollama, openwebui
  • shlink, gitea, netdata, tailscale, uptime-kuma

TrueNAS Pool (tank)

Mounted at: /mnt/tank

  • General appdata: /mnt/tank/docker/appdata/
  • Backups: /mnt/tank/docker/backups/
  • Downloads: /mnt/tank/docker/downloads/

Notable appdata on tank:

  • homepage, newt, dockhand (config only)
  • kitchenowl, donetick, qui
  • calibre-web-automated config

Unraid NFS

Mounted at: /mnt/unraid

  • Media libraries: /mnt/unraid/data/media/
  • Immich media: /mnt/unraid/immich

Networks

  • ix-databases_shared-databases — created by databases stack; project name ix-databases set in compose
  • pangolin — created by newt at runtime; used by all externally exposed services

Active Stacks (as of 2026-05-05)

databases/

  • shared-postgres (immich-optimized image with vectorchord + pgvector)
  • shared-mariadb
  • shared-redis

infrastructure/

  • newt, homepage, dockhand, uptime-kuma, netdata, tailscale

media/

  • ix-plex-plex-1 (GPU passthrough, RTX 2080 Ti)
  • ix-tautulli-tautulli-1
  • ix-audiobookshelf-audiobookshelf-1
  • seerr (Postgres backend)
  • calibre-web-automated

photos/

  • ix-immich-immich-server-1
  • ix-immich-immich-machine-learning-1 (GPU, CUDA)

home/

  • kitchenowl, donetick, donetick-dakboard-bridge, qui, shlink, shlink-web-client

dev/

  • gitea, ix-rackpeek-rackpeek-1

ai/

  • ollama (GPU, RTX 2080 Ti, port 11434)
  • openwebui (Postgres backend, port 8282)

meshtastic/

  • meshmonitor, meshmonitor-mqtt-proxy, meshmonitor-tileserver, meshtastic-map

Planned / Not Yet Deployed

  • dispatcharr, gotify, bytestash, kima-hub, n8n, qdrant, paperless-ngx, home-assistant

Shelved

  • scriberr — SQLite incompatible with ZFS nfsv4 ACLs

Design Principles

  • deterministic storage paths
  • no anonymous volumes
  • stack-local .env for secrets; .env.example committed with placeholders
  • SSD for write-heavy / DB / SQLite / GPU workloads
  • tank NFS for general appdata and configs
  • Unraid NFS for media only
  • databases stack uses name: ix-databases to maintain network name compatibility