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
8 changes: 8 additions & 0 deletions changelog.d/81-database-claims.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
### Fixed

- The Neon guide says each database belongs to an application Cloudfall
deploys on the same server, and no longer suggests an app on another host
can reach it; the brownfield design's operation example uses a target
scope the schema accepts (`host`); the site no longer offers a PostgreSQL
on its own, and its navigation and footer links are easier to tap on a
phone (#81)
2 changes: 1 addition & 1 deletion docs/brownfield-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ Every playbook or role the team already runs becomes an operation:
id: deploy
playbook: playbooks/deploy.yml
risk: mutating
targets: component
targets: host
inputs:
version: string
preconditions:
Expand Down
20 changes: 14 additions & 6 deletions docs/neon-migration-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,22 @@ simply absent:
(a Hetzner Cloud VPS is the proven reference), or a fresh one plus an
hour to get there
- The Neon application's connection details and console access
- The application that uses the database, declared in the same project
so Cloudfall deploys it on the server (see Step 1)
- Python 3.14 and [`uv`](https://docs.astral.sh/uv/) on the machine you
run Cloudfall from

## Step 1: declare the PostgreSQL service

One `Service` resource, with the major version matching Neon's (the Neon
console shows it under application settings):
Each database belongs to an application Cloudfall deploys on the same
server: `databases[].application` names a declared `Application`, and that
application needs at least one component. Declare the application first
([getting started](getting-started.md)). A database on its own, for an app
that stays on another host, is not supported yet
([#81](https://github.com/cloudfall-dev/cloudfall/issues/81)).

Then one `Service` resource, with the major version matching Neon's (the
Neon console shows it under application settings):

```yaml
---
Expand Down Expand Up @@ -186,10 +195,9 @@ database will produce.

## Step 5: cut over the application

Point the application's `DATABASE_URL` at the migrated database. For a
co-located app this is the local peer-authenticated socket URL (no
password, no TLS, no pooler); for an app elsewhere, route it the same
way as any other declared service. Deploy, watch health, and keep writes
Point the application's `DATABASE_URL` at the migrated database. The app
runs on the same server, so this is the local peer-authenticated socket URL
(no password, no TLS, no pooler). Deploy, watch health, and keep writes
frozen until the app is verified against the new database.

## Step 6: wind down Neon
Expand Down
9 changes: 5 additions & 4 deletions site/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
.b-try { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin-top: 18px }
.b-try code { font: 500 13px var(--b-mono); background: var(--b-paper); border: 1.5px dashed var(--b-ink); border-radius: 8px; padding: 7px 12px; overflow-wrap: anywhere }
.b-try button { font: 700 13px var(--b-body); background: transparent; border: 0; color: var(--b-blue); cursor: pointer; padding: 4px }
@media (max-width: 560px) { .b-links a, footer .links a { display: inline-block; padding-block: 11px } .b-links { row-gap: 0 } .b-try button { padding: 12px 8px } }
.b-try button:focus-visible { outline: 2px solid var(--b-blue); border-radius: 4px }
.b-try small { width: 100%; color: var(--b-dim); font-size: .85rem }
.b-aside code { font: 500 .85em var(--b-mono); background: var(--b-paper); padding: 1px 5px; border-radius: 4px }
Expand Down Expand Up @@ -368,8 +369,8 @@ <h3>The record is the page you send your client</h3>
</ol>
</div>
<div class="b-cta" style="margin-top:0">
<a class="b-btn primary" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/neon-migration-guide.md#step-1-declare-the-postgresql-service">Put one client's PostgreSQL under the gate</a>
<a class="b-btn" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/brownfield-design.md">Bring your Ansible repo</a>
<a class="b-btn primary" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/brownfield-design.md">Bring your Ansible repo</a>
<a class="b-btn" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/getting-started.md">Read the getting-started guide</a>
</div>
</div>

Expand Down Expand Up @@ -473,7 +474,7 @@ <h3>The gate lives in Cloudfall, not in the prompt</h3>
<div class="b-sec">
<div class="b-final" id="pilot">
<div><h3>Want us to set it up with you? The pilot is free.</h3><p>We're taking three outside teams this quarter. We move one app or one client fleet onto Cloudfall together with you, and you keep running it. Write to <span class="b-mail">pilot@cloudfall.dev</span></p></div>
<div class="b-cta" style="margin-top:0"><a class="b-btn primary" href="mailto:pilot@cloudfall.dev?subject=Cloudfall%20pilot">Email about a pilot</a><a class="b-btn" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/neon-migration-guide.md#step-1-declare-the-postgresql-service">Start with one PostgreSQL</a></div>
<div class="b-cta" style="margin-top:0"><a class="b-btn primary" href="mailto:pilot@cloudfall.dev?subject=Cloudfall%20pilot">Email about a pilot</a><a class="b-btn" href="https://github.com/cloudfall-dev/cloudfall/blob/main/docs/getting-started.md">Try it yourself first</a></div>
</div>
</div>
</main>
Expand Down Expand Up @@ -506,7 +507,7 @@ <h3>The gate lives in Cloudfall, not in the prompt</h3>
(() => {
const items = [
{ name: "Render", href: "https://github.com/cloudfall-dev/cloudfall/blob/main/docs/render-migration-guide.md", note: 'Import your <code>render.yaml</code>: apps, data and a DNS cutover that pauses until you flip it.' },
{ name: "Neon", href: "https://github.com/cloudfall-dev/cloudfall/blob/main/docs/neon-migration-guide.md#step-1-declare-the-postgresql-service", note: 'One <code>Service</code> file: PostgreSQL on your server, nightly backups, a daily check that the backup restores.' },
{ name: "Neon", href: "https://github.com/cloudfall-dev/cloudfall/blob/main/docs/neon-migration-guide.md#step-1-declare-the-postgresql-service", note: 'PostgreSQL next to your app on your server: nightly backups and a daily check that the backup restores.' },
];
const btn = document.getElementById("rot-btn"), word = document.getElementById("rot-word"), note = document.getElementById("rot-note");
if (matchMedia("(prefers-reduced-motion: reduce)").matches) return;
Expand Down
1 change: 1 addition & 0 deletions site/public/manifesto.html
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
footer .wrap { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 28px; color: var(--b-dim); font-size: .92rem }
footer .links { display: flex; flex-wrap: wrap; gap: 6px 20px }
footer a { color: inherit; text-decoration: none }
@media (max-width: 560px) { .b-links a, footer .links a { display: inline-block; padding-block: 11px } .b-links { row-gap: 0 } }
footer a:hover { color: var(--b-ink) }
footer .b-brand { color: var(--b-ink); font-size: 1.1rem }
@media (max-width: 560px) { .tenet { grid-template-columns: minmax(0, 1fr) } .tenet .num { grid-row: auto } }
Expand Down
Loading