Commit Graph

132 Commits

Author SHA1 Message Date
admin 9abd392247 crafty-controller: changelog + report for healthcheck fix (route un-withheld; 502 backend-scheme tracked separately) 2026-06-26 09:56:52 +02:00
admin 68ce009f19 crafty-controller: python3 TLS healthcheck (image has no curl); controller-side probe http->tcp (8443 is TLS) 2026-06-26 09:45:17 +02:00
admin 6a71c5aa0a catalog: add open_path for apps whose UI isn't at / (gokapi=/admin, ghost=/ghost/)
New .felhom.yml field consumed by the controller's Megnyitás link. Audit of all 53 templates: only
gokapi (file-share index redirects away) and ghost (bare / is the public blog; admin at /ghost/) need it;
the rest serve/redirect usefully at root. onlyoffice is API-only (status page at /) — left at root.
2026-06-23 12:00:30 +02:00
admin 6e91a5cbe5 docs: gokapi RedirectUrl + default_creds follow-ups 2026-06-23 11:49:07 +02:00
admin 9db1259750 gokapi: point index RedirectUrl at the app's own /admin (not Gokapi's GitHub)
Gokapi's bare root '/' redirects to RedirectUrl. It was the upstream default (github.com/Forceu/Gokapi),
so the controller's 'Megnyitás' link (always the bare subdomain root) landed on Gokapi's GitHub instead
of the app. Point it at https://${SUBDOMAIN}.${DOMAIN}/admin so the root + the controller link reach
the Gokapi login/panel.
2026-06-23 11:47:14 +02:00
admin ed10e5bb06 gokapi: show admin username (default_creds) + fix first_steps for headless setup
App now auto-configures (no setup wizard), so first_steps described a flow that no longer happens.
Add default_creds 'Felhasználó: admin · jelszó a Beállítások oldalon' so the app-info page shows the
initial admin user like other apps; password stays on the Beállítások page (generated field).
2026-06-23 11:23:41 +02:00
admin 72d8c8b97c docs: gokapi headless-setup fix (CHANGELOG + REPORT) 2026-06-23 11:13:35 +02:00
admin 3ec67ef2f5 gokapi: reproducible headless setup via seed config + --deployment-password
Gokapi v1.9.6 has no env-var setup and otherwise exposes a public /setup (admin-takeover risk).
Entrypoint seeds config.json on first boot (admin, this app's URL, local storage, no-encryption so
it restarts without a prompt) with password/salts cleared, then runs the documented
--deployment-password one-shot to set the felhom-generated admin password before serving — claims
admin at first boot, never exposes /setup. Seed pinned to v1.9.6 (ConfigVersion 21).
2026-06-23 11:07:50 +02:00
admin 690c8dd0b8 Revert gokapi headless-env change: Gokapi (v1.9.6/v2.0.1) has no GOKAPI_USERNAME/PASSWORD env
Verified against Gokapi docs + the v1.9.6 binary: no env-var headless admin setup exists in any
version. Non-interactive setup requires a pre-seeded config.json + --deployment-password. Reverting
the non-functional env so the template isn't misleading; choosing a real fix path with the user.
2026-06-23 08:40:11 +02:00
admin 01936716d3 gokapi: headless first-run setup (GOKAPI_USERNAME=admin + generated GOKAPI_PASSWORD)
Gokapi sat in maintenance mode since deploy because /setup was never completed and the
template provided no headless-setup env. GOKAPI_USERNAME/PASSWORD configure it on first
start; password is felhom-generated (deploy field, shown to customer). Fixes share.* maintenance page.
2026-06-23 08:26:15 +02:00
admin d334dd7007 docs: REPORT covers both catalog HC fixes (komga + gitea)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:14:34 +02:00
admin 1a44c1403f docs: CHANGELOG entry for gitea HC fix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:18:10 +02:00
admin 17e00b788e gitea: fix healthcheck — probe /api/healthz (was 404 on /api/v1/version pre-install)
Surfaced during the unattended deploy sweep: a fresh gitea reported unhealthy because
the HC hit /api/v1/version (404 until install-lock); /api/healthz returns 200 while
serving. Fixed both the docker HC and the controller .felhom.yml probe; bumped
start_period to 90s for first-boot DB migration. Same class as the komga fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:17:52 +02:00
admin f51f794cf0 docs: REPORT for komga healthcheck fix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:12:19 +02:00
admin 9b066de331 komga: fix controller-side health probe path too (/actuator/health)
The .felhom.yml controller probe also pointed at the auth-gated /api/v1/actuator/health
(401) — that is what drives the dashboard 'Nem egészséges' state. Repoint to the
unauthenticated /actuator/health, matching the docker HC fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:04:52 +02:00
admin 3faa5ae193 komga: fix healthcheck — probe unauthenticated /actuator/health (was 401 on /api/v1/...)
The /api/v1 prefix is auth-gated → old HC got 401 → curl -f failed → container
reported unhealthy while serving fine. Diagnosed live on guest 9201.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:03:37 +02:00
admin 939864f2a6 catalog: repoint HDD_PATH defaults/placeholders to /mnt/felhom-drives/<name>
Intermediary-mount re-architecture: drives are visible in-guest at the stable
/mnt/felhom-drives/<name>. Composes already use ${HDD_PATH}/${USERDATA_PATH}
(injected + repointed by controller v0.67.0); this updates the UI placeholders,
templates.json defaults, and doc/script examples to the new convention.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 16:48:52 +02:00
admin f7458487fb docs: REPORT for paperless OCR lang-pack fix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 08:29:03 +02:00
admin 67037cc064 paperless: fix OCR lang-pack install (space-separated PAPERLESS_OCR_LANGUAGES)
The compose fed the +-joined PAPERLESS_OCR_LANGUAGE (e.g. hun+eng) into
PAPERLESS_OCR_LANGUAGES (the install list), so the image tried to apt-install a bogus
'tesseract-ocr-hun+eng' → hun pack missing → Django check crash-loop on the default
hun+eng. PAPERLESS_OCR_LANGUAGES must be space-separated; set a fixed superset
'eng hun deu' (verified each installs). Found live deploying paperless on guest 9201.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 08:23:21 +02:00
admin 3c13d3e8e9 docs: REPORT for userdata layout repoint
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:32:03 +02:00
admin c99070c105 komga + audiobookshelf: add no-new-privileges (root-fallback hardening)
Address security review: reverting to root removed the user:1000 boundary, so add
security_opt no-new-privileges:true to block SUID-based escalation. Full cap_drop
is intentionally NOT applied — the images' root-init needs CHOWN/SETUID/SETGID to
set up /config and /metadata (dropping them reproduces the crash we hit at user:1000).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:17:32 +02:00
admin 0d60a5cb2e komga + audiobookshelf: revert to root (user:1000 fallback)
Live try-then-fallback: pinning user 1000:1000 crash-loops both — their named
config/metadata volumes are Docker-created root-owned and the pinned process can't
write them (komga: SQLite /config open fails; audiobookshelf: EACCES mkdir
/metadata/logs; neither has a PUID-style root-init chown). Reverted to root; they
rely on the setgid 2775 userdata dirs (files land group 1000 → FileBrowser browses/reads).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:13:29 +02:00
admin 69611cec18 userdata layout: repoint customer-content mounts to ${USERDATA_PATH}
Move every shared-media + ingest mount off ${HDD_PATH}/media onto the new
${USERDATA_PATH}/... convention (controller injects USERDATA_PATH = <namespace>/userdata):
- jellyfin/emby/plex: media:/media:ro ; navidrome: media/music:ro
- audiobookshelf (user 1000:1000): media/{audiobooks,podcasts}
- komga (user 1000:1000): media/comics
- calibre-web (UMASK=002): library->media/books, ingest->import/calibre
- radarr/sonarr (UMASK=002): media/{movies,tv} + downloads (sibling, same FS)
- romm: ROM library -> userdata/roms (browsable); resources stay in appdata
- immich: + external library media/photos:/external/photos:ro (registration is a
  post-deploy admin step — flagged in compose + .felhom.yml)
