···11111212# Bun deps for scripts/ (regenerated by `bun install`)
1313scripts/node_modules/
1414+1515+# Terraform state lives in B2 (aly-backups/cute.haus/terraform/), but the
1616+# local cache + plan files can still appear in this directory.
1717+terraform/.terraform/
1818+terraform/.terraform.lock.hcl
1919+terraform/*.tfstate
2020+terraform/*.tfstate.*
2121+terraform/*.tfplan
+27-1
terraform/providers.tf
···11terraform {
22- required_version = ">= 1.5"
22+ required_version = ">= 1.10"
3344 required_providers {
55 cloudflare = {
···1010 source = "hetznercloud/hcloud"
1111 version = "~> 1.48"
1212 }
1313+ }
1414+1515+ # State in B2 alongside CNPG + Longhorn backups. Auth via AWS_ACCESS_KEY_ID /
1616+ # AWS_SECRET_ACCESS_KEY (B2 application key in secrets/b2.yaml). Bucket has
1717+ # versioning enabled, so state history is recoverable from B2 if a bad apply
1818+ # corrupts it.
1919+ #
2020+ # No state locking: B2's S3 API at us-east-005 doesn't honor the
2121+ # If-None-Match conditional-PUT header that terraform's use_lockfile uses
2222+ # (501 NotImplemented). DynamoDB-based locking is overkill for single-user
2323+ # operation; the discipline is "don't run terraform from two places at once."
2424+ backend "s3" {
2525+ bucket = "aly-backups"
2626+ key = "cute.haus/terraform/terraform.tfstate"
2727+ region = "us-east-005"
2828+2929+ endpoints = {
3030+ s3 = "https://s3.us-east-005.backblazeb2.com"
3131+ }
3232+3333+ skip_credentials_validation = true
3434+ skip_metadata_api_check = true
3535+ skip_region_validation = true
3636+ skip_requesting_account_id = true
3737+ use_path_style = true
3838+ skip_s3_checksum = true
1339 }
1440}
1541