Files
serverAppConfigs/shared/homepage/services.json
T
Frank 4c7465d00d arr fleet: FrankBook-Pro is the sole deployment, all egress VPN-gated
FrankBook-Pro becomes the only *arr/qBittorrent deployment. Every fleet
container (qB + five arrs) now shares gluetun's netns, so all egress —
torrent, indexer APIs, metadata lookups — exits the WireGuard tunnel by
construction (AllowedIPs=0.0.0.0/0); the arrs' own ports publish on the
gluetun unit, none on the arr units themselves.

- dankserver/compose.yaml: remove the six arr services (the Aug 20 compose
  copy — never healthy, superseded; config dirs trashed on the host)
- dankclaw/Caddyfile + shared/homepage/services.json: arr vhosts and
  probes repoint 192.168.0.235 -> 192.168.0.112 (FrankBook-Pro)
- frankbook-pro units: five arrs join gluetun netns (Wants/After/Network);
  gluetun publishes 9696/8989/7878/8686/8787 alongside 8080/6881
- tests/frankbook_quadlet.bats: new VPN egress seam — every arr+qB unit
  must share gluetun's netns and publish no port; gluetun must publish the
  whole fleet's ports
- deploy-plan.py: gluetun changes carry the whole netns family (a gluetun
  recreation kills all six joiners); dankserver compose set loses the arrs
- AGENTS.md: deployment is complete only when unit tests AND the Playwright
  E2E suite both pass
2026-09-04 12:54:28 -07:00

334 lines
7.3 KiB
JSON

[
{
"name": "SearXNG",
"category": "user",
"description": "AI-free, VPN-routed search engine, fully hosted on Frank's server.",
"url": "http://search.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:8081",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "OpenWebUI",
"category": "user",
"description": "AI Chat/Search interface",
"url": "http://ai.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3005",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Gitea",
"category": "user",
"description": "Git code hosting and review platform.",
"url": "http://gitea.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3000",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Calibre-Web",
"category": "user",
"description": "E-book library.",
"url": "http://books.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:8083",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "RomM",
"category": "user",
"description": "ROM and emulator library.",
"url": "http://romm.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:8085",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Copyparty",
"category": "user",
"description": "Direct downloads from Frank's server.",
"url": "http://files.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:3923",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Plex",
"category": "user",
"description": "Closed source media server with apps for everything.",
"url": "http://plex.franksdank.cloud/web/index.html",
"docs": "",
"probe": "192.168.0.235:32400",
"method": "tcp",
"wip": false,
"showLink": true
},
{
"name": "Jellyfin",
"category": "user",
"description": "Open source media server.",
"url": "http://jelly.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:8096",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Seerr",
"category": "user",
"description": "Download Requests",
"url": "http://seerr.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:5055",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Sonarr",
"category": "user",
"description": "TV series library and automation.",
"url": "http://sonarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8989",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Hermes",
"category": "admin",
"description": "The agent gateway.",
"url": "",
"docs": "",
"probe": "127.0.0.1:8787",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "Grafana",
"category": "admin",
"description": "Dashboards.",
"url": "http://grafana.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3002",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Prometheus",
"category": "admin",
"description": "Metrics collection.",
"url": "http://prometheus.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:9090",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Loki",
"category": "admin",
"description": "Log storage.",
"url": "http://loki.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3100",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "node-exporter",
"category": "admin",
"description": "Host metrics.",
"url": "",
"docs": "",
"probe": "127.0.0.1:9100",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "alloy",
"category": "admin",
"description": "Log shipping.",
"url": "",
"docs": "",
"probe": "127.0.0.1:12345",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "Caddy",
"category": "admin",
"description": "The reverse proxy.",
"url": "",
"docs": "",
"probe": "127.0.0.1:80",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "dnsmasq",
"category": "admin",
"description": "LAN name resolution.",
"url": "",
"docs": "",
"probe": "127.0.0.1:53",
"method": "tcp",
"wip": false,
"showLink": false
},
{
"name": "Gluetun",
"category": "admin",
"description": "The outbound VPN tunnel.",
"url": "",
"docs": "",
"probe": "127.0.0.1:51820",
"method": "tcp",
"wip": true,
"showLink": false
},
{
"name": "frank-large",
"category": "admin",
"description": "The large LLM (27B) on Dankclaw.",
"url": "",
"docs": "",
"probe": "127.0.0.1:7770",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "frank-small",
"category": "admin",
"description": "The small LLM (35B MoE) on Dankserver.",
"url": "",
"docs": "",
"probe": "192.168.0.235:7770",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "mariadb",
"category": "admin",
"description": "The media-stack database.",
"url": "",
"docs": "",
"probe": "192.168.0.235:3306",
"method": "tcp",
"wip": false,
"showLink": false
},
{
"name": "valkey",
"category": "admin",
"description": "The SearXNG cache.",
"url": "",
"docs": "",
"probe": "127.0.0.1:6379",
"method": "tcp",
"wip": false,
"showLink": false
},
{
"name": "Prowlarr",
"category": "admin",
"description": "Indexer manager.",
"url": "http://prowlarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:9696",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Radarr",
"category": "admin",
"description": "Movie library and automation.",
"url": "http://radarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:7878",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Readarr",
"category": "admin",
"description": "Book library and automation.",
"url": "http://readarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8787",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Lidarr",
"category": "admin",
"description": "Music library and automation.",
"url": "http://lidarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8686",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "qBittorrent",
"category": "admin",
"description": "Torrent client.",
"url": "http://qbittorrent.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8080",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Postgres",
"category": "admin",
"description": "The Gitea database.",
"url": "",
"docs": "",
"probe": "127.0.0.1:5432",
"method": "tcp",
"wip": false,
"showLink": false
},
{
"name": "ComfyUI",
"category": "admin",
"description": "Node-based image generation.",
"url": "",
"docs": "",
"probe": "127.0.0.1:8188",
"method": "http",
"wip": false,
"showLink": false
}
]