218 Commits

Author SHA1 Message Date
2c46ae33c9 debug: temporarily route Jellyfin ingress through header-capture proxy
Some checks failed
validate / lint (push) Failing after 1s
Adds a transparent nginx passthrough that logs auth-related request
headers (Authorization, X-Emby-Authorization, X-Emby-Token,
X-MediaBrowser-Token, User-Agent) to diagnose why the Filebar iOS app
gets 400s on /Users/AuthenticateByName against Jellyfin 12.0. All
traffic still reaches the real jellyfin Service unchanged. Revert the
Ingress backend and remove jellyfin-header-debug.yaml once captured.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016EQrGkfXFae4PZG9QfPRf4
2026-09-14 15:51:07 +09:00
40f6d05c4b fix: revert Jellyfin to 12.0 after 10.11.11 rollback broke DB compatibility
Some checks failed
validate / lint (push) Failing after 1s
10.11.11 can't read the schema Jellyfin 12.0 already migrated the config
DB to (SQLite errors on every user query), which broke login entirely.
Pin to 12.0 instead of :latest to restore service and stop future
silent version jumps.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016EQrGkfXFae4PZG9QfPRf4
2026-09-14 15:45:39 +09:00
b995b9f5c4 fix: update Jellyfin image to version 10.11.11
Some checks failed
validate / lint (push) Failing after 8s
2026-09-14 15:42:09 +09:00
4d613c9c06 fix: make pia-wg PreDown idempotent to prevent restart failures
Some checks failed
validate / lint (push) Failing after 1s
Enabling MSS clamping exposed a general hazard: systemctl restart
wg-quick@pia-wg tears down the live interface using whatever PreDown
rules are on disk right now, not what the interface was actually
brought up with. If Ansible had already rewritten pia-wg.conf with a
changed rule, the live interface (built under the old rules) won't
have whatever the new PreDown line tries to delete - iptables -D fails,
wg-quick's own set -e aborts the whole down/up sequence, and the
interface is left orphaned (never reaches its own built-in ip link
delete step), which then makes the following wg-quick up fail too with
"already exists".

Confirmed against wg-quick's real source (execute_hooks() runs each
hook via `(eval "$hook")`) that appending `2>/dev/null || true` to
each PreDown iptables -D line makes wg-quick treat it as succeeded
regardless of prior state - verified by rendering the template with
Jinja2 directly before trusting it against the live host. This
prevents the failure mode entirely for any future PostUp/PreDown
content change, not just this one.

Add INCIDENT-2026-08-25-vlan50-pia-qbittorrent.md covering all four
issues from this troubleshooting window: the zombie WireGuard tunnel,
a qBittorrent 5.2.0 stale-lock crash loop, the PMTU black hole this
fix addresses, and the restart failure hit while deploying it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 20:08:29 +09:00
8629a36278 fix: allow WireGuard road-warrior clients to reach DNS on minisforum
Some checks failed
validate / lint (push) Failing after 2s
UFW allowed 53/udp+tcp from every other internal subnet but not from
10.10.0.0/24 (the WireGuard client subnet), so once the tunnel itself
was reachable, decrypted DNS queries still got dropped at minisforum's
own INPUT chain before reaching Technitium.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-26 20:45:09 +09:00
b37a816b3e fix: route home LAN through mac WireGuard client, fix broken bool conditionals
AllowedIPs for the mac road-warrior peer was missing 10.10.40.0/24, so
DNS (10.10.40.53) and other home-LAN hosts were unreachable over the
tunnel. Also fixes the same string-vs-bool `when:` failure already
patched in e757850 (recent ansible-core rejects a `-e ...=true` CLI
string in a boolean conditional) for the client-config display tasks.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-26 20:45:09 +09:00
663337f818 feat: add workaround for qBittorrent 5.2.0 stale lock issue with init container
Some checks failed
validate / lint (push) Failing after 1s
2026-08-25 22:27:47 +09:00
e757850c3b fix: ensure boolean evaluation for pia_force_reregister and pia_force_key_rotation in registration conditions
Some checks failed
validate / lint (push) Failing after 2s
2026-08-25 20:59:40 +09:00
2e64687bb9 feat: switch browser-vpn-proxy to LoadBalancer on port 1080
Some checks failed
validate / lint (push) Failing after 0s
Replace the NodePort (30889) with type: LoadBalancer on the standard
SOCKS5 port 1080, at the user's request for a more natural port than a
30000+ NodePort value. loadBalancerIP: 10.10.40.20 (nik-debian) matches
values/gitea.yaml's gitea-ssh Service pattern exactly.

