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)
Showerhttps://shower.ops.eblu.meBaby shower guest registry (going to be archived soon); staff console here, guest surface public (see below)
taloshttps://talos.ops.eblu.meAgent workflow service (pi + OpenRouter, k3s)
Sifakahttps://nas.ops.eblu.meNAS dashboard

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.meGit hosting (public)
Showerhttps://shower.eblu.meBaby shower guest registry (going to be archived soon) — guest surface only; /host/ and /admin/ 403 with a pointer to shower.ops.eblu.me

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