Service Routing

Services are accessible via three DNS domains with different reachability.

DNS Domains

DomainProxyReachable From
*.eblu.meflyio-proxy (Fly.io → Tailscale tunnel)Public internet
*.ops.eblu.meCaddy on indrik8s pods, docker containers, tailnet clients
*.tail8d86e.ts.netTailscale MagicDNSTailnet clients only

Use *.ops.eblu.me for services that need pod-to-service communication. Use *.eblu.me for services exposed publicly via Fly.io.

Caddy Services (*.ops.eblu.me)

DNS points to indri’s Tailscale IP. TLS via Let’s Encrypt (ACME DNS-01 with Gandi).

Backends split two ways: services running natively on indri are proxied to localhost, while workloads on ringtail’s k3s are reached through their Tailscale Ingress endpoints (<service>.tail8d86e.ts.net) — traffic stays on the tailnet either way. The table below tracks ansible/roles/caddy/defaults/main.yml.

ServiceURLDescription
homepagehttps://go.ops.eblu.meService dashboard (k3s)
forgejohttps://forge.ops.eblu.meGit hosting (SSH: 2222)
zothttps://registry.ops.eblu.meContainer registry
jellyfinhttps://jellyfin.ops.eblu.meMedia server
grafanahttps://grafana.ops.eblu.meDashboards (k3s)
argocdhttps://argocd.ops.eblu.meGitOps CD (k3s)
prometheushttps://prometheus.ops.eblu.meMetrics (k3s)
lokihttps://loki.ops.eblu.meLogs (k3s)
minifluxhttps://feed.ops.eblu.meRSS reader (k3s)
devpihttps://pypi.ops.eblu.mePyPI caching proxy / private index
Hephhttps://heph.ops.eblu.meTask/context hub + PWA (indri)
kiwixhttps://kiwix.ops.eblu.meOffline Wikipedia (k3s)
transmissionhttps://torrent.ops.eblu.meBitTorrent (k3s)
teslamatehttps://tesla.ops.eblu.meTesla logger (k3s)
immichhttps://photos.ops.eblu.mePhoto/video management (k3s)
navidromehttps://dj.ops.eblu.meMusic streaming (k3s)
docshttps://docs.ops.eblu.meDocumentation site (Quartz, static)
cvhttps://cv.ops.eblu.meCV / resume (static)
NVR (Frigate)https://nvr.ops.eblu.meCamera viewer (k3s)
authentikhttps://authentik.ops.eblu.meIdentity provider (k3s)
ntfyhttps://ntfy.ops.eblu.mePush notifications (k3s)
horkoshttps://horkos.ops.eblu.meApproval broker for agent runs (k3s)
ollamahttps://ollama.ops.eblu.meLocal LLM runtime (k3s)
mealiehttps://meals.ops.eblu.meRecipe manager (k3s)
paperlesshttps://paperless.ops.eblu.meDocument management (k3s)
taloshttps://talos.ops.eblu.meAgent workflow service (pi + OpenRouter, k3s)
[[sifakaSifaka]]https://nas.ops.eblu.me

Raw TCP (L4) proxies — SSH and the two PostgreSQL instances — are listed under the port map below.

Public Services (*.eblu.me)

DNS CNAMEs point to blumeops-proxy.fly.dev. TLS via Fly.io-managed Let’s Encrypt. Traffic tunnels back to caddy on indri over a direct Tailscale WireGuard connection, then Caddy routes to the service. See flyio-proxy for details.

ServiceURLDescription
Landing pagehttps://eblu.me, https://www.eblu.me”Under construction” apex splash
docshttps://docs.eblu.meDocumentation site
cvhttps://cv.eblu.meCV / resume
forgejohttps://forge.eblu.mePublic static mirror of the exposed repos — read-only stagit HTML + dumb-HTTP git; every path it does not serve 302s to the private forge (flyio-proxy > Static forge mirror)
immichhttps://photos.eblu.meImmich shared albums — shared-link surface only; login/auth/admin/user API 403 at the edge
Showerhttps://shower.eblu.meArchived — serves a 410 Gone tombstone at the fly edge (the event this site was for has taken place)

The apex landing page is the one exception to the “tunnel back to Caddy on indri” model: it’s a single static splash served directly from nginx on the Fly proxy (files baked into the image), so it stays up even when indri or the tunnel is down. A CNAME is also illegal at the zone apex, so eblu.me uses A/AAAA records pointed at Fly’s ingress IPs instead of the CNAME the subdomains use; www.eblu.me is a normal CNAME like the rest.

Tailscale-Only Services

ServiceEndpointDescription
k3s APIssh ringtailThe k8s cluster lives on ringtail; there is no dedicated MagicDNS hostname for the API server. From the tailnet, use k3s kubectl over SSH or fetch the kubeconfig — see ringtail

The old k8s.tail8d86e.ts.net Minikube endpoint was retired 2026-06 with the cluster itself; every k8s workload (including ArgoCD) now runs on ringtail’s k3s. See retire-minikube for the migration record.

Port Map (Indri)

PortServiceProtocolBindingNotes
443CaddyHTTPS0.0.0.0Reverse proxy
2222Caddy L4TCP0.0.0.0SSH proxy to Forgejo
5433Caddy L4TCP0.0.0.0PostgreSQL proxy — immich-pg on ringtail
5434Caddy L4TCP0.0.0.0PostgreSQL proxy — blumeops-pg on ringtail (postgresql)
9100Caddy L4TCP0.0.0.0Sifaka node_exporter proxy
9633Caddy L4TCP0.0.0.0Sifaka smartctl_exporter proxy
2200Forgejo SSHTCPlocalhostBuilt-in SSH server
3001ForgejoHTTPlocalhostWeb UI
5050ZotHTTPlocalhostRegistry API
8096JellyfinHTTPlocalhostMedia server