Commit Graph
4354 Commits
Author SHA1 Message Date
k.rennerandClaude Opus 4.8 21a0a43f71 ha/matter: remove completed HAOS migration-seed init containers
The `seed` initContainers in home-assistant and matter-server were
one-shot migration importers that streamed the HAOS backup from
s3://k8s-migration on the nas-1 Garage S3. The migration is done (live
pods carry the idempotency sentinels and skip the seed), nas-1 is now
off, and the k8s-migration bucket doesn't exist on Hetzner — so on a
fresh PVC the seed would hang the pod in Init. DR restore is via Velero.

Removed:
- home-assistant: seed initContainer.
- matter-server: seed initContainer + its import-script volume.
- garage-migration-creds Secret (migration-only S3 creds) + HA kustomization ref.
- matter-server-haos-import-script ConfigMap + matter kustomization ref.
- matter-server Flux Kustomization dependsOn: home-assistant (it existed
  solely so the seed could mount garage-migration-creds; matter is now
  independent).

Kept: home-assistant-backup-password Secret — it's the HA backup
encryption credential, not migration scaffolding.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 12:28:06 +02:00
k.rennerandClaude Opus 4.8 0ce60164e1 ci: decommission migration-only rebuild-k8s; point access tooling at Hetzner
rebuild-k8s.yml was the one-shot PVE->K8s migration/rebuild pipeline; it
is no longer needed and still pointed at the retired Garage S3 on the
now-off nas-1. Remove it (DR restore is via Velero + flux bootstrap).

The live cluster-access path is kept and migrated off Garage onto Hetzner
Object Storage (renner-uno-k8s-secrets, fsn1.your-objectstorage.com,
region fsn1, hetzner_s3_* keypair):
- scripts/ci/fetch-kubeconfig.sh: Garage -> Hetzner; env vars renamed
  GARAGE_SECRETS_* -> S3_ACCESS_KEY_ID/S3_SECRET_ACCESS_KEY.
- .woodpecker/e2e.yml, e2e-test.yml: pass hetzner_s3_access_key/secret_key
  (the live cron e2e pipeline needs this — it was broken against dead nas-1).
- scripts/import-cluster-access.sh: Garage -> Hetzner endpoint/bucket/region.
  NOTE: the workstation aws-cli "secrets" profile must now hold the Hetzner
  Object Storage keypair.

Also: delete the orphaned test-garage-smoke play + pipeline, and fix the
two dangling rebuild-k8s.yml references (zfs-tuning play comment;
update-audit prompt Talos-pin file list).

