Managoat is the hosted Fountain. Fountain is the open-source engine, and its name is on the CLI, the API, the SDK and this manual. Everything here applies to Managoat unless a page says it is for a self-hosted server.

Deploy on Render

This guide shows you how to bring up an instance on Render from the blueprint in this repository. It then shows you what to set after the first deploy.

For a machine you control, read Deploy an instance. That guide uses Docker Compose, and it is the shorter path.

What the blueprint gives you

render.yaml declares one web service and one managed Postgres. The web service runs the published image, not a build of your checkout. The blueprint gives you an instance that runs. It does not describe how the hosted service runs, which is Kubernetes.

Before you start

Fork this repository. Render reads the blueprint from a repository you own.

Generate the two keys now. You paste them during the next step.

openssl rand -base64 48 | tr -d '\n' # SECRET_KEY_BASE
openssl rand 32 | base64 | tr '+/' '-_' | tr -d '=\n' # MASTER_SECRETS_KEY

Back MASTER_SECRETS_KEY up before you have data. It is not in the database. A database backup alone does not protect you. Read Back up and restore.

You also need a sandbox provider token. Read Self-host Fountain for what each provider needs.

Apply it

In the Render dashboard, select New, then Blueprint, then your fork. Render reads render.yaml and asks for three values.

SECRET_KEY_BASE The first key above. Render's own value generator makes a value that is too short for the cookie session store.
MASTER_SECRETS_KEY The second key above. Render's generator cannot make this shape either.
SPRITES_TOKEN Your sandbox provider token.

Select Apply. The first deploy takes a few minutes, because the app applies the database migrations before it opens a listener.

PUBLIC_URL is absent from the blueprint on purpose. A prod instance refuses to boot without it, and the hostname does not exist before this first deploy. Fountain reads Render's own RENDER_EXTERNAL_URL instead, so the first deploy has a correct base URL.

Register the first account

Open the service URL and register. The blueprint sets EMAIL_DELIVERY=none and FIRST_USER_ADMIN=true, so your account self-verifies and becomes the admin.

Register before you give the URL to anybody. While no admin exists, the first verified account takes the role.

Then close registration in the Render dashboard, under Environment.

REGISTRATION_ENABLED=false

Add a custom domain

Add the domain to the web service in the dashboard. Then set PUBLIC_URL to the new address, with the scheme.

PUBLIC_URL=https://fountain.example.com

Set it. RENDER_EXTERNAL_URL still holds the onrender.com address, and Fountain keeps that address in every verification email and in every sandbox until you replace it.

Run your own build

The blueprint runs the published image, which is the same image the compose quick start runs. To run a fork with your own changes, replace the runtime and image keys with these two lines.

runtime: docker
dockerfilePath: ./Dockerfile

The build takes 15 to 25 minutes on Render's builders. It compiles the umbrella, it builds the Go CLI, and it fetches the pinned Buzz binaries.

What the blueprint does not do

  • It runs one instance. Fountain clusters over Erlang distribution, and a Render service cannot discover its own peers. A second instance is not a second node, and two schedulers then race over the same sandboxes. Read Architecture. Scale the plan instead of the instance count.
  • It sends no mail. Accounts self-verify at registration in this mode (ADR 0011). Read Configure email for a real provider.
  • It trusts a wide proxy range. Render terminates TLS at its edge, so the app sees the proxy and not the caller. The blueprint sets TRUSTED_PROXIES to the private ranges. Only Render's proxy reaches the container, so this is safe. Narrow it when you confirm the address that Render forwards from.
  • It does not back the database up. Render takes its own snapshots on a paid plan. Read Back up and restore for what a restore needs, and remember that a dump alone cannot decrypt itself.

Upgrade

The blueprint pins a release tag, and autoDeploy is off. A push to your fork does not move the pin.

Edit the tag in render.yaml, then apply the blueprint again.

image:
url: ghcr.io/binarybourbon/fountain:vX.Y.Z

Read Upgrade an instance first. Migrations run at boot, and Fountain does not support a downgrade.