TF: Current File Tree (Annotated)
Current Terraform File Tree (Both Repos)
pal-e-platform
Resource Inventory (main.tf, top to bottom)
Pattern: Every platform component follows namespace → helm_release → funnel
This is a repeating 3-resource pattern (sometimes 4 with extras like configmaps). A natural module boundary.
pal-e-services
services.tf for_each Pattern (per service)
7 resources per service. Currently 4 services = 28 dynamic resources + 8 static = 36 total.
Combined Provider Map
| Provider | pal-e-platform | pal-e-services |
|---|---|---|
| hashicorp/kubernetes | yes | yes |
| hashicorp/helm | yes | yes |
| tailscale/tailscale | yes | no (but uses TS ingress resources via kubernetes provider) |
| aminueza/minio | yes | no |
| goharbor/harbor | no | yes |
| argoproj-labs/argocd | no | yes |
Cross-State Dependencies
pal-e-services depends on resources created by pal-e-platform but does not reference them via
terraform_remote_state. Instead, dependencies are implicit:- Tailscale operator + ACL → must exist before funnel ingresses work
- Harbor → must be running before harbor provider connects
- Forgejo → must be running before ArgoCD can pull repos
- Prometheus ServiceMonitor CRD → must exist before services can define ServiceMonitors
This works for a solo dev who applies platform first, services second. It will break when a CI pipeline tries to apply services independently.