Skip to content
Merged
Show file tree
Hide file tree
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
7 changes: 3 additions & 4 deletions content/access/projects.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,12 @@ one, and you're ready to deploy.

## Project-level settings

Two things live on the project itself, outside any specific resource:
A couple of things live on the project itself, outside any specific resource:

- **Quotas** — caps on what the project can use (max deployments, max replicas
per deployment). Set on the project record; visible from `project.get`.
- **Config** — feature toggles. Today the main one is `domainAllowDisableCdn`,
which controls whether [domains](/networking/domains/) in this project can
turn CDN off.
- **Config** — reserved for project-level feature toggles. There are none
today, so `config` comes back empty from `project.get`.

```bash
deploys project get --project acme
Expand Down
7 changes: 5 additions & 2 deletions content/billing/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,15 @@ no per-deployment monthly minimum. The metered quantities are:
| **Disk** | GiB-hours | Allocated (the size you provisioned) |
| **Registry storage** | GiB-hours | Actual stored size |
| **Egress** | GiB transferred out | Actual bytes leaving the cluster |
| **Domain CDN** | Flat per domain | Per active domain with CDN on |
| **External route egress** | GiB transferred out | Actual bytes served from the edge for an [external HTTP route](/networking/routes/#external-server-http) |

Sizing your `resources.requests` matters — that's the number that hits the
invoice for CPU and memory, whether or not the workload uses every cycle.

Where a location provides edge caching, the CDN that fronts your
[custom domains](/networking/domains/) is included at no extra charge — there's
no separate CDN line item.

## Billing accounts

A **billing account** is the cost center invoices roll up to. One billing
Expand All @@ -49,7 +52,7 @@ each billing account. Invoices have:

- A **number** like `INV-2026-0009`.
- A **period** (`periodStart`, exclusive `periodEnd`).
- **Line items** — one per resource SKU (CPU, memory, disk, egress, CDN).
- **Line items** — one per resource SKU (CPU, memory, disk, egress).
- **Subtotal, tax (rate + amount), and total** in the account's currency.
- A **status** — `draft`, `open`, `paid`, or `void`.

Expand Down
52 changes: 36 additions & 16 deletions content/networking/domains.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,29 @@
title: 'Domains'
linkTitle: 'Domains'
weight: 1
description: 'Attach custom domains, prove you own them, terminate TLS, and turn on the CDN.'
description: 'Attach custom domains, prove you own them, terminate TLS, and route traffic.'
lead: 'A domain represents a custom hostname (or wildcard) you own. Attach it to a project + location, prove ownership with DNS, and the platform terminates TLS and routes traffic for you.'
---

## The Domains page

The Domains tab in the console lists every custom domain in the project, with
its wildcard flag, CDN flag, and the location it's bound to.
its wildcard flag and the location it's bound to.

{{< shot src="/img/domain-list.png" url="console.deploys.app/domain?project=acme" alt="Domain list: apex, www, api, and a wildcard" caption="Four domains in the same project — a mix of apex, subdomains, CDN on and off, and a wildcard." >}}
{{< shot src="/img/domain-list.png" url="console.deploys.app/domain?project=acme" alt="Domain list: apex, www, api, and a wildcard" caption="Four domains in the same project — a mix of apex, subdomains, and a wildcard." >}}

## Create a domain

You'll set four things:
You'll set three things:

- **Domain** — the hostname, e.g. `acme.example.com` or `acme.dev` (apex).
- **Location** — the cluster the domain will serve from. The hostname's TLS
certificate is provisioned in this location.
- **Wildcard** — if `true`, the domain covers `*.host` as well as `host`.
- **CDN** — if `true`, traffic goes through the CDN edge before reaching the
origin. Recommended for public-facing apps.

In locations with edge caching enabled, domains are served through our CDN
automatically — there's no separate toggle. CDN availability depends on the
location (see [The CDN](#the-cdn)).

```bash
curl https://api.deploys.app/domain.create \
Expand All @@ -31,8 +33,7 @@ curl https://api.deploys.app/domain.create \
"project": "acme",
"location": "gke.cluster-rcf2",
"domain": "acme.example.com",
"wildcard": false,
"cdn": true
"wildcard": false
}'
```

Expand Down Expand Up @@ -76,26 +77,45 @@ curl https://api.deploys.app/route.create \

## The CDN

When CDN is on, the platform fronts the domain with an edge cache. You get:
In locations where edge caching is enabled, domains are fronted by our edge
cache automatically — it's included, with nothing to turn on. You get:

- Global PoP routing — TLS terminates at the closest edge to the user.
- Static asset caching with sensible defaults (respects standard
`Cache-Control`).
- DDoS mitigation and request filtering.

Two operations matter day to day:
{{< callout type="note" >}}
CDN availability depends on the location. Locations without edge caching serve
your domain directly; `domain.purgeCache` returns `api: location not support`
for a domain in such a location.
{{< /callout >}}

- **Purge cache** — invalidate cached content for the domain. Available from
the console and as `domain.purgeCache` in the API.
- **Downgrade** — turn CDN off. There's a dedicated console flow at
`/domain/cdn-downgrade` because it changes the routing path.
**Purge cache** invalidates cached content for the domain. It's available from
the console and as `domain.purgeCache` in the API. Purge the whole domain, an
exact URL (`file`), or everything under a path (`prefix`):

```bash
# purge the whole domain
curl https://api.deploys.app/domain.purgeCache \
-d '{ "project": "acme", "location": "gke.cluster-rcf2",
"domain": "acme.example.com" }'
-d '{ "project": "acme", "domain": "acme.example.com" }'

