# Burrow Release Storage

This OpenTofu stack owns Google Cloud Storage buckets used as Burrow's first
release-storage backup target.

Garage is the required S3-compatible primary target. CI uses repo-owned storage
wrappers: they upload to Garage first, then mirror to GCS unless the backup is
explicitly disabled.

The host activation point is `services.burrow.garage`, enabled by the forge
host. It creates the initial single-node Garage layout and buckets from
host-local runtime secrets.

It may manage:

- the release artifact bucket served by `releases.burrow.net`
- the signed package repository bucket served by `packages.burrow.net`
- the private Nix cache backup bucket for `nix.burrow.net`
- public object-read IAM for download buckets
- object-admin IAM for the Burrow Forgejo runner service account

It must not manage:

- Google service-account JSON keys
- release signing keys
- package repository metadata
- DNS or CDN cutover

GCS access is keyless. Forgejo jobs run `Scripts/ci/google-wif-auth.sh` to
trade an Authentik-issued OIDC token for the Google runner service account in
project `project-88c23ce9-918a-470a-b33`, then use `gcloud storage` against the
managed backup buckets. The normal release path does not use rclone or Google
service-account JSON keys.

The Nix cache backup bucket defaults to private. Attic remains the public cache
surface at `nix.burrow.net`; GCS is only a backup target for the Garage `attic`
bucket.

## Run

```sh
Scripts/releases-tofu.sh init -backend-config=backend.hcl
Scripts/releases-tofu.sh plan -var-file=terraform.tfvars
```

For local syntax work without remote state:

```sh
Scripts/releases-tofu.sh init -backend=false
Scripts/releases-tofu.sh validate
```

Start with `manage_google = false`. Import existing buckets before enabling
management if they already exist.
