Commit Graph
149 Commits
Author SHA1 Message Date
ginnoirandClaude Opus 4.8 63fd3fd1cc feat(llm): llama-swap multi-model menu (gpt-oss-20b default + gemma4 family)
Replace single llama-server with llama-swap so all benchmarked models are
selectable from Hermes' menu and hot-swapped on the one P100. Menu: gpt-oss-20b
(default, ~45s cold start), gemma-4-26b-a4b (MoE), gemma-4-12b, gemma-4-e4b.
qwen3-30b-a3b excluded (OOMs at 64k in 16GB). All 64k, q8/q8 KV, --parallel 1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 00:02:58 -05:00
ginnoirandClaude Opus 4.8 eba51a52a7 docs(llm): record final 64k config, perf, and Pascal/Hermes gotchas
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 17:14:26 -05:00
ginnoirandClaude Opus 4.8 4aa2cd9468 fix(llm): q8_0 V-cache (q4_0 tanked generation to 1.3 tok/s on Pascal)
The q4_0 V-cache + flash-attention path is pathological on the GP100: 1.28
tok/s generation at 5-8% GPU util. q8_0 V-cache gives 9.2 tok/s and still fits
64k context in 16GB (15.3GB used, ~950MB free).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 17:04:17 -05:00
ginnoirandClaude Opus 4.8 13424fcf75 fix(llm): override-kv context_length=65536 so slot isn't capped to 32k
llama-server caps the slot to the GGUF training context (32768) and ignores the
YaRN-extended size, leaving per-seq context at 32k. Raise qwen2.context_length
metadata to 65536 so the full window is served per request.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:45:33 -05:00
ginnoirandClaude Opus 4.8 74791105b3 fix(llm): --parallel 1 so a single request gets the full 64k context
With the default 4 slots, llama-server splits ctx into 32k per sequence, which
fails Hermes' 64K minimum. One slot serves the full 65536 per request (serial
agent use; concurrent calls queue).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:42:41 -05:00
ginnoirandClaude Opus 4.8 265b407e8d feat(llm): serve 64k context (YaRN) to meet Hermes' 64K minimum
Hermes Agent rejects models with <64K context. Qwen2.5-14B is 32k native, so
enable YaRN rope-scaling (2x → 65536) and drop the V-cache to q4_0 for VRAM
headroom on the 16GB P100.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:39:56 -05:00
ginnoirandClaude Opus 4.8 605c6d3709 fix(llm): use --flash-attn on (this llama.cpp build requires explicit value)
The server-cuda image parses -fa as --flash-attn [on|off|auto], so a bare -fa
swallowed the following --cache-type-k as its value and crash-looped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:31:01 -05:00
ginnoirandClaude Opus 4.8 8e7682985d feat(llm): add llama.cpp inference stack for Hermes (Qwen2.5-14B on P100)
New stacks/llm/ serves Qwen2.5-14B-Instruct (Q4_K_M GGUF) via llama.cpp's
OpenAI-compatible server on the Tesla P100 (CDI nvidia.com/gpu=0), published on
172.20.0.1:8090 for the host-side Hermes agent. vLLM was rejected: the P100
(cc 6.0) lacks the DP4A INT8 instructions its AWQ/GPTQ kernels need.

Includes design spec and implementation plan under docs/superpowers/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:22:57 -05:00
ginnoirandClaude Sonnet 4.6 847edff1f8 fix(proxy): SameSite=Lax on share_gate cookie to fix Safari/Firefox redirect
Deploy Caddyfile to valhalla / deploy (push) Successful in 2m19s
SameSite=Strict caused Safari and Firefox to drop the freshly-set cookie on
the immediate same-site redirect when the top-level navigation originated
from an external app (Discord). SameSite=Lax explicitly permits the cookie
on same-site redirects regardless of the initiating context.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:30:14 -05:00
ginnoirandClaude Sonnet 4.6 d654e6df90 fix(proxy): use parse-time {$SHARE_KEY} in share_gate instead of runtime placeholder
Deploy Caddyfile to valhalla / deploy (push) Successful in 44s
{env.SHARE_KEY} is not resolved by Caddy's query matcher or CEL expression at
request time — the literal placeholder string was compared against the URL key,
causing every external request to fall through to 403. {$SHARE_KEY} is
substituted by the Caddyfile adapter at reload/start, baking the literal key
value into the compiled config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 01:45:11 -05:00
ginnoir bf8caccd88 fix(media): raise nofile ulimit to 65536 for *arr containers
sonarr/radarr/prowlarr/whisparr/bazarr were hitting the default Docker
nofile limit of 1024, causing EMFILE errors and excessive virtiofsd FD
churn on the /storage1 virtiofs mount.
2026-06-24 01:28:08 -05:00
ginnoirandClaude Sonnet 4.6 f477465a1d feat(proxy): add share_gate for Discord-group external access
Deploy Caddyfile to valhalla / deploy (push) Failing after 4s
Capability-URL snippet: external users visit ?k=SHARE_KEY once, Caddy
sets a 30-day HttpOnly cookie and redirects to the clean path. Subsequent
visits check the cookie only. Internal IPs and tailnet pass through
unconditionally. Applied to roms.ginnoir.com and romhacks.ginnoir.com.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 01:02:06 -05:00
ginnoir 8510b1403e feat(proxy): expose Hermes WebUI internally
Deploy Caddyfile to valhalla / deploy (push) Failing after 12m15s
2026-06-21 15:11:50 -05:00
ginnoir b4a45a6735 fix: block public hermes browser UI
Deploy Caddyfile to valhalla / deploy (push) Successful in 51s
2026-06-21 14:46:22 -05:00
ginnoir d38048faf0 fix: preserve hermes dashboard host guard
Deploy Caddyfile to valhalla / deploy (push) Successful in 1m10s
2026-06-21 14:40:01 -05:00
ginnoir 12cb5279d0 feat: expose hermes dashboard backend
Deploy Caddyfile to valhalla / deploy (push) Failing after 3m28s
2026-06-21 14:36:39 -05:00
ginnoirandClaude Opus 4.8 466ffe9588 fix(remote): correct hbbs relay flag to lowercase -r
The previous commit used `hbbs -R 192.168.1.69` (uppercase -R sets
rendezvous/cluster servers), so hbbs advertised an empty relay list and
clients failed with "failed to connect to relay server". Lowercase -r is
the relay-server flag; hbbs now advertises 192.168.1.69 and LAN clients
relay correctly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 04:54:04 -05:00
ginnoir 73f25d20a1 fix(remote): add -R 192.168.1.69 to hbbs so relay address is reachable from LAN 2026-06-18 03:48:50 -05:00
ginnoirandClaude Opus 4.8 6cfa2a50c9 chore(roms): unpin RomM from 4.9.0-beta.2 to floating :4 stable
The save-sync (/api/sync/*) and raw content_hash fixes that forced the
beta pin shipped in stable 4.9.x (now 4.9.2). Return to the watchtower-
tracked :4 tag per the original design.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 02:41:11 -05:00
ginnoirandClaude Opus 4.8 c5d487effe chore: add migration helper scripts + cutover plan doc
R510 -> R730XD/Proxmox migration helpers (consistent DB dumps, B2/Kopia snapshot refresh, cutover final backup) plus the previously-untracked gitea-portainer-registry cutover plan under docs/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 23:27:55 -05:00
ginnoir 4ede8c483a feat: add check_uptime.js script for scheduled checks 2026-06-17 12:31:10 -05:00
ginnoir 8dd90854af fix: improve onlyoffice container runtime 2026-06-16 00:23:36 -05:00
ginnoirandClaude Sonnet 4.6 3283187741 feat(files): mount /storage1/ROMs into Nextcloud container
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 23:44:30 -05:00
ginnoirandClaude Sonnet 4.6 2cf48222b8 fix(claude): correct Authentik provider template scope PKs and grant_types
grant_types must be set explicitly ([] = all auth rejected). Scope PKs
were truncated placeholders — replaced with actual UUIDs from this
Authentik instance. Signing key was already correct.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 23:17:06 -05:00
ginnoirandClaude Sonnet 4.6 ba6724a1c3 docs: record Nextcloud migration; drop TB-021 paperless-ngx
TB-021 dropped — user wanted Google Docs replacement, not document OCR.
Migrated ownCloud → Nextcloud 34 + OnlyOffice (files.ginnoir.com).
Authentik OIDC configured via user_oidc app; office.ginnoir.com internal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 23:11:24 -05:00
ginnoirandClaude Sonnet 4.6 1c02bfe2fc docs(caddy): update nextcloud staging comment post-cutover
Deploy Caddyfile to valhalla / deploy (push) Successful in 47s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 23:09:37 -05:00
ginnoirandClaude Sonnet 4.6 ac6f233988 feat: cut files.ginnoir.com over to Nextcloud; fix scope PKs
Deploy Caddyfile to valhalla / deploy (push) Successful in 55s
Switch files.ginnoir.com from ownCloud to Nextcloud (internal-only).
Fix Authentik scope PKs in CLAUDE.md — the last UUID segments were
wrong and would have caused provider creation failures.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 23:07:18 -05:00
ginnoirandClaude Sonnet 4.6 a1c57ca899 feat: add Nextcloud + OnlyOffice files stack
Deploy Caddyfile to valhalla / deploy (push) Successful in 2m20s
Replaces ownCloud with Nextcloud (postgres + redis) and adds OnlyOffice
Document Server for Google Docs-style editing. Migration is staged:
nextcloud.ginnoir.com for testing, files.ginnoir.com still points at
ownCloud until cutover is verified.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:55:00 -05:00
ginnoirandClaude Sonnet 4.6 a937de7bda docs: document Authentik OIDC standard for new services
Pattern A (native OAuth2) is preferred — create provider + app in
Authentik, configure service with discovery URL. Pattern B (Caddy
forward_auth) is the fallback for services with no native auth.
Reusable Authentik flow/scope PKs pinned so they don't need re-deriving.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:44:59 -05:00
ginnoirandClaude Sonnet 4.6 acdf61500c chore(plans): mark TB-019 Immich done
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:21:36 -05:00
ginnoirandClaude Sonnet 4.6 dbe4a95059 feat(photos): add Immich stack
Deploy Caddyfile to valhalla / deploy (push) Successful in 46s
Self-hosted photo backup at photos.ginnoir.com (internal/tailnet only).
Server + machine-learning + postgres (vectorchord) + redis.
Upload storage: /storage1/labdata/immich/upload (ZFS).
DB/model-cache: /config/immich/ (SSD).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:15:28 -05:00
ginnoirandClaude Sonnet 4.6 11f51559b0 chore(plans): record new service decisions and drop list
New services: all in except TB-020 Mealie (deferred to famapp).
Active interest: TB-015 Vault, TB-027 Jellyfin, TB-028 HA, TB-031 Pingvin.
Dropped: TB-017 MinIO consolidation, TB-018 Plane, TB-029 Firefly III,
TB-030 AdGuard (handled at router), TB-032 Wiki.js (using BookStack).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:08:55 -05:00
ginnoirandClaude Sonnet 4.6 c6e8af7e62 chore(media): remove maintainerr
Deploy Caddyfile to valhalla / deploy (push) Successful in 48s
Too complex to configure for the use case; not worth the overhead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 22:03:12 -05:00
ginnoirandClaude Sonnet 4.6 29d04980fd feat(media): update maintainerr to v3 (new GHCR org)
Image moved from ghcr.io/jorenn92/maintainerr to ghcr.io/maintainerr/maintainerr
with the v3.x release series. v3 runs its own DB migrations on startup.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:35:26 -05:00
ginnoirandClaude Sonnet 4.6 fb3938c71b feat: migrate Overseerr → Seerr
Deploy Caddyfile to valhalla / deploy (push) Successful in 1m20s
Replace sctx/overseerr:latest with ghcr.io/seerr-team/seerr:latest.
Same port (5055), same config volume (/config/overseerr:/app/config) —
Seerr auto-migrates the DB on first boot. Add init: true as required.
Rename container overseerr → seerr; update Caddy upstream to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 21:00:09 -05:00
ginnoirandClaude Sonnet 4.6 1bc648f33b fix(maintainerr): correct data volume path and enable TLS bypass for Plex
- Mount /config/maintainerr to /opt/data (actual DB location, not /opt/maintainerr/data)
- Add NODE_TLS_REJECT_UNAUTHORIZED=0 so Node.js accepts Plex's self-signed cert
- Mark TB-007/008/009/012/013/016 tasks as done/dropped in improvement plan

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:52:06 -05:00
ginnoir 79b99cf883 docs: document plex as external systemd service on valhalla 2026-06-15 20:27:48 -05:00
ginnoir f923cd5b49 feat(media): add maintainerr for stale overseerr request cleanup
Deploy Caddyfile to valhalla / deploy (push) Successful in 1m11s
2026-06-15 20:25:51 -05:00
ginnoir 8ef2f689f6 chore(media): retire deluge, qbit is the sole torrent client
Deploy Caddyfile to valhalla / deploy (push) Successful in 1m7s
2026-06-15 20:19:16 -05:00
ginnoir 76679dd030 fix(code-server): scope mount to projects dir and ai extension configs 2026-06-15 20:15:38 -05:00
ginnoir ecf5c955f3 feat: add wa4.ginnoir.com chest checklist static site
Deploy Caddyfile to valhalla / deploy (push) Successful in 46s
2026-06-15 02:06:39 -05:00
ginnoirandClaude Sonnet 4.6 a44adc4814 docs: document gitea-first homelab deploys
Switch CLAUDE.md and AGENTS.md to Gitea-primary language. Remove
github-runner from the management plane now that Gitea Actions handles
Caddy reloads and famapp builds. Disable GitHub deploy workflow.
Update apply-compose.ps1 status text.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 00:38:15 -05:00
ginnoirandClaude Sonnet 4.6 e3937dcf52 fix(famapp): pull image from valhalla registry
Switch famapp container from ghcr.io/ginnoir/famapp:latest to
registry.ginnoir.com/ginnoir/famapp:latest.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 00:17:28 -05:00
ginnoirandClaude Sonnet 4.6 fb4de751ed fix: alias gitea.ginnoir.com on Caddy for Portainer go-git TLS
Portainer go-git resolves gitea.ginnoir.com inside Docker. Alias was on
the gitea container → port 443 refused. Moved alias to Caddy so go-git
reaches Caddy:443 (TLS ok) → proxies to gitea:3000.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 00:04:08 -05:00
ginnoir 1138e41e22 fix: add gitea.ginnoir.com edge alias so Portainer go-git resolves internally 2026-06-14 23:36:38 -05:00
ginnoir 67234b3948 fix(caddy-deploy): install docker.io in job container for docker exec
Deploy Caddyfile to valhalla / deploy (push) Successful in 49s
2026-06-14 23:14:34 -05:00
ginnoir 5558c03bac ci: add gitea caddy deploy workflow
Deploy Caddyfile to valhalla / deploy (push) Failing after 27s
2026-06-14 22:59:04 -05:00
ginnoir ef107dd743 fix: make portainer stacks use stack env only 2026-06-14 22:56:38 -05:00
ginnoir 2a76a8f1f8 refactor: move gitea and registry to management plane 2026-06-14 22:54:31 -05:00
ginnoir 3918f24970 chore: add registry auth credentials 2026-06-14 22:53:22 -05:00