Commit graph

127 commits

Author SHA1 Message Date
6f5432be73
Remove direnv from base Debian packages (not in Ubuntu 22.04 repos) 2026-07-24 16:40:03 -05:00
18da06e769
Fix vault.yml: remove spurious document separator that broke YAML parsing 2026-07-24 16:39:28 -05:00
d3f4278133
Enable incident.io alerts on all Icinga2 hosts and services
Add vars.enable_incidentio = true to every host template (generic-host,
server, mikrotik, ap-ubnt, netonix, edgeswitch, ap-epmp, af11, af24)
and the generic-service template — all ~80 hosts and their services
are now covered via template inheritance.
2026-07-24 16:37:46 -05:00
edd689d8c7
Add incident.io alert integration for Icinga2
- New notification script (incidentio-notification.sh) that POSTs JSON
  payloads to incident.io HTTP alert sources via curl/jq
- New Icinga2 config template defining User, NotificationCommand (host
  + service), and apply Notification rules — follows the PagerDuty
  pattern with opt-in via vars.enable_incidentio
- Notification type mapping: PROBLEM/DOWN/CRITICAL/WARNING/UNKNOWN →
  firing, RECOVERY/UP/OK → resolved, ACKNOWLEDGEMENT → firing with
  metadata
- Deduplication keys: host-{name} for hosts, service-{host}-{service}
  for services
- Deployed via Ansible: script copied to /etc/icinga2/scripts/,
  config rendered to conf.d/; gated on icinga2_incidentio_token being
  defined
2026-07-24 16:36:49 -05:00
5171f6666c
Comment out GSSAPIAuthentication in ssh_config on trixie (removed in OpenSSH 10) 2026-07-24 14:59:15 -05:00
2c6dfcfcb6
Add git safe.directory config to forgejo role for SSH clone access 2026-07-24 14:55:49 -05:00
6a69247512
Add registry cleanup: keep latest 2 Docker images per repo 2026-07-24 14:28:38 -05:00
95b3f40dba
Forgejo admin user only created on first deploy, not re-run 2026-07-24 14:08:08 -05:00
a496efa816
Remove password field from graham user config - only set on initial creation 2026-07-24 14:07:06 -05:00
e1c7dad545
Set runner container.network to forgejo_forgejo for workflow DNS resolution 2026-07-24 14:04:53 -05:00
5b05811ec7
Set DEFAULT_PUSH_CREATE_PRIVATE=true 2026-07-24 14:01:05 -05:00
da2445f2c7
Fix forgejo runner setup, prevent data wipe on re-run, add SSH key to Forgejo
- forgejo role: tasks no longer wipe data on subsequent runs (check for existing
  data before resetting)
- runner: use data.forgejo.org/forgejo/runner:12, register with --no-interactive,
  run as root for Docker socket access
