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
This commit is contained in:
Frank
2026-08-13 20:19:41 -07:00
commit e3eb5334cb
57 changed files with 3033 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# Calibre-Web
Calibre-Web is a web app that browses, reads, and downloads eBooks from an existing Calibre library database. It is the web frontend for the Calibre e-book manager.
**Host:** Dankserver — **Hostname:** `books.dankserver.local` — **Docs:** https://github.com/linuxserver/docker-calibre-web
## Facts (from research, primary source)
| Item | Value |
|------|-------|
| Image | `lscr.io/linuxserver/calibre-web:latest` (already running on Dankserver) |
| Port | 8083 (host) → 8083 (container) |
| Env | `PUID=1000`, `PGID=1000`, `TZ=Etc/UTC` |
| Optional | `DOCKER_MODS=linuxserver/mods:universal-calibre` (ebook conversion, x86-64 only) |
| Volumes | `/config` (internal db + config), `/books` (existing Calibre library) |
| Extra tools | `unrar` (path `/usr/bin/unrar`), `kepubify` (path `/usr/bin/kepubify`) |
## Configuration
- Set the library path in the Calibre-Web admin page: Basic Configuration → Calibre Database → Location of Calibre database = `/books`.
- Set the external binary paths in Basic Configuration → External Binaries after first login.
- The default login is `admin` / `admin123` on first boot; change it immediately.
## Volumes
| Container path | Host path (convention) |
|----------------|------------------------|
| `/config` | `/opt/calibre-web/config` |
| `/books` | the existing Calibre library directory (user-entered later) |
## Healthcheck
The web UI responds on 8083. A `wget -q --spider` check on `/` suffices.
## Gotchas
- If the DB path is wrong, login appears to succeed but the library is empty.
- Ebook conversion needs the `universal-calibre` mod AND the external binary path set to `/usr/bin/ebook-convert` (or `/usr/bin/` on newer versions).
- Google OAuth needs `OAUTHLIB_RELAX_TOKEN_SCOPE=1`.
## See Also
- [[Dankserver Stack]]
- [[Calibre]] — the underlying library engine (host tool, not a container)
+27
View File
@@ -0,0 +1,27 @@
# Calibre
Calibre is the e-book library manager behind Calibre-Web. It manages metadata, formats, and conversions for the library that Calibre-Web serves.
**Host:** Dankserver (library directory on host) — **Docs:** https://calibre-ebook.com
## Role in this stack
Calibre itself is a desktop/GUI application, not a container service. This stack runs **Calibre-Web** in a container and points it at an existing Calibre library directory on the Dankserver host.
## Library Directory
The user will enter the existing Calibre library path during Calibre-Web setup. The convention in this repo:
| Purpose | Host path (convention) |
|---------|------------------------|
| Calibre library | `/opt/calibre-web/books` (bind-mounted to `/books` in the container) |
## What the container needs
- Read/write access to the library directory (Calibre-Web edits metadata through the app).
- Ownership matching `PUID=1000` / `PGID=1000` (the `dank` user on Dankserver).
## See Also
- [[Calibre-Web]] — the containerized frontend
- [[Dankserver Stack]]
+43
View File
@@ -0,0 +1,43 @@
# Copyparty
Copyparty is a lightweight file server that shares and streams files over HTTP. It handles large payloads, media streaming, uploads, and directory browsing from a single Python binary.
**Host:** Dankserver — **Hostname:** `files.dankserver.local` — **Docs:** https://github.com/9001/copyparty
## Facts (from research)
| Item | Value |
|------|-------|
| Image | `ghcr.io/9001/copyparty:latest` (official Dockerfile in repo) |
| Port | 3923 (host) → 3923 (container) |
| Volume | bind mount the shared root directory |
| Auth | per-directory `.cpy` config files, HTTP basic auth |
| Streaming | HTTP range requests, HLS, WebDAV |
## Configuration
- Run with `-e COPAY_PASS=...` or configure per-folder passwords.
- Set `-e COPAY_MODE=rw` for read-write shares where uploads are allowed.
- The container publishes port 3923; expose it to Caddy only, not the WAN.
- `--resumable` enables resumable uploads for large files (models, ISOs).
## Volumes
| Container path | Host path (convention) |
|----------------|------------------------|
| `/data` | `/opt/copyparty/data` |
## Healthcheck
A simple TCP check on 3923 works; Copyparty returns HTTP 200 on the web root.
## Gotchas
- Large transfers benefit from disabling TLS inside the app and letting Caddy terminate TLS.
- Do not give Copyparty the whole disk; give it a dedicated share directory.
- Upload tokens scoped per folder prevent accidental global write access.
## See Also
- [[Dankserver Stack]]
- [[Caddy]] — TLS termination and auth in front
+33
View File
@@ -0,0 +1,33 @@
# Dankserver Stack
Dankserver (192.168.0.235) runs the media and library stack. Every service is reachable by hostname through the Caddy reverse proxy on the host.
```mermaid
graph LR
U[User] --> C[Caddy :80/:443]
C --> R[RomM]
C --> P[Copyparty]
C --> W[Calibre-Web]
W --> L[Calibre library]
```
## Services
| Service | Hostname | Port | Docs |
|---------|----------|------|------|
| RomM | romm.dankserver.local | 8085 | [[RomM]] |
| Copyparty | files.dankserver.local | 3923 | [[Copyparty]] |
| Calibre-Web | books.dankserver.local | 8083 | [[Calibre-Web]] |
## Removed Services
The following services ran on Dankserver and are now retired from this stack:
- OpenWebUI — moved to Dankclaw (see [[OpenWebUI]])
- llama-swap — retired; no replacement
- SearXNG — moved to Dankclaw (see [[SearXNG]])
## See Also
- [[index]] — repository index
- [[Network Architecture]] — routing and proxy
+45
View File
@@ -0,0 +1,45 @@
# RomM
RomM (ROM Manager) is a self-hosted rom manager and player for retro game collections. It scans a ROM library, enriches it with metadata and cover art, and serves it through a clean web UI.
**Host:** Dankserver — **Hostname:** `romm.dankserver.local` — **Docs:** https://docs.romm.app
## Facts (from research)
| Item | Value |
|------|-------|
| Image | `ghcr.io/rommapp/romm:latest` |
| Port | 8085 (host) → 8080 (container) |
| Data volume | config, cache, covers, metadata DB |
| ROMs volume | bind mount to the game library |
| Frontend | React; backend FastAPI/Node |
| Metadata | Screenscraper, IGDB, MobyGames, RAHasher (optional) |
## Configuration
- Set `ROMM_USERNAME`, `ROMM_PASSWORD`, `ROMM_SECRET_KEY` on first boot (creates the admin user).
- `DISABLE_AUTH: true` disables authentication for LAN-only deployments (not recommended behind Caddy auth).
- Bind-mount the ROM library read-only unless RomM should also manage folder structure.
- Metadata providers need API keys; set them in the RomM admin UI after first login.
## Volumes
| Container path | Host path (convention) |
|----------------|------------------------|
| `/romm/library` | `/opt/romm/library` |
| `/romm/resources` | `/opt/romm/resources` |
## Healthcheck
Expose a `/health` endpoint; RomM serves the UI on `/`.
## Gotchas
- The first login sets the admin password; do not rely on the env credentials after that.
- Database is SQLite by default — back it up with the resources volume.
- RAHasher build increases image build time; skip unless RetroAchievements hashes are needed.
## See Also
- [[Dankserver Stack]]
- [[Calibre-Web]] — sibling library web UI