- paperless: consume -> import/paperless (USERMAP 1000)
- nextcloud: unchanged (fully app-managed)
.felhom.yml first_steps updated for the new browsable drop-zones.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 21:46:23 +02:00
admin 5ec2b2cadc F5: fix uptime-kuma healthcheck (v2 uses compiled extra/healthcheck binary)
The override pointed at a v1-era node /app/extra/healthcheck.mjs that does not
exist in louislam/uptime-kuma:2, so the container was permanently unhealthy and
Traefik withheld the route → the app URL 404'd despite the app running. Point at
the correct binary (extra/healthcheck, WORKDIR /app) and use the image's timing
(180s start_period) to avoid transient unhealthy→404 on first boot.
2026-06-14 09:51:40 +02:00
admin 86d473c779 adventurelog: mark SECRET_KEY as data_key (fail-closed restore annotation)
SECRET_KEY ("Titkosítási kulcs") is a data-encrypting key — regenerating it on
restore would render stored data unreadable. data_key:true makes the controller
recover it from the guest's own app.yaml (live/PBS) and fail closed if it can't,
rather than ever regenerating. Pairs with controller v0.53.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 10:20:36 +02:00
admin 7e6223190b fix: drop doubled felhom-data segment from HDD app compose templates
Model A binds the guest mount /mnt/<drive> directly onto the host's
<drive>/felhom-data namespace, so the guest mount already IS felhom-data.
The templates' ${HDD_PATH}/felhom-data/appdata/<app> therefore double-nested
to <drive>/felhom-data/felhom-data/appdata/<app> on disk, diverging from the
provenance-aware backup helpers (NamespaceRoot(drive,true) -> single-nested).

