- TypeScript 54.1%
- Python 42.6%
- Just 2.2%
- Jinja 0.9%
- Shell 0.1%
- Other 0.1%
| .forgejo/workflows | ||
| .githooks | ||
| ansible | ||
| docs | ||
| flux | ||
| ingest_daemon | ||
| node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709 | ||
| tests | ||
| .editorconfig | ||
| .gitignore | ||
| .markdownlint-cli2.jsonc | ||
| .sops.yaml | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| justfile | ||
| LICENSE | ||
| README.md | ||
BERT FRC Team 133 — Foundational Infrastructure
This repository contains the GitOps configuration, Kubernetes manifests, and automation for BERT FRC Team 133's on-premises cluster. It is a reference architecture for FRC teams deploying Kubernetes at scale with minimal operational overhead.
Intended audience: BERT 133 team members and other FRC teams adopting this architecture.
LAN-only. This cluster and its configuration are designed for deployment on a private network within an FRC competition venue. No part of this repository is intended for public internet exposure.
Getting Started
- VISION.md — long-term goals and design principles.
- Design Plans — phase-by-phase implementation roadmaps.
just --list— run this command to see all available operations (task runner recipes).
For detailed information on any subdirectory, see the CLAUDE.md file within it:
- ansible/CLAUDE.md — Ansible playbooks, roles, and inventory structure.
- flux/CLAUDE.md — Flux GitOps manifests and application deployments.
- tests/CLAUDE.md — Acceptance tests and test infrastructure.
- docs/CLAUDE.md — Documentation standards and decision records.
Customizing This Stack for Your Team
Other FRC teams adopting this repository must change a small set of values
before running just bootstrap. Each is noted with a # TODO comment in the
file it lives in.
| Variable | File | What it is |
|---|---|---|
team_number |
ansible/inventory/group_vars/all.yml |
Your FRC team number. Every LAN addressing value (subnet, gateway IP, DHCP pool) is derived from this one value. |
lan_base_domain |
ansible/inventory/group_vars/all.yml and flux/clusters/team/cluster-vars.yaml |
LAN subdomain of the team-owned public zone (e.g., lan.team1234.org). LAN services resolve here via split-horizon DNS; the wildcard Let's Encrypt cert covers *.${lan_base_domain}. Must match in both files — just check-config fails on drift. |
lan_subnet, lan_server_ip |
ansible/inventory/group_vars/all.yml |
Derived from team_number by default (10.<team/100>.<team%100>.0/24 and .10). Override only if your pit network deviates from FRC convention. |
cloudflare_zone |
ansible/inventory/group_vars/all.yml and flux/clusters/team/cluster-vars.yaml |
The Cloudflare-hosted parent zone of lan_base_domain (e.g., team1234.org). Used by cert-manager's DNS-01 solver. |
acme_contact_email |
ansible/inventory/group_vars/all.yml and flux/clusters/team/cluster-vars.yaml |
Real contact address for Let's Encrypt expiration warnings. |
team_server_wan_interface, team_server_lan_interface |
ansible/inventory/host_vars/<host>.yml |
Names of the server's WAN (upstream wifi) and LAN (pit) interfaces. Discover via docs/runbooks/discover-interface-names.md. |
| Cloudflare API token | flux/infrastructure/configs/cert-manager/cloudflare-api-token.sops.yaml |
Scoped Zone:DNS:Edit + Zone:Zone:Read token on cloudflare_zone. Replace with just sops-edit <file>. Never use a global API key. |
See docs/design-plans/2026-04-20-pit-network.md for the complete rationale
and docs/runbooks/frc-radio-bridge-mode.md for the one-time radio setup.
License
This project is licensed under the MIT License — see LICENSE.