diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..f154e32 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,140 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Repository Overview + +This is a multi-environment infrastructure-as-code repository managing: +- **Ansible**: Configuration management for servers across multiple environments (VNTX, home, app servers) +- **Terraform**: DNS infrastructure management across DNSimple, Porkbun, and PowerDNS +- **Kubernetes**: K3s cluster deployments on Proxmox with Flatcar/Debian +- **Home Lab**: K3s configurations with Tailscale integration + +## Common Commands + +### Ansible Operations +```bash +# Run main playbook +cd ansible && ./run.sh + +# Bootstrap new host +make bootstrap-init HOSTNAME=hostname ANSIBLE_HOST=ip_address + +# Run specific playbook +ansible-playbook general.yml + +# Run with specific tags +ansible-playbook -t caddy general.yml + +# Gather facts from all hosts +make facts +``` + +### Terraform Operations +```bash +cd terraform +terraform init +terraform plan +terraform apply + +# Format terraform files before committing +terraform fmt +``` + +### K3s Cluster Deployment (VNTX) +```bash +cd clusters/vntx +export TF_VAR_proxmox_password="your-password" +./deploy.sh + +# Manual steps if needed: +cd terraform && tofu apply +cd ../ansible && ansible-playbook -i inventory.yml k3s-install.yml +export KUBECONFIG=./kubeconfig +kubectl get nodes +``` + +## Architecture + +### Directory Structure +- `ansible/` - Ansible playbooks and roles for server configuration + - `roles/` - Reusable roles (base, caddy, docker, k3s, resolvers, etc.) + - `group_vars/` - Group-specific variables + - `host_vars/` - Host-specific variables + - Main playbooks: `playbook.yml`, `general.yml`, `bootstrap.yml` + +- `terraform/` - DNS infrastructure management + - Manages domains: w5isp.com, vntx.net/org, manero.org, mcintire.me, gridmap.org + - Providers: DNSimple, Porkbun, PowerDNS (reverse DNS) + +- `clusters/vntx/` - K3s cluster on Proxmox + - `terraform/` - VM provisioning on Proxmox + - `ansible/` - K3s installation and configuration + - `infrastructure/` - Services like Icinga2, FreeRADIUS, Unbound + - `system/` - Core services: MetalLB, Longhorn, cert-manager + +- `home/` - Home lab K3s configurations + - `k3s/` - K3s service definitions with Tailscale integration + - `cluster/` - Application deployments (Forgejo, Node-RED, etc.) + +### Key Infrastructure Services + +**Monitoring**: Icinga2 with MariaDB backend +**DNS**: Unbound resolvers, PowerDNS for reverse zones +**VPN**: Tailscale integration across environments +**Web Proxy**: Caddy for reverse proxy and SSL termination +**Storage**: Longhorn distributed storage for K3s +**Load Balancing**: MetalLB for bare-metal K3s + +### Security Notes +- Ansible user (UID 10001) with passwordless sudo +- SSH keys fetched from GitHub for authentication +- Tailscale requires `TAILSCALE_KEY` environment variable +- Terraform credentials should use environment variables (TF_VAR_*) + +## Development Workflow + +### Adding New Hosts +1. Add host to `ansible/hosts` inventory +2. Create host_vars file if needed +3. Run bootstrap: `make bootstrap-init HOSTNAME=x ANSIBLE_HOST=y` +4. Apply configuration: `ansible-playbook -l hostname general.yml` + +### DNS Changes +1. Edit appropriate `terraform/dns_*.tf` file +2. Run `terraform fmt` to format +3. Review with `terraform plan` +4. Apply with `terraform apply` + +### K3s Service Deployment +1. Create namespace if needed +2. Deploy storage (PVC) if stateful +3. Create ConfigMaps/Secrets +4. Deploy application +5. Configure Service/Ingress for access + +## Testing + +### Ansible +```bash +# Syntax check +ansible-playbook --syntax-check playbook.yml + +# Dry run +ansible-playbook --check playbook.yml + +# Test on specific host +ansible-playbook -l hostname playbook.yml +``` + +### Terraform +```bash +terraform validate +terraform plan +``` + +### Kubernetes +```bash +kubectl apply --dry-run=client -f manifest.yaml +kubectl diff -f manifest.yaml +``` \ No newline at end of file diff --git a/ansible/roles/caddy/templates/Caddyfile.j2 b/ansible/roles/caddy/templates/Caddyfile.j2 index 4872b0e..91bdeec 100644 --- a/ansible/roles/caddy/templates/Caddyfile.j2 +++ b/ansible/roles/caddy/templates/Caddyfile.j2 @@ -19,3 +19,7 @@ truck.w5isp.com { reverse_proxy http://100.105.74.2 } + +photos.w5isp.com { + reverse_proxy http://10.0.16.1:2283 +}