Files
serverAppConfigs/docs/Infrastructure/Homepage.md
T
Frank e3eb5334cb feat: initialize serverAppConfigs with podman stacks for Dankserver and Dankclaw
- Dankserver stack: RomM, Copyparty, Calibre-Web, node-exporter
- Dankclaw stack: Gluetun VPN (SearXNG tunnel), SearXNG+Valkey, ComfyUI
  (CPU backend), OpenWebUI, Hermes, Gitea+Postgres (migrated), Caddy
  reverse proxy, Grafana+Prometheus+Loki+Alloy observability
- Caddyfiles with .local hostname convention and basicauth homepage
- bind-mount storage policy, no named volumes
- deploy.sh mirroring vllmScripts git workflow (push -> pull -> restart -> health)
- docs/ Obsidian vault: per-service docs from frank-default-small research
  subagents (promtail EOL -> Alloy; gitea SECRET_KEY preservation; ComfyUI --cpu)
- bats test suite at 6 seams — 22 tests green
2026-08-13 20:19:41 -07:00

1.6 KiB

Homepage

A password-protected homepage on each host lists the services that are up, with a short description of each and a link to both the service and its documentation.

Served by: Caddy, file_server + basicauth — Docs: n/a (static page in this repo)

Purpose

  • One landing page per host instead of a bookmark folder.
  • Shows at a glance which services are currently up and active.
  • Answers "what is this?" for every service with a one-line description.
  • Links to the service and to this repo's docs page for that service.

Layout

shared/
└── homepage/
    ├── index.html      # the page, shared logic, per-host service list injected
    ├── style.css
    └── services.json   # service list: name, hostname, port, description, docs link

The page fetches services.json and pings each service's health endpoint (or the proxy hostname) to set an up/down badge. It is static; the status check runs in the browser via fetch.

Auth

Caddy wraps the homepage with HTTP basic auth:

dankclaw.local {
    basicauth {
        dank $2a$14$HASH
    }
    root * /srv/homepage
    file_server
}

Generate the hash with caddy hash-password at deploy time. Do not commit the hash or the password.

Service Entry Format

{
  "name": "SearXNG",
  "hostname": "http://search.dankclaw.local",
  "description": "Privacy-respecting metasearch engine.",
  "docs": "/docs/Dankclaw/SearXNG.md"
}

See Also