Change all four HDD app templates (romm, nextcloud, immich, paperless-ngx)
to ${HDD_PATH}/appdata/<app>, matching AppDataDir(NamespaceRoot(HDD_PATH,true)).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 09:23:48 +02:00
admin e1c6e062d9 docs: update repo link for deploy-felhom-compose -> felhom-controller rename
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 13:39:55 +02:00
admin 004e4308be fix(nextcloud): add internal hostname to trusted_domains
Add 'nextcloud' to NEXTCLOUD_TRUSTED_DOMAINS so internal callbacks
from other containers (e.g. OnlyOffice Document Server) arriving with
Host: nextcloud are not rejected. Only affects initial install — for
existing deployments, the integration handler sets it via occ.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:22:28 +01:00
admin 6bd7ea4d73 Add X-Forwarded-Proto header middleware to OnlyOffice template
Fixes mixed content errors when OO is behind Traefik HTTPS reverse
proxy. Without this, OO Document Server generates http:// URLs for
editor resources, which browsers block on HTTPS pages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:04:31 +01:00
admin 8d0b991207 feat: add integrations metadata to onlyoffice template
Declares FileBrowser and Nextcloud as integration targets for the
new app-to-app integration framework in the controller.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 20:06:22 +01:00
admin 65acc925fc home-assistant: fix initial config - remove !include directives
The !include directives for automations/scripts/scenes reference files
that don't exist on fresh install, causing HA to enter recovery mode
which ignores trusted_proxies. Simplified to minimal config with just
default_config and http block - HA adds the rest during onboarding.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 19:12:44 +01:00
admin ba78eb060f home-assistant: add trusted_proxies entrypoint wrapper
HA rejects proxied requests (400 Bad Request) without trusted_proxies
in configuration.yaml. Uses entrypoint wrapper pattern (like romm) to
ensure the http config block exists before HA starts.

