From 1028bc3a7409a67c5c084bfbac597905714eac29 Mon Sep 17 00:00:00 2001 From: ginnoir Date: Tue, 25 Aug 2026 22:24:39 -0500 Subject: [PATCH] Serve 5etools from storage1 via Caddy instead of a 14G image. The mirror is static files; keeping it in a container burned root disk. Caddy file_server bind-mounts /storage1/labdata/5etools like the other static sites. --- .agents/skills/homelab-ssh/SKILL.md | 2 +- .claude/skills/homelab-ssh/SKILL.md | 2 +- CLAUDE.md | 2 +- Caddyfile | 13 ++++++------- bookmarks-ports.html | 1 - scripts/portainer-stack-env-exemptions.json | 1 - stacks/foundry/docker-compose.yml | 11 ++--------- stacks/proxy/docker-compose.yml | 3 +++ 8 files changed, 14 insertions(+), 21 deletions(-) diff --git a/.agents/skills/homelab-ssh/SKILL.md b/.agents/skills/homelab-ssh/SKILL.md index 8a0f2a7..3c638df 100644 --- a/.agents/skills/homelab-ssh/SKILL.md +++ b/.agents/skills/homelab-ssh/SKILL.md @@ -23,7 +23,7 @@ The first `Bash` of a session is gated by a GateGuard hook — state the user re |---|---| | `proxy` | `caddy` | | `media` | `deluge`, `nzbget`, `sonarr`, `radarr`, `bazarr`, `prowlarr`, `overseerr`, `tautulli`, `qbittorrent`, `whisparr`, `stash` | -| `foundry` | `foundry`, `foundry2`, `5etools` | +| `foundry` | `foundry`, `foundry2` | | `owncloud` | `owncloud_server`, `owncloud_mariadb`, `owncloud_redis` | | `resume` | `resume`, `postgres_resume`, `minio_resume`, `chrome` | | `famapp` | `famapp`, `postgres_famapp`, `minio_famapp` | diff --git a/.claude/skills/homelab-ssh/SKILL.md b/.claude/skills/homelab-ssh/SKILL.md index 8a0f2a7..3c638df 100644 --- a/.claude/skills/homelab-ssh/SKILL.md +++ b/.claude/skills/homelab-ssh/SKILL.md @@ -23,7 +23,7 @@ The first `Bash` of a session is gated by a GateGuard hook — state the user re |---|---| | `proxy` | `caddy` | | `media` | `deluge`, `nzbget`, `sonarr`, `radarr`, `bazarr`, `prowlarr`, `overseerr`, `tautulli`, `qbittorrent`, `whisparr`, `stash` | -| `foundry` | `foundry`, `foundry2`, `5etools` | +| `foundry` | `foundry`, `foundry2` | | `owncloud` | `owncloud_server`, `owncloud_mariadb`, `owncloud_redis` | | `resume` | `resume`, `postgres_resume`, `minio_resume`, `chrome` | | `famapp` | `famapp`, `postgres_famapp`, `minio_famapp` | diff --git a/CLAUDE.md b/CLAUDE.md index 411955a..f3082c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,7 +17,7 @@ Deployment configuration for a **live, single-host Docker homelab** running on a ├── stacks/ # one directory per Portainer-managed application stack │ ├── proxy/ # caddy │ ├── media/ # *arr stack, deluge, qbittorrent, stash, ... -│ ├── foundry/ # foundry, foundry2, 5etools +│ ├── foundry/ # foundry, foundry2 (5etools is Caddy static files) │ ├── owncloud/ # owncloud + its mariadb + redis │ ├── resume/ # reactive-resume + its postgres + minio + chrome │ ├── famapp/ # famapp + its postgres + minio diff --git a/Caddyfile b/Caddyfile index 781e87e..d146a29 100644 --- a/Caddyfile +++ b/Caddyfile @@ -85,13 +85,6 @@ foundry2.ginnoir.com { reverse_proxy foundry2:30000 } -# ============================================================= -# TABLETOP TOOLS — public -# ============================================================= -5etools.ginnoir.com { - reverse_proxy 5etools:80 -} - # ============================================================= # FILE STORAGE — internal only (Nextcloud) # ============================================================= @@ -121,6 +114,12 @@ files.ginnoir.com { # ============================================================= # STATIC SITES — public # ============================================================= +5etools.ginnoir.com { + root * /srv/5etools + file_server + encode gzip zstd +} + wa4.ginnoir.com { root * /srv/wa4 file_server diff --git a/bookmarks-ports.html b/bookmarks-ports.html index 318ec1e..fc44798 100644 --- a/bookmarks-ports.html +++ b/bookmarks-ports.html @@ -34,7 +34,6 @@

foundry
foundry2 :30001 -
5etools :9009

Media

diff --git a/scripts/portainer-stack-env-exemptions.json b/scripts/portainer-stack-env-exemptions.json index b48a599..e4967e8 100644 --- a/scripts/portainer-stack-env-exemptions.json +++ b/scripts/portainer-stack-env-exemptions.json @@ -1,7 +1,6 @@ { "authentik": ["authentik-redis"], "dev": ["dbx", "redis_plane"], - "foundry": ["5etools"], "monitoring": ["uptime-kuma"], "owncloud": ["redis"] } diff --git a/stacks/foundry/docker-compose.yml b/stacks/foundry/docker-compose.yml index 8687605..b273a3e 100644 --- a/stacks/foundry/docker-compose.yml +++ b/stacks/foundry/docker-compose.yml @@ -1,6 +1,7 @@ -# foundry stack — Foundry VTT instances + 5etools mirror. +# foundry stack — Foundry VTT instances. # Tabletop services; bind-mounted to /storage1/foundry*. They don't talk to each # other, so they only need `edge` for Caddy to proxy them. +# 5etools is static files at /storage1/labdata/5etools, served by Caddy. services: foundry: @@ -51,14 +52,6 @@ services: ports: - "30001:30000" - 5etools: - container_name: 5etools - image: ghcr.io/5etools-mirror-3/5etools-src:latest - restart: unless-stopped - networks: [edge] - ports: - - "9009:80" - networks: edge: name: edge diff --git a/stacks/proxy/docker-compose.yml b/stacks/proxy/docker-compose.yml index 8dfbf52..672afd3 100644 --- a/stacks/proxy/docker-compose.yml +++ b/stacks/proxy/docker-compose.yml @@ -56,6 +56,9 @@ services: # ROM files are exposed only through romhacks-files.ginnoir.com/_roms/* # and that site imports internal_only in the Caddyfile. - /storage1/Emulation/roms:/srv/roms:ro + # 5etools mirror — static files on ZFS. Serving via Caddy file_server + # instead of ghcr.io/5etools-mirror-3/5etools-src (~14G image on root). + - /storage1/labdata/5etools:/srv/5etools:ro networks: edge: