Commit Graph
104 Commits
Author SHA1 Message Date
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
ginnoir 0b58c11f2b test: add portainer stack env guard 2026-06-14 22:52:13 -05:00
ginnoir 1289e0a615 fix: preserve gitea database password in dev stack 2026-06-12 01:22:42 -05:00
ginnoirandClaude Sonnet 4.6 17be6410ba chore: rotate GITHUB_STACKS_PAT
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:33:22 -05:00
ginnoirandClaude Sonnet 4.6 96e3ef9a4d chore(authentik): upgrade to 2026.5.2 (hop 2 of 2)
Final target version. Intermediate 2025.12.5 hop applied and validated
before this upgrade.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:07:38 -05:00
ginnoirandClaude Sonnet 4.6 113af2d8e2 chore(authentik): upgrade to 2025.12.5 (hop 1 of 2)
Intermediate step on the way to 2026.5.2 — Authentik requires passing
through the latest 2025 release before jumping to 2026.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 22:57:41 -05:00
ginnoir eff906f298 feat: add uptime checking script for scheduled reports 2026-06-11 20:14:07 -05:00
ginnoir e3bf11d18e Add Caddy bypasses so MCP can reach *arr and Uptime Kuma through Authentik.
Deploy to valhalla / deploy (push) Has been cancelled
TB-006 forward_auth blocks machine clients with HTML/302; route /api on *arr
sites and /api plus socket.io on uptime (LAN/tailnet only) before forward_auth.
Also add Cursor interview-first rule and small Authentik/FreshRSS debug helpers.
2026-06-11 17:37:21 -05:00
ginnoir 776478c035 feat(proxy): add idlegame internal site
Deploy to valhalla / deploy (push) Has been cancelled
2026-06-11 17:31:05 -05:00
ginnoir fdc2eddf03 fix(dev): use resolvable bookstack mariadb tag 2026-06-11 17:18:38 -05:00
ginnoir f91a993c58 feat(dev): add gitea actions runner 2026-06-11 17:13:39 -05:00
ginnoirandClaude Sonnet 4.6 993504106e feat(caddy): bypass Authentik forward_auth for Plane API key requests
Deploy to valhalla / deploy (push) Has been cancelled
Adds a named matcher @plane_api that matches /api/* requests carrying
X-API-Key, routing them directly to plane_api:8000 without hitting the
Authentik outpost. Browser/UI sessions still go through forward_auth.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 15:32:09 -05:00
ginnoir 792305e5fa Mark homelab quick wins complete in plan briefs and task menu.
Close TB-002–004 and TB-033 with done-when checkboxes and update PLAN-BRIEF priority to the next themes.
2026-06-11 03:00:45 -05:00
ginnoir 67be0d6aff Replace expired GITHUB_STACKS_PAT so Portainer git pulls match the working token in Obsidian. 2026-06-11 02:55:49 -05:00
ginnoir 9bad6f3d22 Point Servarr download clients at internal Docker hosts so API calls bypass Authentik forward_auth.
After batch 2 SSO, Sonarr/Radarr hitting nzbget.ginnoir.com got 302 from Caddy instead of NZBGet JSON-RPC.
2026-06-11 02:47:54 -05:00
ginnoir 51acb44322 Ship homelab quick wins: Recyclarr, infra pins, jd.ginnoir.com, and LAN lockdown.
Deploy to valhalla / deploy (push) Has been cancelled
Add Recyclarr to the media stack, pin database/object-store/Caddy/Vault images with Watchtower disabled, expose JDownloader at jd.ginnoir.com, and restrict minio/homarr/docs to internal_only. Mark TB-002–004 and TB-033 complete; bundle batch-3 OIDC env for FreshRSS, ownCloud, and Reactive Resume.
2026-06-11 02:28:06 -05:00
ginnoir 1ce63153ab Persist TB-006 batch 2 media SSO and batch 1 auth fixes to the repo.
Media sites get Caddy forward_auth; Authentik scripts cover all proxy providers. BookStack OIDC and Plane admin routing fixes included, plus ops scripts for external auth on valhalla.
2026-06-11 01:19:06 -05:00
ginnoir 63889fc150 Complete TB-006 batch 1 SSO so admin apps use Authentik without double login.
Deploy to valhalla / deploy (push) Has been cancelled
Native OAuth/OIDC for Homarr, BookStack, Gitea, and MinIO console; forward_auth with local auth disabled for code-server, uptime, and kopia; Caddy and Authentik scripts updated to match.
2026-06-10 23:52:14 -05:00
ginnoir 109cc0d5cb Fix Homarr appdata bind mount and deploy Authentik forward auth on admin sites.
Deploy to valhalla / deploy (push) Has been cancelled
Homarr-labs stores state under /appdata; the old compose mapped empty paths and lost the dashboard on redeploy. TB-006 batch 1 adds Caddy forward_auth for 12 admin UIs with API and webhook bypasses.
2026-06-10 23:14:32 -05:00
ginnoir 1253825541 Mark TB-005 Obsidian hardening complete.
Record deployed internal_only gate and update plan brief gaps.
2026-06-10 22:47:02 -05:00
ginnoir 80b0fc6904 Restrict Obsidian LiveSync to LAN and tailnet only.
Deploy to valhalla / deploy (push) Has been cancelled
Closes TB-005: obsidian.ginnoir.com was publicly reachable; sync clients use tailnet.
2026-06-10 22:19:50 -05:00
ginnoir d5a54b24cc Mark TB-001 backup stack complete.
Kopia+B2 deployed, cron scheduled, ntfy wired, restore tests passed.
2026-06-10 22:17:29 -05:00
ginnoir c053f285b8 Fix backup cron scripts for Kopia password and MariaDB dumps.
Pass KOPIA_REPOSITORY_PASSWORD into snapshot create; use MARIADB_ROOT_PASSWORD for romm and bookstack app user for bookstack root mismatch.
2026-06-10 22:01:26 -05:00
ginnoir 4bb9413391 Set explicit Kopia UI credentials for web login.
Use HTTP basic auth username kopia with KOPIA_REPOSITORY_PASSWORD; document in README.
2026-06-10 21:38:10 -05:00
ginnoir 9878f17673 Add internal-only Caddy proxy for Kopia backup UI.
backup.ginnoir.com reverse-proxies kopia:51515; regenerate bookmark pages.
2026-06-10 21:32:06 -05:00
ginnoir bb18e0e338 Mount backup scripts from /config/backup on host.
Portainer CE git stacks cannot bind-mount relative repo paths; sync auxiliary files to the host path documented in README.
2026-06-10 21:28:56 -05:00
ginnoir f660bc9c4b Fix backup stack env for Portainer git deploy.
Remove compose ${VAR} overrides that blanked stack.env values and map KOPIA_REPOSITORY_PASSWORD in init-kopia; use hostname-only B2 endpoint.
2026-06-10 21:26:02 -05:00
ginnoir 7c7f6dfebc Add Kopia backup stack with Backblaze B2 offsite target.
Protects /config, selective labdata, and nightly DB dumps; documents homelab improvement plan briefs.
2026-06-10 21:21:34 -05:00
ginnoir 225078afbe chore(roms): pin romm to 4.9.0-beta.2 for save-sync endpoints + content_hash fix 2026-06-09 18:36:14 -05:00
ginnoir 3cc86d866f fix(vault): raise memlock ulimit to unlimited
Newer hashicorp/vault:latest mlocks more memory than docker's default
64KB memlock ulimit allows; vault crash-looped for ~5900 restarts with
'Failed to lock memory: cannot allocate memory' despite cap_add IPC_LOCK.
Deployed via apply-compose.ps1 -Portainer (mgmt plane, not a git stack).
2026-06-09 18:06:38 -05:00
ginnoir 7aa95fa00a refactor: pure env_file stack.env convention across all stacks
Every service now reads stack.env via env_file with container-exact var
names — no ${VAR} parse-time interpolation, no Portainer UI env vars
(except stacks/dev, kept on UI-env interpolation as documented exception).

- media: drop PUID/PGID/TZ env lines (env_file covers); resolve ${ROOT}
- foundry: secrets via env_file; FOUNDRY_PATCH_URLS -> CONTAINER_PATCH_URLS
- monitoring: HOMARR_SECRET_ENCRYPTION_KEY -> SECRET_ENCRYPTION_KEY
- notify: FRESHRSS_USER composed in stack.env; TZ via env_file
- owncloud: container-exact OWNCLOUD_*/MYSQL_* keys; runtime $$ healthcheck
- resume/famapp: composites (DATABASE_URL etc.) written out in stack.env
- authentik: container-exact keys; image tag pinned in compose
- notes: couchdb creds via env_file
- remote: gains stack.env (no secrets; convention completeness)
- CLAUDE.md: env convention, valhalla-lab registration-only note, correct
  on-host Portainer working-copy path (/config/portainer/compose/<id>)

Validated with docker compose config on valhalla for all 15 stacks.
2026-06-09 16:03:47 -05:00
ginnoir bb2bc6a20e feat: serve romhack archive site
Deploy to valhalla / deploy (push) Has been cancelled
2026-06-08 21:17:22 -05:00
ginnoir 27aa1bf2fe fix(romhacks): only link library files that exist on disk
handoff.json lists files captured at routing time, but the
extraction-cruft cleanup later removes files extracted out of a kept
archive. The Caddy file_server can only serve real files (not archive
interiors), so existence-filter the art + guide rel-paths against
library/<slug>/ before embedding/linking them — dropping phantom
entries that would 404.
2026-06-08 05:02:34 -05:00
ginnoir 9210cd23f8 feat(romhacks): serve library over internal Caddy file_server; notes embed art + guide links
Deploy to valhalla / deploy (push) Has been cancelled
- proxy: read-only bind /storage1/labdata/romhacks/library -> /srv/romhacks
- Caddyfile: romhacks-files.ginnoir.com (internal_only) file_server + browse
- render_catalog_notes.py + handoff.py: embed box art and link guides/
  spreadsheets via https://romhacks-files.ginnoir.com/<slug>/<file>
  (handoff art/guides; guide filter drops buried game-data txt, caps at 30)
- regenerate bookmarks
2026-06-08 04:44:38 -05:00
ginnoir 8224a8fddb chore(romhacks): catalog publisher tooling (analyze + render Obsidian notes) 2026-06-08 04:25:58 -05:00
ginnoir ae57c7f661 chore(romhacks): add extraction-cruft cleanup script (keeps archives, audits for loss) 2026-06-08 03:38:37 -05:00
ginnoir 1360a8fa65 feat(romhacks): automated hand-off — route downloads to RomM + library, render notes
handoff.py classifies completed downloads (console rom vs RPG-Maker fangame vs
patch, via bsdtar archive peek incl. RAR5), copies console roms into
Emulation/roms/<platform> for RomM, moves the full folder (rom + guides) into
the library archive, and renders note.md + handoff.json per hack for the
Obsidian publish step. Wired into the cycle; single /data mount keeps moves as
fast renames. Validated on 4 real games.
2026-06-07 20:25:30 -05:00
ginnoir 328b5df776 feat(romhacks): arm downloads (DRY_RUN=false) + fix dry-run state burn
process_file now marks messages processed only after a real crawljob write, so
DRY_RUN no longer poisons the state and link-less posts get re-checked after the
host filter widens. State file reset alongside this so the arm cycle re-enqueues
all threads.
2026-06-07 19:55:00 -05:00
ginnoir 4fda9a3b3e feat(romhacks): widen host filter (pokeharbor, raw.githubusercontent, pokehostel) 2026-06-07 19:40:01 -05:00
ginnoir d9724f39e6 fix(romhacks): build on Alpine DCE base (apk + self-contained CLI)
The tyrrrz/discordchatexporter image is Alpine, not Debian, and ships DCE as a
self-contained executable (no dotnet on PATH). Use apk for python3 and invoke
/opt/app/DiscordChatExporter.Cli directly.
2026-06-07 18:57:42 -05:00
ginnoir ba207a0fcd feat(romhacks): add Discord rom-hack ingestion stack (DCE -> JDownloader -> RomM)
Inert by default: empty token keeps the orchestrator idle and DRY_RUN=true
suppresses downloads. Orchestrator exports per-generation forum threads via
DiscordChatExporter, extracts download links + art, stages metadata, and writes
JDownloader crawljobs. Armed here with an alt account token and all 11 romhack
forums, still in DRY_RUN pending first-cycle validation.
2026-06-07 18:53:23 -05:00
ginnoir 91d6724175 feat(deck): add SteamGridDB batch art scripts and skill
scripts/deck-sgdb-art.py  — runs on Deck; fetches hero, wide capsule,
and portrait/poster art from SGDB for all RomM-synced shortcuts.
scripts/deck-sgdb-art.ps1 — Windows wrapper; handles SSH ASKPASS
upload and execution.
.claude/skills/deck-sgdb/ — Claude skill documenting invocation,
file naming conventions, appid formula, and known gotchas.
2026-06-07 18:17:45 -05:00
ginnoir 49bda4234a fix(caddy): make roms.ginnoir.com internal-only
Deploy to valhalla / deploy (push) Has been cancelled
External access for a trusted friend now goes through the share stack's
Tailscale serve node (roms-share.<tailnet>.ts.net), so roms.ginnoir.com
no longer needs public exposure. Add import internal_only (LAN + tailnet).
2026-06-06 23:18:22 -05:00
ginnoir bf68f5a3da fix(share): absolute host bind for serve config
Portainer's git-stack checkout does not materialize sibling repo files
at the relative bind path, so ./serve-roms.json mounted as an empty
auto-created directory and tailscale serve failed ('is a directory').
Switch to an absolute /config/share/serve-roms.json bind (matching every
other stack's /config convention); the file is mirrored on the host.
2026-06-06 23:06:30 -05:00
ginnoir 2aa8122cd3 feat(share): Tailscale serve stack to share internal services with external tailnet users
Adds stacks/share/ — a dedicated stack of userspace Tailscale 'serve'
nodes that expose individual internal services to external tailnet
users (a friend on his own tailnet) over each node's 100.x identity.
No public exposure, no LAN access, immune to the friend's home-subnet
addressing. First node ts-roms serves RomM at roms-share.<tailnet>.ts.net
-> romm:8080. One reusable tag:share auth key + one ACL rule cover every
node; adding a service is a serve-<svc>.json + a copied service block.

roms stack reverted to a pointer comment.
2026-06-06 22:52:15 -05:00
ginnoir dc0a4eb58f revert(caddy): drop RomM empty-Bearer workaround
Deploy to valhalla / deploy (push) Has been cancelled
decky-romm-sync has completed its first-run token mint, so the
Authorization: Bearer (empty token) probe that crashed RomM 4.8.x no
longer occurs. Collapse roms.ginnoir.com back to a plain reverse_proxy.
2026-06-06 20:53:19 -05:00