# purge a single file
curl https://api.deploys.app/domain.purgeCache \
-d '{ "project": "acme", "domain": "acme.example.com",
"file": "https://acme.example.com/style.css" }'

# purge everything under a path prefix
curl https://api.deploys.app/domain.purgeCache \
-d '{ "project": "acme", "domain": "acme.example.com",
"prefix": "acme.example.com/assets" }'
```

{{< callout type="note" >}}
A wildcard domain can't be purged by host alone — pass a `file` or `prefix` so
the edge knows which concrete host to invalidate.
{{< /callout >}}

## Removing a domain

Deleting a domain also deletes any routes that reference it. The TLS
Expand Down
2 changes: 1 addition & 1 deletion content/networking/routes.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ affected — only the routing.
client
▼ HTTPS to acme.example.com/api/v1/users
edge / CDN (if domain.cdn = true)
edge (TLS terminates here; CDN-cached where the location supports it)
location ingress
Expand Down
35 changes: 18 additions & 17 deletions scripts/screenshots/mock-enrichment.patch
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git a/src/lib/server/mock.js b/src/lib/server/mock.js
index 4171516..e70aacf 100644
index a87d79f..d41a85e 100644
--- a/src/lib/server/mock.js
+++ b/src/lib/server/mock.js
@@ -127,8 +127,8 @@ function deployment (project = 'acme') {
Expand Down Expand Up @@ -44,16 +44,16 @@ index 4171516..e70aacf 100644
createdAt: CREATED_AT,
createdBy: USER_EMAIL,
successAt: CREATED_AT,
@@ -175,85 +175,155 @@ function deployment (project = 'acme') {
@@ -175,90 +175,154 @@ function deployment (project = 'acme') {
}

const deployments = [
- deployment('acme'),
{
...deployment('acme'),
- name: 'cron-cleanup',
- type: 'CronJob',
- schedule: '0 * * * *',
- name: 'web-paused',
- status: 'success',
- action: 'pause'
+ name: 'web',
+ image: 'registry.deploys.app/acme/web:v2.4.1',
+ revision: 24,
Expand All @@ -63,9 +63,12 @@ index 4171516..e70aacf 100644
+ url: 'web.acme.rcf2.deploys.app',
+ allocatedPrice: 142.8,
+ successAt: '2026-05-27T09:12:00Z'
+ },
+ {
+ ...deployment('acme'),
},
{
...deployment('acme'),
- name: 'cron-cleanup',
- type: 'CronJob',
- schedule: '0 * * * *',
+ name: 'api',
+ image: 'registry.deploys.app/acme/api:v1.8.0',
+ revision: 31,
Expand Down Expand Up @@ -173,7 +176,6 @@ index 4171516..e70aacf 100644
- location: LOCATION_ID,
- domain: 'acme.example.com',
- wildcard: false,
- cdn: true,
- verification: {
- ownership: { type: 'TXT', name: '_deploys.acme.example.com', value: 'verify=mock', errors: [] },
- ssl: {
Expand All @@ -193,7 +195,6 @@ index 4171516..e70aacf 100644
+ location: LOCATION_ID,
+ domain: 'acme.example.com',
+ wildcard: false,
+ cdn: true,
+ verification: {
+ ownership: { type: 'TXT', name: '_deploys.acme.example.com', value: 'verify=mock', errors: [] },
+ ssl: {
Expand All @@ -219,10 +220,10 @@ index 4171516..e70aacf 100644
+}
+
+const domains = [
+ { ...domainBase, domain: 'acme.example.com', cdn: true },
+ { ...domainBase, domain: 'www.acme.example.com', cdn: true },
+ { ...domainBase, domain: 'api.acme.example.com', cdn: false },
+ { ...domainBase, domain: 'acme.dev', wildcard: true, cdn: true }
+ { ...domainBase, domain: 'acme.example.com' },
+ { ...domainBase, domain: 'www.acme.example.com' },
+ { ...domainBase, domain: 'api.acme.example.com' },
+ { ...domainBase, domain: 'acme.dev', wildcard: true }
]

+const routeBase = {
Expand Down Expand Up @@ -254,7 +255,7 @@ index 4171516..e70aacf 100644
]

const wafZone = {
@@ -411,6 +481,20 @@ const roles = [
@@ -416,6 +480,20 @@ const roles = [
createdAt: CREATED_AT,
createdBy: USER_EMAIL
},
Expand All @@ -275,7 +276,7 @@ index 4171516..e70aacf 100644
{
role: 'admin',
name: 'Administrator',
@@ -434,7 +518,15 @@ const serviceAccounts = [
@@ -439,7 +517,15 @@ const serviceAccounts = [
sid: 'sa_mock_ci',
email: 'ci@acme.deploys.app',
name: 'CI Deployer',
Expand All @@ -292,7 +293,7 @@ index 4171516..e70aacf 100644
createdAt: CREATED_AT,
createdBy: USER_EMAIL
}
@@ -471,7 +563,10 @@ const auditLogItems = (() => {
@@ -476,7 +562,10 @@ const auditLogItems = (() => {

const repositories = [
{ name: 'acme/web', size: 184320000, createdAt: CREATED_AT },
Expand Down
Binary file modified static/img/domain-list-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified static/img/domain-list.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.