You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(tofu): close end-to-end gaps so a fresh apply works from the docs (#57)
A real run against the provisioning-with-tofu doc surfaced four gaps:
1. terraform.tfvars.example was missing slots for ghcr_username,
ghcr_token, superuser_email, and superuser_password — all declared
in variables.tf and wired through main.tf, but invisible to an
operator following the docs.
2. LinkedIn OAuth was half-wired: the API has a full LinkedIn provider
(apps/api/src/lib/oauth/providers/linkedin.ts) and apps/api/.env.example
exposes LINKEDIN_OAUTH_CLIENT_{ID,SECRET}, but the tofu side was
missing — no variable declarations, no module wiring, no template
rendering. tfvars.example had commented entries that would emit
"undeclared variable" warnings if uncommented. Wired through the
same pattern as Google/GitHub (root variables.tf → bootstrap module
variables.tf → main.tf passthrough → compose.env.tftpl render).
3. PageIntro said "configures Cloudflare DNS firewalls" — reads like
Cloudflare's paid DNS Firewall product. Tweaked to "Cloudflare DNS
and a Hetzner firewall scoped to Cloudflare's IP ranges".
4. Sample output claimed "Resources: 5 added" — actual count is 9
(server, SSH key, firewall, apex A/AAAA, www CNAME, two zone
settings, redirect ruleset).
Two pieces of operator guidance also added:
- `cloud-init status: done` only means cloud-init's own steps ran —
it doesn't reflect bootstrap.sh failures inside the script. Added a
callout pointing at /var/log/cloud-init-output.log + the right
docker compose commands to find the actual problem.
- "Site returns 525" on first apply is normal for 2–5 minutes while
DNS propagates and ACME issues the first cert. Expanded the
troubleshooting entry to set expectations + suggest the dig +
Traefik log commands operators actually need.
Also fixed a stray empty description on github_oauth_client_secret.
tofu fmt + validate clean. Docs build clean (67 pages).
Copy file name to clipboardExpand all lines: apps/docs/src/content/docs/topics/provisioning-with-tofu.mdx
+27-6Lines changed: 27 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,9 +21,10 @@ import FaqItem from "../../../components/FaqItem.tsx";
21
21
{ value: "5 min", label: "Provisioning time" },
22
22
]}
23
23
>
24
-
One declarative `tofu apply` provisions a Hetzner VPS, configures Cloudflare
25
-
DNS firewalls, installs Docker runtime, and bootstraps your full-stack
26
-
docker-compose environment.
24
+
One declarative `tofu apply` provisions a Hetzner VPS, configures
25
+
Cloudflare DNS and a Hetzner firewall scoped to Cloudflare's IP ranges,
26
+
installs Docker runtime, and bootstraps your full-stack docker-compose
27
+
environment.
27
28
</PageIntro>
28
29
29
30
BoringStack's [Deployment](/topics/deployment/) path is manual: SSH into a VPS, install Docker, clone the monorepo, `compose pull && compose up -d`. Some operators prefer this.
@@ -100,7 +101,7 @@ flowchart LR
100
101
{ tone: "ok", text: "Success! The configuration is valid." },
0 commit comments