Documented the actual behavior after checking, not assuming: k3s's
ServiceLB (Klipper) binds the port on every node via a DaemonSet by
default - loadBalancerIP only sets the reported external IP, it
doesn't scope which nodes bind the port. That needs a separate
enablelb/lbpool node-label mechanism this repo doesn't use anywhere
yet (including on the existing gitea-ssh Service, which likely has the
same characteristic, unnoticed until now). So this change doesn't
narrow exposure to nik-debian only - it's still reachable at any node
IP on port 1080, the same multi-node reachability the NodePort version
already had, just a different port number.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 00:06:54 +09:00
6f6c3cf0eb feat: decommission legacy gluetun-proxy in favor of browser-vpn-proxy
Some checks failed
validate / lint (push) Failing after 0s
manifests/media/gluetun-proxy.yaml (the standalone Gluetun/OpenVPN
HTTP proxy, NodePort 30888) is now fully replaced by
manifests/multus/30-browser-vpn-proxy.yaml, live and validated
end-to-end (connectivity, DNS-through-proxy, PIA egress, fail-closed
kill switch). Removing the file from git - the live Deployment/Service
still need a separate kubectl delete, since media has prune: false.

Note gluetun.home.arpa (the dashy VPN-IP-banner hostname, and the
Certificate/IngressRoute in qbittorrent.yaml routing it to that pod's
ip-reporter sidecar) is unrelated and unaffected - it never pointed at
this standalone proxy.