Assumes cluster-access objects (kubeconfig.sops/talosconfig.sops) were
migrated into renner-uno-k8s-secrets; with rebuild-k8s gone, nothing
auto-refreshes them, which is fine for a stable cluster.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 12:17:33 +02:00
k.rennerandClaude Opus 4.8 facbb859ad netbird-server: drop vestigial reverse-SSH tunnel
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
The netbird-tunnel.service.j2 reverse-SSH tunnel template was never
instantiated by any task in the role, and its target
netbird_auth_ingress_host=10.2.45.100 was the Caddy HA keepalived VIP,
destroyed in PR #70. The VPS reaches homelab auth over the NetBird mesh
now (netbird-ingress DaemonSet -> Traefik fd99::86), so the tunnel is
dead. Remove the template and its only-consumer vars
(netbird_auth_tunnel_port/ingress_host/ingress_port, netbird_tunnel_ssh_key).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 12:05:00 +02:00
k.rennerandClaude Opus 4.8 9050dd143e cleanup(ansible): remove dead Caddy plays + Grafana dashboard
Residue from the Caddy HA -> Traefik migration (Caddy LXCs destroyed in
PR #70):

- install-error-page.yml, install-gitea-proxy.yml: both target the
  destroyed host caddy.srv.renner.uno (the gitea-proxy play also wrote a
  Caddyfile reverse_proxy block + cloudflare import; gitea is now served
  by a Traefik Ingress in kubernetes/apps/gitea).
- grafana-observability: drop the caddy-overview dashboard (monitored
  caddy_http_* metrics from the dead Caddy HA) and its two deploy/cleanup
  loop entries.

Note: a previously-provisioned Network/caddy-overview.json may still
linger in the live Grafana until the dashboards are re-synced or it's
removed in the UI; it just shows no data.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:59:24 +02:00
k.renner 874ee1f41a Merge pull request 'cleanup(ingress): drop legacy Caddy/cloudflared/netbird-gateway tiers' (#70) from simplify-ingress-drop-legacy into master
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
ci/woodpecker/manual/deploy-infrastructure Pipeline was successful
ci/woodpecker/push/build-ci-images Pipeline was successful
Reviewed-on: gitea_admin/homelab#70
2026-06-27 11:44:22 +02:00
k.rennerandClaude Opus 4.8 1fb7bfacc6 cleanup(ingress): drop legacy Caddy/cloudflared/netbird-gateway tiers
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
ci/woodpecker/push/build-ci-images Pipeline was successful
The netbird-ingress DaemonSet, netbird reverse-proxy, and Traefik have
fully superseded the old ingress tiers, which have been stopped (not
deleted) since the 2026-05-09 PVE cutover. Remove the dead code:

- Caddy HA: LXCs 232/233/234 (opentofu/ingress.tf), caddy-ha role,
  install-caddy-ha + install-crowdsec-caddy plays, caddy cred vars,
  proxmox_caddy_ha group_vars, build-caddy/deploy-caddy pipelines,
  ci-caddy-builder image.
- cloudflared: LXC 117, cloudflared-lxc role, install-cloudflared play,
  cloudflare_tunnel/variables_cloudflare disabled tofu stubs.
- netbird-gateway: LXC 260 (replaced by the in-cluster netbird-ingress
  DaemonSet), netbird-gateway role + play.
- backup_jobs.tf: drop VMIDs 117/232/233/234/260 from the nightly vzdump
  include list (those LXCs are being destroyed).
- netbird-server: point the setup-key hint at netbird-ingress/netbird-proxy.

Kept deliberately:
- crowdsec role (reusable; basis for the pending Traefik bouncer).
- netbird-client role + play (loki/prometheus LXCs are tagged
  netbird_client, so it remains live architecture).

Note: applying the opentofu change will plan a DESTROY of stopped LXCs
117/232/233/234/260 — review the plan before apply.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:40:49 +02:00
k.renner 89098710b9 Merge pull request 'ci(update-audit): post issues with gitea_token (has write:issue)' (#68) from update-audit-use-gitea-token into master 2026-06-27 09:48:18 +02:00
k.rennerandClaude Opus 4.8 dd32b5d917 ci(update-audit): post issues with gitea_token (has write:issue)
ci/woodpecker/manual/update-audit Pipeline was successful
security_bot_token is scoped for code/PRs only; the issue POST in the
post step returned HTTP 403 'token does not have ... write:issue', so the
audit ran green but silently created no issue. Switch GITEA_TOKEN to the
gitea_token secret — the broader machine account already used by
build-caddy and build-ci-images for release-asset and registry writes —
which is the most likely existing secret to also hold write:issue.

No new token to provision; audit issues become attributed to gitea_token's
owner instead of the security bot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 09:36:12 +02:00
k.renner 25024042c4 Merge pull request 'paperless: move ftp-scanner vsftpd config to hash-suffixed generator' (#22) from paperless-ftp-config-generator into master
Reviewed-on: gitea_admin/homelab#22
2026-06-27 09:04:47 +02:00
k.renner 1064b487c3 Merge pull request 'ci(update-audit): surface Gitea API failures in the post step' (#35) from update-audit-fix-issue-post into master
Reviewed-on: gitea_admin/homelab#35
2026-06-27 09:04:39 +02:00
k.renner cd6c52884b Merge pull request 'netbird-server: enable IdpSignKeyRefreshEnabled (survive Authentik key rotation)' (#65) from netbird-mgmt-jwks-refresh into master
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
Reviewed-on: gitea_admin/homelab#65
2026-06-27 08:54:31 +02:00
k.renner 156d0fc593 Merge pull request 'netbird-proxy: drop unused cert/state dir creation' (#67) from cleanup-proxy-dirs into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline was successful
2026-06-27 08:24:03 +02:00
k.rennerandClaude Opus 4.8 81d5cb0e71 netbird-proxy: drop unused cert/state bind-mount dir creation
certs + state are Docker named volumes now; only the compose dir is needed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 08:23:58 +02:00
k.renner 4cf2a01907 Merge pull request 'cleanup: drop one-off migrate-tfstate pipeline + unused proxy dirs' (#66) from cleanup-netbird-proxy-ha into master 2026-06-27 08:21:15 +02:00
k.rennerandClaude Opus 4.8 0b8d406adc cleanup: drop the one-off migrate-tfstate pipeline + unused proxy dirs
- Remove .woodpecker/migrate-tfstate.yml — the Garage(nas-1)->Hetzner state
  migration it performed is complete and verified; it was a manual one-off.
- netbird-proxy no longer needs the /opt/netbird-proxy/certs and /state
  bind-mount dirs (those are Docker named volumes now); only the compose dir
  is required.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 08:21:10 +02:00
k.rennerandClaude Opus 4.8 6759b6dd79 netbird-server: enable IdpSignKeyRefreshEnabled (survive Authentik key rotation)
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
The management cached Authentik's JWKS at startup and never refreshed it, so
when Authentik rotated its JWT signing key the management could no longer
verify tokens ('unable to find appropriate key' -> 'token invalid'), breaking
the dashboard. Set IdpSignKeyRefreshEnabled=true so management re-fetches the
JWKS on an unknown key id instead of caching forever.

NOTE: deploying this redeploys VPS-1 (the IdP host) and restarts the
management container.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 07:22:37 +02:00
k.renner 4c9d411af4 Merge pull request 'netbird-proxy: named volume for /var/lib/netbird state' (#64) from netbird-proxy-certs-volume into master
ci/woodpecker/manual/deploy-netbird-proxy Pipeline was successful
ci/woodpecker/push/deploy-netbird-proxy Pipeline was successful
2026-06-27 07:00:57 +02:00
k.rennerandClaude Opus 4.8 3803a0962e netbird-proxy: named volume for /var/lib/netbird too (state write perms)
Same root-owned-bind-mount issue as /certs: the non-root proxy couldn't
write netbird state ('failed to write active profile state / geolocation:
permission denied'). Use a named volume for /var/lib/netbird as well.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 07:00:52 +02:00
k.renner 30727eadb0 Merge pull request 'netbird-proxy: named volume for /certs (ACME write perms)' (#63) from netbird-proxy-certs-volume into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline was successful
ci/woodpecker/manual/deploy-netbird-proxy Pipeline was successful
2026-06-27 06:57:35 +02:00
k.rennerandClaude Opus 4.8 8f04f5a388 netbird-proxy: use a named volume for /certs so ACME can write
The proxy runs non-root; a root-owned bind mount (/opt/netbird-proxy/certs)
was unwritable ('open lock file ...: permission denied'), which would block
cert issuance once the host gets traffic. Switch to a named volume like
VPS-1, which inherits the image's writable ownership.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 06:57:30 +02:00
k.renner 76b0bb9958 Merge pull request 'netbird-server: route /management.ProxyService/ for remote proxies' (#62) from netbird-mgmt-proxyservice-route into master
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
2026-06-27 06:51:52 +02:00
k.rennerandClaude Opus 4.8 eb37602d4e netbird-server: route /management.ProxyService/ through Traefik for remote proxies
ci/woodpecker/push/deploy-netbird-server Pipeline was successful
Remote reverse-proxy instances (proxy-1) connect to the management server
over Traefik via the ProxyService gRPC path. Traefik only routed
ManagementService, so the remote proxy's mapping stream got Traefik's 404
HTML. Add a router for /management.ProxyService/ to the same management
backend (h2c:33073). The local VPS-1 proxy is unaffected (it uses
management:33073 directly).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 00:18:07 +02:00
k.renner a826718c74 Merge pull request 'netbird-proxy: create /etc/docker before daemon.json' (#61) from netbird-proxy-docker-ipv6 into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline was successful
ci/woodpecker/manual/deploy-netbird-proxy Pipeline was successful
2026-06-27 00:11:05 +02:00
k.rennerandClaude Opus 4.8 0cb61cd517 netbird-proxy: create /etc/docker before writing daemon.json
On Arch /etc/docker does not exist until something writes there; the
daemon.json template failed with 'Destination directory does not exist'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 00:10:44 +02:00
k.renner f3e6b7b55d Merge pull request 'netbird-proxy: enable Docker IPv6 (proxy couldn't reach v6-only mgmt)' (#60) from netbird-proxy-docker-ipv6 into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline failed
ci/woodpecker/manual/deploy-netbird-proxy Pipeline failed
2026-06-27 00:09:20 +02:00
k.rennerandClaude Opus 4.8 e0d3870991 netbird-proxy: enable Docker IPv6 so the proxy reaches the v6-only mgmt path
The deployed proxy on proxy-1 (v6-only host) couldn't connect to the
management server: 'dial tcp [2a01:...]:443 / 162.55.50.97:443: network is
unreachable'. The host reaches mgmt over v6 fine, but Docker had no IPv6
(no daemon.json), so the container had no v6 egress and no v4 exists.

Add /etc/docker/daemon.json (ipv6 + ULA fixed-cidr-v6 + ip6tables NAT),
flush it (restart docker) before the container deploys, and put the proxy
service on the default bridge (network_mode: bridge) so it inherits that v6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 00:09:14 +02:00
k.renner 9c460ccf60 Merge pull request 'opentofu: cut state backend over to Hetzner' (#59) from backend-cutover-hetzner into master
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
ci/woodpecker/manual/deploy-infrastructure Pipeline failed
ci/woodpecker/manual/deploy-netbird-proxy Pipeline was successful
2026-06-26 23:25:00 +02:00
k.rennerandClaude Opus 4.8 55e7f591dd opentofu: cut the state backend over to Hetzner Object Storage
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
State already migrated (migrate-tfstate pipeline; 45 resources verified on
Hetzner). Repoint providers.tf backend (bucket/region/endpoint/path-style)
and the deploy-infrastructure backend creds from the nas-1 Garage S3 to
Hetzner. nas-1 is now fully decommissionable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:24:55 +02:00
k.renner 2e9df8a0cd Merge pull request 'ci: fix migrate-tfstate resource guard' (#58) from migrate-tfstate-pipeline into master
ci/woodpecker/manual/migrate-tfstate Pipeline was successful
2026-06-26 23:21:42 +02:00
k.rennerandClaude Opus 4.8 3de3236c98 ci: fix migrate-tfstate resource guard (grep -c counts lines on compact JSON)
The pulled state is compact (one line), so grep -c returned 1. Count
occurrences instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:21:37 +02:00
k.renner 2924ce167f Merge pull request 'ci: fix migrate-tfstate YAML (block scalar)' (#57) from migrate-tfstate-pipeline into master
ci/woodpecker/manual/migrate-tfstate Pipeline failed
2026-06-26 23:20:13 +02:00
k.rennerandClaude Opus 4.8 3f188829cf ci: fix migrate-tfstate YAML (use a block scalar for the script)
The per-line commands were parsed as YAML maps because of colons in echo
strings. Move the whole script into a single block scalar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:18:43 +02:00
k.renner 6963b81d99 Merge pull request 'ci: one-off migrate-tfstate pipeline (Garage -> Hetzner)' (#56) from migrate-tfstate-pipeline into master 2026-06-26 23:15:14 +02:00
k.rennerandClaude Opus 4.8 a125515ca0 ci: one-off manual migrate-tfstate pipeline (Garage nas-1 -> Hetzner)
Migrates the OpenTofu remote state to Hetzner Object Storage. Garage is
read-only (state pull only), so reversible. Manual trigger only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:14:07 +02:00
k.renner 3fb0b0c0e5 Merge pull request 'opentofu: add Hetzner renner-uno-tfstate bucket' (#55) from tfstate-hetzner-bucket into master
ci/woodpecker/manual/deploy-infrastructure Pipeline was successful
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
2026-06-26 23:08:22 +02:00
k.rennerandClaude Opus 4.8 a91400dd82 opentofu: add Hetzner renner-uno-tfstate bucket for state migration
ci/woodpecker/push/deploy-infrastructure Pipeline was successful
Target bucket for migrating the OpenTofu remote state off the nas-1 Garage
S3 (s3.nas-1.renner.uno) to Hetzner Object Storage. State copy + backend
repoint follow in subsequent steps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 23:08:19 +02:00
k.renner f337b75ba2 Merge pull request 'opentofu: give the woodpecker-agent LXCs IPv6 (root cause)' (#54) from agents-lxc-ipv6 into master
ci/woodpecker/push/deploy-infrastructure Pipeline failed
ci/woodpecker/manual/deploy-infrastructure Pipeline failed
2026-06-26 15:19:35 +02:00
k.rennerandClaude Opus 4.8 3475c2013c opentofu: give the woodpecker-agent LXCs IPv6 (the actual root cause)
ci/woodpecker/push/deploy-infrastructure Pipeline failed
The agents are unprivileged Proxmox LXCs whose ip_config had only an ipv4
block — no IPv6 at all. So no matter how Docker/Woodpecker were configured
for v6 (daemon.json ip6tables, WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6), the
step containers had no v6 uplink to NAT onto, and deploys to v6-only hosts
(proxy-1) failed 'Network unreachable'. IPv4 NAT works in these LXCs, so v6
NAT will too once the LXC actually has v6.

Add an optional ipv6 block to the proxmox_lxc module (auto/dhcp/static) and
set ipv6_address = "auto" (SLAAC off v40srv) for the agents.

NOTE: `initialization` is in the module's ignore_changes, so this does NOT
apply to running agents on a normal apply — they must be RECREATED to pick
up v6 (they're tagged `transient`). Recreate one at a time to keep CI up,
then re-run install-woodpecker-agent.yml on each.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 15:07:11 +02:00
k.renner 4bbf422037 Merge pull request 'woodpecker-agent: force docker restart if IPv6 not active' (#53) from agent-force-docker-v6 into master
ci/woodpecker/push/deploy-woodpecker-agent Pipeline was successful
2026-06-26 14:24:45 +02:00
k.rennerandClaude Opus 4.8 dee8614482 woodpecker-agent: force a docker restart if IPv6 isn't actually active
The self-deploy restarts were unreliable, so Docker may have the daemon.json
on disk but never reloaded it. Check docker bridge EnableIPv6 and, if not
active, schedule a deferred restart. Idempotent once v6 is live. The check
result also surfaces (in the deploy log) whether Docker had v6 at all.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:24:42 +02:00
k.renner b50ee03d3f Merge pull request 'woodpecker-agent: enable IPv6 on pipeline networks (the actual fix)' (#52) from agent-woodpecker-ipv6 into master
ci/woodpecker/push/deploy-woodpecker-agent Pipeline was successful
ci/woodpecker/manual/deploy-netbird-proxy Pipeline failed
2026-06-26 14:18:39 +02:00
k.rennerandClaude Opus 4.8 1879d17dc9 woodpecker-agent: enable IPv6 on pipeline networks (the actual fix)
The daemon.json (PR #48) only gives the *default bridge* IPv6 — but
Woodpecker runs each step on a per-pipeline network, which it creates
WITHOUT IPv6 unless told to. So step containers still had no v6 and the
deploy to v6-only proxy-1 kept failing 'Network unreachable'.

Set WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6=true on the agent so it creates
v6-enabled pipeline networks (pairs with the daemon.json ipv6/ip6tables
NAT). Also defer the woodpecker-agent restart (systemd-run timer) so the
agent self-deploy doesn't interrupt its own running pipeline.

Ref: https://woodpecker-ci.org/docs/administration/configuration/backends/docker

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:18:36 +02:00
k.renner d338e7fb44 Merge pull request 'woodpecker-agent: defer docker restart so the agent self-deploy survives' (#51) from agent-docker-deferred-restart into master
ci/woodpecker/push/deploy-woodpecker-agent Pipeline was successful
ci/woodpecker/manual/deploy-netbird-proxy Pipeline failed
2026-06-26 14:13:15 +02:00
k.rennerandClaude Opus 4.8 3cb3a110a6 woodpecker-agent: defer the docker restart so the agent self-deploy survives
deploy-woodpecker-agent runs on an agent; a synchronous 'systemctl restart
docker' kills the job's own container before the play finishes (pipeline
994 died at docker-install, before the daemon.json task even ran). Schedule
the restart via a transient systemd timer (systemd-run --on-active=15s) so
the playbook completes first, then docker restarts and picks up the IPv6
daemon.json.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:13:12 +02:00
k.renner 0c42ef1544 Merge pull request 'ci: add deploy-woodpecker-agent pipeline' (#50) from deploy-woodpecker-agent-pipeline into master
ci/woodpecker/push/deploy-woodpecker-agent Pipeline failed
2026-06-26 14:08:41 +02:00
k.rennerandClaude Opus 4.8 1266c433e6 ci: add deploy-woodpecker-agent pipeline
The woodpecker-agent role had no deploy pipeline — so the Docker IPv6
daemon.json (PR #48) landed in git but never reached the agents. Mirror
the other deploy-* pipelines: master + manual trigger, runs
install-woodpecker-agent.yml in the ci-ansible runner.

Merging self-triggers on its own path and applies the agent config. It
deploys the agents from an agent, so the Docker restart kills this job
mid-run (reported as failure) but still applies on both agents; re-trigger
deploy-netbird-proxy after.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:08:38 +02:00
k.renner bcc663fbe7 Merge pull request 'netbird-proxy: reuse VPS-1's proxy token; deploy on master only' (#49) from netbird-proxy-token-fix into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline failed
ci/woodpecker/cron/e2e Pipeline failed
ci/woodpecker/cron/security-scan Pipeline failed
2026-06-26 14:02:44 +02:00
k.rennerandClaude Opus 4.8 c57533f726 netbird-proxy: reuse VPS-1's proxy token; deploy on master only
- Drop the invented per-instance token: a shared NB_PROXY_TOKEN with the
  same NB_PROXY_DOMAIN is a valid HA cluster, so proxy-1 just reuses the
  existing vault_netbird_proxy_token. No token to generate, no new vault
  secret — removes that deploy gate entirely.
- Scope the deploy-netbird-proxy pipeline to master + manual so it stops
  auto-running (and failing) on feature-branch pushes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:02:24 +02:00
k.renner 05cf7ceb5f Merge pull request 'netbird-proxy: add a second reverse-proxy HA cluster member (proxy-1)' (#47) from netbird-proxy-ha into master
ci/woodpecker/push/deploy-netbird-proxy Pipeline failed
2026-06-26 14:01:13 +02:00
k.renner d1005aba64 Merge pull request 'woodpecker-agent: enable IPv6 in the Docker daemon (so CI can reach v6 hosts)' (#48) from ci-agent-ipv6 into master 2026-06-26 13:57:55 +02:00