Compare commits

..

24 Commits

Author SHA1 Message Date
root
acc5af8477 feat: add authentik forward-auth gate for media.hubris.network (API bypass for apps) 2026-07-04 19:45:14 +02:00
root
e01a39175f teddy.hubris.network: fix backend to https://192.168.8.243:8443 2026-06-29 22:11:21 +02:00
root
3824faf11c add teddy.hubris.network for TeddyCloud LXC 131 2026-06-29 21:52:04 +02:00
root
06d9452741 books.hubris.network: migrate backend to grimmory LXC 130 (192.168.8.213) 2026-06-29 01:20:11 +02:00
root
e0973bfeeb add house.hubris.network for Yuvomi 2026-06-26 17:24:33 +02:00
root
85e9a92059 remove matrix.hubris.network — moved to VPS traefik 2026-06-25 10:38:49 +02:00
dtoro
d2d9ef8da0 add trmnl.hubris.network -> 192.168.8.211:9851 (TRMNL plugins LXC 128) 2026-06-24 17:14:08 +02:00
root
6786f07c76 Add element.hubris.network (Element Web client) 2026-06-23 23:30:09 +02:00
root
0f472e9088 remove papers.hubris.network (zimaos paperless removed) 2026-06-21 23:29:17 +02:00
root
f9783571a1 revert paperless.hubris.network to LXC 103 2026-06-21 23:18:08 +02:00
root
b3e7385754 add papers.hubris.network for paperless on zimaos 2026-06-21 21:58:57 +02:00
root
8d14ef80fa point paperless to zimaos (192.168.8.195:8000) 2026-06-21 21:14:40 +02:00
root
d49a844941 feat: gate sab.hubris.network with Authentik forward-auth 2026-06-13 11:15:04 +02:00
root
32575ce73f fix: sab.hubris.network reverse proxy port 8081 -> 8082
SABnzbd is configured with SABNZBD__PORT=8082 in docker compose.
Previous value 8081 was a dead port; 8080 would route to qBittorrent.
2026-06-06 14:13:42 +02:00
1b977aabfa photos: clean up routing for Mulimage 2.0, add prism subdomain
Update the photos.hubris.network block to match the current stack
(PhotoPrism API + Go sidecar + SvelteKit). Add prism.hubris.network
as a dedicated PhotoPrism vhost for the Prismatic mobile client.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-06 12:38:41 +02:00
root
408a11c856 fix: add internal HTTP proxy for forward-auth (avoids TLS routing issues) 2026-06-04 23:43:48 +02:00
root
fec102895f fmt: clean up sso.hubris.network block formatting 2026-06-04 22:51:58 +02:00
root
2962a6e485 cleanup: point authentik forward-auth and sso to VPS 2026-06-04 22:47:28 +02:00
root
f520afad60 fix: proxy auth.hubris.network to VPS (82.165.190.79), strip port from Host header 2026-06-04 22:37:45 +02:00
c906a5acc7 authentik: add sso.hubris.network site for LAN forward-auth outpost callback
Domain-level proxy providers (Paperless, qBit) need an external_host that
routes to the LAN outpost (192.168.8.6), not auth.hubris.network (now the VPS
core). New site sso.hubris.network -> reverse_proxy 192.168.8.6:9000.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 00:41:55 +02:00
6ea8e727d4 authentik: point forward-auth snippet at LAN outpost (192.168.8.6)
Forward-auth now validates against the VPS Authentik core via a dedicated
LAN outpost (auth-outpost LXC 106), not LXC 124's frozen embedded outpost.
Resolves the post-migration split-brain. 192.168.8.180:9000 -> 192.168.8.6:9000.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 00:31:08 +02:00
db7f8fbf4e photos: revert /library/login proxy — OIDC starts at /api/v1/oidc/login
Earlier commits (e535f93 + a52cf68) proxied /library/login through to
PhotoPrism to fix what I thought was the OIDC initiation path. Wrong:
the SvelteKit SPA initiates OIDC by navigating to /api/v1/oidc/login
(already routed via @pp). The /library/login URL is what PhotoPrism's
UI uses POST-OIDC for the localStorage handoff back to the SPA — it
MUST bounce to / via the caddy redir, otherwise the SPA never picks
up the session and the user lands in PhotoPrism's own UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 01:08:10 +02:00
a52cf68d0f photos: wrap site block in route{} to force literal directive order
Without an explicit route{} block, caddy auto-hoists `redir` ahead of
`reverse_proxy`. That meant /library/* still redirected to / even
though I'd placed an @pp_login reverse_proxy above the redirs in the
file. Wrap the whole site in route{} so directives run in source order
and the more-specific /library/login matcher wins before the broader
/library/* redir.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 01:02:11 +02:00
e535f93dcc photos: stop caddy from eating /library/login (OIDC initiation)
The /library/* catch-all redir bounced /library/login (PhotoPrism's
OIDC login surface) back to / before the user could click "Sign in
with Authentik". Add a specific @pp_login matcher above the redir
so /library/login + /library/login/* reach PhotoPrism, while the
post-login /library/browse target still bounces back to the SvelteKit
SPA.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 01:01:21 +02:00

111
Caddyfile
View File

@@ -1,9 +1,20 @@
# Internal forward-auth upstream proxy (no TLS between Caddy handlers)
:8099 {
@outpost path /outpost.goauthentik.io/*
reverse_proxy @outpost https://auth.hubris.network:443 {
transport http {
tls_server_name auth.hubris.network
}
header_up Host auth.hubris.network
}
}
# Authentik forward-auth snippet (domain-level mode).
# Usage: add "import authentik" inside any site block to gate it.
(authentik) {
route {
reverse_proxy /outpost.goauthentik.io/* http://192.168.8.180:9000
forward_auth http://192.168.8.180:9000 {
reverse_proxy /outpost.goauthentik.io/* https://auth.hubris.network:443
forward_auth http://127.0.0.1:8099 {
uri /outpost.goauthentik.io/auth/caddy
copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version
trusted_proxies private_ranges
@@ -28,7 +39,16 @@ media.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.206:8096
# API and streaming paths — no Authentik (Jellyfin apps use their own auth)
@api path /api/* /socket /Audio/* /Videos/* /Items/* /Users/* /Sessions/* /System/* /LiveTv/* /Music/* /Artists/* /Albums/* /Playlists/* /Images/* /Subtitle* /videos/* /audio/*
handle @api {
reverse_proxy 192.168.8.206:8096
}
# Web UI — gated behind Authentik
handle {
import authentik
reverse_proxy 192.168.8.206:8096
}
}
git.hubris.network {
@@ -62,7 +82,7 @@ books.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.205:6060
reverse_proxy 192.168.8.213:6060
}
home.hubris.network {
@@ -79,12 +99,6 @@ cloud.hubris.network {
reverse_proxy 192.168.8.224:80
}
matrix.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.239:8008
}
proxmox.hubris.network {
tls {
@@ -133,7 +147,10 @@ sab.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.132:8081
handle {
import authentik
reverse_proxy 192.168.8.132:8082
}
}
blog.hubris.network {
@@ -144,30 +161,44 @@ blog.hubris.network {
}
photos.hubris.network {
# mule-image — PhotoPrism + Go sidecar + SvelteKit (post-Mulimage 2.0)
# Mulimage 2.0 — PhotoPrism + Go sidecar + SvelteKit (LXC 120)
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
encode zstd gzip
# PhotoPrism API + OIDC callback first (matched before static catch-all)
# PhotoPrism API + static assets + share links
@pp path /api/v1/* /api/v1 /static/* /share/*
reverse_proxy @pp 192.168.8.136:2342
# PhotoPrism redirects to /library/browse after OIDC. Bounce back to
# the SvelteKit SPA; mule-image is the only user-facing frontend.
redir /library / 302
# OIDC hand-off: PhotoPrism redirects to /library/login after SSO;
# bounce back to / so the SvelteKit SPA picks up the session.
redir /library / 302
redir /library/* / 302
# mule-sidecar (Go) — keeps the /api/sidecar/ prefix
# Go sidecar — marks, folder mutations, duplicates, heap convert
@sc path /api/sidecar/*
reverse_proxy @sc 192.168.8.136:8000
# Catch-all → nginx-on-120 serving the SvelteKit static bundle (no Vite in prod)
# SvelteKit frontend (catch-all)
reverse_proxy 192.168.8.136:3000
}
prism.hubris.network {
# PhotoPrism — direct access for Prismatic mobile client (LXC 120)
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
encode zstd gzip
reverse_proxy 192.168.8.136:2342
}
auth.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.180:9000
reverse_proxy https://auth.hubris.network:443 {
transport http {
tls_server_name auth.hubris.network
}
header_up Host auth.hubris.network
}
}
artifacto.hubris.network {
@@ -220,3 +251,45 @@ secrets.hubris.network {
}
reverse_proxy 192.168.8.205:9820
}
# Authentik LAN forward-auth outpost (external_host for domain-level providers)
sso.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy https://auth.hubris.network:443 {
transport http {
tls_server_name auth.hubris.network
}
header_up Host auth.hubris.network
}
}
element.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.239:8080
}
trmnl.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.211:9851
}
house.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.212:3000
}
teddy.hubris.network {
tls {
dns ionos {env.IONOS_AUTH_API_TOKEN}
}
reverse_proxy 192.168.8.243:8080
}