--- date: "2026-03-04T00:00:00+00:00" slug: "terraform" sidebar_position: 118 --- # Terraform State Registry Publish terraform states to sync it between multiple users or CI system. ## Requirements To work with the Terraform State registry, you need to use [Terraform](https://www.terraform.io/) or [OpenTofu](https://opentofu.org/). ## Configuring the package registry To use the Gitea Terraform State registry, you need to configure the `http` backend in your Terraform configuration. ```hcl terraform { backend "http" { address = "https://gitea.example.com/api/packages/{owner}/terraform/state/{name}" lock_address = "https://gitea.example.com/api/packages/{owner}/terraform/state/{name}/lock" unlock_address = "https://gitea.example.com/api/packages/{owner}/terraform/state/{name}/lock" lock_method = "POST" unlock_method = "DELETE" username = "{username}" password = "{password_or_token}" } } ``` | Placeholder | Description | | ----------- | ----------- | | `owner` | The owner of the state (user or organization). | | `name` | The name of the state. | | `username` | Your Gitea username. | | `password` | Your Gitea password or [personal access token](development/api-usage.md#authentication). | If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password. ## Initialize the backend After configuring the backend, you can initialize it with: ```shell terraform init ``` Terraform will prompt you to migrate your state if you already have one locally. ## State Locking Gitea supports state locking to prevent concurrent modifications. The `lock_address` and `unlock_address` should point to the `/lock` sub-route of your state URL. - **Locking**: Performed via a `POST` request to `{address}/lock`. - **Unlocking**: Performed via a `DELETE` request to `{address}/lock`. Terraform handles these requests automatically when configured as shown above. ## Encrypted state The state registry supports [encrypted state](https://opentofu.org/docs/language/state/encryption/). ## State Versions and Management Gitea keeps track of your Terraform state versions. You can use the API to retrieve or delete specific versions. ### Fetch state To fetch the latest version of a state: ```shell curl --user {username}:{password_or_token} \ https://gitea.example.com/api/packages/{owner}/terraform/state/{name} ``` To fetch a specific version by its serial number: ```shell curl --user {username}:{password_or_token} \ https://gitea.example.com/api/packages/{owner}/terraform/state/{name}/versions/{serial} ``` ### Delete state To delete the entire state and all its versions: ```shell curl --user {username}:{password_or_token} -X DELETE \ https://gitea.example.com/api/packages/{owner}/terraform/state/{name} ``` To delete a specific version by its serial number: ```shell curl --user {username}:{password_or_token} -X DELETE \ https://gitea.example.com/api/packages/{owner}/terraform/state/{name}/versions/{serial} ```