Commit Graph
4354 Commits
Author SHA1 Message Date
k.renner fa9754475c ci: add setup-woodpecker workflow for Ansible provisioning
Manual-trigger workflow that provisions:
1. Woodpecker server (LXC 231) with Docker + Compose
2. Woodpecker agents (LXC 910-911) with Docker + agent
3. Caddy update with ci.renner.uno reverse proxy
2026-03-16 22:17:25 +01:00
k.renner fb8a76545d fix(opentofu): set storage to local-zfs for woodpecker agents
Security Audit / Infrastructure Scan (IaC) (push) Successful in 21s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 1m54s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 2m31s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 32s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 22s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 29s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m22s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 33s
Deploy Infrastructure / plan (push) Successful in 15m59s
Deploy Infrastructure / apply (push) Successful in 59s
Deploy Infrastructure / integration-tests (push) Successful in 13s
Empty storage string caused Proxmox API 400 error. Server LXC 231
was created successfully, only agents 910/911 need this fix.
2026-03-16 21:44:34 +01:00
k.renner c5bc901c3a chore(vault): add Woodpecker Gitea OAuth credentials 2026-03-16 21:27:06 +01:00
k.renner f34108b252 feat: add Woodpecker CI to replace Gitea Actions
Security Audit / Infrastructure Scan (IaC) (push) Successful in 24s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 1m52s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 2m20s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 29s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 19s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 25s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m25s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 19s
Deploy Infrastructure / plan (push) Successful in 16m2s
Deploy Infrastructure / apply (push) Failing after 55s
Deploy Infrastructure / integration-tests (push) Has been skipped
Deploy Woodpecker CI server (LXC 231) and 2 agents (LXC 910-911):

OpenTofu:
- lxc_231_woodpecker.tf: Server on jupiter, 1GB RAM, ci.renner.uno
- woodpecker_agents.tf: 2 agents with Docker, 2GB RAM each
- locals.tf: Add woodpecker_agents spec list
- variables.tf: Add woodpecker_agent_count variable

Ansible:
- woodpecker-server role: Docker Compose, SQLite, Gitea OAuth
- woodpecker-agent role: Docker Compose, GRPC to server
- Playbooks for server and agent install
- Inventory entries and group_vars with vault secrets
- Caddy reverse proxy entry for ci.renner.uno

Woodpecker pipelines (.woodpecker/):
- build-caddy.yml: Custom Caddy binary build
- deploy-infrastructure.yml: OpenTofu plan + apply
- security-scan.yml: Trivy IaC and Docker image scans

Vault: Added GRPC secret and Gitea OAuth placeholder secrets.
2026-03-16 21:23:27 +01:00
k.renner 1d59c5d9d3 fix(caddy): upgrade to v2.11.2 to satisfy caddy-l4 dependency
Security Audit / Infrastructure Scan (IaC) (push) Successful in 25s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 1m57s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 2m27s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 27s
Build Caddy Custom / build (push) Successful in 5m35s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 21s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 21s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 20s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m14s
caddy-l4 requires caddy/v2 >= v2.11.2. Also bump caddy_version in
Ansible defaults to match.
2026-03-16 20:19:53 +01:00
k.renner 99c4e21d15 feat(caddy): add layer4 TCP proxy for Gitea SSH on port 2222
Security Audit / Infrastructure Scan (IaC) (push) Successful in 33s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 2m1s
Build Caddy Custom / build (push) Failing after 2m50s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 1m5s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 51s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 43s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 3m14s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 17s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m26s
Add caddy-l4 plugin to xcaddy build to enable TCP-level routing.
Configure a layer4 listener on port 2222 that proxies all connections
to gitea.srv.renner.uno:22, enabling SSH git operations via the
Caddy ingress VIP without conflicting with system SSH on port 22.
2026-03-16 20:02:34 +01:00
k.renner 318b51d864 fix(ansible): update hardcoded paths from ~/homelab to ~/source/homelab
ansible.cfg inventory and vault_password_file paths were pointing to
~/homelab which was the path on fortress. Updated to ~/source/homelab
to work from workstation after cloning the repo locally.
2026-03-16 17:47:37 +01:00
k.rennerandClaude 83725358f0 fix(audiobookshelf): Add playbook to fix upload permissions
Security Audit / Infrastructure Scan (IaC) (push) Successful in 31s
Deploy Infrastructure / plan (push) Successful in 1m18s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 2m4s
Deploy Infrastructure / apply (push) Successful in 1m55s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 3m22s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 31s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 21s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 17s
Deploy Infrastructure / integration-tests (push) Successful in 2m1s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m31s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 1m29s
The /audiobooks and /metadata directories were owned by root,
preventing the audiobookshelf service from creating new directories
for uploads. This playbook sets correct ownership to audiobookshelf user.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-14 21:15:39 +01:00
k.rennerandClaude 60a1c6404f fix(netbird): Disable prompt=login to prevent double authentication
The NetBird PKCE flow was sending prompt=login in the OAuth authorization
request, which caused Authentik to force re-authentication even after the
user had already authenticated. This resulted in users seeing two identical
login prompts before the desktop client callback was reached.

