Commit graph

158 commits

Author SHA1 Message Date
f3f10c3e36
ansible: rewrite netbox role to match live netbox.vntx.net (bare-metal install)
The previous role was netbox-community/netbox-docker (compose-based) but
the live host runs the upstream tarball install directly: system Postgres
17, system Redis 8, gunicorn under systemd, and Caddy reverse-proxy.
Re-running the old role would have torn the working install down.

This rewrite mirrors what's actually deployed:

- defaults: NetBox 4.6.0, /opt/netbox layout, gunicorn 5w/3t/120s, all
  configuration.py knobs exposed as ansible vars.
- tasks: install OS deps, ensure netbox user, create Postgres role + db,
  download + extract release tarball, run upgrade.sh, render
  configuration.py / gunicorn.py / systemd units, enable services.
- templates: configuration.py.j2 covers the same keys the live file sets;
  netbox.service / netbox-rq.service are byte-equivalent to the live
  units (modulo paths driven by the install-dir var).
- caddy role gets a per-host Caddyfile-netbox.vntx.net.j2 mirroring the
  live vhost (25MB body limit, /static/* file_server, reverse_proxy to
  127.0.0.1:8001).
- inventory: new netbox_servers group; netbox.vntx.net added to
  caddy_servers so the per-host Caddyfile is wired up.
- host_vars/netbox.vntx.net.yml: secrets reference vault_* vars; role
  refuses to render config.py until they're set.

Operator action: create host_vars/netbox.vntx.net/vault.yml with
netbox_secret_key, netbox_db_password, and netbox_api_token_peppers
(value visible via `sudo cat /opt/netbox/netbox/netbox/configuration.py`
on the live host). See roles/netbox/README.md.
2026-05-08 12:17:30 -05:00
2f85d55edd
ansible: drop disabled syncthing play stub 2026-05-08 12:03:40 -05:00
4a84b5b277
ansible: drop dead caddy_ansible dep + commented-out ns/netbox/tailscale_home plays
caddy_ansible.caddy_ansible was only referenced by the (commented) netbox play,
so removing the disabled play also makes the role unused. ns play was already
superseded by the BIND9 play. Tailscale-on-home-hosts was never re-enabled
post-Talos-migration — drop the stub; restore from git history if needed.
2026-05-08 12:02:35 -05:00
0970e29364
ansible: fix two latent bugs surfaced by repo audit
- grafana role: empty grafana_admin_password by default, and only emit
  admin_password into grafana.ini when the var is set. Previously the
  default 'admin' was rewritten on every run, clobbering passwords
  rotated via the Grafana UI.

- bootstrap.yml: probe for sudo state before attempting su-as-root.
  The first play was using become_method=su unconditionally; on hosts
  where graham already has passwordless sudo (or where -K isn't passed),
  ansible blocked indefinitely waiting for a root password prompt.
  Now the install-via-su task only runs when sudo is actually missing,
  and the python3 task uses sudo when available.

Also bring in latest microwaveprop dashboard tweaks.
2026-05-08 11:09:14 -05:00
be96483fb0
prom: add app-specific grafana dashboards + per-pod job override
Dashboards: aprs-me, towerops-{application,beam,ecto,oban,phoenix,phoenix-live-view}.

prometheus.yml.j2: kubernetes-pods job now honors a `prometheus.io/job`
pod annotation so apps can claim a named job label (e.g. towerops)
instead of bucketing under job=kubernetes-pods.
2026-05-08 10:25:17 -05:00
a8e1f2fb73
grafana: replace dashboard 13770 (Korean) with 6417 (English)
13770 'Kubernetes All-in-one Cluster Monitoring KR' has Korean panel titles.
Swap in 6417 'Kubernetes Cluster (Prometheus)' which is fully English.
2026-05-08 10:23:53 -05:00
e1274bc63b
prom: feed home-cluster metrics + provision standard k8s dashboards
Cluster-side:
- Deploy kube-state-metrics (kube-system) for cluster-state series.
- Deploy node-exporter DaemonSet on all 7 nodes via the new monitoring ns
  (privileged PSS, hostNetwork, read-only host mounts).
- Both managed by ArgoCD apps under home/cluster/argocd/apps/.

Prometheus-side:
- Replace direct pod-IP scraping (which can't reach the 10.244.0.0/16 pod
  network from outside the cluster) with API-server-proxy scraping for
  both Services and Pods. Now one target per pod, all healthy.
- Extend external Prometheus RBAC with services/proxy + pods/proxy.

Grafana-side:
- Add file-based dashboard provisioner; ship 5 standard dashboards
  (Node Exporter Full, k8s cluster-via-prometheus, k8s all-in-one,
  k8s monitoring, Prometheus 2.0 overview).

prom.w5isp.com:3000 now shows live data for all 7 cluster nodes plus
the prom host itself.
2026-05-08 10:08:32 -05:00
922552059f
prom: add prometheus stack (prometheus, alertmanager, grafana, node_exporter)
Provisions prom.w5isp.com (10.0.15.31) as the home-cluster monitoring host.
Prometheus 3.6.0 scrapes the Talos cluster API/nodes/cAdvisor via an external
SA token; Grafana ships with the Prometheus datasource pre-provisioned.

host_vars opens 9090/9093/9100/3000 to 10.0.0.0/16 plus SSH from the home LAN
so the firewall role doesn't lock out admin access.
2026-05-08 09:50:31 -05:00
20896be049
gridmap: move ArgoCD source + image-updater to codeberg 2026-05-05 12:02:52 -05:00
04d0f76a08
aprs: move ArgoCD source + image-updater to codeberg 2026-05-05 11:28:06 -05:00
2cd8169e94
towerops: move ArgoCD source + image-updater to codeberg
The towerops-web repo got renamed to codeberg.org/gmcintire/towerops
and its container image follows the same rename
(codeberg.org/gmcintire/towerops). Application source repo and
image-updater registry list updated.
2026-05-05 10:58:35 -05:00
abb991e3c6
prop: move ArgoCD source + image-updater to codeberg
The prop and prop-grid-rs container images now live on
codeberg.org/gmcintire/* (see prop repo commit 8a9c0ba6 for the
workflow flip). Application source repo and image-updater registry
list follow.

Cluster-side state still required for this to roll out, applied
out-of-band via kubectl:

- Secret prop/forgejo-registry — dockerconfigjson with codeberg.org
  auth (also keeps git.mcintire.me auth during the transition).
- Secret argocd/forgejo-registry — same shape, used by the
  argocd-image-updater registry config.
- Secret argocd/codeberg-credentials-gmcintire (label
  argocd.argoproj.io/secret-type=repo-creds) — credentials template
  matching url=https://codeberg.org/gmcintire so future codeberg
  repos under that owner pick up auth automatically.
- ConfigMap argocd/argocd-image-updater-config — registries.conf
  extended with codeberg.org entry referencing the new pull secret.
2026-05-05 10:45:41 -05:00
36b5e087b3
updates 2026-05-04 16:59:31 -05:00
fea69f8a51
updates 2026-04-29 15:03:17 -05:00
82630fb98b
add argocd-image-updater with forgejo registry config
annotates the 4 Applications so image-updater scans git.mcintire.me
on a 2min loop and writes new tags to spec.source.kustomize.images
(no git commits, no CI sed-and-bump).
2026-04-29 10:38:05 -05:00
ae5ceebf44
migrate from flux to argocd
- install argocd at home/cluster/argocd/, app-of-apps via root-app.yaml
- 4 child Applications: aprs, gridmap, prop, towerops
- argo.w5isp.com via cloudflared tunnel (CNAME + ingress_rule in tofu)
- update CLAUDE.md: drop K3s/Wavelog/n8n/Node-RED, document GitOps + ArgoCD
2026-04-29 10:26:33 -05:00
c3ae90aff0
dns updates 2026-04-27 12:43:08 -05:00
841fab5abe
update 2026-04-21 12:40:18 -05:00
8b4102b1d1
change 2026-04-20 13:00:52 -05:00
925d37f3b8
update 2026-04-16 10:07:37 -05:00
e1eb7a1739
update 2026-04-15 14:15:48 -05:00
36ab4bde73
update w5isp.com 2026-04-12 13:56:17 -05:00
d01a76e902
update 2026-04-10 13:48:53 -05:00
35f66d0408
update 2026-04-06 09:39:03 -05:00
7494b04d2c
update 2026-04-04 17:40:50 -05:00
fc934290b8
update 2026-04-03 15:52:40 -05:00
ea091c68c9
fix w5isp.com ns 2026-04-02 09:37:07 -05:00
5ba93d2866
move w5isp.com to cloudflare 2026-04-02 09:22:20 -05:00
baa50efccf
update 2026-03-26 17:53:51 -05:00
fb6d00b84d
updates 2026-03-16 17:40:30 -05:00
47158aa771
update to reflect 380 prod 2026-03-10 10:05:17 -05:00
231c9744aa
update some dns and cloudflare 2026-02-25 13:24:10 -06:00
d68f32837d
dns cleanup 2026-02-24 09:24:53 -06:00
11c06b13df
Add Longhorn storage to Talos worker nodes
Configure passthrough NVMe drives (/dev/sdb) on each worker with
XFS partition mounted at /var/mnt/longhorn. Switch worker installer
image to Talos Image Factory build with iscsi-tools and util-linux-tools
extensions required by Longhorn. Remove conflicting grubUseUKICmdline
setting.
2026-02-19 13:24:35 -06:00
34aece2126
update 2026-02-19 09:35:52 -06:00
ee5d485808
add cloudflare 2026-02-18 12:55:34 -06:00
b3bb484bf0
Upgrade Talos to v1.12.4, fix DNS and tailscale config
- Upgrade all nodes from v1.12.1/v1.12.2 to v1.12.4 installer image
- Set explicit nameservers (9.9.9.9, 149.112.112.112, 1.1.1.1) on
  workers to replace unreliable DHCP-provided resolver at 10.0.15.254
- Fix talos-worker2 missing ExtensionServiceConfig for ext-tailscale
  which was causing node reboots every ~35 minutes
- Update tailscale.patch.yaml with working auth key
2026-02-18 12:08:32 -06:00
d9de8c351d
remove gitlab CI config and cluster resources
Removed gitlab-agent, gitlab-runner Helm releases, and
associated namespaces from the Talos home cluster.
2026-02-18 11:05:33 -06:00
a7f8b76c0e
update ha dns 2026-02-18 09:57:12 -06:00
782359c82f
update gitignore and docs for local tofu state 2026-02-17 14:31:33 -06:00
98d07b99e2
track tofu state locally in repo 2026-02-17 14:15:57 -06:00
c9705b645a
update dns 2026-02-17 13:15:24 -06:00
928eba54e0
clean up tofu: porkbun-only, update aprs.me NS to cloudflare
- Remove proxmox/talos/null providers and variables
- Remove HTTP backend, use local state
- Remove skookum.me, towerops.net, vntx.net, as393837.net from DNS
- Switch aprs.me NS to Cloudflare
2026-02-17 13:07:04 -06:00
bed3526470
move terraform to tofu, add porkbun domain NS management
- Rename terraform/ to tofu/
- Add marcfrederick/porkbun provider for registrar NS management
- Add dns.tf with all 14 Porkbun domains and import blocks
- Update gridmap.org BIND9 zone NS to Cloudflare
- Update CLAUDE.md to reflect new directory structure
2026-02-17 12:49:26 -06:00
35c86b5f27
update dns for gridmap 2026-02-17 12:10:22 -06:00
b790650157
cname for gridmap 2026-02-17 08:35:28 -06:00
71f24d1ca4
updates 2026-02-17 08:26:29 -06:00
36265b9da7
changes 2026-02-05 12:46:51 -06:00
7d8ef39291
cleanup 2026-01-30 17:32:32 -06:00
a1e787093e
update 2026-01-30 17:27:52 -06:00