Infrastructure-as-code for Kai's hosts and Kubernetes homelab, including Ansible convergence and observability.
  • Python 51%
  • Shell 26.7%
  • PowerShell 12.6%
  • HCL 4.8%
  • Jinja 2.3%
  • Other 2.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
coilyco-ops b37caa0fdd
All checks were successful
TruffleHog / Scan for secrets (push) Successful in 5s
CI / lint (push) Successful in 43s
Seed git's clone template with the pre-commit hooks (#986)
2026-08-29 06:53:18 +00:00
.agents/skills fix(ops): name the cluster on every guarded kubectl call before the rebuild (#977) 2026-08-28 19:46:59 +00:00
.claude fix(claude): drop the repo-local allow wildcard the harness never accepted (#944) 2026-08-26 03:12:55 +00:00
.forgejo/workflows feat(mirrors): verify push mirrors from the receiving side, on a schedule (#967) 2026-08-27 10:22:09 +00:00
.githooks Add .gitattributes and post-merge hook to fix CRLF on Linux pulls 2026-04-14 00:41:22 -07:00
.github chore: drop CODEOWNERS so agents stop reading a review request as a gate (#898) 2026-08-20 09:11:42 +00:00
ansible Seed git's clone template with the pre-commit hooks (#986) 2026-08-29 06:53:18 +00:00
caddy chore(tangled-knot)!: remove the host-native knot wiring 2026-08-13 19:53:43 -07:00
clusters feat(coredns): declare the hairpin fix both clusters are running undeclared (#976) 2026-08-28 18:59:35 +00:00
config fix(forgejo): declare state/ambient so it stops reading as taxonomy drift (#984) 2026-08-29 05:29:28 +00:00
deploy feat(coredns): declare the hairpin fix both clusters are running undeclared (#976) 2026-08-28 18:59:35 +00:00
docs Seed git's clone template with the pre-commit hooks (#986) 2026-08-29 06:53:18 +00:00
fail2ban feat(sshd): enable fail2ban with default sshd jail 2026-06-04 03:38:34 -07:00
scripts chore(ansible): use a current role slug in the launch wrapper test (#980) 2026-08-28 21:05:04 +00:00
sudoers feat(eco): wire native|server transport axis over the live-side eco scripts 2026-07-03 21:23:55 +00:00
systemd fix(restic): use %N so the alert unit is not named .service.service (#922) 2026-08-25 05:40:21 +00:00
terraform feat(dns): claim bot.coilysiren.me for the agent's atproto identity (#962) 2026-08-27 08:27:42 +00:00
.ansible-lint fix: make infrastructure lint match the repo 2026-07-27 13:08:47 -07:00
.gitattributes feat: add 3D photogrammetry model of kai-desktop-tower 2026-05-20 20:42:22 -07:00
.gitignore fix: make infrastructure lint match the repo 2026-07-27 13:08:47 -07:00
.pre-commit-config.yaml ci(pre-commit): keep the windows-name check off the commit-msg stage 2026-08-20 02:02:57 -07:00
.pylintrc fix(lint): re-enable too-many-nested-blocks, refactor the depth out 2026-06-04 04:05:26 -07:00
.python-version Migrate from requirements.txt to uv + pyproject.toml 2026-05-14 06:30:28 -07:00
.typos.toml chore: land the aos-precommit-v0.18.0 bump and satisfy its new hooks 2026-08-10 21:06:14 -07:00
.yamllint fix: make infrastructure lint match the repo 2026-07-27 13:08:47 -07:00
AGENTS.md docs(agents): adopt the generated git-workflow block (#940) 2026-08-26 02:38:21 +00:00
bootstrap.sh feat(just): retire ward exec, move the verb table to a justfile 2026-08-17 11:59:56 -07:00
CLAUDE.md Add CLAUDE.md with @AGENTS.md import 2026-04-23 19:35:51 -07:00
justfile feat(mirrors): force-push every mirror from one verb, then verify (#968) 2026-08-27 10:33:47 +00:00
pyproject.toml docs(agents): adopt the generated git-workflow block (#940) 2026-08-26 02:38:21 +00:00
README.md docs: correct the layout tree, em-dashes, and a mismatched link (#908) 2026-08-24 01:38:33 +00:00
uv.lock fix: make infrastructure lint match the repo 2026-07-27 13:08:47 -07:00

infrastructure

Everything Kai needs to stand up and operate kai-server. Systemd units, shell scripts, k3s cluster manifests, and a small set of ward verbs for cluster-side bootstrap.

Layout

.
├── .agents/skills/   # canonical operator and repository skill provider
├── ansible/          # host and workstation convergence - see ansible/README.md
├── clusters/         # per-cluster state, one directory each for kai-server and ser8
├── terraform/        # AWS IAM, KMS, inventory, public assets, and Tailscale
├── deploy/           # cluster-wide manifests, plus Flux, Forgejo runners, and observability
├── systemd/          # systemd unit files
├── scripts/          # unit ExecStart/ExecPre scripts and Python helpers for the just verbs
├── fail2ban/         # jail and filter config
├── sudoers/          # privileged-verb sudoers fragments
├── config/           # small shared config, currently the required-status-checks list
├── caddy/            # legacy, pre-traefik
├── docs/             # durable feature and convergence documentation
├── bootstrap.sh      # first-run host bootstrap
├── justfile          # dev verbs
└── .ward/ward.yaml   # catalog metadata

Eco server setup notes live in the eco-server-setup skill. Disk usage, rootfs pressure, Kubernetes DiskPressure, and Forgejo storage incidents route through the ops-investigation-disk-pressure skill. K3s workload startup, Forgejo runner, and cluster connectivity incidents route through the symptom-driven skills indexed in docs/k3s-deploy-notes-topology.md.

Operating the cluster

Cluster-bootstrap verbs are declared in the justfile and call their scripts/k8s/ helpers directly. Common verbs run via just <verb>:

just cert-manager                                                        # re-apply cert-manager + ClusterIssuers
just aws-secrets aws_access_key_id=<ID> aws_secret_access_key=<SECRET>   # bootstrap external-secrets + aws-credentials

Cluster passthroughs (SSM, kubectl, Forgejo, Tailscale) run through aosguard ops. K3s service ops go over Tailscale SSH: restart k3s with ssh kai-server -- sudo systemctl restart k3s.service. Game-server systemd ops still live in coily core (kai-server keeps coily until gaming is ported): tail or restart game servers with coily gaming <eco|core-keeper|icarus|factorio> ....

See docs/ for:

  • architecture.md - top-down view of what runs on kai-server
  • certificates.md - DNS-01 via Route 53 cert flow, replacing the HTTP-01 and hairpin-NAT workarounds
  • windows.md - BrowserPicker opens complete Forgejo deep links in the installed Chrome app

Commands

Dev commands are declared in the justfile. Run them as just <verb>, and run just alone to list every one.

See also

  • AGENTS.md - agent-facing operating rules.
  • docs/FEATURES.md - inventory of what ships today.
  • justfile - dev verbs. Agents route through just, not bare uv / python / npm / cargo / dotnet.

Cross-reference convention: features-release-tooling.md. Origin: coilysiren/agentic-os-kai#313.