Setting DisablePromptLogin: true prevents the prompt=login parameter from
being sent, allowing Authentik to use the existing session.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-06 16:16:29 +01:00
k.rennerandClaude ae35dca90f feat(common): Disable NTP on VMs and LXC containers
VMs should use kvm-clock from hypervisor, and LXC containers inherit
time from the host. Running systemd-timesyncd is unnecessary and can
cause time sync conflicts.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 21:51:08 +01:00
k.rennerandClaude 3788f4ac4c feat(common): Disable NTP on VMs - use kvm-clock from hypervisor
VMs should get time from the hypervisor via kvm-clock, not run their
own NTP client. This prevents unnecessary NTP traffic and ensures
consistent time across all VMs.

Added to common role with condition: ansible_virtualization_type == 'kvm'

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 21:49:45 +01:00
k.rennerandClaude 468c850f2d feat(ntp): Add serverstats metrics to chrony exporter and dashboard
- Configure chrony_exporter to run as _chrony user for unix socket access
- Enable serverstats collector for NTP request statistics
- Add ReadWritePaths=/run/chrony for systemd security compatibility
- Add cmdallow 127.0.0.1 to chrony config for UDP command access
- Update NTP Overview dashboard with server statistics:
  - Total NTP requests counter
  - Dropped NTP requests counter
  - Command packets counter
  - NTP request rate time series

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 21:37:54 +01:00
k.rennerandClaude 2877161fcb docs: Add lesson learned about reading documentation first
Added chrony_exporter lesson: always read the README before attempting
workarounds. The docs clearly stated UDP is default and unix socket
requires root.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 21:20:21 +01:00
k.rennerandClaude 0c4bd37d6a feat(monitoring): Add chrony_exporter for NTP stratum metrics
- Add chrony-exporter role to install and configure chrony_exporter
- Update chrony-ntp-server to use UDP command interface (port 323) instead of unix socket for easier exporter access
- Add chrony job to Prometheus scrape config
- Update NTP Overview dashboard with stratum panels for jupiter/saturn/neptune
- Add timex collector to node_exporter on PVE hosts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 21:17:33 +01:00
k.rennerandClaude ebcbe50d17 feat(monitoring): Add NTP cluster monitoring to PVE hosts
- Install node_exporter with timex collector on PVE cluster (jupiter, saturn, neptune)
- Add PVE hosts as Prometheus scrape targets for NTP metrics
- Update NTP Overview dashboard to show actual cluster status
- Add install-node-exporter-pve.yml playbook for PVE deployment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 20:52:44 +01:00
k.rennerandClaude 551ce4c6fc feat(grafana): Add NTP Overview dashboard
Add new dashboard for monitoring NTP/time synchronization across the infrastructure:
- NTP HA cluster status panels for DNS-1, DNS-2, DNS-3
- Hosts synchronized/not synced counters
- Average time offset stat
- Time offset history graphs for NTP cluster and all hosts
- Detailed table with host sync status, offset, and max error

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 20:46:43 +01:00
k.rennerandClaude 935f41b978 feat(ntp): Add playbook to configure VM time sync from host
VMs should get time from Proxmox host via kvm-clock instead of
running their own NTP client. This playbook:

