Compare commits

...

127 Commits

Author SHA1 Message Date
admin 4e86091f7d updates scripts 2026-06-07 12:59:09 +02:00
admin 754564167f updated probe-loop.sh 2026-06-07 12:50:41 +02:00
admin 40f5532570 added memoty to grafana 2026-06-07 12:01:19 +02:00
admin 0a2efb86ac fixed image 2026-06-07 11:52:28 +02:00
admin b40090dec1 fixed dns 2026-06-07 11:51:35 +02:00
admin 2370f005c6 added fallback_scrape_protocol 2026-06-07 11:32:54 +02:00
admin 05fa40ff5d prom targets for wan 2026-06-07 11:24:29 +02:00
admin ef77ab9285 updated wan rules 2026-06-07 11:20:30 +02:00
admin e0fd669f7c fix 2026-06-07 11:15:44 +02:00
admin 877cda7be1 updated configmap 2026-06-07 11:14:48 +02:00
admin 0887848d29 changed linebreak 2026-06-07 11:12:23 +02:00
admin 565c4c8bd0 fixed repo, added prometheus rules 2026-06-07 11:00:31 +02:00
admin 998cd150a1 added wan-monitor 2026-06-07 10:34:41 +02:00
admin 1a1cded065 outlint 1.8.1 2026-06-06 15:44:24 +02:00
admin a66cef8a9e Merge pull request 'feat: migrate seerr from fallenbagel/jellyseerr:preview-OIDC -> seerr-team/seerr:v3.3.0' (#88) from feat/seerr-migrate-to-seerr-team into main 2026-06-06 13:37:22 +00:00
admin d67ec2af65 seerr: migrate fallenbagel/jellyseerr:preview-OIDC -> ghcr.io/seerr-team/seerr:v3.3.0
Switching from the third-party OIDC-capable jellyseerr fork to the
mainline successor project (Seerr - the combined Overseerr+Jellyseerr
team rebrand, v3.0.0 / Feb 2026 onward). Mainline now has native OIDC
support so the custom preview-OIDC build isn't needed.

  - Image    : docker.io/fallenbagel/jellyseerr:preview-OIDC
              -> ghcr.io/seerr-team/seerr:v3.3.0 (Jun 2, 2026)
  - Migration: automatic on first start per docs.seerr.dev/migration-guide;
              existing sqlite db + settings.json in /app/config are
              directly compatible. v3.1.x added CVE-2026-40175 fix +
              auth-related security patches, so v3.3.0 is the right
              floor anyway.
  - Backup   : ~/seerr-backups/seerr-config-20260606-153633.tar.gz on
              dooplex (covers db.sqlite3 + settings.json + logs).
              Rollback = revert image + restore tarball into the PVC.

Worth verifying after rollout:
  - Pod becomes Ready (readiness probe path /api/v1/status -- should
    still exist in seerr).
  - Authentik OIDC sign-in still works. If the custom build used
    different config keys than mainline seerr expects, OIDC may need
    re-configuration in the seerr UI (Authentik side unchanged).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 15:37:21 +02:00
admin 6592bfe309 Merge pull request 'feat: sparkyfitness v0.16.6.3 -> v0.16.8 + handle versioning scheme change' (#87) from feat/sparkyfitness-v0.16.8 into main 2026-06-06 13:24:40 +00:00
admin 23b66875e4 sparkyfitness: bump to v0.16.8 + accept both 3- and 4-segment tags
codewithcj changed sparkyfitness versioning on 2026-06-01:
  - Old (through v0.16.6.3 / 2026-05-24): vMAJOR.MINOR.PATCH.BUILD
  - New (from v0.16.7 / 2026-06-01)      : vMAJOR.MINOR.PATCH

Our version-checker regex was `^v\d+\.\d+\.\d+\.\d+$` (4 segments
only), so the new v0.16.7 / v0.16.8 tags were invisible to it. The
"newest matching" became an arbitrarily-chosen old 4-segment tag
(v0.16.5.9 in the latest scan), which then showed up as an "upgrade
to an older version" -- nonsense, but predictable given the filter.

Two changes:
  1. Bump both `codewithcj/sparkyfitness` (frontend) and
     `codewithcj/sparkyfitness_server` (backend) from v0.16.6.3 to
     v0.16.8 (the actual upstream latest).
  2. Loosen the regex to `^v\d+\.\d+\.\d+(\.\d+)?$` so it matches
     both the legacy 4-segment form and the new 3-segment form.
     Once everything's on 3-segment we can tighten it again if we
     want, but the current form is harmless.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 15:24:39 +02:00
admin 80750369da Merge pull request 'fix: remove orphan } in renovate config (broke PR #85)' (#86) from fix/renovate-json-fix into main 2026-06-06 13:11:53 +00:00
admin f189a742cd renovate: remove orphan } left by previous cleanup PR (#85)
The previous PR deleted the umami packageRule but left a stray closing
brace after it, which broke the embedded config.json. ArgoCD applied
the manifest as a string (it's a ConfigMap; k8s doesn't validate the
JSON inside data), so the live ConfigMap also has the invalid JSON --
next Renovate run would fail to parse the config.

Removing the orphan brace restores valid JSON. Verified `json.loads`
parses to 3 customManagers + 7 packageRules.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 15:11:52 +02:00
admin c973d491ce Merge pull request 'cleanup: drop felhom-system stale copies + fix plex datasource + drop obsolete umami config' (#85) from cleanup/felhom-stale-plex-renovate into main 2026-06-06 13:05:00 +00:00
admin ee93b504fa cleanup: drop stale felhom-system copies + fix plex datasource + remove obsolete umami config
Three coordinated changes, all surfaced by the question "will Renovate
track the manually-bumped packages going forward":

1) Delete `felhom-system/` directory (4 files).
   These were never the source of truth -- the `felhom` ArgoCD app
   pulls from `felhom.eu`, path `manifests`. The copies in this repo
   fell out of sync over time and were misleading. Renovate was about
   to start opening DEAD PRs against them (the customManager below
   targeted `felhom-system/umami.yaml`). Removing the directory is the
   cleanest fix; manual bumps for the real felhom-system manifests go
   into the felhom.eu repo.

2) Fix plex inline `# renovate:` comment in helm/plex/values.yaml.
   It referenced `datasource=custom.plex` but no such customDatasource
   exists in the config -- Renovate would silently skip plex. Switched
   to the standard docker datasource with regex versioning that parses
   `1.X.Y.Z-<hash>` (4 segments + git short-hash suffix, same pattern
   approach as servarr and termix).

3) Remove the now-obsolete umami customManager + packageRule.
   The customManager was for the `postgresql-vX.Y.Z` tag form we've
   abandoned -- the real felhom.eu deployment is on `3.1.0` (plain
   semver). The packageRule disabled the kubernetes manager for the
   umami image to silence its failure on `postgresql-vX.Y.Z`; not
   needed since the default versioning handles `3.X.Y` fine. (Moot
   anyway since Renovate doesn't watch felhom.eu -- but cleanup
   reduces config noise.)

After this PR, Renovate's effective tracking:
  - servarr (sonarr/radarr/prowlarr)      -> YES (customManager)
  - plex                                   -> YES (inline comment, docker)
  - termix                                 -> YES (customManager)
  - umami / filebrowser in felhom.eu      -> NO (different repo, manual)
  - all standard semver/named tags in homelab-manifests -> YES (defaults)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 15:04:59 +02:00
admin 6caf521c1f Merge pull request 'feat: bump servarr (sonarr/radarr/prowlarr) + plex image tags' (#84) from feat/servarr-plex-bumps into main 2026-06-06 12:16:25 +00:00
admin 0f2ff3fa52 servarr + plex: bump image tags
- sonarr     version-4.0.16.2944 -> version-4.0.17.2952  (patch within 4.0.x)
  - radarr×2   version-6.0.4.10291 -> version-6.1.1.10360  (minor within 6.x)
  - prowlarr   version-2.3.0.5236  -> version-2.3.5.5327   (patch within 2.3.x)
  - plex       1.43.0.10467-...    -> 1.43.2.10687-...     (patch within 1.43.x)

All four were stuck because of tag-format issues that I addressed in
PR #82 (servarr customManager) / PR #83. Renovate isn't auto-creating
the PRs yet (DH rate-limit), so doing them manually so version-checker
clears.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 14:16:24 +02:00
admin 6f49a21b3d Merge pull request 'fix: re-pin moving tags (filebrowser/umami/recipes) so Renovate can track them' (#83) from fix/moving-tag-repins into main 2026-06-06 11:35:13 +00:00
admin d92d2c31a6 re-pin moving tags so Renovate can track them
Renovate can't propose updates for moving tags (the tag string never
changes; the registry just points it at a different image). These three
were pinned to moving variants:

  felhom-system/webpage.yaml : filebrowser/filebrowser:v2-alpine
  felhom-system/umami.yaml   : ghcr.io/umami-software/umami:postgresql-latest
  tandoor-system/tandoor.yaml: vabene1111/recipes:2.6

Pin each to the current actual version per Viktor's call:
  - filebrowser -> v2.63.13 (matches the other 4 filebrowser pinnings
    in the repo; dropped the `-alpine` variant so Renovate can group
    them via the existing default datasource path)
  - umami       -> postgresql-v1.38.0 (current upstream postgresql
    variant latest; tracked via new customManager below)
  - recipes     -> 2.6.9 (current actual semver of the 2.6 series)

For umami, the `postgresql-vX.Y.Z` tag pattern is rejected by Renovate's
default docker versioning pre-check (same failure class as termix +
linuxserver servarr). Added a customManager regex + packageRule disable
pair so Renovate can track future `postgresql-vX.Y.Z` updates via regex
versioning. filebrowser and recipes use standard semver `X.Y.Z` after
the re-pin and need no special handling.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 13:35:12 +02:00
admin 6ca0a7b051 Merge pull request 'fix: version tracking tuning — annotations + linuxserver customManager' (#82) from fix/version-tracking-tuning into main 2026-06-06 11:25:51 +00:00
admin 1d08156d81 version tracking: tune annotations + add customManagers for linuxserver servarr
Several images were showing as outdated in version-checker / unhandled by
Renovate. Each had a distinct cause; this PR fixes the auto-tractable ones.

1) admin-system/renovate.yaml: bump `app.kubernetes.io/version` labels
   `43.197.0 -> 43.209.3` (3 occurrences) to match the live image.
   Renovate's own self-update PR bumped the image tag but left the
   labels stale; the version-checker widget appears to read the label.
   Long-term, this label will drift again on each self-update -- worth
   a customManager later if it becomes a recurring annoyance.

2) admin-system/renovate.yaml: add a customManager + packageRule pair
   for linuxserver servarr apps. Tag pattern is `version-X.Y.Z.B`
   (4 segments + `version-` prefix) which the kubernetes manager's
   default docker versioning rejects at the pre-check, same failure
   class as termix. Regex versioning parses the prefixed 4-segment
   form; the same customManager handles prowlarr/radarr/sonarr (depName
   captured from the regex). kubernetes-manager extraction for these
   three depnames is disabled via packageRule so the dashboard isn't
   cluttered with the failing fallback.

3) nextcloud-system/nextcloud.yaml: add
   `match-regex.version-checker.io/nextcloud: '^\d+\.\d+\.\d+-apache$'`
   so version-checker doesn't treat the bare `33.0.5` server tag as a
   newer version of our `33.0.5-apache` image. The widget was showing
   `33.0.5-apache -> 33.0.5` -- false positive; image is already current.

4) helm/plex/values.yaml: tighten the version-checker regex from
   `^\d+\.\d+\.\d+\.\d+-.*$` to `^\d+\.\d+\.\d+\.\d+-[a-f0-9]+$` so
   per-arch tags (`-armhf`, `-arm64`, ...) are excluded. The widget
   was showing an `-armhf` tag as "newer" than our x86_64 install.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 13:25:49 +02:00
