Terraform
Point Terraform at your Dependably instance and terraform init resolves and
downloads every provider through it, instead of reaching registry.terraform.io
and releases.hashicorp.com.
This is the ecosystem where a mirror pays off most visibly. A stack using
hashicorp/aws and hashicorp/random unpacks to roughly 665 MB of provider
binaries, and CI runners keep no .terraform directory between jobs, so
without a mirror every pipeline re-downloads the archives.
You will need your instance's base URL and, unless your organization allows
anonymous pull, a token. Create one in the web UI (see
Getting started). The examples below use
repo.example.com; substitute your own. Your provider mirror URL is:
https://repo.example.com/terraform/
HTTPS is mandatory here. Terraform rejects an
http://mirror URL while parsing its CLI configuration, before it makes any request, withCannot use "http://…" as a URL for a network provider mirror. Unlike the other ecosystems, a plain-HTTP deployment cannot serve this one. Terminate TLS in front of Dependably first.
Configure
Provider installation is configured in Terraform's CLI configuration, not
per project. There is no per-repository file to edit and no change to any
required_providers block.
Create ~/.terraformrc (Linux and macOS) or %APPDATA%\terraform.rc
(Windows):
provider_installation {
network_mirror {
url = "https://repo.example.com/terraform/"
}
}
In CI, where $HOME may not be the runner's, point Terraform at the file
explicitly:
export TF_CLI_CONFIG_FILE=/path/to/terraformrc
terraform init
If your organization has anonymous pull disabled, the mirror answers 401 with
a WWW-Authenticate: Bearer challenge. Put the token in the URL's userinfo.
The username is ignored; only the token is checked:
url = "https://user:<your token>@repo.example.com/terraform/"
Verify
terraform init
Providers download through Dependably. The first download of each provider archive is recorded as a First fetch event on the Activity tab of the Audit page, which admins, owners and auditors can open. See Audit log.
A committed .terraform.lock.hcl needs no change and no -upgrade run:
Terraform recomputes each provider's h1: hash from the archive it downloads
and verifies it against the lock file, and the mirrored bytes are identical to
the ones the public registry serves. A configuration with no committed lock
file gets no verification, the same exposure it already accepts when
installing directly.
Archives are cached per platform. A version document lists every platform the
upstream registry advertises, but each archive is fetched and cached on its
own first download. Running terraform init on Linux does not warm the macOS
arm64 archive; the next init on that platform is what fetches it.
What is mirrored
Only providers are mirrored. Terraform's module registry is a separate
protocol with no network-mirror equivalent, so terraform init still reaches
the public registry for any module block sourced from a registry. Provider
archives are where the bytes are, so this still removes the large majority of
egress. A deployment that must eliminate registry traffic entirely needs to
vendor modules or source them from Git.
Only configured registry hosts are mirrored. A provider is addressed by its
own source address ({hostname}/{namespace}/{type}), and Dependably matches
that hostname against your organization's configured upstreams instead of
fetching from whatever host the address names. To mirror a provider from a
private registry, open Settings, then Proxy, and add that registry
under Upstream registries (see Upstreams).
Supply-chain controls
Provider fetches run the same checks as every other ecosystem. The archive's
checksum is verified against the shasum the registry reports for that exact
platform before it is stored. A provider is pinned to the registry host that
first served it. The policy gate runs on first fetch and on every cache hit, and
reserved namespaces never pull from upstream. See
Settings for the gates themselves.
Advisory scanning and the licence gate behave differently for Terraform.
OSV publishes no Terraform provider ecosystem, so providers are never queried and never stamped as scanned. The UI reports them as No advisory feed, never as clean, so an artefact with zero advisory coverage is not mistaken for one screened against a live feed. Every other gate still applies.
Provider archives carry no licence manifest, so recording zero licences is the normal case here, not an unknown-licence signal, and it does not block under a blocking licence policy.
Troubleshooting
Cannot use "http://…" as a URL for a network provider mirror: Terraform
rejects a plain-HTTP network_mirror.url while parsing the CLI configuration,
before any request is made. Terminate TLS in front of Dependably.
A provider resolves to no installable versions: the mirror answers 404
when the provider's hostname is not among your organization's configured
upstream registries. Terraform then reports that the provider has no available
versions, the same as if it did not exist at all, rather than a clear "this
registry is not configured" error. Open Settings, then Proxy, and add
the registry under Upstream registries, or check required_providers for a
typo in the hostname.
Revert
Remove the provider_installation block from ~/.terraformrc (or unset
TF_CLI_CONFIG_FILE). Terraform returns to resolving providers directly from
their source registries on the next terraform init.