- Detects VMs using kvm-clock
- Disables and masks systemd-timesyncd
- LXC containers already inherit host time automatically

Usage: ansible-playbook plays/configure-vm-time-sync.yml

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 19:46:56 +01:00
k.rennerandClaude 95e725fe53 feat(shelly): Add playbook to configure NTP on Shelly devices
Discovers all Shelly devices on IoT networks via HTTP API and
configures them to use the local HA NTP server (ntp.renner.uno).

Supports:
- Gen1 devices (via /settings endpoint)
- Gen2/Gen3/Gen4 devices (via /rpc/Sys.SetConfig endpoint)

Usage: ansible-playbook plays/configure-shelly-ntp.yml

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 19:35:27 +01:00
k.rennerandClaude 4345fd96a6 feat(ntp): Use PTB stratum 1 servers as upstream
Switch from Debian pool to PTB (Physikalisch-Technische Bundesanstalt)
atomic clock servers for more accurate time synchronization:
- ptbtime1.ptb.de (preferred)
- ptbtime2.ptb.de
- ptbtime3.ptb.de

Keeps de.pool.ntp.org as fallback.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 19:30:59 +01:00
k.rennerandClaude 0d6bdab256 feat(ntp): Add HA NTP cluster on Proxmox hosts
Deploy chrony NTP servers on all 3 PVE hosts (jupiter, saturn, neptune)
with keepalived VIP failover at 10.2.40.4.

- chrony-ntp-server role: Configures chrony to serve NTP to local networks
- keepalived-ntp role: Manages VIP failover with NTP health checks
- install-ntp-ha.yml: Deployment playbook for the HA cluster

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 19:24:46 +01:00
k.rennerandClaude 6232c61aa9 fix(paperless): Ensure Syncthing .stfolder marker exists
Add Ansible task to create the .stfolder marker in the consume directory
when Syncthing is enabled. This prevents sync failures when the marker
gets accidentally deleted.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-04 19:07:49 +01:00
k.rennerandClaude 5238f20a3b fix(grafana): Use correct battery power sensors in power-flow dashboard
- Changed from single battery_power sensor (unsigned) to separate
  battery_power_in_absolute and battery_power_out_absolute sensors
- battery_power_out_absolute correctly shows discharge power
- battery_power_in_absolute correctly shows charge power
- Updated timeseries panel to use out - in for signed battery power
- This fixes the incorrect battery values shown in the flow diagram

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 17:44:40 +01:00
k.rennerandClaude 5af19cd495 feat(grafana): Use ECharts for power flow visualization
Replace Sankey panel with Business Charts (ECharts) plugin for creating
custom power flow visualization with:
- Circular nodes for Solar, Grid, Battery, Home
- Animated flow dots showing energy direction
- Color-coded connections based on power source/destination
- Real-time power values and battery SOC display

Also adds grafana host to static inventory for reliable deployments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 16:26:33 +01:00
k.rennerandClaude c9d65d3646 feat(n8n): Add n8n workflow automation server
- Add LXC container configuration (ID 230, 4GB RAM, 2 cores)
- Create Ansible role with Docker Compose deployment
- Configure PostgreSQL database for production reliability
- Add reverse proxy configuration in Caddy HA
- Store secrets (encryption key, DB password) in Ansible vault