- runner-config: proper generate-config format
- graham user: password hash in managed_users config
- SSH key added to Forgejo graham user
- direnv in base Debian packages
2026-07-24 13:52:10 -05:00
1e1e423772
Set graham user password hash in managed_users config 2026-07-24 13:44:19 -05:00
437031aaa3
Add direnv to base Debian packages 2026-07-24 13:32:58 -05:00
292758900e
Add hi (74.50.113.232) with Forgejo + Caddy, bootstrapped support.vntx.net
- DNS: hi.mcintire.me A/AAAA, git.mcintire.me A/AAAA updated to new host
- forgejo role: Docker Compose deployment with SQLite, INSTALL_LOCK, admin user creation
- Caddyfile-hi.j2: reverse proxy git.mcintire.me -> localhost:3000
- tailscale role: skip connect when no auth key; dynamic repo suite
- debian role: fix Signed-By for debian.sources on trixie
- curl added to base Debian packages
- support.vntx.net: added to vntx_servers, DNS, host_vars
2026-07-24 13:12:33 -05:00
7ff93a5ac3
update opensearch 2026-07-24 09:18:08 -05:00
Graham McInitre
d644868602 Migrate mcintire.me DNS from self-hosted BIND9 to Cloudflare
- Add mcintire.me zone + all 14 DNS records to tofu/cloudflare.tf (A, MX, CNAME, SRV, TXT)
- Include zone settings, HSTS, bot management, firewall for mcintire.me
- Update Porkbun NS from as393837_ns to cloudflare_ns in tofu/dns.tf
- Remove mcintire.me zone from BIND9 master config (group_vars/bind9_servers/)
- Delete mcintire.me.yml zone file
- Remove mcintire.me secondary zone from git.mcintire.me host_vars
2026-07-24 09:14:36 -05:00
80a85f3916
update 2026-07-19 14:41:46 -05:00
39bedb08d1
renumber infrastructure from 10.0.15.0/24 to 10.0.16.0/22 (hosts in 10.0.19.x)
Proxmox: node1-3 → 10.0.19.101-103
Talos cp1-3 → 10.0.19.1-3, workers → 10.0.19.4-6
K8s endpoint → VIP https://10.0.19.10:6443
Ansible: prom → 10.0.19.31, db → 10.0.19.30
Talos: added VIP block to controlplane.yaml base config
Promtail: Loki URL → 10.0.19.31
Docs: all references updated, talos4 removed
2026-07-18 08:28:47 -05:00
8c94ca0d09
update radius 2026-07-12 15:35:31 -05:00
baec7c22e8
updated talos 2026-07-05 13:27:15 -05:00
74317f40e1
update 2026-06-29 10:32:00 -05:00
a42e2eeb7b
exclude manero-ca from most things 2026-06-25 16:52:20 -05:00
390eb2d835
cleanup 2026-06-22 16:17:33 -05:00
55451fe285
cleanup resolvers 2026-06-22 16:11:33 -05:00
c85be1d56c
flatcar resolvers 2026-06-22 15:52:51 -05:00
d6cf15165a
restore UISP server + caddy frontend, fix SSH host key regeneration, add tofu proxmox provider 2026-06-21 19:06:33 -05:00
216bd8e668
updates 2026-06-21 13:39:36 -05:00
763d7a938c
updates 2026-06-20 14:21:32 -05:00
1eb0b74fe8
updates 2026-06-19 17:24:54 -05:00
fb5803c866
add FreeBSD bootstrap, irc servers, hostname overrides, and cleanups
- bootstrap.yml: support pkg for FreeBSD sudo/python3 install
- base role: FreeBSD package sets, sudoers paths, host key regen, admin group, usermod process-in-use tolerance
- freebsd role: pkg update/upgrade tasks
- general role: standalone hostname tasks (ungated from network.skip), hostname_override support
- inspircd role: deploy configs for ca/us manero.org irc servers with vault-backed secrets
- uisp role: download and run installer on fresh hosts, skip if already running
- netbox role: stop services before usermod to avoid process-in-use failures
- hosts: add irc_servers group, ca/us.manero.org (Tailscale), drop staging.towerops.net
- all.yml: graham user gets static ed25519 key alongside github keys
2026-06-19 17:19:29 -05:00
b43aa56b5c
icinga2 host updates 2026-06-19 15:24:44 -05:00
b9a52c258a
updates 2026-06-19 09:33:27 -05:00
86ae10d963
resolvers: tune unbound for performance and reliability
- so-reuseport: yes — kernel hashes UDP across the per-thread sockets
  instead of waking all threads, balancing load and improving headroom
- edns-buffer-size: 1232 — DNS Flag Day 2020 default, avoids IP
  fragmentation (retransmits/TCP fallback)
- serve-expired (RFC 8767) with 1800ms client timeout and 86400s stale
  ttl — fast answers from stale cache during upstream slowness/outages
2026-06-07 16:43:33 -05:00
02390adff8
telegraf: disable PrivateMounts in containers (fix LXC 226/NAMESPACE)
The packaged telegraf.service sets PrivateMounts=true, which requires a
mount namespace that unprivileged LXC containers cannot create, so the
service failed to start on the LXC resolver with status 226/NAMESPACE.
Drop in PrivateMounts=false, gated to container guests so VM hosts keep
the unit's hardening.
2026-06-07 13:38:26 -05:00
66986e294b
monitoring: collect Unbound metrics via Telegraf into Prometheus + Grafana
Add a telegraf role (applied to the resolvers) that runs unbound-control
via the inputs.unbound plugin and exposes the stats as a Prometheus
/metrics endpoint on :9273, firewalled to the 204.110.188.0/22 scrape
network. Imports the InfluxData signing key (influxdata-archive.key; the
_compat key expired 2026-01-17) so dnf can validate the package.

- prom.w5isp.com: scrape job "unbound" for resolver1/2:9273
- grafana: "Unbound Resolvers" dashboard (queries, cache hit ratio,
  rcodes, query types, recursion time, request list, cache memory)
- resolvers: disable unused shm-enable to silence the startup warning
2026-06-07 13:34:24 -05:00
43730bf5e7
resolvers: fix empty sshd validation command in post-quantum task
The 'Validate sshd configuration' task had ansible.builtin.command with no
command, so it always errored (one of the following is required:
_raw_params, cmd, argv), tripping the rescue that reverts the drop-in. The
post-quantum KexAlgorithms hardening therefore never applied. Run sshd -t
to validate before restart as intended.
2026-06-07 10:38:46 -05:00
c64f59929e
resolvers: NXDOMAIN blocklist via RPZ; fix Ansible deprecations
Add an RPZ blocklist on the Unbound resolvers that returns NXDOMAIN for a
set of domains (and subdomains) and logs only those matches under rpz-log
tag "blocklist". Domains are templated from resolver_blocked_domains
(single source of truth) into /etc/unbound/blocklist.rpz; respip module
enabled for RPZ support.

