146 Commits

Author SHA1 Message Date
d44295f569 fix: add resource requests/limits and probes to workloads that had none
Stage 7 of REFACTOR_PLAN.md (findings #16). Covers dashy, glances,
ca-installer, authentik-proxy-outpost, jellyfin, qbittorrent/jdownloader main
containers (their gluetun sidecars already had probes), and all 4 Immich
Deployments -- previously none of these had any protection against one
workload starving another on this fixed-capacity cluster, nor automatic
restart on hang.

Values are sized from live `kubectl top pod` baselines gathered this session
(not guessed): e.g. Jellyfin/Immich-server were observed at ~3.1-3.3Gi
resident, so their limits give headroom above that (4Gi) rather than an
arbitrary round number. Used tcpSocket probes instead of httpGet wherever I
wasn't certain of an app's exact health-check path (Immich, Postgres/Redis),
to avoid a wrong path causing false probe failures on a live service.

This is Kubernetes-native and takes effect on next pod restart, but should
still be rolled out watching `kubectl top`/restart counts rather than pushed
and forgotten -- limits set too low can OOMKill under real load.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:21:03 +09:00
d0887ac648 fix: Argo CD bootstrap normalization -- adopt cert-manager/Authentik config, fix policy drift
Stage 5 + part of Stage 6/7 of REFACTOR_PLAN.md. This is the highest-risk
stage per the plan -- these Applications are NOT to be pushed/synced blindly.
Each needs `kubectl diff` against live state one at a time before enabling.

New Applications (previously-live resources with zero GitOps coverage):
- cert-manager-config.yaml (manifests/cert-manager: both ClusterIssuers + the
  internal CA Certificate -- every TLS cert in the cluster depends on these,
  and nothing currently restores them on a cold rebuild).
- authentik-config.yaml (manifests/authentik: ingress, proxy outpost,
  middleware -- raw manifests only, low risk).
- authentik.yaml (the Authentik Helm chart itself): sync is deliberately left
  MANUAL and targetRevision is a REPLACE_ME placeholder -- I don't have a safe
  way to read the live chart version (`helm list -n authentik`), and guessing
  wrong risks an unwanted upgrade/downgrade of the SSO IdP gating Argo CD/
  Grafana/Gitea logins. Needs your input before this one goes anywhere.
- network.yaml: widens coverage to the 4 non-sealed files in manifests/network
  (ddns-cronjob, glances-debian-ingress, traefik-dashboard-ingress,
  watch-party-ingress) that were previously invisible to Argo CD; keeps
  network-secrets.yaml scoped to *-sealed.yaml only.

Fixes:
- homeassistant.yaml: destination.namespace was "homeassistant" (empty,
  unused) while the actual resources are hardcoded to "default" -- corrected,
  dropped CreateNamespace=true. The old empty namespace isn't auto-deleted
  (prune: false); safe to remove by hand if desired.
- gitea-backup.yaml: added the missing Namespace object (nothing created
  "gitea-backup" before); replaced a cluster-wide ClusterRole/ClusterRoleBinding
  granting pods/exec everywhere with a Role/RoleBinding scoped to the `gitea`
  namespace, matching what the backup script actually execs into. NOTE: this
  is already under active sync via gitea-secrets.yaml (selfHeal: true,
  prune: false) -- once pushed, the old ClusterRole/ClusterRoleBinding will
  need manual `kubectl delete` since Argo CD won't prune them.
- Added sync-wave "-2" to cert-manager/sealed-secrets Applications so their
  CRDs land before consumers (matches the existing -1/0 wave pattern).
- Normalized targetRevision HEAD -> main on home-services/otel-collector/tempo.
- Normalized sync policy per your decision: home-services/otel-collector/tempo
  prune true -> false; pihole/pihole-debian selfHeal false -> true (repo-wide
  consistency, per your call on finding #18).

Verified: kubeconform valid across all manifests + Argo CD Application objects.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:20:54 +09:00
a859e83ea6 docs: track refactor plan progress, record new findings from live cluster checks
Marks Stages 1-4 and part of Stage 6 done in the tracker. Records three things
discovered via read-only kubectl checks during this session that weren't in
the original audit: Grafana/Loki's static PVs are orphaned (dynamically
provisioned via local-path instead), Finding #24 (GPU passthrough) is actually
working and doesn't need fixing, and live node hostnames differ cosmetically
from ansible/inventory.yaml's aliases.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:15:17 +09:00
5a00f5767b fix: Ansible cleanup -- merge dual config, pin collections, align K3s version, fix bugs
Stage 4 of REFACTOR_PLAN.md.

- Merge ansible/ansible.cfg into root ansible.cfg (single source of truth);
  the dual-config setup silently broke documented commands and lost
  host_key_checking=False when run from the ansible/ directory.
- Add ansible/requirements.yml pinning community.general, ansible.posix,
  community.docker -- previously undocumented deps of the glances/watch-party
  roles that would fail a fresh bootstrap.
- Align K3s version to v1.32.4+k3s1 across roles/k3s-server, roles/k3s-agent,
  and host_vars/gpu-node.yaml defaults (was skewed: .2 vs .4). This only
  changes what a *future* provision installs -- minisforum/debian are still
  live on v1.32.2+k3s1 until separately upgraded.
- Fix kubeconfig fetch/replace path mismatch in k3s-server role: the `fetch`
  task (flat: true) writes to ~/.kube/config, but `replace` was targeting a
  /tmp/k3s-minisforum.yaml nothing creates -- would break a fresh rebuild.
- gitea-runner: only remove /run/docker.sock when it's actually a directory
  (task name implied a check that wasn't there); tighten registration-token
  systemd unit from 0644 to 0600.
- nvidia: stop unconditionally reporting `changed` (and restarting Docker)
  on every run for an idempotent runtime-configure command.
- Gate the K3s join-token debug print and WireGuard client-config/QR display
  behind opt-in vars (k3s_show_token, wireguard_show_client_configs), default
  off -- both were printing real secrets to console on every run.
- Parameterize the docker role for Debian and Ubuntu; homeassistant now
  depends on it (meta/main.yaml) instead of duplicating a Debian-only Docker
  install inline.
- FQCN cleanup across wireguard, homeassistant, and ollama roles/handlers
  (bare module names -> ansible.builtin.*/community.general.*/ansible.posix.*),
  plus a few ansible-lint name-casing/idiom fixes. Handler renames verified
  against their `notify:` call sites so notifications still fire.
- Update ansible/README.md and root README.md: add gpu-node/gpu_workstation
  (4th host, previously undocumented), docker/nvidia roles, setup-gpu-node.yaml,
  homeassistant.yaml, requirements.yml install step; correct the "Legacy"
  homeassistant label (it's the only thing serving ha.home.arpa); correct the
  Gitea ingress/backup-storage doc-drift; flag the Grafana/Loki static-PV
  binding drift discovered via live cluster check.

Verified: all playbooks pass `ansible-playbook --syntax-check`, yamllint clean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:15:12 +09:00
57a78fd8e7 fix: remove orphaned DNS entry, sync Pi-hole DNS drift between primary/secondary
Stage 3 + 6 of REFACTOR_PLAN.md.

- Drop nik4nao.home.arpa from both Pi-hole values files: no Certificate,
  Ingress, or IngressRoute anywhere references it (confirmed via grep).
- Add the immich.home.arpa and gluetun.home.arpa entries that existed in
  values/pihole.yaml but were missing from values/pihole-debian.yaml --
  Pi-hole has no wildcard DNS here, so every hostname must be listed in both.

Both files' hostname lists now match exactly (aside from the differing
target IPs, which is expected for primary vs. secondary).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:14:54 +09:00
08d2b97410 chore: add yamllint and ansible-lint configs for local validation
Stage 2 of REFACTOR_PLAN.md. Repo had no CI or local validation tooling at
all. Tuned rules to match this repo's existing conventions (no trailing
newline on hand-written manifests, aligned comment blocks) rather than
rewriting hundreds of pre-existing files to satisfy defaults.

Baseline is clean: yamllint reports 0 issues repo-wide, kubeconform validates
117 manifests + 20 Argo CD Applications, and all Ansible playbooks pass
--syntax-check.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:14:50 +09:00
e6550d0e39 fix: rotate Gitea DB password and Dashy API key off plaintext, fix internal CA issuerRef
Stage 1 of REFACTOR_PLAN.md. values/gitea.yaml and config/dashy/conf.yaml now
reference secrets injected at apply-time (gitea-postgres-secret.sh, .env) instead
of hardcoding a live DB password and weather API key in git. Both values must be
treated as compromised and rotated by the operator (see .env.example).

Also fixes authentik-ingress.yaml and traefik-dashboard-ingress.yaml, which
pointed at the internal-ca root ClusterIssuer instead of internal-ca-issuer,
the chained issuer every other internal Certificate uses -- causing untrusted-cert
warnings on the SSO login and Traefik dashboard.

Extends .gitignore for *.retry, .vault_pass*, kubeconfig patterns, and editor
swap files.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 18:14:46 +09:00
f0d2f23a0f feat: add SwitchBot token and secret to environment configuration and update ha-gateway secret and deployment 2026-07-23 13:57:07 +09:00
791c0a5fa5 feat: add infrastructure change reviewer and secrets leak scanner, update CLAUDE.md with operational guidance 2026-07-23 11:25:20 +09:00
e7718ce356 feat: add GPU node setup with Docker and NVIDIA support, including configuration files and playbook updates 2026-07-23 11:07:18 +09:00
f80848c57e fix: update JDownloader VPN configuration to use Singapore server region 2026-05-24 17:05:53 +09:00
0bf7f0f597 feat: add configuration for GPU node setup and update Ollama role for cross-platform support 2026-05-20 23:17:23 +09:00
d3069eb234 fix: update SSH configuration for security and add inotify limits 2026-05-16 18:50:01 +09:00
7a2caa824d fix: update HTTPPROXY_LISTENING_ADDRESS format to include port prefix 2026-05-16 17:28:45 +09:00
620068624d fix: update Gluetun image version to v3.41.1 in Gluetun, JDownloader, and qBittorrent deployments 2026-05-16 17:26:21 +09:00
21f3c545b9 feat: add health checks for Gluetun proxy, JDownloader, and qBittorrent deployments 2026-05-16 17:25:16 +09:00
3e0ed35e24 fix: update SERVER_REGIONS for Gluetun proxy to include South Korea and Taiwan 2026-05-16 06:59:55 +09:00
cce74a88e8 fix: update SERVER_REGIONS for JDownloader and qBittorrent to include additional locations 2026-05-16 06:58:29 +09:00
0e0d74d816 fix: update ignoreDifferences for loki-stack ConfigMap to include /data 2026-05-15 04:11:39 +09:00
cc070cee61 feat: add Gluetun proxy deployment and service configuration 2026-05-13 22:30:26 +09:00
5fde45b374 feat: add Gluetun proxy deployment and service configuration 2026-05-13 22:28:50 +09:00
c39ae7bd3c feat: add new services and status items to Dashy configuration 2026-05-13 01:07:59 +09:00
c373b828d1 fix: remove Photoview references from configuration and documentation 2026-05-13 00:40:15 +09:00
449b60b38f fix: improve IP retrieval logic with retry mechanism and timeout 2026-05-12 23:16:40 +09:00
367a456bcc fix: specify charset in Content-Type header for HTML response 2026-05-12 23:13:25 +09:00
8381be79e2 fix: update X-Frame-Options to Content-Security-Policy for enhanced security 2026-05-12 23:10:49 +09:00
d674fa9ddc feat: enhance IP reporter response with HTML formatting and styling 2026-05-12 23:06:33 +09:00
30fa7aa9ce fix: update iframe URL in Dashy config for public IP retrieval 2026-05-12 22:59:28 +09:00
4c62bfa7b8 feat: replace gluetun-auth ConfigMap with ip-reporter service for public IP retrieval 2026-05-12 22:56:07 +09:00
b2024efb7e fix: correct syntax for auth configuration in gluetun ConfigMap 2026-05-12 22:46:36 +09:00
d310a8ba16 fix: update gluetun-auth ConfigMap to use correct syntax for routes 2026-05-12 22:43:36 +09:00
6e5b8fa241 feat: add gluetun authentication ConfigMap and mount it in qBittorrent deployment 2026-05-12 22:41:45 +09:00
5275c5186a Added setting to disable auth 2026-05-12 22:37:51 +09:00
8bc36e4a0b feat: add name to web port in qBittorrent service configuration 2026-05-12 22:34:02 +09:00
3209a13ed6 feat: enhance Dashy configuration with new Downloads section and integrate gluetun API for VPN IP display
feat: update qBittorrent deployment to expose gluetun API on port 8000 and add TLS certificate for secure access
feat: add gluetun DNS entry to Pi-hole configuration for improved network management
2026-05-12 22:32:20 +09:00
b9638c0ad9 feat: enable BLOCK_IPV6 in JDownloader and qBittorrent configurations 2026-05-12 20:12:07 +09:00
7742509a29 feat: update SERVER_REGIONS value to 'Hong Kong' in JDownloader and qBittorrent configurations 2026-05-12 20:06:34 +09:00
95b27c4eb2 feat: update SERVER_REGIONS value to 'JP Tokyo' in JDownloader and qBittorrent configurations 2026-05-12 20:00:25 +09:00
d2b36080a6 feat: update VPN_TYPE to openvpn in JDownloader and qBittorrent configurations 2026-05-12 19:59:05 +09:00
cfce656854 feat: add gluetun VPN container and pia-credentials management for secure connections 2026-05-12 19:52:56 +09:00
0aa886b6a2 feat: update qBittorrent image version to 5.2.0 2026-05-10 01:32:10 +09:00
16f3b4ec13 added DS_Store to the gitignore 2026-05-06 19:49:08 +09:00
4cc3af39d6 feat: update README files to enhance documentation for Ansible, Argo CD, and Kubernetes manifests 2026-05-06 19:42:33 +09:00
f9b0e53988 Move file 2026-05-06 01:44:28 +09:00
0c0254b03d feat: add CA sync service account, roles, role bindings, and cron job for certificate rotation management 2026-05-06 01:21:22 +09:00
7f1462658b feat: update Immich server and machine learning images to v2.7.5 2026-05-01 19:50:22 +09:00
1ceb8209bc feat: add Immich database credentials and deployment configuration 2026-05-01 19:43:09 +09:00
861f9c9688 feat: increased timeout limit 2026-04-21 23:21:34 +09:00
f0bef8e4c1 feat: add model checking and conditional pulling for Ollama models 2026-04-21 22:53:25 +09:00
54d368d462 feat: add ai-gateway deployment and service configuration with TLS support 2026-04-21 22:04:22 +09:00