n8n v2.11.0 accessible at https://n8n.renner.uno

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 16:24:38 +01:00
k.rennerandClaude 8ac755c23f feat(grafana): Add Sankey panel for power flow visualization
Install netsage-sankey-panel plugin and update power flow dashboard to
use it for visualizing energy flow from sources (Solar, Grid, Battery)
to destinations (Home consumption by floor).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 16:18:09 +01:00
k.rennerandClaude c4d3a2bb9f fix(grafana): Replace flowcharting plugin with SVG-based power flow diagram
The Grafana flowcharting plugin is Angular-based and incompatible with
Grafana 12. This replaces it with an embedded SVG in a Text panel showing
power flow visualization (Solar, Grid, Battery, Home) with colored nodes
and flow lines.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 16:13:18 +01:00
k.rennerandClaude 114d7855e3 feat(grafana): Add flowcharting plugin for power flow visualization
- Add agenty-flowcharting-panel plugin installation task
- Create draw.io-based energy flow diagram with:
  - Solar, Grid, Battery, Home nodes as circles
  - Colored flow lines connecting nodes
  - Data bindings for live power values
- Add floor breakdown and large consumers side panels
- Matching colors: Solar(amber), Grid(blue), Battery(green), Home(orange)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 16:04:27 +01:00
k.rennerandClaude baa97bb0f6 fix(grafana): Correct Canvas field bindings in power flow dashboard
- Fix Solar field reference from "Value" to "Value #A"
- Fix House calculation to sum floor power consumption instead of
  complex clamp_min formula that returned no data

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 15:53:33 +01:00
k.rennerandClaude f1745002be feat(grafana): Add Canvas panel with visual flow connections
Update power-flow dashboard with:
- Canvas panel showing graphical flow from sources to sinks
- Visual connections between Solar/Grid/Battery and House
- Visual connections from House to floor-level consumers (KG/EG/OG/DG)
- Large consumers section with Server, Heat Pump, Battery Charging, Garden
- Color-coded elements matching the flow colors

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 12:14:05 +01:00
k.rennerandClaude 65c27073e3 feat(grafana): Add power flow dashboard with floor-based visualization
Creates a comprehensive power flow dashboard showing:

Sources:
- Solar production (Vitocharge 03)
- Grid import/export
- Battery level and charge/discharge status

Sinks by Floor:
- KG (Keller) with server breakdown
- EG (Erdgeschoss) room breakdown
- OG (Obergeschoss) room breakdown
- DG (Dachgeschoss) room breakdown

Large Consumers:
- Server
- Battery charging
- Heat pump
- Garden

Historical Charts:
- Power flow over time (solar, battery, grid, house)
- Floor consumption history

Energy Statistics:
- Solar production today/total
- Grid import/export totals
- Self-consumption percentage
- Heat pump energy this year

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-03 12:05:13 +01:00
k.rennerandClaude 92040a3bfc fix(netbird-server): Correct reverse proxy Traefik configuration
- Use HTTP challenge instead of TLS challenge for ACME
- Set explicit Docker network for Traefik provider
- Add proxy state volume for persistence
- Use traefik:latest image

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 22:24:27 +01:00
k.rennerandClaude 0b6a8d054f fix(netbird): Change proxy domain to avoid TLS conflicts
Per NetBird documentation, the proxy domain must NOT be a subdomain
of the management domain as this causes TLS and routing conflicts.

Changed from proxy.netbird.renner.uno to proxy.renner.uno.

Also added NB_PROXY_DEBUG=true for troubleshooting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 17:41:14 +01:00
k.rennerandClaude 687d41cf0b feat(netbird): Add reverse proxy service per official documentation
Security Audit / Infrastructure Scan (IaC) (push) Successful in 19s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 3m37s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 3m33s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 23s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 42s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 18s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 16s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m20s
Implemented reverse proxy feature exactly as per NetBird docs:
- Added netbird-proxy service with TLS passthrough via Traefik
- Created proxy.env configuration for ACME certificates
- Added AuthClientID and AuthCallbackURL to management.json (required for external IdP)
- Generated new proxy token and stored in vault

