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
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_workers_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 |
|