You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.0 KiB
Markdown

# quotesdb Infrastructure
OpenTofu configuration for deploying quotesdb to Cloudflare.
## Resources provisioned
| Resource | Description |
|---|---|
| `cloudflare_d1_database.quotesdb` | D1 SQLite database backing the API |
| `cloudflare_workers_script.api` | Compiled Wasm Worker serving `/api/*` |
| `cloudflare_worker_route.api` | Routes `quotes.elijah.run/api/*` to the Worker |
| `cloudflare_pages_project.ui` | Pages project hosting the Yew SPA |
| `cloudflare_record.ui` | CNAME `quotes.elijah.run` → Pages |
| `cloudflare_pages_domain.ui` | Custom domain binding on Pages |
## Required credentials
| Variable | Description |
|---|---|
| `cloudflare_api_token` | Cloudflare API token (Workers, D1, Pages, DNS edit) |
| `cloudflare_account_id` | Cloudflare account ID |
| `cloudflare_zone_id` | Zone ID for `elijah.run` |
These are set in `terraform.tfvars` (gitignored)
```sh
cloudflare_api_token="..."
cloudflare_account_id="..."
cloudflare_zone_id="..."
```
## First-time setup (chicken-and-egg)
D1 must exist before the Worker can bind to it. On the very first deploy:
```sh
cd infra/
tofu init
tofu apply -target=cloudflare_d1_database.quotesdb
wrangler d1 execute quotesdb --file schema.sql --remote
tofu apply
```
Subsequent deploys: CI/CD handles everything automatically.
## Local apply
```sh
cd quotesdb/infra/
tofu init
tofu plan
tofu apply
```
## State
State is stored locally in `terraform.tfstate` (gitignored). For a team setup, migrate to a remote backend (S3-compatible bucket, Terraform Cloud, etc.).
## Files
| File | Purpose |
|---|---|
| `main.tf` | Terraform block and provider version constraints |
| `providers.tf` | Cloudflare provider configuration |
| `variables.tf` | Input variable declarations |
| `d1.tf` | Cloudflare D1 database resource |
| `worker.tf` | Cloudflare Workers script + route |
| `pages.tf` | Cloudflare Pages project |
| `dns.tf` | DNS record and custom domain binding |
| `schema.sql` | Idempotent D1 schema (applied via wrangler, not tofu) |
| `.gitignore` | Ignores state, lock, and credential files |