DNS records already configured:
- proxy.netbird.renner.uno -> netbird.renner.uno
- *.proxy.netbird.renner.uno -> netbird.renner.uno

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 17:19:42 +01:00
k.rennerandClaude 5cb752a329 fix(netbird): Use bind mounts to preserve existing database
Security Audit / Infrastructure Scan (IaC) (push) Successful in 34s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 3m13s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 1m0s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 3m40s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 26s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 37s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 19s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Has been cancelled
Changed from Docker named volumes to bind mounts pointing to
/opt/netbird/management, /opt/netbird/signal, and /opt/netbird/letsencrypt
to ensure the existing database is preserved across deployments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 17:13:00 +01:00
k.rennerandClaude 860996df1e refactor(netbird): Align with official multi-container template
Update NetBird server configuration to match the official
infrastructure_files/docker-compose.yml.tmpl for external IdP setups.

Changes:
- Management port: 443 -> 33073 (official standard)
- Signal gRPC port: 80 -> 10000
- Relay port: 80 -> 33080
- Add ws-proxy routes for signal and management
- Use Docker volumes instead of host directories
- Rename container to netbird-traefik
- Remove ReverseProxy config from management.json
- Add structured logging to all containers
- Clean up Traefik config with global HTTP redirect

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 17:00:35 +01:00
k.rennerandClaude bbb6f00521 revert(netbird): Remove reverse proxy feature
Remove NetBird reverse proxy configuration that was causing TLS/ACME
issues. The proxy feature requires additional configuration that
conflicts with Traefik's ACME TLS challenge handling.

Removed:
- proxy container from docker-compose
- proxy.env template and deployment task
- proxy-related variables from defaults
- proxy handler
- project plan file

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 16:50:54 +01:00
k.rennerandClaude 65af935122 fix(netbird): Change proxy domain to proxy.renner.uno
The proxy domain must not be a subdomain of the management domain
(netbird.renner.uno). Changed from proxy.netbird.renner.uno to
proxy.renner.uno per NetBird documentation requirements.