Fix deprecation warnings across the Ansible tree:
- apt_repository -> deb822_repository (monitor, aprsc, uisp, grafana),
  removing stale .list files and adding update_cache where deb822 drops it
- community.mysql.* -> ansible.mysql.* (monitor) and requirements.yml
- top-level facts -> ansible_facts[...] (ansible_os_family,
  distribution_release, fqdn, architecture, default_ipv4) repo-wide
2026-06-07 10:32:42 -05:00
c5b658d653
remove findings 2026-06-04 15:25:00 -05:00
5e8823f4dd
fix: resolve all logic bugs
- Remove duplicate firewall include_role from base role (#18)
- Move remote_user from [ssh_connection] to [defaults] in ansible.cfg (#20)
- Add set -euo pipefail to run.sh (#21)
- Delete orphaned playbook_handlers.yml (#22)
- Fix changed_when: true in debian tasks (#23)
- Add tailscale_authkey env var lookup with TAILSCALE_KEY fallback (#25)
- Document -K requirement in bootstrap.yml (#26)
- Replace bare ansible_host=mail/git with IP addresses (#27)
- Update findings.md
2026-06-04 14:43:06 -05:00
ec372fd399
fix: add geerlingguy.postgresql to requirements.yml (used by db.w5isp.com) 2026-06-04 14:41:25 -05:00
8d50d412c6
docs: mark general.yml and docker targets findings as resolved 2026-06-04 14:40:22 -05:00
ffe1cc3820
docs: mark alpine role finding as resolved in findings.md 2026-06-04 14:40:02 -05:00
d81f910797
cleanup: remove orphaned host_vars/db.aprs.me.yml (superseded by db.w5isp.com) 2026-06-04 14:39:29 -05:00
118aa70f51
cleanup: remove broken makefile targets, fix general.yml references
- Remove all docker/build/push targets (no Dockerfile exists)
- Remove broken qc-web target (group doesn't exist)
- Remove clean, dirs, base-*, local, latest targets (docker-only)
- Fix bootstrap-network, run-all to use playbook.yml not general.yml
- Fix install-collections (deleted files referenced)
- Update findings.md
2026-06-04 14:37:55 -05:00
1b7077dd0d
fix: add template defaults, remove alpine ref, fix ssh -t flag
- Add |default() fallbacks for ntpserver, template_run_date,
  deb_mirror, and sshd.* to prevent template crash
- Remove include_role: name=alpine from base tasks (no such role)
- Fix SSH -t flag placement in Makefile reboot targets
- Update findings.md
2026-06-04 14:37:08 -05:00
44c109c6c9
cleanup: remove dead code and stale files
- Delete unreferenced roles: icinga2-container, debug, mailcow, syncthing
- Remove unused Galaxy deps from requirements.yml (docker, kubernetes)
- Delete roles/requirements.yml (graylog2.graylog, bertvv.bind, artis3n.tailscale)
- Merge netbox.netbox from collections/requirements.yml into root, delete file
- Delete 56 stale fact_cache files
- Remove unused inventory groups: home_cluster, dns_servers
- Update findings.md
2026-06-04 14:35:28 -05:00
ee72c64246
fix: resolve best practice and lint violations
- Convert ~290 short module names to FQCNs across all roles
- Change become: yes/no to become: true/false, gather_facts: no to false
- Remove deprecated inject_facts_as_vars from ansible.cfg
- Add missing task names to import_tasks/include_role calls
- Add become: yes to librenms clone task (partial-become fix)
- Add pipefail to risky shell command in udp-gro-fix.yml
- Quote all octal mode values
- Harden .ansible-lint with production profile and empty skip_list
- Update findings.md with all fixes
2026-06-04 14:34:23 -05:00
6f0d308fea
cleanup: remove forgejo, fix ssh key paths, fix tracking issues, update docs
- Remove forgejo role, play, group, host_vars, and DNS references
- Replace hardcoded /Users/graham/.ssh/ paths with env var lookup
- Remove broken setup-user Makefile target
- Add community.mysql collection to requirements.yml
- Add .ansible/ to .gitignore
- git rm --cached .DS_Store files and .vscode/settings.json
- Update CLAUDE.md and README.md to reflect actual state
- Add findings.md with audit results
2026-06-04 14:27:31 -05:00
46f55cdad8
fix 2026-06-02 14:46:50 -05:00