Skip to content

Fix Broken Link for ACME Challenge Validation #2069

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 23, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion networking/custom-domain.html.markerb
Original file line number Diff line number Diff line change
@@ -28,11 +28,11 @@

#### Option I: Set a CNAME record

In most cases, you can use a CNAME record, which points your custom domain at your `.fly.dev` host. If your DNS provider doesn't allow Apex, or root, hostnames to have CNAME records, then you can use *Option II: Set the A/AAAA records*.

Check warning on line 31 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Spelling] Is 'hostnames' a typo? Raw Output: {"message": "[Fly.Spelling] Is 'hostnames' a typo?", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 31, "column": 151}}}, "severity": "INFO"}

Set the CNAME record with your DNS provider. For example, if you have a domain called `example.com` and an app called `exemplum`, then you can create a CNAME record for `example.com`'s DNS that would look like this:

| Record Type | Host / Hostname / Name | Value / Content / Alias of |

Check failure on line 35 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'hostname' instead of 'Hostname'. Raw Output: {"message": "[Vale.Terms] Use 'hostname' instead of 'Hostname'.", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 35, "column": 24}}}, "severity": "ERROR"}
| --- | --- | ---|
| CNAME | @ | exemplum.fly.dev |

@@ -60,7 +60,7 @@
Once the A and AAAA records are added and propagated through the DNS system, you should be able to connect over unencrypted HTTP to the domain name. Continuing the preceding example, that's the domain name: `http://example.com`.

<div class="important">
**Important:** Hostname validation will fail without an IPv6 address&mdash;and we won't attempt to issue or renew a certificate&mdash;unless you're using a [CNAME `_acme-challenge` for domain verification](#optional-validate-with-an-acme-challenge). However, we still recommend having both an IPv4 and an IPv6 address allocated if your app is serving traffic. If your app doesn't have an IPv6 address, allocate one with `flyctl ips allocate-v6`.
**Important:** Hostname validation will fail without an IPv6 address&mdash;and we won't attempt to issue or renew a certificate&mdash;unless you're using a [CNAME `_acme-challenge` for domain verification](#optional-validate-with-an-acme-dns-01-challenge). However, we still recommend having both an IPv4 and an IPv6 address allocated if your app is serving traffic. If your app doesn't have an IPv6 address, allocate one with `flyctl ips allocate-v6`.

Check failure on line 63 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'IPs' instead of 'ips'. Raw Output: {"message": "[Vale.Terms] Use 'IPs' instead of 'ips'.", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 63, "column": 436}}}, "severity": "ERROR"}

Check failure on line 63 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'hostname' instead of 'Hostname'. Raw Output: {"message": "[Vale.Terms] Use 'hostname' instead of 'Hostname'.", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 63, "column": 16}}}, "severity": "ERROR"}
</div>

### Get certified
@@ -127,7 +127,7 @@
Created At = 1m24s ago
Status = Ready
```
2. Reference the **DNS Validation Instructions** to create a `CNAME` DNS record for a subdomain, `_acme-challenge`, of your domain (**DNS Validation Hostname**) and point it at the **DNS Validation Target**.

Check failure on line 130 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'hostname' instead of 'Hostname'. Raw Output: {"message": "[Vale.Terms] Use 'hostname' instead of 'Hostname'.", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 130, "column": 150}}}, "severity": "ERROR"}

Once complete, and the updated DNS data has propagated, that domain will be queried to confirm you have control of it. Certificates will be generated and installed.

@@ -144,7 +144,7 @@

When users make requests, their browser sends a `Host` header you can use to alter the behavior of your application. When you run your app server on Fly.io directly, just get the contents of the `Host` header to identify a request.

If you're running your application on another provider, you will need to create a proxy application, like NGINX to route traffic through Fly.io. Your application can then use the `X-Forwarded-Host` header to determine how to handle requests.

Check failure on line 147 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'nginx' instead of 'NGINX'. Raw Output: {"message": "[Vale.Terms] Use 'nginx' instead of 'NGINX'.", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 147, "column": 107}}}, "severity": "ERROR"}

## Supported top-level domains

@@ -166,7 +166,7 @@

If you encounter issues when adding or validating a certificate for a custom domain on Fly.io, you can use the following methods to troubleshoot:

* Use [Let's Debug](https://letsdebug.net/): A diagnostic tool/website to help figure out why you might not be able to issue a certificate for Let's Encrypt. Using a set of tests, it can identify a variety of issues, including: problems with basic DNS setup, problems with nameservers, rate limiting, networking issues, CA policy issues, and common website misconfigurations.

Check warning on line 169 in networking/custom-domain.html.markerb

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Spelling] Is 'misconfigurations' a typo? Raw Output: {"message": "[Fly.Spelling] Is 'misconfigurations' a typo?", "location": {"path": "networking/custom-domain.html.markerb", "range": {"start": {"line": 169, "column": 358}}}, "severity": "INFO"}
* Wait and retry: If you've hit a rate limit, you'll need to wait until the rate limit window passes before you can successfully create or validate a certificate again. We don’t have a way to reset it.

The best way to avoid hitting rate limits is to use staging environments and domains for testing and development, and to carefully plan your certificate issuance to stay within the limits. Avoid failed validation by ensuring that your DNS records are correctly configured, with no conflicting records.