Get Charon deployed in 5 minutes!
- Kubernetes cluster (Linode LKE, k3s, or similar)
-
kubectlconfigured and working - Terraform v1.0+ installed
- Cloudflare account with domain
- Cloudflare API token (DNS edit permissions)
→ Detailed: Prerequisites Guide
# Clone the repository
git clone https://github.com/your-org/charon.git
cd charon
# Create environment file
cat > .env << EOF
CLOUDFLARE_API_TOKEN="your-api-token-here"
EOF
# Copy and edit terraform vars
cd terraform
cp terraform.tfvars.example terraform.tfvarsEdit terraform.tfvars:
cloudflare_zone_id = "your-zone-id"
cert_manager_email = "you@example.com"
headscale_server_url = "https://vpn.example.com"
domain_name = "example.com"→ Detailed: Configuration Guide
# Load credentials
source ../.env
export TF_VAR_cloudflare_api_token="$CLOUDFLARE_API_TOKEN"
# Initialize
terraform init
# Deploy (takes ~5-10 minutes)
terraform applyWhat happens:
- ✅ cert-manager installs
- ✅ Headscale VPN deploys
- ✅ TLS certificates provision
- ✅ Services start (Grafana, FreeIPA, etc.)
- ✅ DNS records auto-configure
# Check all pods are running
kubectl get pods -n dev
# Should see:
# headscale-0 1/1 Running
# grafana-0 3/3 Running
# freeipa-0 2/2 Running
# open-webui-0 3/3 Running# Get a pre-auth key
kubectl exec -n dev headscale-0 -- headscale preauthkeys create \
--user default --reusable --expiration 90d
# Connect your device
tailscale up --login-server https://vpn.example.com --authkey <your-key>
# Verify connection
tailscale status→ Detailed: VPN Enrollment Guide
Once connected to VPN:
# Grafana
https://grafana.example.com
# Login: admin / (check Grafana docs for initial password)
# FreeIPA
https://freeipa.example.com
# Login: admin / (generated password in terraform output)
# Open-WebUI
https://ai.example.com
# Use FreeIPA credentials- 📖 Architecture Overview - Understand how it works
- 🔐 LDAP Integration - Configure authentication
- 📊 Monitoring Setup - Set up dashboards
- 🛠️ Adding Services - Extend the platform
# Check PVC status
kubectl get pvc -n dev
# Check storage class
kubectl get storageclassFix: Ensure your cluster has a default storage class configured.
# Check if records were created
dig vpn.example.comFix: Verify cloudflare_zone_id is correct and API token has DNS edit
permissions.
# Check cert-manager
kubectl get pods -n cert-manager
kubectl logs -n cert-manager -l app=cert-manager
# Check certificate status
kubectl get certificate -n devFix: Verify Cloudflare API token has Zone:DNS:Edit permissions.
→ Full guide: Troubleshooting
To remove everything:
cd terraform
terraform destroyWarning: This deletes all services and data!
Navigation: 📚 Documentation Index | 🏠 Home | Next: Configuration →