Commit Graph
1220 Commits
Author SHA1 Message Date
Ruben Hensen bb7e2f2bac node001: distrust the roots above the compromised eMudhra intermediates
The private keys of eight eMudhra intermediates are recoverable
(https://emudhra.we-have-a-problem.com). node001 runs NixOS 25.11 from
March with nss-cacert 3.121, and curl there still accepted a chain via
emSign ECC Root CA - G3. Blacklist that root and Comodo AAA Services root
until nixpkgs ships NSS 3.131.1. Everything node001 talks to chains to
ISRG Root X1.

Already deployed with ./cli update node001, and Gatus, ntfy and Stalwart
were restarted so they reload the trust store.
2026-10-21 11:49:28 +02:00
Ruben Hensen 1efa132f9d Stop FreshRSS + MBG WordPress until PHP is patched
CERT-EU 2026-018 (CVE-2026-109618, CVE-2026-109619, CVSS 9.2): possible
unauthenticated RCE in PHP 5 and later. Both are internet-facing and are
the only PHP workloads (FreshRSS on PHP 8.2.29, WordPress on 8.3.30), so
scale them to 0 until their images ship a fixed PHP. PVCs and the MariaDB
cluster stay as they are.
2026-10-21 09:18:24 +02:00
Ruben Hensen 054117ad6d vault: point External Secrets at the in-cluster Vault service
The store went through https://vault.rubenhensen.nl, so via Hetzner and
the home internet connection. When home internet dropped, the store
validation failed and External Secrets backed off long enough that it
needed a controller restart after the connection came back.

vault-active.vault.svc talks to the active Vault pod directly. It's plain
HTTP, same as the ingress → Vault hop already is.
2026-10-20 15:45:55 +02:00
Ruben Hensen ac61c346af node001: run ntfy at ntfy1.rubenhensen.nl and alert from s1
ntfy listens on 127.0.0.1:2586 behind the same SNI-to-8444 setup as s1.
Users and tokens come from encrypted nix-infra secrets, exported as env
vars by a small wrapper since ntfy and Gatus only read them from the
environment.

s1 alerts on the home services, Scouting MBG and s2. It stays quiet on
mail, which lives on this box and is covered by s2.
2026-10-20 15:34:42 +02:00
Ruben Hensen e23779044f gatus: alert through self-hosted ntfy
Add ntfy at ntfy2.rubenhensen.nl on the home cluster, pointed straight at
the home IP like s2. s2 now alerts on mail and on s1 through it. The
home services are left to s1, which sees them from outside.

ntfy denies everything except the provisioned user. The user, its
password hash and the Gatus token come from Vault kv/ntfy.
2026-10-20 15:34:42 +02:00
Ruben Hensen 53a079dc22 node001: run Gatus at s1.rubenhensen.nl
Gatus listens on 127.0.0.1:8090. nginx gets s1 in the SNI map, sends it
to a local TLS vhost on 8444 with its own ACME cert, and proxies to
Gatus from there. The endpoint list is built from tunneledHosts plus
mail, Scouting MBG and s2, matching gatus/config.yaml.
2026-10-20 11:03:58 +02:00
Ruben Hensen 3ffb10b627 gatus: add s2.rubenhensen.nl status page on the home cluster
Gatus with sqlite history, checking every public service plus its twin
s1.rubenhensen.nl on Hetzner. Replaces the GitHub-hosted Upptime page.

DNS gets s1 (Hetzner) and s2. s2 points straight at the home IP rather
than through the Hetzner tunnel, so it stays reachable when Hetzner is
down.

gatus/README.md explains how to read the two pages and writes down the
plan for a single self-hosted failover URL (PowerDNS LUA records).
2026-10-20 11:03:58 +02:00
Ruben Hensen 145f4eaac4 gitea: pin to 1.27.3 (CVE-2026-60004, CVE-2026-20896, CVE-2026-27771)
The floating gitea/gitea:1 tag with IfNotPresent pull policy left the
node on a cached 1.26.1 image. Pin the version and let Renovate track it.
2026-09-24 11:40:12 +02:00
Ruben Hensen 20cf119dbd Extend authentik + FreshRSS session lifetimes
Authentik's default-authentication-login stage ships with
session_duration: seconds=0, so the SSO session died with the browser.
New blueprint raises it to 30 days for every app on that flow.

FreshRSS runs OIDC through Apache mod_auth_openidc, whose defaults are a
5 minute inactivity timeout and a ~7.5 hour max duration in a non-persistent
cookie. Bumped to a 30 day sliding inactivity window (refreshed on every
request) with a 90 day hard cap, and made the cookie persistent so it
survives a browser restart.
2026-09-03 15:21:07 +02:00
Ruben Hensen ec5405fc29 bolletjestrui: deploy main-10268f1 (routes, voting, push, ride uploads)
Adds the VAPID keypair for web push and raises the ingress body limit to 25m to
match the app's BODY_SIZE_LIMIT, since a bulk route import posts every GPX in one
request.

The VAPID env refs are optional:true on purpose — a missing key in a secretKeyRef
puts the pod in CreateContainerConfigError, and the app already handles absent
keys by sending no notifications.
2026-08-15 17:55:37 +02:00
Ruben Hensen b50f8dc5b6 bolletjestrui: deploy main-8f17b5d (editable etappe titles) 2026-07-24 11:36:21 +02:00
Ruben Hensen 06dd19e5de bolletjestrui: deploy main-878b462 (select chevron fix) 2026-07-24 11:13:54 +02:00
Ruben Hensen 29847b1f12 bolletjestrui: deploy main-cca932c (global scoring setting) 2026-07-24 10:55:50 +02:00
Ruben Hensen 52b58835c0 bolletjestrui: deploy main-b3bfe55 + BODY_SIZE_LIMIT 25M (20MB profile photos) 2026-07-23 23:20:57 +02:00
Ruben Hensen 1d7d625d53 bolletjestrui: deploy main-7e1236d (mobile hamburger menu) 2026-07-23 22:27:43 +02:00
Ruben Hensen a3dadcd50f bolletjestrui: deploy main-923b40f (climb-matching CSV streams fix) 2026-07-23 21:09:47 +02:00
Ruben Hensen 095d82af02 bolletjestrui: bump image to main-60c604c 2026-07-22 12:08:41 +02:00
Ruben Hensen aabe5ad349 bolletjestrui: bump image to main-1a46d10 2026-07-22 11:55:40 +02:00
Ruben Hensen 851f9e4a20 bolletjestrui: bump image to main-041b4e0 2026-07-22 11:40:52 +02:00
Ruben Hensen 0b5eb69f84 bolletjestrui: bump image to main-1e286f5 2026-07-22 11:31:41 +02:00
Ruben Hensen 15d7916e81 bolletjestrui: bump image to main-d21edde 2026-07-22 11:03:46 +02:00
Ruben Hensen d2f5d5eac6 bolletjestrui: bump image to main-86048a8
Even more generous detection; NC climbs now score a point.
2026-07-21 16:53:18 +02:00
Ruben Hensen c0b4a7183b bolletjestrui: bump image to main-b5baf1f
Generous climb detection (min length/grade/score lowered, Cat 4 floor)
and the climb category editor fix.
2026-07-21 16:36:59 +02:00
Ruben Hensen 8e60f6796a node001: tunnel vic.rubenhensen.nl to the home cluster
Add vic.rubenhensen.nl to tunneledHosts so the edge box does SNI
passthrough on :443 and the :80 ACME/redirect vhost for it, matching
the DNS record. Without this, vic falls through to Stalwart on :8443
and cert-manager's HTTP-01 challenge can't be reached.
2026-07-21 15:29:49 +02:00
Ruben Hensen f13417bc8f Add bolletjestrui app + vic.rubenhensen.nl
Deploys ghcr.io/rubenhensen/bolletjestrui at vic.rubenhensen.nl:
- bolletjestrui/ folder: deployment (SQLite on a PVC, migrate-on-start,
  ORIGIN + raised BODY_SIZE_LIMIT for GPX uploads), service, nginx
  ingress with prod-cluster-issuer TLS, PVC, and a Vault ExternalSecret
  (kv/bolletjestrui: site_password, admin_password, key_secret).
- apps/templates/bolletjestrui-folder.yaml: ArgoCD Application.
- dns: vic A record -> 46.224.26.65 (ingress LB).
- renovate: watch bolletjestrui/ for image tag bumps.

Committed locally, not pushed: needs the Vault secret created and the
ghcr package made public first.
2026-07-21 14:33:31 +02:00
Ruben Hensen a11309263e Update home cluster IP to 62.41.86.27 2026-06-06 09:52:36 +02:00
Ruben Hensen 379c050bb3 Update actual-budget to chart 1.8.9 / app 26.6.0 2026-06-03 11:28:10 +02:00
Ruben Hensen 20128bcd73 Add gitea at git.rubenhensen.nl
Single-pod sqlite install (simplest path for a home git host). HTTPS-only,
no SSH listener for now. Wired into the Hetzner tunnel like the other
rubenhensen.nl services.

First visitor to git.rubenhensen.nl can register; Gitea auto-promotes the
first user to admin.
2026-05-19 23:19:21 +02:00
Ruben Hensen ffe8830b5e Tunnel argocd/ha/longhorn/lingo/blog/serpbear through Hetzner
Refactor node001 nginx to drive both the SNI map and the port-80 vhosts
from a single tunneledHosts list so adding a service is one line.
2026-05-19 23:14:04 +02:00
Ruben Hensen 8d383d4261 Tunnel ynab.rubenhensen.nl through Hetzner 2026-05-19 23:04:02 +02:00
Ruben Hensen 00d46b6bd6 Tunnel vault.rubenhensen.nl through Hetzner 2026-05-19 22:56:52 +02:00
Ruben Hensen cb7cba25d0 Tunnel authentik.rubenhensen.nl through Hetzner
Same pattern as rss — needed so the OIDC redirect from freshrss (and
other relying parties) works for clients outside the home LAN.
2026-05-19 22:50:56 +02:00
Ruben Hensen ff9c2d3cef Tunnel rss.rubenhensen.nl through Hetzner
Point rss to the Hetzner box and reverse-proxy/SNI-passthrough back to
the home cluster so cert-manager keeps owning the certificate. Move
stalwart's HTTPS listener to 127.0.0.1:8443 so nginx can take :443 and
dispatch by SNI.
2026-05-19 22:45:55 +02:00
Ruben Hensen 790d7d6f32 Add WF_ENCRYPTION_KEY to mbgwp wordpress 2026-05-18 22:12:45 +02:00
Ruben Hensen 8aef769e78 Fix serpbear PVC permissions 2026-04-25 20:48:27 +02:00
Ruben Hensen 20dfbde02f Add serpbear 2026-04-25 20:39:20 +02:00
Ruben Hensen bb308a3d66 rm phocaslustrum 2026-04-10 21:53:10 +02:00
Ruben Hensen 5a84bbaead rm ttrss 2026-04-10 21:52:08 +02:00
Ruben Hensen 0c4afc9b71 Add oidc actualbudget 3 2026-04-10 21:40:38 +02:00
Ruben Hensen 499cd6826a Add oidc actualbudget 2 2026-04-10 21:32:19 +02:00
Ruben Hensen 068ac20693 Add oidc actualbudget 2026-04-10 21:23:50 +02:00
Ruben Hensen 579e40d2b3 Update port oidc freshrss 2026-04-10 20:59:59 +02:00
Ruben Hensen 428f14efc1 Add oidc freshrss 2026-04-10 20:49:11 +02:00
Ruben Hensen dc85d89904 Add oidc secret for argocd 2026-04-06 18:52:21 +02:00
Ruben Hensen 0fd7bf1135 Add OIDC to argocd 2026-04-06 18:44:32 +02:00
Ruben Hensen faaf6b6729 Remove most hensen.io refs and move from stalwart.rubenhensen.nl to mail.rubenhensen.nl 2026-04-06 18:09:24 +02:00
Ruben Hensen c876a725c1 Move to simpler email setup 2026-04-06 17:55:48 +02:00
Ruben Hensen cfa4c49a2b Remove sogo 2026-04-06 17:42:06 +02:00
Ruben Hensen 1b7fd44117 Add Manage sieve 2026-04-06 14:44:56 +02:00
Ruben Hensen b9ebe42023 Remove sogo quota 2026-04-06 14:25:26 +02:00