Also added project plan for exposing services via NetBird reverse proxy.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-02 15:50:39 +01:00
k.rennerandClaude 982732cd4f chore(mkdocs-wiki): Disable HA docs generation
HA documentation feature moved to separate project for further development.
See ~/Notes/Work & Dev/Projects/HA Wiki Documentation.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 20:16:53 +01:00
k.rennerandClaude 82b92ae028 feat(mkdocs-wiki): Rewrite HA docs generator for room-based organization
- Use WebSocket API for area, device, and entity registries
- Generate per-room documentation pages with devices, entities, and automations
- Group entities by domain (lights, switches, sensors, etc.)
- Match automations to rooms by name pattern
- Add websocket-client dependency

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:43:12 +01:00
k.rennerandClaude 03bb3ce298 feat: Add Home Assistant auto-documentation to wiki
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 4s
Security Audit / Infrastructure Scan (IaC) (push) Failing after 6s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 4s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 4s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Failing after 4s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 17s
- Add generate-ha-docs.py script to query HA API
- Generate docs for entities, automations, scripts, scenes, devices, integrations
- Auto-regenerate HA docs every 15 minutes via cron
- Add HA token to vault
- Update mkdocs.yml navigation with HA Auto section

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:23:26 +01:00
k.rennerandClaude d398611425 chore: Update vault with new secrets
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 5s
Security Audit / Infrastructure Scan (IaC) (push) Failing after 7s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 4s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 4s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 6s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 4s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Failing after 4s
Adds credentials for:
- SNMP exporter (Synology SNMPv3)
- PBS client authentication

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:11:23 +01:00
k.rennerandClaude 690d176cc2 fix: Use absolute path for vault_password_file in ansible.cfg
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:11:14 +01:00
k.rennerandClaude 05134cee10 fix: Paperless consumer ignore patterns and protonmail bridge fix
- Add Synology @eaDir to consumer ignore patterns
- Add protonmail-bridge entrypoint fix for 3.22.0 update issue
- Add healthcheck for protonmail-bridge

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:11:07 +01:00
k.rennerandClaude edfaaad2b3 feat: Update PBS client for Synology NAS backup
- Add encryption password and API key support
- Fix volume mount paths with spaces
- Add CRON_BACKUP_ONLY mode
- Configure nas-1 backup paths and PBS server

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:10:52 +01:00
k.rennerandClaude dc7cf27966 feat: Add SNMP exporter for Synology NAS monitoring
- Add snmp-exporter role with Synology module support
- Add Synology scrape job to Prometheus config
- Add Synology NAS Grafana dashboard
- Support SNMPv2/v3 authentication

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:10:37 +01:00
k.rennerandClaude eb0199a255 feat: Improve Alloy syslog receiver for Synology NAS
- Add raw syslog format support for BSD/RFC 3164 style logs
- Parse hostname and app from Synology log messages
- Configure loki.srv.renner.uno as syslog receiver (UDP 1514)
- Add stability_level experimental for raw format support

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 19:10:28 +01:00
k.rennerandClaude 32fe55c8d8 fix: Remove become_user from mkdocs-wiki role (no sudo on LXC)
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 5s
Security Audit / Infrastructure Scan (IaC) (push) Failing after 7s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 4s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 6s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 7s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 4s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Failing after 5s
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 18:37:03 +01:00
k.rennerandClaude 3644fd050c feat: Add MkDocs wiki for household documentation access
Security Audit / Infrastructure Scan (IaC) (push) Failing after 6s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 4s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 4s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 5s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 4s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Failing after 4s
Deploy Infrastructure / plan (push) Successful in 55s
Deploy Infrastructure / apply (push) Successful in 47s
Deploy Infrastructure / integration-tests (push) Successful in 14s
- Add MkDocs wiki LXC (235) on saturn
- Create mkdocs-wiki Ansible role with:
  - MkDocs Material theme
  - Obsidian wikilinks support (roamlinks plugin)
  - Multi-language support (i18n plugin)
  - Caddy for local serving
  - Sync script for updates
- Add wiki.renner.uno route to Caddy HA

Source: Obsidian vault at ~/Notes/Work & Dev/Homelab
Renders documentation for household members at wiki.renner.uno

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 18:13:12 +01:00
k.rennerandClaude f12db57f07 docs: Add docs-maintainer agent integration
Update CLAUDE.md to use the docs-maintainer Task agent for
documentation updates in ~/Notes Obsidian vault.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 17:34:17 +01:00
k.rennerandClaude 6cd44ac5c5 chore: Clean up and reorganize Ansible playbooks
Security Audit / Infrastructure Scan (IaC) (push) Failing after 1m22s
Deploy Infrastructure / plan (push) Successful in 1m26s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 6s
Deploy Infrastructure / apply (push) Successful in 1m7s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 5s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 1m23s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 4s
Deploy Infrastructure / integration-tests (push) Successful in 12s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 6s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Failing after 6s
Naming Convention Standardization:
- Rename all setup-* playbooks to install-* or configure-*
- Rename all *-update.yml to update-*.yml for prefix consistency
- Fix underscore usage (ensure_template -> check-template)
- Standardize on prefixes: install-, update-, configure-, check-

Consolidations:
- Remove duplicate NetBird playbooks (3 removed)
- Replace update.yml with more complete update_all_software.yml
- Update internal import references in update.yml

Deletions:
- Remove unused certbot-cloudflare role (Caddy handles HTTPS)
- Remove empty vars/empty.yml placeholder

Archive:
- Move 7 completed migration/cleanup playbooks to archived/

Result: 54 -> 43 active playbooks with consistent naming

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-01 17:25:35 +01:00