Update the root README's VLAN 50 status table with browser-vpn-proxy
and this removal, including the exact commit to restore the old file
from if ever needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 23:48:31 +09:00
462a9d9c79 fix: move browser-vpn-proxy out of the canary's sync-wave gate
Some checks failed
validate / lint (push) Failing after 1s
sync-wave 3 (after the canary's wave 2) was a documentation convention,
not a real dependency, and it broke syncing entirely: this cluster's
argocd-cm ignores /status updates for reconciliation cluster-wide
(resource.customizations.ignoreResourceUpdates.all), so Argo's wave
orchestrator can never observe a freshly recreated Pod's Pending ->
Running transition happening during an active sync - exactly what the
canary does every test round, since it's deleted and recreated each
time. The sync hung forever on "waiting for healthy state of
/Pod/vlan50-canary" even once the pod was actually Running live.

Move browser-vpn-proxy to wave 1, alongside the NAD - the only thing
it actually needs to exist first. Document the root cause and the
kubectl patch to clear a stuck operation in the README, since this
risk applies to anything synced after the canary in this Application,
not just this one file.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 23:40:34 +09:00
b333b5e6d9 feat: activate browser-vpn-proxy content changes (previous commit was a bare rename)
Some checks failed
validate / lint (push) Failing after 1s
The previous commit (89524d4) only captured the file rename - a git
add with one stale/invalid pathspec aborted before staging the actual
content, and the resulting empty diff wasn't caught before committing.
This commit has the real changes described in that one's message:
EXPECTED_VLAN50_IP/NET_RAW on the guard init container, REQUIRE_AUTH
dropped to false with ALLOWED_IPS removed entirely (broken as drafted
- see the file's own header for why), sync-wave 3 annotation, and the
README updates dropping the now-unneeded secret-script references.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 23:20:26 +09:00
89524d45e3 feat: activate browser-vpn-proxy (VLAN 50 SOCKS5 proxy via PIA)
Move manifests/multus/reserved/browser-vpn-proxy.yaml into the active
multus tree (sync-wave 3) now that qBittorrent and JDownloader have
both independently passed their canary, validation, and soak gates -
the precondition this file's own header already called for.

Add EXPECTED_VLAN50_IP/NET_RAW to its guard init container, matching
the fix qBittorrent/JDownloader/canary all needed for the arping-based
checks to run.

Deliberately no auth (REQUIRE_AUTH=false) and no ALLOWED_IPS, after
discussion: access restriction relies on the home network's own
firewall (Trusted/Lab -> Lab NodePort ALLOW, other VLANs DENY except
Technitium DNS), not an app-level control. Along the way, found and
avoided shipping a real bug in the original draft - go-socks5-proxy's
ALLOWED_IPS parses values with net.ParseIP (not CIDR-aware) and
matches with exact net.IP.Equal(), so the drafted "10.10.40.0/24"
value would have produced a nil whitelist entry that matches no real
client, rejecting every connection. This library has no way to express
a subnet allowlist at all - removed rather than left silently broken.

Also drops the now-unneeded browser-vpn-proxy-credentials Secret and
its companion script/README references.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 23:19:48 +09:00
9b799c5ea2 docs: drop stale rollback-file references now that rollback/ is removed
Some checks failed
validate / lint (push) Failing after 1s
qbittorrent.yaml and jdownloader.yaml's own header comments still
pointed at manifests/media/rollback/*-gluetun.yaml and described the
migration as pending approval/preconditions - both are live and
validated now, and that directory is being removed (no kept on-disk
Gluetun copy). Rewrite both headers as a status note instead, pointing
rollback at git history (with the exact pre-migration commit) to match
the root README's rollback table, which gets the same exact-commit
treatment here instead of the vaguer reference from the previous
commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 23:00:40 +09:00
75a371e17d refactor: remove outdated REFACTOR_PLAN.md document
Some checks failed
validate / lint (push) Failing after 1s
2026-08-24 22:59:35 +09:00
c1cde07118 docs: mark VLAN 50/PIA gateway live, drop stale rollback file references
Some checks failed
validate / lint (push) Failing after 0s
Both the root README and manifests/README were still written as if the
whole VLAN 50 migration was drafted-but-unapplied; it's now fully live
and independently validated end to end (canary matrix, both media
workloads' own fail-closed kill-switch test). Update the status line
and PIA region accordingly.

Also drop references to manifests/media/rollback/*-gluetun.yaml, which
is being removed now that qBittorrent/JDownloader are confirmed
working - rollback guidance now points at git history instead of a
kept-file copy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 22:58:33 +09:00
756fa120b3 feat: update JDownloader deployment for VLAN 50 migration with enhanced network configuration and egress guard
Some checks failed
validate / lint (push) Failing after 1s
2026-08-24 22:45:08 +09:00
2f7ec5f5b1 feat: migrate qBittorrent deployment to VLAN 50 with Multus integration and enhanced configuration
Some checks failed
validate / lint (push) Failing after 0s
2026-08-24 22:33:45 +09:00
28d062801a fix: use nft instead of ip6tables/sysctl for IPv6 blocking in vlan50 guard
Some checks failed
validate / lint (push) Failing after 1s
The previous ip6tables->sysctl fix (26894d1) was itself wrong: writing
/proc/sys/net/ipv6/conf/all/disable_ipv6 failed live with "Read-only
file system" despite NET_ADMIN and a passing [ -w ] check - the
container runtime mounts /proc/sys read-only by default regardless of
capabilities, independent of file permission bits. Making it writable
needs either kubelet's securityContext.sysctls (and
net.ipv6.conf.*.disable_ipv6 isn't on its default safe-sysctls
allowlist, so that means a node-level --allowed-unsafe-sysctls flag)
or securityContext.procMount: Unmasked (which needs pod-level user
namespaces) - too much blast radius for one pod's IPv6 kill switch.

nft (nftables) is genuinely present in the same image (the "nftables"
apk package, installed alongside "iptables" but not "ip6tables") and
handles the ip6 address family without a separate binary, so it needs
no image or capability change. Verified by actually running the exact
commands against the real pinned nicolaka/netshoot:v0.11 image
(digest-matched to what's on nik-debian), not just against docs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 22:15:12 +09:00
7ce0dee711 fix: replace ip6tables with disable_ipv6 sysctl in vlan50 egress guard
Some checks failed
validate / lint (push) Failing after 1s
nicolaka/netshoot:v0.11 (the pinned tag actually in use) is built on
Alpine 3.18.0, where ip6tables is packaged separately from iptables;
this image's Dockerfile only installs the latter, so ip6tables does
not exist in the container at all (confirmed live: "ip6tables: not
found", and against Alpine's own v3.18 package index, not master's).

Write 1 to /proc/sys/net/ipv6/conf/all/disable_ipv6 instead - per the
kernel's own ip-sysctl docs this is equivalent to also setting
conf/default/disable_ipv6 and every existing per-interface
disable_ipv6 (lo/eth0/net1) at once, and is strictly stronger than an
iptables DROP policy would have been: no IPv6 activity happens on any
interface at all, not just filtered output. Needs no capability beyond
the NET_ADMIN the guard init container already has.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 22:08:34 +09:00
26894d16ce feat: strengthen VLAN50 canary egress guard and document its lifecycle
Some checks failed
validate / lint (push) Failing after 1s
Diagnosed the vlan50-canary FailedCreatePodSandBox->net1-timeout failure
as a stale Pod artifact of the Multus DaemonSet rollout race (sandbox
created via a transient daemon/shim state mid-rollout; the current,
fully-settled daemon's own logs show no ADD for that UID, only a DEL).
No defect found in 02-daemonset.yaml or 10-nad-vlan50.yaml; both are
unchanged.

Independent of that diagnosis, harden the shared guard script per
review: print safe interface/address/route diagnostics before every
FATAL exit; validate net1 actually carries the workload's expected
static /24 address rather than just existing; add arping-based
duplicate-address and gateway-reachability checks before installing
the net1 default route (exit-code semantics verified against arping's
own source). Requires EXPECTED_VLAN50_IP and NET_RAW (for arping's raw
ARP sockets) on every consumer - wired into 20-canary.yaml now,
qbittorrent.yaml/jdownloader.yaml need the same when they're migrated.

Document the canary's Pod lifecycle: restartPolicy: Never means a
Failed canary never reruns on its own, and Argo "Synced" only reflects
manifest match, not runtime success - recreate it (new UID) after any
Multus/CNI change before trusting its result. Recommend keeping it a
manually recreated, controller-less Pod rather than a Job/Deployment,
since unattended auto-retry risks a duplicate-address race on its
static .100 IP - the exact class of bug this diagnosis just walked
through.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 22:02:27 +09:00
f1bdf11f1e fix: install missing CNI reference plugins (macvlan) for Multus on k3s
Some checks failed
validate / lint (push) Failing after 1s
k3s deliberately ships only the plugins its own flannel networking
needs (bandwidth, bridge, firewall, flannel, host-local, loopback,
portmap — confirmed against k3s's own build script; macvlan's absence
is an intentional upstream scope decision, k3s-io/k3s#9224). Multus's
macvlan delegate for the vlan50 NAD therefore had nothing to exec even
after the binDir/mount fixes.

Add a cni-plugins init container mirroring Rancher's own official
rke2-multus Helm chart (the fix k3s's own docs recommend for this
exact gap): rancher/hardened-cni-plugins, digest-pinned, writing into
our existing cnibin mount instead of the image's hardcoded
/opt/cni/bin, with SKIP_CNI_BINARIES=flannel so it doesn't overwrite
k3s's already-working flannel plugin.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 21:39:23 +09:00
c7cdcc967d fix: mount k3s CNI data parent dir into multus for symlink resolution
Some checks failed
validate / lint (push) Failing after 0s
binDir alone (previous commit) wasn't sufficient: k3s's plugin bin dir
is a directory of symlinks into a content-hash-named sibling directory,
and the narrow cnibin mount didn't cover that sibling. FindInPath's
os.Stat follows symlinks, so it failed inside the container even though
the same path resolves fine on the real host. Mount the parent
(k3s-cni-data) into the main container instead so the symlinks resolve;
the init container keeps the narrower cnibin mount since it only writes
files and never follows them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 21:25:12 +09:00
d410c05e6d fix: correct Multus binDir/cnibin path for k3s delegate plugin exec
Some checks failed
validate / lint (push) Failing after 0s
Root cause: Multus's ChrootExec resolves a delegate plugin's absolute
path from the daemon container's own filesystem view, then execs that
exact path string after chrooting into the real host root. binDir
defaulted to /opt/cni/bin, which is valid inside the container (bind-
mounted to k3s's real bin dir) but doesn't exist on the actual host, so
every pod attaching to the VLAN 50 NAD failed FailedCreatePodSandBox
trying to delegate to flannel. Confirmed against multus-cni's source at
the exact pinned v4.3.0 tag, not assumed. Sets binDir explicitly to
k3s's real path and matches the cnibin mount path to it on both sides of
the chroot boundary (main container and the install_multus init
container).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 20:06:04 +09:00
e980fcb755 feat: add Multus manifests for VPN VLAN 50 (manual sync)
Some checks failed
validate / lint (push) Failing after 1s
CRD, RBAC, thick-plugin DaemonSet (nik-debian only, k3s CNI paths,
digest-pinned), the VLAN 50 NAD (macvlan bridge on enp1s0.50), the
shared pod egress-guard script, a temporary canary pod, and the
not-yet-deployed browser-vpn-proxy workload (kept in reserved/, outside
this Application's non-recursive source path).

Referenced by argocd/apps/multus.yaml (already pushed) but not deployed
by it — that Application has no syncPolicy.automated, so this still
needs an explicit selective sync per resource.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 18:07:40 +09:00
82137f6b2a feat: register multus Argo CD Application (manual sync)
Some checks failed
validate / lint (push) Failing after 1s
Points at manifests/multus/ — deliberately no syncPolicy.automated, so
app-of-apps picking this up only registers the Application; nothing
under it deploys until selectively synced by hand.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 18:05:32 +09:00
7eb7072ec5 feat: add vlan50-parent role for nik-debian's tagged VLAN 50 interface
Some checks failed
validate / lint (push) Failing after 1s
Creates enp1s0.50 on nik-debian (no L3 address, VLAN 40/node IP/default
route untouched) for Multus to later attach macvlan/ipvlan workloads to.

Verified live: enp1s0.50 is up with no IPv4 address (only the automatic
IPv6 link-local, which is expected and harmless), default route
unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 17:56:59 +09:00
325d3bc5c7 feat: add pia-gateway role for minisforum PIA WireGuard egress
Registers minisforum as a PIA WireGuard peer for VPN VLAN 50, with a
boot-ordered kill switch (dedicated PIA-VLAN50 iptables chain + a
terminal unreachable route in a dedicated routing table), multi-region
addKey fallback (Hong Kong -> Taiwan -> JP Tokyo, each region's full
server list, in order), and an observability-only health check.

Verified live against minisforum: registration succeeds, wg-quick@pia-wg
is up.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 17:54:16 +09:00
939a7c6ed1 feat: add routed UFW rules for pod traffic and open NFS/SMB on nik-debian
Some checks failed
validate / lint (push) Failing after 1s
Adds explicit UFW routed-allow rules (10.42.0.0/16 pod-to-pod, pod-to-Technitium
DNS) since these nodes default their routed/FORWARD policy to DROP. Also brings
nik-debian's NFS (2049) and SMB (445) ports under Ansible-managed UFW rules via
the existing nfs-server role, scoped to the Lab/Trusted networks that need them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-23 15:00:45 +09:00
53d02b7522 feat: configure K3s DNS resolver and update firewall rules for new subnet
Some checks failed
validate / lint (push) Failing after 7s
2026-08-23 14:07:49 +09:00
9f9bd04b4b fix: change serviceDns type from LoadBalancer to ClusterIP in Pi-hole configurations
Some checks failed
validate / lint (push) Failing after 8s
2026-08-23 11:46:23 +09:00
0824404f96 fix: update host IP addresses to new subnet 10.10.40.0/24 in documentation
Some checks failed
validate / lint (push) Has been cancelled
2026-08-23 11:42:47 +09:00
fa53b7fee4 fix: disable both Pi-hole instances during DNS migration
Some checks failed
validate / lint (push) Has been cancelled
Set replicaCount: 0 for pihole and pihole-debian so Argo CD's selfHeal
doesn't scale them back up once its git connectivity recovers. Live
deployments already scaled to 0 directly; this just keeps git in sync
with that so it sticks.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-23 11:40:26 +09:00
12b3b48e8d fix: update SERVER_REGIONS environment variable for Gluetun to include additional locations
Some checks failed
validate / lint (push) Has been cancelled
2026-08-23 05:53:12 +09:00
7a8c73d78a fix: update fleet IPs after subnet migration to 10.10.40.0/24
Some checks failed
validate / lint (push) Has been cancelled
minisforum, debian, mac-mini, and gpu-node all moved from
192.168.7.0/24 to 10.10.40.0/24. Updates K3s server/agent config and
node IPs (including gpu-node's host_vars override), NFS export
allow-list and exports template, Pi-hole DNS records and
kube-vip/loadBalancerIP pins, WireGuard's pushed DNS/AllowedIPs, and
the NFS server IP baked into Jellyfin/Kavita/gitea-backup PVs and the
Ollama URL used by ai-gateway/Dashy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-23 05:52:41 +09:00
abc316d7f8 fix: update Gluetun image version to v3.41 for Gluetun, JDownloader, and qBittorrent deployments
Some checks failed
validate / lint (push) Failing after 1s
2026-08-19 01:23:34 +09:00
5512735770 fix: update VPN server regions to use JP Tokyo format for Gluetun, JDownloader, and qBittorrent
Some checks failed
validate / lint (push) Failing after 1s
2026-08-19 01:13:51 +09:00
db862df82c fix: update VPN server regions to include Japan for Gluetun, JDownloader, and qBittorrent
Some checks failed
validate / lint (push) Failing after 1s
2026-08-19 01:11:27 +09:00
bf91e72429 Revert "fix: remove Ingress and TLS configurations for Watch Party and Portfolio services"
Some checks failed
validate / lint (push) Failing after 8s
This reverts commit 3657519b17c16888fbde0946ba5c65c855330d2b.
2026-08-19 00:38:49 +09:00
e15911305f Revert "feat: move Gitea traffic from gitea.nik4nao.com to gitea.home.arpa"
This reverts commit fd13b8a. The registry-host migration broke image
pulls for home-services/portfolio (internal CA not trusted by
containerd) and has left them Degraded for 11 days; reverting back to
gitea.nik4nao.com pending a decision on how to proceed. Not pushed yet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 00:22:27 +09:00
fd13b8aedb feat: move Gitea traffic from gitea.nik4nao.com to gitea.home.arpa
Some checks failed
validate / lint (push) Has been cancelled
The public domain is unreachable while moving, and the cluster had no
Traefik route to Gitea at all (public or internal), leaving every Argo
CD Application stuck in Unknown sync. Add a gitea.home.arpa
Certificate/IngressRoute, repoint Argo CD's repoURL, Gitea's own
DOMAIN/ROOT_URL/SSH_DOMAIN, the container registry references, the
Gitea Actions runner, and the watch-party clone URL at the internal
hostname.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 23:06:02 +09:00
3657519b17 fix: remove Ingress and TLS configurations for Watch Party and Portfolio services
Some checks failed
validate / lint (push) Failing after 1s
2026-08-07 16:22:33 +09:00
36ac94ccf3 fix: increase memory requests and limits for kavita2 deployment
Some checks failed
validate / lint (push) Failing after 0s
2026-08-02 18:10:01 +09:00
0a997367f0 fix: update VPN server regions for JDownloader deployment
Some checks failed
validate / lint (push) Failing after 1s
2026-08-02 03:05:05 +09:00
d31f85f4b3 fix: increase failureThreshold for livenessProbe in Gluetun and qBittorrent deployments
Some checks failed
validate / lint (push) Failing after 0s
2026-08-02 02:32:51 +09:00
bcc697db7e feat: add second Kavita instance with NFS and IngressRoute at books2.home.arpa
Some checks failed
validate / lint (push) Failing after 0s
fix: update Pi-hole configurations to include DNS entry for books2.home.arpa
2026-08-02 02:30:17 +09:00
423d9eacab feat: add Kavita e-book server configuration with NFS and IngressRoute
Some checks failed
validate / lint (push) Failing after 0s
2026-08-02 01:54:23 +09:00
47e3a8992a feat: add custom DNS entries for books.home.arpa in Pi-hole configurations
Some checks failed
validate / lint (push) Failing after 0s
2026-08-02 01:53:59 +09:00
6277c7fa33 alert-bridge: switch ingress from HTTPS to plain HTTP
Some checks failed
validate / lint (push) Failing after 1s
Callers on the LAN (e.g. nik-gpu) don't trust this cluster's internal CA,
and installing it everywhere was judged not worth it for a LAN-only,
bearer-token-authenticated endpoint. Drops the internal-CA Certificate and
switches the IngressRoute from websecure to the web entrypoint.
2026-08-01 23:00:06 +09:00
85cc8494fa feat: add alert bridge service and related configurations
Some checks failed
validate / lint (push) Failing after 1s
2026-08-01 22:51:59 +09:00