Handles both fresh deploys (creates full configuration.yaml) and
existing installs (appends http block if missing).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 19:10:26 +01:00
admin 56dc87af58 fix(home-assistant): healthcheck uses /manifest.json instead of authenticated /api/
The /api/ endpoint requires authentication, causing healthcheck to always
fail and spam HA logs with "invalid authentication" warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:34:22 +01:00
admin ac074b5176 fix(ghost): fix healthchecks for Ghost 6.x (301 redirects to external URL)
Ghost 6.x redirects all HTTP requests to the configured external URL.
- Docker healthcheck: use node http.get (accepts 301 as healthy)
- Controller probe: switch from api (expect 200) to http (any response)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:26:12 +01:00
admin 750f7b8ec9 fix(ghost): update image from non-existent 5.108.0-alpine to 6.19.2-alpine
Ghost 5.108.0 doesn't exist on Docker Hub. Latest stable is 6.19.2.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:21:00 +01:00
admin b111610f32 fix(bentopdf): remove empty volumes block that breaks docker compose validation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:13:19 +01:00
admin cb65587c3e updated adventurelog template 2026-02-25 15:01:53 +01:00
admin a04882e296 feat: add controller-side healthcheck configs to all 52 apps
Each app template now declares a healthcheck: section in .felhom.yml
with appropriate probe type (http, api, or tcp) and endpoint based on
the app's known health endpoints. The controller uses these to verify
services are actually responding, not just that containers are running.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 11:11:27 +01:00
admin 2febc99148 fix(vikunja): remove healthcheck — container has no shell/wget
The vikunja/vikunja:0.24.6 image is a scratch/distroless build with
only the Go binary. wget, curl, sh, and all other utilities are
missing, making in-container healthchecks impossible.

Removing the healthcheck lets the controller detect the container
as "running" directly from Docker state, which is the correct
behavior for shell-less images.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:48:53 +01:00
admin ab3f9e7b35 fix(vikunja): run as root to fix /db volume permissions
Vikunja 0.24.6 runs as uid=1000 but named Docker volumes are
created with root ownership, causing permission denied on /db.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:34:45 +01:00
admin b406bd39f7 updated recipe-importer tag to latest 2026-02-25 08:32:35 +01:00
admin c0e4564295 chore(recipe-importer): bump to v0.8.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:33:15 +01:00
admin 771263c90f updated racipe importer details 2026-02-24 20:09:46 +01:00
admin b3280c976d feat: add recipe-importer app template
Hungarian recipe scraper for Mealie & Tandoor. Supports mindmegette.hu,
streetkitchen.hu, nosalty.hu, sobors.hu, kiskegyed.hu, gastrohobbi.hu
with schema.org fallback for other sites.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 19:49:02 +01:00
admin 153a05e2d8 fix: change admin password fields from secret to password type
All user-facing admin passwords now use type: password instead of
type: secret, giving users a visible editable field with Generate
button (matching Paperless-ngx pattern).

Affected apps: Nextcloud, Grafana, Kimai, Code-server

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:27:37 +01:00
admin dbe92bad5c fix: use felhom-data/appdata/ path for HDD volume mounts
Compose templates were mounting app data at ${HDD_PATH}/appdata/ instead
of ${HDD_PATH}/felhom-data/appdata/ as designed in the v0.26.0+ path
structure. Affects: nextcloud, immich, paperless-ngx, romm.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:53:15 +01:00
admin 3a24723c07 fix(adventurelog): healthcheck + SECRET_KEY for v0.11.0
Backend: wget missing from image, use python urllib instead.
Frontend: localhost resolves to IPv6, use 127.0.0.1.
Backend: add SECRET_KEY env var (v0.11.0 reads it directly).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 12:08:14 +01:00
admin 5b23e89c6a fix(adventurelog): use v0.11.0 image tags (v0.12.0 doesn't exist)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:28:10 +01:00
admin 87d0e5e59d feat: use ${SUBDOMAIN} variable in all templates
All 51 docker-compose.yml: replaced hardcoded subdomain.${DOMAIN}
with ${SUBDOMAIN}.${DOMAIN} in Traefik labels, app env vars, and
comments.

All 51 .felhom.yml: added SUBDOMAIN deploy field (type: subdomain)
with default matching existing subdomain metadata value.

Works with felhom-controller v0.27.0 which validates and stores the
user-chosen subdomain in app.yaml. Existing deployed apps get
SUBDOMAIN auto-injected via InjectMissingFields() on next sync.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 15:06:44 +01:00
admin a969cbd557 updated bookstack template and readme 2026-02-20 11:03:30 +01:00