admin a8c657d554 Merge pull request 'pihole: bump image to 2026.05.0 (dnsmasq CVE security release)' (#81) from feat/pihole-2026.05.0 into main 2026-06-06 10:56:00 +00:00
admin 9e020af94d pihole: bump image to 2026.05.0 (dnsmasq CVE security release)
Pi-hole 2026.05.0 bundles FTL v6.6.2 which imports six upstream dnsmasq
security fixes, covering all publicly disclosed CVEs against the
dnsmasq 2.92/2.93 line. Per the upstream release notes the fixes are
"minimal, self-contained changes to the embedded dnsmasq sources. No
FTL-side configuration or API changes; users should see no observable
behavior change beyond the closed vulnerabilities."

Override the chart's default image.tag in helm/pihole/values.yaml (no
chart version bump). The pihole ArgoCD app is intentionally MANUAL
sync per Viktor's call -- after merge, sync the pihole app from the
ArgoCD UI to roll the pod over.

https://github.com/pi-hole/docker-pi-hole/releases/tag/2026.05.0

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 12:55:58 +02:00
admin ec9ae43bee Merge pull request 'termix: manual bump 1.11.2 -> 2.3.2 (Renovate blocked by DH rate-limit)' (#80) from feat/termix-v2.3.2 into main 2026-06-06 09:16:02 +00:00
admin e822b76982 termix: manual bump 1.11.2 -> 2.3.2 (Renovate blocked by DH rate-limit)
Renovate's `Pending Approval` checkbox for the termix v2 major was ticked
on Dashboard #6, but the manual Renovate runs that should have processed
it both aborted on Docker Hub's authenticated rate-limit:

  HTTP 429: You have reached your pull rate limit as 'kisfenyo'

The free DH plan caps authenticated pulls at 100/6h; with ~270 deps in
this repo and the multiple runs we've done today, we've exhausted it.
Renovate's behavior on a host 429 is to abort the entire repository run
(`result: external-host-error`), so no further work — including ticked
dashboard approvals — gets done until the quota window resets.

Rather than wait ~3-4 hours, this PR does the bump by hand. Upstream
ghcr.io/lukegus/termix:release-2.3.2 is verified present (Termix-SSH
GitHub Release of 2026-06-04). Termix is stateless (host/cred config
stored in PocketBase but compatible across release-1 and release-2),
so the rollout should be a straightforward image swap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 11:16:00 +02:00
admin 876b044d0a Merge pull request 'fix: roll back immich-postgres v17 -> v16 (PG major incompat) + gate postgres-family' (#79) from fix/immich-postgres-rollback into main 2026-06-06 09:00:33 +00:00
admin e459b0d262 immich/renovate: roll back immich-postgres v17 -> v16 (PG major datadir incompat) + gate postgres-family images
Renovate PR #76 (merged 2026-06-06 10:48) bumped ghcr.io/immich-app/postgres
from `16-vectorchord0.3.0` to `17-vectorchord0.3.0`. PostgreSQL major
upgrades require pg_upgrade or pg_dump/restore — the new server binary
refuses to open a data directory initialized by the previous major:

  FATAL: database files are incompatible with server
  DETAIL: The data directory was initialized by PostgreSQL version 16,
          which is not compatible with this version 17.6

Both immich-postgres and immich-server (depends on Postgres) went into
CrashLoopBackOff. PVC still holds the v16 datadir.

This PR:
  1. Reverts ghcr.io/immich-app/postgres back to `16-vectorchord0.3.0`
     so immich recovers immediately.
  2. Adds a packageRule with `dependencyDashboardApproval: true` covering
     `postgres`, `postgis/postgis`, and `ghcr.io/immich-app/postgres`.
     Any update to these images is now held on the Dashboard's "Pending
     Approval" section -- Renovate won't even open a PR until the user
     explicitly ticks the box. Forces the migration plan to be made
     BEFORE the change reaches main.

This is the same recovery pattern we just used for meilisearch (PR #77)
-- a class of stateful images where the on-disk format isn't
forward-compatible across version bumps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 11:00:32 +02:00
admin 99bbc31325 Merge pull request 'Update docker.io/library/nextcloud Docker tag to v33.0.5' (#78) from renovate/docker.io-library-nextcloud-33.x into main 2026-06-06 09:00:24 +00:00
Renovate Bot fee5fafeb0 Update docker.io/library/nextcloud Docker tag to v33.0.5
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 09:00:21 +00:00
admin 25c1baf1c3 Merge pull request 'Update grafana/grafana Docker tag to v13' (#58) from renovate/grafana-grafana-13.x into main
Reviewed-on: #58
2026-06-06 08:56:24 +00:00
admin 184c469c51 Merge pull request 'Update redis Docker tag to v8' (#64) from renovate/redis-8.x into main
Reviewed-on: #64
2026-06-06 08:56:16 +00:00
admin 6291423776 Merge pull request 'Update ghcr.io/cloudnative-pg/cloudnative-pg Docker tag to v1.29.1' (#70) from renovate/ghcr.io-cloudnative-pg-cloudnative-pg-1.x into main
Reviewed-on: #70
2026-06-06 08:56:08 +00:00
admin d063513869 Merge pull request 'Update ghcr.io/immich-app/immich-server Docker tag to v2.7.5' (#74) from renovate/ghcr.io-immich-app-immich-server-2.x into main
Reviewed-on: #74
2026-06-06 08:48:14 +00:00
admin 0cd8a3272d Merge pull request 'Update ghcr.io/immich-app/postgres Docker tag to v17' (#76) from renovate/ghcr.io-immich-app-postgres-17.x into main
Reviewed-on: #76
2026-06-06 08:48:07 +00:00
admin 9de82b7295 Merge pull request 'fix: roll back wanderer meilisearch v1.45.2 -> v1.11.3 (index incompat) + dashboardApproval' (#77) from fix/meilisearch-rollback into main 2026-06-06 08:45:24 +00:00
admin 1338bbb6ae wanderer/renovate: roll back meilisearch v1.45.2 -> v1.11.3 + gate future bumps
Renovate PR #32 (merged 2026-06-06 09:30) bumped getmeili/meilisearch
from v1.11.3 to v1.45.2 under the default-allow + 3-day stability rule.
Meilisearch's on-disk index format is NOT forward-compatible across
that range; wanderer-meilisearch went into CrashLoopBackOff with:

  Error: Your database version (1.11.3) is incompatible with your
  current engine version (1.45.2).

The PVC still holds the v1.11.x index, so the safest immediate recovery
is reverting the image tag. Wanderer's search starts working again the
moment the pod comes up on v1.11.3.

To prevent recurrence, add a packageRule that holds ALL meilisearch
updates behind the dashboard's "Pending Approval" checkbox via
`dependencyDashboardApproval: true`. PRs won't be opened until the
user explicitly approves them on the dashboard, so the version bump
can be planned around the documented dump/restore migration path
(https://www.meilisearch.com/docs/learn/update_and_migration/updating).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 10:45:23 +02:00
admin 789c75d253 Merge pull request 'Update codercom/code-server Docker tag to v4.123.0' (#52) from renovate/codercom-code-server-4.x into main
Reviewed-on: #52
2026-06-06 08:36:58 +00:00
admin 3c37d283da Merge pull request 'Update registry.k8s.io/external-dns/external-dns Docker tag to v0.21.0' (#75) from renovate/registry.k8s.io-external-dns-external-dns-0.x into main 2026-06-06 08:33:51 +00:00
Renovate Bot 231d8fd492 Update ghcr.io/immich-app/postgres Docker tag to v17
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:50 +00:00
Renovate Bot 6d46261dff Update registry.k8s.io/external-dns/external-dns Docker tag to v0.21.0
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:44 +00:00
admin 82c397af2c Merge pull request 'Update ghcr.io/immich-app/immich-machine-learning Docker tag to v2.7.5' (#73) from renovate/ghcr.io-immich-app-immich-machine-learning-2.x into main 2026-06-06 08:33:42 +00:00
Renovate Bot c0acfc338c Update ghcr.io/immich-app/immich-server Docker tag to v2.7.5
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:40 +00:00
admin 7956ca930b Merge pull request 'Update ghcr.io/headlamp-k8s/headlamp Docker tag to v0.42.0' (#72) from renovate/ghcr.io-headlamp-k8s-headlamp-0.x into main 2026-06-06 08:33:26 +00:00
Renovate Bot c5887cb6d6 Update ghcr.io/immich-app/immich-machine-learning Docker tag to v2.7.5
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:26 +00:00
admin 2d5aca0df3 Merge pull request 'Update ghcr.io/gethomepage/homepage Docker tag to v1.13.1' (#71) from renovate/ghcr.io-gethomepage-homepage-1.x into main 2026-06-06 08:33:23 +00:00
Renovate Bot 56f2622225 Update ghcr.io/headlamp-k8s/headlamp Docker tag to v0.42.0
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:22 +00:00
Renovate Bot a3525c7ab6 Update ghcr.io/gethomepage/homepage Docker tag to v1.13.1
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:16 +00:00
Renovate Bot e0550cbe54 Update ghcr.io/cloudnative-pg/cloudnative-pg Docker tag to v1.29.1
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:11 +00:00
admin f3d0b7e404 Merge pull request 'Update ghcr.io/stakater/reloader Docker tag to v1.4.17' (#69) from renovate/ghcr.io-stakater-reloader-1.x into main 2026-06-06 08:33:11 +00:00
admin 8bc11a6db7 Merge pull request 'Update ghcr.io/paperless-ngx/paperless-ngx Docker tag to v2.20.15' (#68) from renovate/ghcr.io-paperless-ngx-paperless-ngx-2.x into main 2026-06-06 08:33:04 +00:00
Renovate Bot 22d5c38bac Update ghcr.io/stakater/reloader Docker tag to v1.4.17
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:33:03 +00:00
admin 8f29f9e645 Merge pull request 'Update dependency ghcr.io/lukegus/termix to release-1.11.2' (#67) from renovate/ghcr.io-lukegus-termix-1.x into main 2026-06-06 08:32:55 +00:00
Renovate Bot a2d69962ed Update ghcr.io/paperless-ngx/paperless-ngx Docker tag to v2.20.15
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 08:32:55 +00:00
Renovate Bot a993456653 Update dependency ghcr.io/lukegus/termix to release-1.11.2
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 08:32:50 +00:00
admin 3bfd8afb43 Merge pull request 'renovate: termix — strip -tag suffix from github-releases candidates' (#66) from feat/renovate-termix-tag-suffix into main 2026-06-06 08:27:15 +00:00
admin e12cc36266 renovate: termix — strip -tag suffix from GitHub release tag_names
Verified with the GitHub Releases API for Termix-SSH/Termix that the
actual `tag_name` field is `release-X.Y.Z-tag` (with a `-tag` suffix),
even though the release `name` is `release-X.Y.Z`. Renovate's
github-releases datasource keys off `tag_name`, so the regex versioning
correctly rejects all candidates as invalid:

  INFO: Found no results from datasource that look like a version
        (dependency=Termix-SSH/Termix)

The docker image at ghcr.io/lukegus/termix uses the short form
(`release-X.Y.Z`, no suffix), which is what the manifest also has.

Fix: add `extractVersionTemplate: ^(?<version>release-\d+\.\d+\.\d+)`
which Renovate applies to each candidate from the datasource BEFORE
the versioning regex sees it. tag_names `release-2.3.2-tag` become
`release-2.3.2`, the regex versioning parses them, comparison works,
and Renovate writes the short form back to the manifest -- which is
the correct tag at the ghcr.io registry.

(extractVersion is NOT applied to currentValue, but currentValue already
is in the short form, so no normalization needed there.)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 10:27:13 +02:00
admin 4539f00e61 Merge pull request 'Update python Docker tag to v3.14' (#47) from renovate/python-3.x into main
Reviewed-on: #47
2026-06-06 08:26:36 +00:00
admin 0fdb79519d Merge pull request 'Update mysql Docker tag to v8.4' (#42) from renovate/mysql-8.x into main
Reviewed-on: #42
2026-06-06 08:26:14 +00:00
admin 6be3d58aad Merge pull request 'Update linuxserver/bookstack Docker tag to v26' (#59) from renovate/linuxserver-bookstack-26.x into main
Reviewed-on: #59
2026-06-06 08:20:07 +00:00
admin f05c1b39cc Merge pull request 'Update docker.io/library/nextcloud Docker tag to v33' (#57) from renovate/docker.io-library-nextcloud-33.x into main
Reviewed-on: #57
2026-06-06 08:19:46 +00:00
admin 98ec1bf3b2 Merge pull request 'Update gtstef/filebrowser Docker tag to v1.3.3' (#35) from renovate/gtstef-filebrowser-1.x into main
Reviewed-on: #35
2026-06-06 08:19:22 +00:00
admin f6736de333 Merge pull request 'Update gitea/gitea Docker tag to v1.26.2' (#33) from renovate/gitea-gitea-1.x into main
Reviewed-on: #33
2026-06-06 08:19:16 +00:00
admin 04081723e7 Merge pull request 'renovate: termix customManager regex versioning (loose+extractVersion still failing)' (#65) from feat/renovate-termix-regex-versioning into main 2026-06-06 08:03:55 +00:00
Renovate Bot 56d39399d6 Update redis Docker tag to v8
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:53:16 +00:00
Renovate Bot 7ca41bb929 Update linuxserver/bookstack Docker tag to v26
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:52:52 +00:00
Renovate Bot a2e68c1745 Update grafana/grafana Docker tag to v13
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:52:33 +00:00
admin cf26da036e Merge pull request 'Update vaultwarden/server Docker tag to v1.36.0' (#56) from renovate/vaultwarden-server-1.x into main 2026-06-06 07:52:31 +00:00
Renovate Bot 283688cf2a Update docker.io/library/nextcloud Docker tag to v33
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:52:29 +00:00
admin 47ca9140d5 Merge pull request 'Update vabene1111/recipes Docker tag to v2.6' (#55) from renovate/vabene1111-recipes-2.x into main 2026-06-06 07:52:23 +00:00
Renovate Bot fc6f6c5bda Update vaultwarden/server Docker tag to v1.36.0
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:52:23 +00:00
admin ce28c03c5d Merge pull request 'Update tailscale/tailscale Docker tag to v1.98.4' (#54) from renovate/tailscale-tailscale-1.x into main 2026-06-06 07:52:18 +00:00
Renovate Bot 35710fe5ea Update vabene1111/recipes Docker tag to v2.6
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:52:16 +00:00
admin 3c31024828 Merge pull request 'Update renovate/renovate Docker tag to v43.209.3' (#53) from renovate/renovate-renovate-43.x into main 2026-06-06 07:52:09 +00:00
Renovate Bot 9ce2cc2c25 Update tailscale/tailscale Docker tag to v1.98.4
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:52:08 +00:00
Renovate Bot 013824af38 Update renovate/renovate Docker tag to v43.209.3
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:48:37 +00:00
Renovate Bot 33629d2f2d Update python Docker tag to v3.14
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:48:35 +00:00
Renovate Bot c6533a92f1 Update mysql Docker tag to v8.4
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:48:32 +00:00
Renovate Bot ec6262ce6c Update gtstef/filebrowser Docker tag to v1.3.3
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:48:29 +00:00
Renovate Bot 9db5517659 Update gitea/gitea Docker tag to v1.26.2
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:48:19 +00:00
admin 82bb8bab45 Merge pull request 'Update index.docker.io/rclone/rclone Docker tag to v1.74.3' (#51) from renovate/index.docker.io-rclone-rclone-1.x into main 2026-06-06 07:48:16 +00:00
Renovate Bot c7ec82eae0 Update codercom/code-server Docker tag to v4.123.0
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 07:48:15 +00:00
admin 5836c8e9b4 Merge pull request 'Update filebrowser/filebrowser Docker tag to v2.63.13' (#50) from renovate/filebrowser-filebrowser-2.x into main 2026-06-06 07:48:09 +00:00
Renovate Bot 35986cb892 Update index.docker.io/rclone/rclone Docker tag to v1.74.3
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 07:48:08 +00:00
Renovate Bot 386e764713 Update filebrowser/filebrowser Docker tag to v2.63.13
renovate/stability-days Updates have not met minimum release age requirement
2026-06-06 07:47:56 +00:00
admin df5afe1695 Merge pull request 'renovate: termix via customManagers (inline comments not honored by kubernetes manager)' (#49) from feat/renovate-termix-custommanagers into main 2026-06-06 07:42:14 +00:00
admin 9d996ee0ec Merge pull request 'Update redis Docker tag' (#48) from renovate/redis-7.x into main 2026-06-06 07:32:31 +00:00
Renovate Bot b29db876d5 Update redis Docker tag
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:32:28 +00:00
admin 7ba27a7e4f Merge pull request 'Update prom/prometheus Docker tag to v3.12.0' (#46) from renovate/prom-prometheus-3.x into main 2026-06-06 07:32:24 +00:00
admin 0fb59899c9 Merge pull request 'Update outlinewiki/outline Docker tag to v1.8.0' (#45) from renovate/outlinewiki-outline-1.x into main 2026-06-06 07:32:11 +00:00
Renovate Bot cb991b5d0c Update prom/prometheus Docker tag to v3.12.0
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:32:10 +00:00
admin 0c7f5b6291 Merge pull request 'Update onlyoffice/documentserver Docker tag to v9.4.0' (#44) from renovate/onlyoffice-documentserver-9.x into main 2026-06-06 07:32:03 +00:00
Renovate Bot a261ff3e72 Update outlinewiki/outline Docker tag to v1.8.0
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:32:03 +00:00
admin 5c2dc27954 Merge pull request 'Update nginx Docker tag to v1.31' (#43) from renovate/nginx-1.x into main 2026-06-06 07:31:58 +00:00
Renovate Bot f5cb8f48c6 Update onlyoffice/documentserver Docker tag to v9.4.0
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:58 +00:00
Renovate Bot dee4f0fac3 Update nginx Docker tag to v1.31
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:55 +00:00
admin 9d7dff645a Merge pull request 'Update mikefarah/yq Docker tag to v4.53.2' (#41) from renovate/mikefarah-yq-4.x into main 2026-06-06 07:31:51 +00:00
admin fcc0bc5ef8 Merge pull request 'Update louislam/uptime-kuma Docker tag to v2.4.0' (#40) from renovate/louislam-uptime-kuma-2.x into main 2026-06-06 07:31:44 +00:00
Renovate Bot be3c5e431e Update mikefarah/yq Docker tag to v4.53.2
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:43 +00:00
admin 80dfd75227 Merge pull request 'Update linuxserver/qbittorrent Docker tag to v5.2.1' (#39) from renovate/linuxserver-qbittorrent-5.x into main 2026-06-06 07:31:40 +00:00
Renovate Bot 9c72b0cab4 Update louislam/uptime-kuma Docker tag to v2.4.0
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:38 +00:00
admin 289d1ab763 Merge pull request 'Update index.docker.io/rclone/rclone Docker tag to v1.74.2' (#38) from renovate/index.docker.io-rclone-rclone-1.x into main 2026-06-06 07:31:21 +00:00
Renovate Bot 23695bd9a4 Update linuxserver/qbittorrent Docker tag to v5.2.1
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:21 +00:00
admin 1a52aca6db Merge pull request 'Update index.docker.io/alpine Docker tag to v3.23' (#37) from renovate/index.docker.io-alpine-3.x into main 2026-06-06 07:31:14 +00:00
Renovate Bot 6ec9f6a0ae Update index.docker.io/rclone/rclone Docker tag to v1.74.2
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:14 +00:00
admin fd97f14293 Merge pull request 'Update healthchecks/healthchecks Docker tag to v4.2' (#36) from renovate/healthchecks-healthchecks-4.x into main 2026-06-06 07:31:10 +00:00
Renovate Bot 0c62b28210 Update index.docker.io/alpine Docker tag to v3.23
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:10 +00:00
Renovate Bot 6f82023155 Update healthchecks/healthchecks Docker tag to v4.2
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:31:05 +00:00
admin b73786871e Merge pull request 'Update grafana/grafana Docker tag to v12.4.4' (#34) from renovate/grafana-grafana-12.x into main 2026-06-06 07:31:01 +00:00
Renovate Bot 0afa7d91e0 Update grafana/grafana Docker tag to v12.4.4
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:30:42 +00:00
admin 7af4092e32 Merge pull request 'Update getmeili/meilisearch Docker tag to v1.45.2' (#32) from renovate/getmeili-meilisearch-1.x into main 2026-06-06 07:30:33 +00:00
admin c19de989ce Merge pull request 'Update filebrowser/filebrowser Docker tag to v2.63.5' (#31) from renovate/filebrowser-filebrowser-2.x into main 2026-06-06 07:30:16 +00:00
Renovate Bot 1810e40fb4 Update getmeili/meilisearch Docker tag to v1.45.2
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:30:16 +00:00
admin 6013ea668c Merge pull request 'Update docker.io/valkey/valkey Docker tag to v9.1' (#30) from renovate/docker.io-valkey-valkey-9.x into main 2026-06-06 07:29:57 +00:00
Renovate Bot 1233868f63 Update filebrowser/filebrowser Docker tag to v2.63.5
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:29:55 +00:00
admin 7658914ddb Merge pull request 'Update docker.io/bitnamilegacy/postgresql Docker tag to v17.6.0' (#29) from renovate/docker.io-bitnamilegacy-postgresql-17.x into main 2026-06-06 07:29:51 +00:00
Renovate Bot 7aecce94a1 Update docker.io/valkey/valkey Docker tag to v9.1
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:29:51 +00:00
admin f11126cac3 Merge pull request 'Update codercom/code-server Docker tag to v4.122.1' (#28) from renovate/codercom-code-server-4.x into main 2026-06-06 07:29:44 +00:00
Renovate Bot 4431c44991 Update docker.io/bitnamilegacy/postgresql Docker tag to v17.6.0
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:29:44 +00:00
Renovate Bot c65cf19bd2 Update codercom/code-server Docker tag to v4.122.1
renovate/stability-days Updates have met minimum release age requirement
2026-06-06 07:29:42 +00:00
admin c7ff367cdf Merge pull request 'renovate: termix via inline manifest comment (packageRule applied too late)' (#27) from feat/renovate-termix-inline-comment into main 2026-06-06 07:25:31 +00:00
41 changed files with 640 additions and 978 deletions
+42 -6
View File
@@ -52,7 +52,7 @@ data:
},
"customManagers": [
{
"description": "termix uses a release-X.Y.Z prefixed tag. extractVersion + loose doesn't work because Renovate validates the raw currentValue BEFORE applying extractVersion. Using regex versioning (which parses the prefixed value directly) sidesteps the pre-check. Datasource redirected to GitHub Releases at Termix-SSH/Termix so the 3-day stability gate has real timestamps to work with.",
"description": "termix: docker image tag is `release-X.Y.Z` but the upstream GitHub release tag_name is `release-X.Y.Z-tag` (different from the release name). regex versioning parses currentValue (no -tag); extractVersion strips the -tag suffix from candidate tag_names so they normalize to the same shape Renovate writes back to the manifest.",
"customType": "regex",
"managerFilePatterns": ["/termix-system/.+\\.ya?ml$/"],
"matchStrings": [
@@ -60,7 +60,19 @@ data:
],
"datasourceTemplate": "github-releases",
"packageNameTemplate": "Termix-SSH/Termix",
"versioningTemplate": "regex:^release-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$"
"versioningTemplate": "regex:^release-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
"extractVersionTemplate": "^(?<version>release-\\d+\\.\\d+\\.\\d+)"
},
{
"description": "linuxserver servarr apps (prowlarr, radarr, sonarr) use tag pattern `version-X.Y.Z.B` (4 segments + `version-` prefix). The kubernetes manager's default docker versioning rejects them at the pre-check (same failure class as termix), so no PRs ever open. Use regex versioning to parse the prefixed 4-segment form; depName is captured from the regex so the same customManager handles all three apps.",
"customType": "regex",
"managerFilePatterns": ["/servarr-system/.+\\.ya?ml$/"],
"matchStrings": [
"image:\\s+linuxserver/(?<depName>prowlarr|radarr|sonarr):(?<currentValue>version-\\d+\\.\\d+\\.\\d+\\.\\d+)"
],
"datasourceTemplate": "docker",
"packageNameTemplate": "linuxserver/{{depName}}",
"versioningTemplate": "regex:^version-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)$"
}
],
"packageRules": [
@@ -108,11 +120,35 @@ data:
"matchPackageNames": ["flomp/wanderer-db", "flomp/wanderer-web"],
"groupName": "wanderer"
},
{
"description": "meilisearch: every version bump can require an index format migration via dump/restore (see https://www.meilisearch.com/docs/learn/update_and_migration/updating). PR #32 (v1.11.3 -> v1.45.2) on 2026-06-06 broke wanderer with `Your database version (1.11.3) is incompatible with your current engine version (1.45.2)`. Hold ALL meilisearch updates behind dashboard approval so the migration is planned before the PR even opens.",
"matchPackageNames": ["getmeili/meilisearch"],
"dependencyDashboardApproval": true
},
{
"description": "Postgres-family images: a major bump (e.g. 16 -> 17) requires pg_upgrade or dump/restore — the new server binary refuses to open the old data directory (`database files are incompatible with server`). PR #76 (immich-app/postgres 16 -> 17) on 2026-06-06 crashlooped immich-postgres and immich-server. Renovate's docker versioning treats these custom tag formats inconsistently, so don't trust the major/minor classification: hold ALL updates for these images behind explicit dashboard approval. Includes vanilla postgres, postgis/postgis (where the tag prefix IS the pg major), and ghcr.io/immich-app/postgres (custom `N-vectorchordX.Y.Z` form).",
"matchPackageNames": [
"postgres",
"postgis/postgis",
"ghcr.io/immich-app/postgres"
],
"dependencyDashboardApproval": true
},
{
"description": "termix: kubernetes manager would extract the image with versioning=docker and silently skip it (release-1.11.0 fails the docker pre-check). Disable that extraction; customManagers above does the real work via github-releases.",
"matchManagers": ["kubernetes"],
"matchPackageNames": ["ghcr.io/lukegus/termix"],
"enabled": false
},
{
"description": "linuxserver servarr apps: same disable pattern as termix. The customManager above handles extraction with the right versioning; turn off the default kubernetes-manager extraction so it doesn't silently skip + clutter the dashboard.",
"matchManagers": ["kubernetes"],
"matchPackageNames": [
"linuxserver/prowlarr",
"linuxserver/radarr",
"linuxserver/sonarr"
],
"enabled": false
}
],
"labels": ["renovate"]
@@ -126,7 +162,7 @@ metadata:
labels:
app.kubernetes.io/instance: renovate
app.kubernetes.io/name: renovate
app.kubernetes.io/version: "43.197.0"
app.kubernetes.io/version: "43.209.3"
spec:
# Sat 02:00 Europe/Budapest — leaves the full weekend for troubleshooting
# if a Renovate-merged update breaks something.
@@ -141,14 +177,14 @@ spec:
labels:
app.kubernetes.io/instance: renovate
app.kubernetes.io/name: renovate
app.kubernetes.io/version: "43.197.0"
app.kubernetes.io/version: "43.209.3"
spec:
template:
metadata:
labels:
app.kubernetes.io/instance: renovate
app.kubernetes.io/name: renovate
app.kubernetes.io/version: "43.197.0"
app.kubernetes.io/version: "43.209.3"
annotations:
# Renovate uses plain X.Y.Z semver tags (no -slim suffix anymore)
match-regex.version-checker.io/renovate: '^\d+\.\d+\.\d+$'
@@ -157,7 +193,7 @@ spec:
restartPolicy: OnFailure
containers:
- name: renovate
image: renovate/renovate:43.197.0
image: renovate/renovate:43.209.3
imagePullPolicy: IfNotPresent
envFrom:
- secretRef:
+1 -1
View File
@@ -90,7 +90,7 @@ spec:
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: tailscale
image: tailscale/tailscale:v1.94.1
image: tailscale/tailscale:v1.98.4
imagePullPolicy: IfNotPresent
env:
- name: TZ
+344
View File
@@ -0,0 +1,344 @@
---
# ============================================================================
# wan-monitor — internet connection quality monitoring
# Single pod (3 containers) in admin-system:
# - blackbox : prometheus blackbox-exporter (HTTP phases, ICMP, DNS) :9115
# - wan-probe : irtt (UDP quality) + iperf3 (throughput) loop -> /shared
# - metrics-http : busybox httpd serving /shared/metrics :9116
# Prometheus scrapes :9115 (blackbox relabel jobs) and :9116 (textfile metrics).
# Scrape jobs live in prometheus-wan-scrape-jobs.yaml (merge into monitoring.yaml).
# ============================================================================
apiVersion: v1
kind: ConfigMap
metadata:
name: wan-monitor-blackbox
namespace: admin-system
labels:
app: wan-monitor
data:
blackbox.yml: |
modules:
http_2xx:
prober: http
timeout: 10s
http:
preferred_ip_protocol: ip4
ip_protocol_fallback: false
method: GET
fail_if_not_ssl: false
icmp:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: ip4
ip_protocol_fallback: false
dns_udp:
prober: dns
timeout: 5s
dns:
transport_protocol: udp
preferred_ip_protocol: ip4
query_name: "telex.hu"
query_type: "A"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: wan-monitor-scripts
namespace: admin-system
labels:
app: wan-monitor
data:
metrics-header.prom: |
# HELP wan_irtt_rtt_seconds irtt round-trip time by statistic (seconds)
# TYPE wan_irtt_rtt_seconds gauge
# HELP wan_irtt_jitter_seconds irtt IPDV jitter mean by direction (seconds)
# TYPE wan_irtt_jitter_seconds gauge
# HELP wan_irtt_loss_ratio irtt packet loss ratio by direction (0-1)
# TYPE wan_irtt_loss_ratio gauge
# HELP wan_irtt_late_ratio irtt late/reordered packet ratio (0-1)
# TYPE wan_irtt_late_ratio gauge
# HELP wan_irtt_duplicate_ratio irtt duplicate packet ratio (0-1)
# TYPE wan_irtt_duplicate_ratio gauge
# HELP wan_irtt_packets irtt packet counters for the run
# TYPE wan_irtt_packets gauge
# HELP wan_irtt_success 1 if the irtt run produced stats
# TYPE wan_irtt_success gauge
# HELP wan_throughput_bits_per_second achieved throughput (bits/sec)
# TYPE wan_throughput_bits_per_second gauge
# HELP wan_throughput_success 1 if the throughput test succeeded
# TYPE wan_throughput_success gauge
# HELP wan_probe_last_run_timestamp_seconds unix time of last probe run
# TYPE wan_probe_last_run_timestamp_seconds gauge
irtt_to_prom.py: |
#!/usr/bin/env python3
# irtt JSON (stdin) -> Prometheus sample lines (no HELP/TYPE; header is static).
# args: <condition> <target>
# Hardened: tolerates missing/null/NaN/Inf fields and clamps ratios to 0..1
# so a pathological irtt run can never emit an out-of-range or invalid sample.
import json, sys, time, math
cond = sys.argv[1] if len(sys.argv) > 1 else "idle"
target = sys.argv[2] if len(sys.argv) > 2 else "hetzner"
L = f'target="{target}",condition="{cond}"'
ts = f'{time.time():.0f}'
def num(x, default=0.0):
# finite float or default (handles None / str / missing / NaN / Inf)
try:
v = float(x)
except (TypeError, ValueError):
return default
return v if math.isfinite(v) else default
def pct_ratio(x):
# percent (0..100, possibly garbage) -> ratio clamped to 0..1
return max(0.0, min(1.0, num(x) / 100.0))
def fail():
print(f'wan_irtt_success{{{L}}} 0')
print(f'wan_probe_last_run_timestamp_seconds{{probe="irtt",{L}}} {ts}')
sys.exit(0)
try:
s = json.load(sys.stdin).get("stats")
except Exception:
fail()
if not isinstance(s, dict):
fail()
rtt = s.get("rtt") or {}
for k in ("min", "mean", "median", "max", "stddev"):
print(f'wan_irtt_rtt_seconds{{{L},stat="{k}"}} {num(rtt.get(k)) / 1e9}')
def ipdv(key):
d = s.get(key) or {}
return num(d.get("mean")) / 1e9
print(f'wan_irtt_jitter_seconds{{{L},direction="round_trip"}} {ipdv("ipdv_round_trip")}')
print(f'wan_irtt_jitter_seconds{{{L},direction="send"}} {ipdv("ipdv_send")}')
print(f'wan_irtt_jitter_seconds{{{L},direction="receive"}} {ipdv("ipdv_receive")}')
print(f'wan_irtt_loss_ratio{{{L},direction="round_trip"}} {pct_ratio(s.get("packet_loss_percent"))}')
print(f'wan_irtt_loss_ratio{{{L},direction="upstream"}} {pct_ratio(s.get("upstream_loss_percent"))}')
print(f'wan_irtt_loss_ratio{{{L},direction="downstream"}} {pct_ratio(s.get("downstream_loss_percent"))}')
print(f'wan_irtt_late_ratio{{{L}}} {pct_ratio(s.get("late_packets_percent"))}')
print(f'wan_irtt_duplicate_ratio{{{L}}} {pct_ratio(s.get("duplicate_percent"))}')
print(f'wan_irtt_packets{{{L},kind="sent"}} {int(num(s.get("packets_sent")))}')
print(f'wan_irtt_packets{{{L},kind="received"}} {int(num(s.get("packets_received")))}')
print(f'wan_irtt_packets{{{L},kind="server_received"}} {int(num(s.get("server_packets_received")))}')
print(f'wan_irtt_success{{{L}}} 1')
print(f'wan_probe_last_run_timestamp_seconds{{probe="irtt",{L}}} {ts}')
tput_to_prom.py: |
#!/usr/bin/env python3
# iperf3 JSON (stdin) -> Prometheus sample lines. args: <direction> <target>
import json, sys, time
direction = sys.argv[1] if len(sys.argv) > 1 else "download"
target = sys.argv[2] if len(sys.argv) > 2 else "hetzner"
L = f'target="{target}",direction="{direction}"'
ts = f'{time.time():.0f}'
try:
bps = json.load(sys.stdin)["end"]["sum_received"]["bits_per_second"]
print(f'wan_throughput_bits_per_second{{{L}}} {bps:.0f}')
print(f'wan_throughput_success{{{L}}} 1')
except Exception:
print(f'wan_throughput_success{{{L}}} 0')
print(f'wan_probe_last_run_timestamp_seconds{{probe="throughput",{L}}} {ts}')
probe-loop.sh: |
#!/bin/sh
set -u
SHARED=/shared
HDR=/scripts/metrics-header.prom
HETZNER="${HETZNER_HOST:?set HETZNER_HOST}"
IRTT_PORT="${IRTT_PORT:-2112}"
IPERF_PORT="${IPERF_PORT:-5201}"
IRTT_INTERVAL="${IRTT_INTERVAL:-20ms}"
IRTT_DURATION="${IRTT_DURATION:-60}" # seconds (numeric, for timeout math)
TPUT_EVERY="${TPUT_EVERY:-900}" # seconds between throughput tests
TPUT_TIME="${TPUT_TIME:-10}" # iperf3 seconds per direction
IRTT_TARGET="${IRTT_TARGET:-hetzner}"
TPUT_TARGET="${TPUT_TARGET:-hetzner}"
HMAC_OPT=""
[ -n "${IRTT_HMAC:-}" ] && HMAC_OPT="--hmac=${IRTT_HMAC}"
mkdir -p "$SHARED"
: > "$SHARED/.irtt.prom"; : > "$SHARED/.irttload.prom"; : > "$SHARED/.tput.prom"
cp "$HDR" "$SHARED/metrics" # serve header immediately so first scrapes don't 404
# Concatenate fragments into the served file via temp + atomic rename.
assemble() {
cat "$HDR" "$SHARED/.irtt.prom" "$SHARED/.irttload.prom" "$SHARED/.tput.prom" \
> "$SHARED/.metrics.tmp" 2>/dev/null
mv "$SHARED/.metrics.tmp" "$SHARED/metrics"
}
# Each fragment is written to <file>.tmp then renamed, so assemble() never
# cats a partially written file (the cause of the impossible loss spikes).
run_irtt() { # $1 condition $2 outfile $3 duration(seconds)
timeout "$(( $3 + 25 ))" irtt client -i "$IRTT_INTERVAL" -d "${3}s" -q $HMAC_OPT \
-o - "${HETZNER}:${IRTT_PORT}" 2>/dev/null \
| python3 /scripts/irtt_to_prom.py "$1" "$IRTT_TARGET" > "$2.tmp"
mv "$2.tmp" "$2"
}
run_tput() {
P="${IPERF_PARALLEL:-4}" # parallel streams: a single stream can't fill the pipe over the RTT
TO="$(( TPUT_TIME + 20 ))"
TMP="$SHARED/.tput.prom.partial"
: > "$TMP"
timeout "$TO" iperf3 -c "$HETZNER" -p "$IPERF_PORT" -t "$TPUT_TIME" -P "$P" --connect-timeout 5000 -R -J 2>/dev/null \
| python3 /scripts/tput_to_prom.py download "$TPUT_TARGET" > "$TMP"
timeout "$TO" iperf3 -c "$HETZNER" -p "$IPERF_PORT" -t "$TPUT_TIME" -P "$P" --connect-timeout 5000 -J 2>/dev/null \
| python3 /scripts/tput_to_prom.py upload "$TPUT_TARGET" >> "$TMP"
mv "$TMP" "$SHARED/.tput.prom"
}
last_tput=0
while true; do
run_irtt idle "$SHARED/.irtt.prom" "$IRTT_DURATION" # blocks ~IRTT_DURATION = loop cadence
assemble
now=$(date +%s)
if [ $(( now - last_tput )) -ge "$TPUT_EVERY" ]; then
LOAD_DUR=$(( 2 * TPUT_TIME + 4 ))
run_irtt under_load "$SHARED/.irttload.prom" "$LOAD_DUR" & # concurrent = bufferbloat
LOADPID=$!
run_tput
wait "$LOADPID" 2>/dev/null
last_tput="$now"
assemble
fi
done
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wan-monitor
namespace: admin-system
labels:
app: wan-monitor
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: wan-monitor
template:
metadata:
labels:
app: wan-monitor
annotations:
enable.version-checker.io/blackbox: "true"
enable.version-checker.io/metrics-http: "true"
enable.version-checker.io/wan-probe: "true"
match-regex.version-checker.io/blackbox: "^v[0-9]+\\.[0-9]+\\.[0-9]+$"
match-regex.version-checker.io/metrics-http: "^[0-9]+\\.[0-9]+\\.[0-9]+$"
match-regex.version-checker.io/wan-probe: "^[0-9]+\\.[0-9]+\\.[0-9]+$"
spec:
enableServiceLinks: false
containers:
- name: blackbox
image: quay.io/prometheus/blackbox-exporter:v0.28.0
args:
- --config.file=/etc/blackbox/blackbox.yml
- --web.listen-address=:9115
ports:
- name: blackbox
containerPort: 9115
securityContext:
capabilities:
add: ["NET_RAW"] # required for the ICMP prober
resources:
requests: { cpu: 10m, memory: 32Mi }
limits: { memory: 64Mi }
volumeMounts:
- name: blackbox-config
mountPath: /etc/blackbox
readOnly: true
- name: wan-probe
# Build + push from Dockerfile.wan-probe (adjust registry/tag to taste)
image: gitea.dooplex.hu/admin/wan-probe:0.1.0
command: ["/bin/sh", "/scripts/probe-loop.sh"]
env:
- name: HETZNER_HOST
# MUST be the Hetzner origin: a DNS-only (grey-cloud) record or raw IP.
# NOT the Cloudflare-proxied jarrs.eu — CF only forwards HTTP/HTTPS, so
# UDP 2112 (irtt) / TCP 5201 (iperf3) never reach the origin behind it.
value: "metrics.jarrs.eu" # DNS-only A record -> Hetzner IPv4
- name: IRTT_PORT
value: "2112"
- name: IPERF_PORT
value: "5201"
- name: IRTT_INTERVAL
value: "20ms"
- name: IRTT_DURATION
value: "60" # seconds (numeric)
- name: TPUT_EVERY
value: "900" # 15 min
- name: TPUT_TIME
value: "10"
- name: IPERF_PARALLEL
value: "4"
- name: IRTT_HMAC # shared key; apply via secret (see below)
valueFrom:
secretKeyRef:
name: wan-monitor-irtt
key: hmac
optional: true
resources:
requests: { cpu: 20m, memory: 48Mi }
limits: { memory: 96Mi }
volumeMounts:
- name: scripts
mountPath: /scripts
readOnly: true
- name: shared
mountPath: /shared
- name: metrics-http
image: busybox:1.36
command: ["httpd", "-f", "-v", "-p", "9116", "-h", "/shared"]
ports:
- name: metrics
containerPort: 9116
resources:
requests: { cpu: 5m, memory: 8Mi }
limits: { memory: 24Mi }
volumeMounts:
- name: shared
mountPath: /shared
readOnly: true
volumes:
- name: blackbox-config
configMap:
name: wan-monitor-blackbox
- name: scripts
configMap:
name: wan-monitor-scripts
- name: shared
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: wan-monitor
namespace: admin-system
labels:
app: wan-monitor
spec:
type: ClusterIP
selector:
app: wan-monitor
ports:
- name: blackbox
port: 9115
targetPort: 9115
- name: metrics
port: 9116
targetPort: 9116
+1 -1
View File
@@ -56,7 +56,7 @@ spec:
spec:
containers:
- name: redis
image: redis:7.2-alpine
image: redis:8.8-alpine
ports:
- containerPort: 6379
name: redis
+1 -1
View File
@@ -77,7 +77,7 @@ spec:
spec:
containers:
- name: redis
image: redis:7-alpine
image: redis:8-alpine
imagePullPolicy: IfNotPresent
args:
- redis-server
+1 -1
View File
@@ -175,7 +175,7 @@ spec:
spec:
containers:
- name: bookstack
image: linuxserver/bookstack:25.12.20251224
image: linuxserver/bookstack:26.05.20260601
imagePullPolicy: IfNotPresent
env:
# LinuxServer.io specific
+1 -1
View File
@@ -50,7 +50,7 @@ spec:
fsGroup: 1000
containers:
- name: code-server
image: codercom/code-server:4.121.0
image: codercom/code-server:4.123.0
args:
- --bind-addr=0.0.0.0:8080
- --auth=none
+1 -1
View File
@@ -169,7 +169,7 @@ spec:
type: RuntimeDefault
containers:
- name: reloader
image: ghcr.io/stakater/reloader:v1.4.12
image: ghcr.io/stakater/reloader:v1.4.17
imagePullPolicy: IfNotPresent
env:
- name: GOMAXPROCS
+1 -1
View File
@@ -57,7 +57,7 @@ replicaCount: 1
# Image configuration (optional - use defaults)
image:
repository: ghcr.io/cloudnative-pg/cloudnative-pg
tag: 1.28.1
tag: 1.29.1
# Service configuration
service:
-142
View File
@@ -1,142 +0,0 @@
# Contact Mailer - Lightweight email sender for felhom.eu contact form
# Uses Resend.com API for transactional email delivery.
#
# PREREQUISITES:
# 1. Build and push the container image:
# docker build -t contact-mailer:latest .
# # Option A: Push to Gitea registry (if configured):
# # docker tag contact-mailer:latest gitea.felhom.eu/felhom/contact-mailer:latest
# # docker push gitea.felhom.eu/felhom/contact-mailer:latest
# # Option B: Import directly into k3s (single node):
# # docker save contact-mailer:latest | sudo k3s ctr images import -
#
# 2. Create the Secret with your Resend API key:
# kubectl create secret generic contact-mailer-config \
# --namespace=felhom-system \
# --from-literal=RESEND_API_KEY='re_xxxxxxxxxxxx'
#
# 3. Apply this manifest:
# kubectl apply -f contact-mailer.yaml
#
# 4. Test:
# # Health check:
# curl https://felhom.eu/api/healthz
# # Send test email (only works if DEBUG=true):
# curl -X POST https://felhom.eu/api/debug/test
#
# 5. Update contact form endpoint in kapcsolat.html:
# CONFIG.formEndpoint = '/api/contact';
#
# DEBUGGING:
# kubectl logs -n felhom-system deploy/contact-mailer -f
# kubectl exec -it -n felhom-system deploy/contact-mailer -- wget -qO- http://localhost:8080/healthz
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: contact-mailer
namespace: felhom-system
labels:
app: contact-mailer
spec:
replicas: 1
selector:
matchLabels:
app: contact-mailer
template:
metadata:
labels:
app: contact-mailer
spec:
containers:
- name: contact-mailer
image: contact-mailer:latest
# Use 'Never' for locally imported images, 'Always' for registry
imagePullPolicy: Never
ports:
- containerPort: 8080
env:
- name: RESEND_API_KEY
valueFrom:
secretKeyRef:
name: contact-mailer-config
key: RESEND_API_KEY
- name: FROM_EMAIL
value: "Felhom.eu <noreply@felhom.eu>"
- name: TO_EMAIL
value: "info@felhom.eu"
- name: ALLOWED_ORIGIN
value: "https://felhom.eu"
- name: TZ
value: "Europe/Budapest"
# Set to "true" to enable /debug/test endpoint
- name: DEBUG
value: "false"
resources:
requests:
memory: "16Mi"
cpu: "5m"
limits:
memory: "64Mi"
cpu: "100m"
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 30
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 10
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
---
apiVersion: v1
kind: Service
metadata:
name: contact-mailer
namespace: felhom-system
spec:
selector:
app: contact-mailer
ports:
- port: 80
targetPort: 8080
---
# Ingress: routes felhom.eu/api/* to the contact mailer
# This is a SEPARATE ingress from the website - nginx-ingress merges them
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: contact-mailer
namespace: felhom-system
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
# Allow larger uploads for attachments
nginx.ingress.kubernetes.io/proxy-body-size: "25m"
# Timeout for large file uploads
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
spec:
ingressClassName: nginx-internal
tls:
- hosts:
- felhom.eu
secretName: felhom-webpage-tls
rules:
- host: felhom.eu
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: contact-mailer
port:
number: 80
-194
View File
@@ -1,194 +0,0 @@
# Healthchecks - Self-hosted cron/backup monitoring with dead man's switch
# Dashboard: https://status.felhom.eu
# Ping endpoint: https://status.felhom.eu/ping/<uuid>
#
# Customer servers ping this after successful backup.
# If a ping is missed, Healthchecks sends email alerts.
#
# After deploying, create superuser:
# kubectl exec -it -n felhom-system deploy/healthchecks -- python manage.py createsuperuser
#
# SMTP: Configure the Secret below with your email provider credentials.
# Recommended free options:
# - Resend.com (3000 emails/month free, easy setup)
# - Brevo/Sendinblue (300 emails/day free)
# - SMTP2GO (1000 emails/month free)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: healthchecks-data
namespace: felhom-system
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: healthchecks
namespace: felhom-system
labels:
app: healthchecks
spec:
replicas: 1
selector:
matchLabels:
app: healthchecks
template:
metadata:
labels:
app: healthchecks
spec:
securityContext:
fsGroup: 999
containers:
- name: healthchecks
image: healthchecks/healthchecks:v4.0
ports:
- containerPort: 8000
env:
# --- Site settings ---
- name: SITE_ROOT
value: "https://status.felhom.eu"
- name: SITE_NAME
value: "Felhom Monitoring"
- name: ALLOWED_HOSTS
value: "status.felhom.eu"
- name: PING_ENDPOINT
value: "https://status.felhom.eu/ping/"
- name: DEBUG
value: "False"
- name: REGISTRATION_OPEN
value: "False"
- name: DB
value: "sqlite"
- name: DB_NAME
value: "/data/hc.sqlite"
- name: TZ
value: "Europe/Budapest"
# --- Secrets (from Secret) ---
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: healthchecks-config
key: SECRET_KEY
- name: SUPERUSER_EMAIL
valueFrom:
secretKeyRef:
name: healthchecks-config
key: SUPERUSER_EMAIL
- name: SUPERUSER_PASSWORD
valueFrom:
secretKeyRef:
name: healthchecks-config
key: SUPERUSER_PASSWORD
- name: EMAIL_HOST
valueFrom:
secretKeyRef:
name: healthchecks-config
key: EMAIL_HOST
- name: EMAIL_PORT
valueFrom:
secretKeyRef:
name: healthchecks-config
key: EMAIL_PORT
- name: EMAIL_HOST_USER
valueFrom:
secretKeyRef:
name: healthchecks-config
key: EMAIL_HOST_USER
- name: EMAIL_HOST_PASSWORD
valueFrom:
secretKeyRef:
name: healthchecks-config
key: EMAIL_HOST_PASSWORD
- name: EMAIL_USE_TLS
valueFrom:
secretKeyRef:
name: healthchecks-config
key: EMAIL_USE_TLS
- name: EMAIL_USE_VERIFICATION
valueFrom:
secretKeyRef:
name: healthchecks-config
key: EMAIL_USE_VERIFICATION
- name: DEFAULT_FROM_EMAIL
valueFrom:
secretKeyRef:
name: healthchecks-config
key: DEFAULT_FROM_EMAIL
volumeMounts:
- name: data
mountPath: /data
resources:
requests:
memory: "128Mi"
cpu: "50m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /api/v3/status/
port: 8000
httpHeaders:
- name: Host
value: status.felhom.eu
initialDelaySeconds: 30
periodSeconds: 60
readinessProbe:
httpGet:
path: /api/v3/status/
port: 8000
httpHeaders:
- name: Host
value: status.felhom.eu
initialDelaySeconds: 10
periodSeconds: 10
volumes:
- name: data
persistentVolumeClaim:
claimName: healthchecks-data
---
apiVersion: v1
kind: Service
metadata:
name: healthchecks
namespace: felhom-system
spec:
selector:
app: healthchecks
ports:
- port: 80
targetPort: 8000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: healthchecks
namespace: felhom-system
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx-internal
tls:
- hosts:
- status.felhom.eu
secretName: healthchecks-tls
rules:
- host: status.felhom.eu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: healthchecks
port:
number: 80
-288
View File
@@ -1,288 +0,0 @@
# Umami v3 - Privacy-focused web analytics for felhom.eu
# Dashboard: https://stats.felhom.eu
# Tracking: Add <script> tag to website HTML pages (see bottom of file)
#
# Umami v3 requires PostgreSQL (no SQLite/MySQL support).
# This manifest deploys a dedicated small PostgreSQL instance alongside Umami
# to keep it self-contained within the felhom-system namespace.
#
# PREREQUISITES:
# 1. Create the Secret with credentials:
# APP_SECRET: Random string for session encryption (generate with: openssl rand -hex 32)
# POSTGRES_PASSWORD: Database password (generate with: openssl rand -hex 16)
#
# kubectl create secret generic umami-config \
# --namespace=felhom-system \
# --from-literal=APP_SECRET="$(openssl rand -hex 32)" \
# --from-literal=POSTGRES_PASSWORD="$(openssl rand -hex 16)"
#
# 2. Apply this manifest:
# kubectl apply -f umami.yaml
#
# 3. Wait for pods to be ready (~30-60 seconds for first start, DB init):
# kubectl get pods -n felhom-system -l app=umami -w
# kubectl get pods -n felhom-system -l app=umami-db -w
#
# 4. Login at https://stats.felhom.eu
# Default credentials: admin / umami
# ⚠️ CHANGE THE PASSWORD IMMEDIATELY after first login!
#
# 5. Add your website in Umami:
# Settings → Websites → Add website → Name: "felhom.eu", Domain: "felhom.eu"
# Copy the tracking code and add it to your HTML pages (see bottom of file).
#
# DEBUGGING:
# kubectl logs -n felhom-system deploy/umami -f
# kubectl logs -n felhom-system deploy/umami-db -f
# kubectl exec -it -n felhom-system deploy/umami -- wget -qO- http://localhost:3000/api/heartbeat
# kubectl exec -it -n felhom-system deploy/umami-db -- pg_isready -U umami
#
# BACKUP:
# # Dump the database:
# kubectl exec -n felhom-system deploy/umami-db -- pg_dump -U umami umami > umami-backup-$(date +%Y%m%d).sql
# # Restore:
# cat umami-backup-YYYYMMDD.sql | kubectl exec -i -n felhom-system deploy/umami-db -- psql -U umami umami
# =============================================================================
# PERSISTENT STORAGE
# =============================================================================
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: umami-db-data
namespace: felhom-system
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 2Gi
# =============================================================================
# POSTGRESQL - Dedicated database for Umami
# =============================================================================
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: umami-db
namespace: felhom-system
labels:
app: umami-db
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: umami-db
template:
metadata:
labels:
app: umami-db
spec:
containers:
- name: postgres
image: postgres:16-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "umami"
- name: POSTGRES_USER
value: "umami"
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: umami-config
key: POSTGRES_PASSWORD
- name: PGDATA
value: "/var/lib/postgresql/data/pgdata"
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
resources:
requests:
memory: "64Mi"
cpu: "25m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
exec:
command:
- pg_isready
- -U
- umami
initialDelaySeconds: 15
periodSeconds: 30
readinessProbe:
exec:
command:
- pg_isready
- -U
- umami
initialDelaySeconds: 5
periodSeconds: 10
volumes:
- name: data
persistentVolumeClaim:
claimName: umami-db-data
---
apiVersion: v1
kind: Service
metadata:
name: umami-db
namespace: felhom-system
spec:
selector:
app: umami-db
ports:
- port: 5432
targetPort: 5432
# =============================================================================
# UMAMI - Web Analytics Application
# =============================================================================
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: umami
namespace: felhom-system
labels:
app: umami
spec:
replicas: 1
selector:
matchLabels:
app: umami
template:
metadata:
labels:
app: umami
spec:
# Wait for DB to be available before starting Umami
initContainers:
- name: wait-for-db
image: postgres:16-alpine
command:
- sh
- -c
- |
echo "Waiting for PostgreSQL to be ready..."
until pg_isready -h umami-db -p 5432 -U umami; do
echo " ...still waiting"
sleep 2
done
echo "PostgreSQL is ready!"
resources:
requests:
memory: "16Mi"
cpu: "5m"
limits:
memory: "32Mi"
cpu: "50m"
containers:
- name: umami
image: ghcr.io/umami-software/umami:postgresql-latest
ports:
- containerPort: 3000
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: umami-config
key: POSTGRES_PASSWORD
- name: DATABASE_URL
value: "postgresql://umami:$(POSTGRES_PASSWORD)@umami-db:5432/umami"
- name: APP_SECRET
valueFrom:
secretKeyRef:
name: umami-config
key: APP_SECRET
# Disable Umami's own telemetry
- name: DISABLE_TELEMETRY
value: "1"
- name: TZ
value: "Europe/Budapest"
resources:
requests:
memory: "128Mi"
cpu: "50m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /api/heartbeat
port: 3000
initialDelaySeconds: 30
periodSeconds: 30
readinessProbe:
httpGet:
path: /api/heartbeat
port: 3000
initialDelaySeconds: 15
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: umami
namespace: felhom-system
spec:
selector:
app: umami
ports:
- port: 80
targetPort: 3000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: umami
namespace: felhom-system
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx-internal
tls:
- hosts:
- stats.felhom.eu
secretName: umami-tls
rules:
- host: stats.felhom.eu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: umami
port:
number: 80
# =============================================================================
# TRACKING SCRIPT - Add to your HTML pages
# =============================================================================
#
# After deploying and creating your website in Umami, add this to every page's
# <head> section (replace WEBSITE_ID with the ID from Umami dashboard):
#
# <script defer src="https://stats.felhom.eu/script.js" data-website-id="YOUR-WEBSITE-ID"></script>
#
# The script is <2KB, async/deferred, cookie-free, and GDPR compliant.
# No cookie consent banner needed!
#
# TIP: Since your HTML files are managed via FileBrowser, you can add the
# script tag to all pages at once. Add it right before </head> in:
# - index.html
# - alkalmazasok.html
# - technologiak.html
# - gyik.html
# - kapcsolat.html
# - biztonsagimentes.html (if exists)
# - Any other pages
-286
View File
@@ -1,286 +0,0 @@
# FileBrowser + Webpage deployment for felhom.eu
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: felhom-website-content
namespace: felhom-system
spec:
accessModes:
- ReadWriteMany
storageClassName: longhorn
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: filebrowser-db
namespace: felhom-system
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 100Mi
---
apiVersion: v1
kind: ConfigMap
metadata:
name: filebrowser-config
namespace: felhom-system
data:
.filebrowser.json: |
{
"port": 8080,
"baseURL": "",
"address": "0.0.0.0",
"log": "stdout",
"database": "/database/filebrowser.db",
"root": "/srv"
}
---
# ===================
# NGINX CONFIG FOR CLEAN URLs
# ===================
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: felhom-system
data:
default.conf: |
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Enable clean URLs - serve .html files without extension
location / {
try_files $uri $uri.html $uri/ =404;
}
# Cache static assets
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# Error pages
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
---
# ===================
# FILEBROWSER
# ===================
apiVersion: apps/v1
kind: Deployment
metadata:
name: filebrowser
namespace: felhom-system
labels:
app: filebrowser
spec:
replicas: 1
selector:
matchLabels:
app: filebrowser
template:
metadata:
labels:
app: filebrowser
spec:
containers:
- name: filebrowser
image: filebrowser/filebrowser:v2-alpine
ports:
- containerPort: 8080
volumeMounts:
- name: website-content
mountPath: /srv
- name: database
mountPath: /database
- name: config
mountPath: /.filebrowser.json
subPath: .filebrowser.json
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
volumes:
- name: website-content
persistentVolumeClaim:
claimName: felhom-website-content
- name: database
persistentVolumeClaim:
claimName: filebrowser-db
- name: config
configMap:
name: filebrowser-config
---
apiVersion: v1
kind: Service
metadata:
name: filebrowser
namespace: felhom-system
spec:
selector:
app: filebrowser
ports:
- port: 80
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: filebrowser
namespace: felhom-system
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
spec:
ingressClassName: nginx-internal
tls:
- hosts:
- files.felhom.eu
secretName: filebrowser-tls
rules:
- host: files.felhom.eu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: filebrowser
port:
number: 80
---
# ===================
# WEBPAGE (nginx)
# ===================
apiVersion: apps/v1
kind: Deployment
metadata:
name: felhom-webpage
namespace: felhom-system
labels:
app: felhom-webpage
spec:
replicas: 1
selector:
matchLabels:
app: felhom-webpage
template:
metadata:
labels:
app: felhom-webpage
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- name: website-content
mountPath: /usr/share/nginx/html
- name: nginx-config
mountPath: /etc/nginx/conf.d/default.conf
subPath: default.conf
resources:
requests:
memory: "32Mi"
cpu: "10m"
limits:
memory: "128Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 30
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 10
volumes:
- name: website-content
persistentVolumeClaim:
claimName: felhom-website-content
- name: nginx-config
configMap:
name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
name: felhom-webpage
namespace: felhom-system
spec:
selector:
app: felhom-webpage
ports:
- port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: felhom-webpage
namespace: felhom-system
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx-internal
tls:
- hosts:
- felhom.eu
- www.felhom.eu
secretName: felhom-webpage-tls
rules:
- host: felhom.eu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: felhom-webpage
port:
number: 80
- host: www.felhom.eu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: felhom-webpage
port:
number: 80
+1 -1
View File
@@ -44,7 +44,7 @@ spec:
mountPath: /data
containers:
- name: gitea
image: gitea/gitea:1.25.4
image: gitea/gitea:1.26.2
imagePullPolicy: IfNotPresent
env:
- name: USER_UID
+1 -1
View File
@@ -1384,7 +1384,7 @@ spec:
# Calendar iCal URLs (JSON object: {"name": "url", ...})
- name: CALENDAR_ICAL_URLS
value: '{"Órák": "https://calendar.google.com/calendar/ical/b2884faf3db792ac082a6206057552c79080716efd5f966e169a41fc500e1c1c%40group.calendar.google.com/private-0998d8053909ba4449c2f0a6409ce3de/basic.ics", "Családi": "https://calendar.google.com/calendar/ical/nitq3l0if4gn54k438obat5ia0%40group.calendar.google.com/private-59afcf70fee1a798ec369b86d9883b46/basic.ics"}'
image: python:3.12-bookworm
image: python:3.14-bookworm
imagePullPolicy: IfNotPresent
name: glance-helper
ports:
+1 -1
View File
@@ -2746,7 +2746,7 @@ spec:
fsGroup: 1000
initContainers:
- name: build-bookmarks-index
image: mikefarah/yq:4.50.1
image: mikefarah/yq:4.53.2
securityContext:
runAsUser: 1000
runAsGroup: 1000
+1 -1
View File
@@ -1372,7 +1372,7 @@ spec:
fsGroup: 1000
initContainers:
- name: build-bookmarks-index
image: mikefarah/yq:4.50.1
image: mikefarah/yq:4.53.2
securityContext:
runAsUser: 1000
runAsGroup: 1000
+1 -1
View File
@@ -258,7 +258,7 @@ spec:
automountServiceAccountToken: true
containers:
- name: headlamp
image: ghcr.io/headlamp-k8s/headlamp:v0.40.0
image: ghcr.io/headlamp-k8s/headlamp:v0.42.0
imagePullPolicy: IfNotPresent
args:
- "-in-cluster"
+1 -1
View File
@@ -42,5 +42,5 @@ rbac:
# Image configuration
image:
repository: registry.k8s.io/external-dns/external-dns
tag: v0.19.0
tag: v0.21.0
pullPolicy: IfNotPresent
+7
View File
@@ -1,4 +1,11 @@
---
# Image tag override: bumps pihole/pihole to 2026.05.0 without changing
# the chart version. The 2026.05.0 release bundles FTL v6.6.2 which
# imports 6 upstream dnsmasq CVE fixes (covering the dnsmasq 2.92/2.93
# disclosures). No FTL-side config or API changes per the release notes.
# https://github.com/pi-hole/docker-pi-hole/releases/tag/2026.05.0
image:
tag: "2026.05.0"
DNS1: "1.1.1.1" # Cloudflare
DNS2: "8.8.8.8" # Google
DNS3: "9.9.9.9" #Quad9
+8 -5
View File
@@ -3,8 +3,8 @@ image:
# -- The public dockerhub registry
registry: index.docker.io
repository: plexinc/pms-docker
# renovate: datasource=custom.plex depName=plex versioning=loose
tag: "1.43.0.10467-2b1ba6e69"
# renovate: datasource=docker depName=plexinc/pms-docker versioning=regex:^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)\.(?<build>\d+)-[a-f0-9]+$
tag: "1.43.2.10687-563d026ea"
sha: ""
pullPolicy: IfNotPresent
@@ -123,7 +123,7 @@ initContainer:
registry: index.docker.io
repository: alpine
# -- If unset use latest
tag: "3.22"
tag: "3.23"
sha: ""
pullPolicy: IfNotPresent
@@ -181,7 +181,7 @@ rclone:
registry: index.docker.io
repository: rclone/rclone
# -- If unset use latest
tag: 1.70.3
tag: 1.74.3
sha: ""
pullPolicy: IfNotPresent
@@ -235,7 +235,10 @@ statefulSet:
annotations: {}
# -- Optional extra annotations to add to the pods in the statefulset
podAnnotations:
match-regex.version-checker.io/plex-plex-media-server-pms: ^\d+\.\d+\.\d+\.\d+-.*$
# Match only `<X.Y.Z.B>-<short-hash>` (the amd64/native tag form) and exclude
# per-arch tags (e.g. `-armhf`, `-arm64`) so version-checker doesn't show an
# ARM tag as "newer" than our x86_64 install.
match-regex.version-checker.io/plex-plex-media-server-pms: '^\d+\.\d+\.\d+\.\d+-[a-f0-9]+$'
service:
type: LoadBalancer
+1 -1
View File
@@ -372,7 +372,7 @@ spec:
enableServiceLinks: true
containers:
- name: homepage
image: ghcr.io/gethomepage/homepage:v1.10.1
image: ghcr.io/gethomepage/homepage:v1.13.1
imagePullPolicy: IfNotPresent
env:
# Required for external access
+1 -1
View File
@@ -535,7 +535,7 @@ spec:
enableServiceLinks: true
containers:
- name: homepage
image: ghcr.io/gethomepage/homepage:v1.10.1
image: ghcr.io/gethomepage/homepage:v1.13.1
imagePullPolicy: IfNotPresent
env:
# Required for external access
+3 -3
View File
@@ -241,7 +241,7 @@ spec:
value: immich-valkey
- name: TRANSFORMERS_CACHE
value: /cache
image: ghcr.io/immich-app/immich-machine-learning:v2.5.5
image: ghcr.io/immich-app/immich-machine-learning:v2.7.5
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
@@ -336,7 +336,7 @@ spec:
value: http://immich-machine-learning:3003
- name: REDIS_HOSTNAME
value: immich-valkey
image: ghcr.io/immich-app/immich-server:v2.5.5
image: ghcr.io/immich-app/immich-server:v2.7.5
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
@@ -416,7 +416,7 @@ spec:
value: http://immich-machine-learning:3003
- name: REDIS_HOSTNAME
value: immich-valkey
image: docker.io/valkey/valkey:9.0-alpine@sha256:d1cc70645bbcef743615463a2fa4616e841407545e18f560aed0c49671a90147
image: docker.io/valkey/valkey:9.1-alpine@sha256:a35428eba9043cc0b79dbe54100f0c92784f2de00ad09b01182bfb1c5c83d1bd
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
+1 -1
View File
@@ -185,7 +185,7 @@ spec:
spec:
containers:
- name: redis
image: redis:7-alpine
image: redis:8-alpine
imagePullPolicy: IfNotPresent
args:
- redis-server
+1 -1
View File
@@ -136,7 +136,7 @@ spec:
fsGroup: 1000
containers:
- name: filebrowser
image: gtstef/filebrowser:1.1.2-stable
image: gtstef/filebrowser:1.3.3-stable
env:
- name: TZ
value: "Europe/Budapest"
+72 -3
View File
@@ -237,6 +237,75 @@ data:
regex: 'ak-outpost-(.*)-outpost'
replacement: '$1'
# --- end-to-end latency + loss (ICMP) to many destinations ---
- job_name: 'wan-icmp'
metrics_path: /probe
params:
module: [icmp]
scrape_interval: 15s
static_configs:
- targets:
- 8.8.8.8
- 1.1.1.1
- jarrs.eu # Hetzner
- telex.hu
- store.steampowered.com
- 192.168.0.1 # gateway
- 37.191.56.193 # your public IP (update if it changes)
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: wan-monitor.admin-system:9115
# --- HTTP phase breakdown (dns/connect/tls/processing/transfer) ---
- job_name: 'wan-http'
metrics_path: /probe
params:
module: [http_2xx]
scrape_interval: 30s
static_configs:
- targets:
- https://telex.hu
- https://store.steampowered.com
- https://jarrs.eu
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: wan-monitor.admin-system:9115
# --- DNS resolution time per resolver (Pi-hole vs public) ---
- job_name: 'wan-dns'
metrics_path: /probe
params:
module: [dns_udp]
scrape_interval: 30s
static_configs:
- targets:
- 192.168.0.250 # Pi-hole
- 1.1.1.1
- 8.8.8.8
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: wan-monitor.admin-system:9115
# --- irtt (UDP quality) + iperf3 (throughput) textfile metrics ---
- job_name: 'wan-probe'
metrics_path: /metrics
scrape_interval: 30s
fallback_scrape_protocol: PrometheusText0.0.4
static_configs:
- targets: ['wan-monitor.admin-system:9116']
# CloudNativePG - Postgres metrics per instance
- job_name: 'cloudnativepg'
kubernetes_sd_configs:
@@ -348,7 +417,7 @@ spec:
spec:
containers:
- name: prometheus
image: prom/prometheus:v3.9.1
image: prom/prometheus:v3.12.0
args:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
@@ -529,7 +598,7 @@ spec:
runAsGroup: 472
containers:
- name: grafana
image: grafana/grafana:12.3.2
image: grafana/grafana:13.0.2
ports:
- containerPort: 3000
name: http
@@ -621,7 +690,7 @@ spec:
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
memory: 768Mi
volumeMounts:
- name: data
mountPath: /var/lib/grafana
+101
View File
@@ -210,3 +210,104 @@ data:
annotations:
summary: "Longhorn node {{ $labels.node }} storage pressure"
description: "Node {{ $labels.node }} disk usage is at {{ printf \"%.1f\" $value }}%."
# Add this as a new data key (wan-alerts.yml) in the existing
# prometheus-rules ConfigMap (mon-system). Thresholds anchored to One.hu's
# "normal conditions" figures: 700 Mbit/s down / 28 Mbit/s up.
# Throughput is sampled every ~15 min, so `for:` spans >=2 samples to avoid
# firing on a single fluke. Recalibrate floors after a week of baseline data.
# NOTE: uses Prometheus template funcs (humanize/humanizePercentage/humanizeDuration);
# mul/div are NOT valid Prometheus template functions.
wan-alerts.yml: |
groups:
- name: wan-quality-alerts
rules:
# --- upstream loss: the prime suspect for dropped calls / WireGuard ---
- alert: WanUpstreamPacketLoss
expr: wan_irtt_loss_ratio{direction="upstream",condition="idle"} > 0.01
for: 2m
labels:
severity: warning
annotations:
summary: "WAN upstream packet loss to {{ $labels.target }}"
description: "irtt upstream loss {{ $value | humanizePercentage }} (>1%) for 2m. Cable-upstream symptom; capture for ISP."
- alert: WanDownstreamPacketLoss
expr: wan_irtt_loss_ratio{direction="downstream",condition="idle"} > 0.01
for: 2m
labels:
severity: warning
annotations:
summary: "WAN downstream packet loss to {{ $labels.target }}"
description: "irtt downstream loss {{ $value | humanizePercentage }} (>1%) for 2m."
# --- latency / jitter ---
- alert: WanLatencyHigh
expr: wan_irtt_rtt_seconds{stat="max",condition="idle"} > 0.08
for: 5m
labels:
severity: warning
annotations:
summary: "WAN RTT spikes to {{ $labels.target }}"
description: "irtt max RTT {{ $value | humanizeDuration }} (>80 ms) for 5m (idle). Real-time apps will feel this."
- alert: WanJitterHigh
expr: wan_irtt_jitter_seconds{direction="round_trip",condition="idle"} > 0.03
for: 5m
labels:
severity: warning
annotations:
summary: "WAN jitter high to {{ $labels.target }}"
description: "Round-trip jitter {{ $value | humanizeDuration }} (>30 ms) for 5m. Degrades VoIP/video."
# --- bufferbloat: latency added while the line is saturated ---
- alert: WanBufferbloat
expr: |
(
wan_irtt_rtt_seconds{stat="mean",condition="under_load"}
- on(target) wan_irtt_rtt_seconds{stat="mean",condition="idle"}
) > 0.1
for: 0m
labels:
severity: info
annotations:
summary: "WAN bufferbloat on {{ $labels.target }}"
description: "RTT rises {{ $value | humanizeDuration }} under load (>100 ms). Line buckles when saturated."
# --- throughput vs One.hu "normal" 700/28 (alert below 50%) ---
- alert: WanDownloadDegraded
expr: wan_throughput_bits_per_second{direction="download"} < 350e6
for: 20m
labels:
severity: warning
annotations:
summary: "WAN download below half of plan"
description: "Download {{ $value | humanize }}bit/s (< 350M, half of 700 normal) for 20m."
- alert: WanUploadDegraded
expr: wan_throughput_bits_per_second{direction="upload"} < 14e6
for: 20m
labels:
severity: warning
annotations:
summary: "WAN upload below half of plan"
description: "Upload {{ $value | humanize }}bit/s (< 14M, half of 28 normal) for 20m."
# --- the monitor itself stopped producing data ---
- alert: WanProbeStalled
expr: time() - max by(probe) (wan_probe_last_run_timestamp_seconds) > 300
for: 0m
labels:
severity: warning
annotations:
summary: "WAN probe '{{ $labels.probe }}' stalled"
description: "No fresh samples for >5 min. Check the wan-monitor pod / Hetzner endpoint."
- alert: WanBlackboxTargetDown
expr: probe_success{job=~"wan-.*"} == 0
for: 3m
labels:
severity: warning
annotations:
summary: "WAN probe to {{ $labels.instance }} failing"
description: "blackbox {{ $labels.job }} to {{ $labels.instance }} unreachable for 3m."
+6 -3
View File
@@ -392,10 +392,13 @@ spec:
nextcloud-config-hash: 06b49913be13b1f9a81745166dd75ada59e7ddd39e8f6a2c5538affe2a6d1093
php-config-hash: 5a497358af870e06b42325eee83d7c0e5466b7f6819cb49b598559d96def7428
hooks-hash: 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
# Only match the `X.Y.Z-apache` variant tags so version-checker doesn't
# treat the bare `X.Y.Z` server tag as a "newer" version of our apache image.
match-regex.version-checker.io/nextcloud: '^\d+\.\d+\.\d+-apache$'
spec:
containers:
- name: nextcloud
image: docker.io/library/nextcloud:32.0.10-apache
image: docker.io/library/nextcloud:33.0.5-apache
imagePullPolicy: IfNotPresent
env:
- name: SMTP_HOST
@@ -552,7 +555,7 @@ spec:
failureThreshold: 3
initContainers:
- name: postgresql-isready
image: docker.io/bitnamilegacy/postgresql:17.5.0-debian-12-r3
image: docker.io/bitnamilegacy/postgresql:17.6.0-debian-12-r3
resources: {}
securityContext: {}
env:
@@ -637,7 +640,7 @@ spec:
hostIPC: false
containers:
- name: postgresql
image: docker.io/bitnamilegacy/postgresql:17.5.0-debian-12-r3
image: docker.io/bitnamilegacy/postgresql:17.6.0-debian-12-r3
imagePullPolicy: "IfNotPresent"
securityContext:
allowPrivilegeEscalation: false
+1 -1
View File
@@ -27,7 +27,7 @@ spec:
spec:
containers:
- name: onlyoffice
image: onlyoffice/documentserver:9.0.2
image: onlyoffice/documentserver:9.4.0
imagePullPolicy: IfNotPresent
env:
- name: TZ
+2 -2
View File
@@ -89,7 +89,7 @@ spec:
initContainers:
# Configure proxy auth in database before starting
- name: configure-auth
image: filebrowser/filebrowser:v2.54.0
image: filebrowser/filebrowser:v2.63.13
command:
- sh
- -c
@@ -109,7 +109,7 @@ spec:
runAsGroup: 1001
containers:
- name: filebrowser
image: filebrowser/filebrowser:v2.54.0
image: filebrowser/filebrowser:v2.63.13
command:
- filebrowser
- --database=/config/filebrowser.db
+4 -4
View File
@@ -10,7 +10,7 @@ metadata:
labels:
app.kubernetes.io/instance: outline
app.kubernetes.io/name: outline
app.kubernetes.io/version: 1.1.0
app.kubernetes.io/version: 1.8.1
name: outline
namespace: outline-system
spec:
@@ -31,7 +31,7 @@ spec:
spec:
containers:
- name: outline
image: outlinewiki/outline:1.4.0
image: outlinewiki/outline:1.8.1
imagePullPolicy: IfNotPresent
env:
- name: NODE_ENV
@@ -198,7 +198,7 @@ spec:
spec:
containers:
- name: redis
image: redis:7-alpine
image: redis:8-alpine
imagePullPolicy: IfNotPresent
command:
- redis-server
@@ -331,7 +331,7 @@ metadata:
labels:
app.kubernetes.io/instance: outline
app.kubernetes.io/name: outline
app.kubernetes.io/version: 1.1.0
app.kubernetes.io/version: 1.8.1
name: outline
namespace: outline-system
spec:
+2 -2
View File
@@ -71,7 +71,7 @@ spec:
spec:
containers:
- name: redis
image: redis:7-alpine
image: redis:8-alpine
imagePullPolicy: IfNotPresent
ports:
- name: redis
@@ -158,7 +158,7 @@ spec:
enableServiceLinks: false
containers:
- name: paperless
image: ghcr.io/paperless-ngx/paperless-ngx:2.20.6
image: ghcr.io/paperless-ngx/paperless-ngx:2.20.15
imagePullPolicy: IfNotPresent
env:
# Database - using shared PostgreSQL in database-system namespace
+2 -2
View File
@@ -43,7 +43,7 @@ spec:
spec:
containers:
- name: mysql
image: mysql:8.0
image: mysql:8.4
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
@@ -121,7 +121,7 @@ spec:
spec:
containers:
- name: redis
image: redis:7.2.1
image: redis:8.8.0
ports:
- containerPort: 6379
name: redis
+13 -6
View File
@@ -30,7 +30,7 @@ spec:
spec:
containers:
- name: prowlarr
image: linuxserver/prowlarr:version-2.3.0.5236
image: linuxserver/prowlarr:version-2.3.5.5327
imagePullPolicy: IfNotPresent
env:
- name: PUID
@@ -91,7 +91,7 @@ spec:
spec:
containers:
- name: radarr
image: linuxserver/radarr:version-6.0.4.10291
image: linuxserver/radarr:version-6.1.1.10360
imagePullPolicy: IfNotPresent
env:
- name: PUID
@@ -164,7 +164,7 @@ spec:
spec:
containers:
- name: sonarr
image: linuxserver/sonarr:version-4.0.16.2944
image: linuxserver/sonarr:version-4.0.17.2952
imagePullPolicy: IfNotPresent
env:
- name: PUID
@@ -244,7 +244,7 @@ spec:
spec:
containers:
- name: qbittorrent
image: linuxserver/qbittorrent:5.1.4
image: linuxserver/qbittorrent:5.2.1
imagePullPolicy: IfNotPresent
env:
- name: PUID
@@ -705,7 +705,7 @@ spec:
spec:
containers:
- name: radarr
image: linuxserver/radarr:version-6.0.4.10291
image: linuxserver/radarr:version-6.1.1.10360
imagePullPolicy: IfNotPresent
env:
- name: PUID
@@ -904,7 +904,14 @@ spec:
spec:
containers:
- name: seerr
image: docker.io/fallenbagel/jellyseerr:preview-OIDC
# 2026-06-06: migrating from fallenbagel/jellyseerr:preview-OIDC
# (a custom OIDC-capable build) to seerr-team/seerr v3.x — the
# successor project (combined Overseerr+Jellyseerr team rebrand
# from v3.0.0). Mainline now has native OIDC support so we don't
# need the custom build. Migration is auto on first start; backed
# up the config PVC to ~/seerr-backups on dooplex before this PR.
# https://docs.seerr.dev/migration-guide
image: ghcr.io/seerr-team/seerr:v3.3.0
imagePullPolicy: IfNotPresent
env:
- name: TZ
+2 -2
View File
@@ -30,7 +30,7 @@ spec:
spec:
initContainers:
- name: create-superuser
image: vabene1111/recipes:2.5
image: vabene1111/recipes:2.6.9
workingDir: /opt/recipes
command:
- /bin/sh
@@ -106,7 +106,7 @@ spec:
key: email
containers:
- name: tandoor
image: vabene1111/recipes:2.5
image: vabene1111/recipes:2.6.9
imagePullPolicy: IfNotPresent
env:
- name: TZ
+1 -1
View File
@@ -45,7 +45,7 @@ spec:
# Renovate handles it via a customManagers regex defined in
# admin-system/renovate.yaml (the kubernetes manager doesn't
# process inline `# renovate:` comments).
image: ghcr.io/lukegus/termix:release-1.11.0
image: ghcr.io/lukegus/termix:release-2.3.2
imagePullPolicy: IfNotPresent
ports:
- name: http
+1 -1
View File
@@ -30,7 +30,7 @@ spec:
spec:
containers:
- name: uptimekuma
image: louislam/uptime-kuma:2.3.2
image: louislam/uptime-kuma:2.4.0
imagePullPolicy: IfNotPresent
env:
- name: TZ
+1 -1
View File
@@ -28,7 +28,7 @@ spec:
spec:
containers:
- name: vaultwarden
image: vaultwarden/server:1.35.2
image: vaultwarden/server:1.36.0
imagePullPolicy: IfNotPresent
env:
- name: TZ
+3 -3
View File
@@ -130,7 +130,7 @@ spec:
initContainers:
# Configure proxy auth in database before starting
- name: configure-auth
image: filebrowser/filebrowser:v2.54.0
image: filebrowser/filebrowser:v2.63.13
command:
- sh
- -c
@@ -151,7 +151,7 @@ spec:
runAsGroup: 1000
containers:
- name: filebrowser
image: filebrowser/filebrowser:v2.54.0
image: filebrowser/filebrowser:v2.63.13
command:
- filebrowser
- --database=/config/filebrowser.db
@@ -324,7 +324,7 @@ spec:
runAsUser: 0
containers:
- name: nginx
image: nginx:1.27-alpine
image: nginx:1.31-alpine
ports:
- containerPort: 8080
name: http
+7 -5
View File
@@ -144,8 +144,10 @@ spec:
app.kubernetes.io/instance: sparkyfitness
app.kubernetes.io/name: server
annotations:
# Tag format is vMAJOR.MINOR.PATCH.BUILD (e.g. v0.16.6.3)
match-regex.version-checker.io/server: '^v\d+\.\d+\.\d+\.\d+$'
# Tag format used to be vMAJOR.MINOR.PATCH.BUILD (e.g. v0.16.6.3),
# changed to vMAJOR.MINOR.PATCH on 2026-06-01 (v0.16.7+). Accept
# both so historical comparisons + new releases both match.
match-regex.version-checker.io/server: '^v\d+\.\d+\.\d+(\.\d+)?$'
spec:
enableServiceLinks: false
securityContext:
@@ -166,7 +168,7 @@ spec:
echo "PostgreSQL is ready!"
containers:
- name: server
image: codewithcj/sparkyfitness_server:v0.16.6.3
image: codewithcj/sparkyfitness_server:v0.16.8
env:
# ---- Database (owner / superuser role, used for migrations) ----
- name: SPARKY_FITNESS_DB_HOST
@@ -330,12 +332,12 @@ spec:
app.kubernetes.io/instance: sparkyfitness
app.kubernetes.io/name: frontend
annotations:
match-regex.version-checker.io/frontend: '^v\d+\.\d+\.\d+\.\d+$'
match-regex.version-checker.io/frontend: '^v\d+\.\d+\.\d+(\.\d+)?$'
spec:
enableServiceLinks: false
containers:
- name: frontend
image: codewithcj/sparkyfitness:v0.16.6.3
image: codewithcj/sparkyfitness:v0.16.8
env:
- name: SPARKY_FITNESS_SERVER_HOST
value: "sparkyfitness-server"