Files
serverAppConfigs/serverAppConfigs-docs/Research/Service Research Brief.md
T
Frank 87721ab0fe rename frank-small → frank-secondary (Dankclaw llama.cpp :7771)
Cross-cutting rename of the current llama.cpp endpoint on the RTX 3090
(port 7771) from frank-small to frank-secondary:

- Service trio: scripts/{frank-small.env,frank-small.service,
  serve-frank-small.sh,download-frank-small.sh} → frank-secondary.*
- Test: tests/frank_small_unit.bats → tests/frank_secondary_unit.bats
- Runbooks: serverAppConfigs-docs/LLM/frank-small-*.md →
  frank-secondary-*.md (9 files); the FreeToken runbook stays
  freetoken-frank-small.md (it documents the retired CUDA-era service)
- Identifiers: FRANK_SMALL→FRANK_SECONDARY, llm_small→llm_secondary,
  LLM_SMALL_*→LLM_SECONDARY_*, deploy_llm_small→deploy_llm_secondary
- Historical references to the OLD frank-small (FreeToken/CUDA on the
  3090, and the Dankserver service that became frank-medium) are
  preserved verbatim — they describe what the service was called
  at the time.
2026-10-06 15:37:13 -07:00

54 lines
4.4 KiB
Markdown

---
type: reference
description: "Consolidated research from the `frank-secondary` research subagents (2026-08-14) plus the pi agent knowledge base."
tags:
- research
timestamp: 2026-09-03
---
# Service Research Brief
Consolidated research from the `frank-secondary` research subagents (2026-08-14) plus the pi agent knowledge base. This is the source material behind the per-service docs pages.
## Method
Four parallel researchers fetched primary sources: official Docker docs, GitHub READMEs, container source (ComfyUI `cli_args.py`, OpenWebUI `env.py`), the Gluetun wiki, and Grafana/Loki/Prometheus docs. The first parallel run failed with `503 Loading model` (llama.cpp on Dankserver reloading); the retry completed for three of four, and the infra brief completed solo.
## Key Findings
### Dankserver stack
- **RomM** — `ghcr.io/rommapp/romm:latest`; FastAPI+React; SQLite data; needs `ROMM_USERNAME`/`ROMM_PASSWORD`/`ROMM_SECRET_KEY` at first boot; volumes `/romm/library` + `/romm/resources`.
- **Copyparty** — `ghcr.io/9001/copyparty:latest`; single-file Python server; port 3923; per-folder `.cpy` auth; `--resumable` for large uploads.
- **Calibre-Web** — `lscr.io/linuxserver/calibre-web:latest` (matches the live container); `PUID=1000 PGID=1000 TZ=Etc/UTC`; `/config` + `/books`; external binary paths `unrar`/`kepubify`/`ebook-convert`; library path must be set in admin UI; DB path wrong ⇒ login succeeds but library empty.
- **Calibre** — host tool, not a container; Calibre-Web points at its library directory.
### Dankclaw stack
- **SearXNG** — `ghcr.io/searxng/searxng:latest`; `network_mode: service:gluetun` (KB Pattern 2); Valkey cache replaces Redis; `settings.yml` keys: `server.secret_key`, `base_url`, `limiter: true`, `valkey.url`, `outgoing.*`, `search.formats: [html, json]`; JSON API rate-limited (4/h untrusted) — trusted-group the agent IP.
- **Gluetun** — `qmcgaw/gluetun:latest`; `NET_ADMIN` + `/dev/net/tun`; port publishing moves to gluetun; `VPN_SERVICE_PROVIDER`, `VPN_TYPE`, `WIREGUARD_PRIVATE_KEY`; DNS: prefer `dot` upstreams, never `DNS_UPSTREAM_PLAIN_ADDRESSES` to a LAN address (leaks); verify with `podman exec gluetun curl -s ifconfig.me`.
- **ComfyUI** — CPU backend required: ROCm wheels have no gfx1151 (Strix Halo) kernels; `--cpu` flag confirmed in `cli_args.py` ("To use the CPU for everything (slow)"); do NOT use CUDA images; models/input/output persisted.
- **OpenWebUI** — `ghcr.io/open-webui/open-webui:main` (NOT `:cuda` on AMD); port 8080 in container; OpenAI-compatible endpoint to `host.containers.internal:7770/v1`; `/health`.
- **Hermes** — Nous Research self-improving agent; MIT; official image `docker.io/nousresearch/hermes-agent:latest` (verified pullable 2026-08-14); TUI + Telegram/Discord/etc.; points at local llama.cpp `:7770/v1`; data volume for skills/memory.
- **Gitea** — migrate live `/opt/gitea/podman-compose.yml` (postgres:16-alpine + gitea + caddy); **never change SECRET_KEY/INTERNAL_TOKEN after migration**; keep bind mounts `/opt/gitea/data/*`; DB password must move to `.env`.
### Infrastructure
- **Caddy** — `caddy:2-alpine`; directive is `basicauth` (renamed from `basic_auth` in v2.8+); hash with `caddy hash-password`; homepage via `root * /srv/http` + `file_server`; `admin off` recommended.
- **Grafana/Prometheus** — `grafana/grafana:latest` + `prom/prometheus:latest`; prometheus.yml scrapes node-exporters on both hosts (192.168.0.143/235:9100) + Gitea/Grafana/Loki metrics; Grafana datasource provisioning `apiVersion: 1` with `access: proxy`.
- **Node-Exporter** — `prom/node-exporter:latest`; `network_mode: host`, `pid: host`, read-only `/proc /sys /` mounts.
- **Logs** — **Promtail is EOL 2026-03-02** ⇒ use **Grafana Alloy** (`grafana/alloy:latest`, River config) as the shipper; Loki `grafana/loki:latest` single-binary mode, TSDB schema v13, filesystem storage, compactor retention 30d; health `/ready`.
## Open Items
- VPN provider choice for Gluetun (`.env` on Dankclaw).
- Calibre library path (user-entered later).
- Caddy bcrypt hashes at deploy (`caddy hash-password`).
- B2 bucket/app key for Backblaze backups (deferred).
- Public DNS for `*.franksdank.cloud` domains (pending).
## See Also
- Per-service pages: [[SearXNG]] [[Gluetun]] [[ComfyUI]] [[OpenWebUI]] [[Hermes]] [[Gitea]] [[RomM]] [[Copyparty]] [[Calibre-Web]] [[Caddy]] [[Grafana]] [[Prometheus]] [[Loki]] [[Alloy]] [[Node-Exporter]]
- [[Observability]] — the stack this research feeds