README.md55 lines · main
1# self-host briven on coolify
2
3drop-in template for [coolify 4.x](https://coolify.io). same compose as `infra/dokploy/compose.yml`, minus the traefik labels — coolify owns routing through its own UI.
4
5briven publishes **prebuilt multi-arch images** on every tagged release at `ghcr.io/flndrn/briven-{api,runtime,realtime,web,docs}` (amd64 + arm64, free anonymous pull). swap the `build:` blocks in `compose.yml` for `image: ghcr.io/flndrn/briven-<svc>:latest` for ~30s deploys, or pin to a specific version tag (e.g. `:0.3.1`) for reproducibility. building from source is also supported — useful when you've forked.
6
7## install
8
91. **create a new resource** in your coolify project: **Docker Compose**, point its git source at `https://code.konnos.org/flndrn/briven.git` (branch `main`), compose path `infra/coolify/compose.yml`. coolify clones the repo and runs `docker compose build` + `up -d`.
102. **set environment variables** under the resource's *Environment Variables* tab. The minimum:
11
12 | name | value |
13 | ------------------------------- | ------------------------------------------ |
14 | `BRIVEN_DOMAIN` | the domain you control (e.g. `briven.example.com`) |
15 | `BRIVEN_POSTGRES_PASSWORD` | strong random — used by every service |
16 | `BRIVEN_BETTER_AUTH_SECRET` | `openssl rand -hex 32` |
17 | `BRIVEN_AUDIT_IP_PEPPER` | `openssl rand -hex 32` |
18 | `BRIVEN_ENCRYPTION_KEY` | `openssl rand -hex 32` |
19 | `BRIVEN_RUNTIME_SHARED_SECRET` | `openssl rand -hex 32` |
20 | `BRIVEN_OPEN_SIGNUPS` | `false` (invite-only) or `true` (public) |
21
22 optional:
23
24 | name | what it enables |
25 | ----------------------------- | ------------------------------------------ |
26 | `BRIVEN_MITTERA_API_URL` | `https://api.mittera.eu` (or your install) |
27 | `BRIVEN_MITTERA_API_KEY` | bearer token for outbound /api/v1/emails |
28 | `BRIVEN_MITTERA_WEBHOOK_SECRET` | HMAC secret for inbound webhook verify |
29 | `BRIVEN_GITHUB_CLIENT_ID` | github oauth signin |
30 | `BRIVEN_GITHUB_CLIENT_SECRET` | github oauth signin |
31
323. **assign domains** in the coolify *Domains* tab, one per public-facing service:
33
34 - `web` → `${BRIVEN_DOMAIN}`
35 - `api` → `api.${BRIVEN_DOMAIN}`
36 - `realtime` → `realtime.${BRIVEN_DOMAIN}`
37 - `docs` → `docs.${BRIVEN_DOMAIN}`
38
39 `postgres`, `redis`, `runtime` stay internal — leave their domains blank.
40
414. **deploy**. coolify wires letsencrypt + a per-service reverse proxy automatically.
42
43## post-boot
44
45same as the dokploy template — sign in via magic link, promote yourself to platform-admin via psql, then create your first project from the dashboard. see `../dokploy/README.md` for the full walkthrough.
46
47## differences vs. dokploy
48
49- **routing**: coolify's per-service Domains UI replaces the `traefik.*` labels.
50- **persistent volumes**: coolify auto-manages volume names with project-scoped prefixes; the names declared here (`postgres_data`, etc.) become `briven_postgres_data` or similar in coolify's storage tab.
51- **upgrades**: click *Redeploy* — coolify re-clones `main` and rebuilds the images from source. there's no `docker compose pull` step because nothing is hosted in a registry.
52
53## upgrade path
54
55dokploy → coolify migrations work as long as the postgres + minio + runtime_bundles volumes are preserved. shut down the dokploy stack, snapshot the volumes, point coolify at the same data directories. control plane comes back stateful.
Preview

self-host briven on coolify

drop-in template for coolify 4.x. same compose as infra/dokploy/compose.yml, minus the traefik labels — coolify owns routing through its own UI.

briven publishes prebuilt multi-arch images on every tagged release at ghcr.io/flndrn/briven-{api,runtime,realtime,web,docs} (amd64 + arm64, free anonymous pull). swap the build: blocks in compose.yml for image: ghcr.io/flndrn/briven-<svc>:latest for ~30s deploys, or pin to a specific version tag (e.g. :0.3.1) for reproducibility. building from source is also supported — useful when you've forked.

install

  1. create a new resource in your coolify project: Docker Compose, point its git source at https://code.konnos.org/flndrn/briven.git (branch main), compose path infra/coolify/compose.yml. coolify clones the repo and runs docker compose build + up -d.

  2. set environment variables under the resource's Environment Variables tab. The minimum:

    namevalue
    BRIVEN_DOMAINthe domain you control (e.g. briven.example.com)
    BRIVEN_POSTGRES_PASSWORDstrong random — used by every service
    BRIVEN_BETTER_AUTH_SECRETopenssl rand -hex 32
    BRIVEN_AUDIT_IP_PEPPERopenssl rand -hex 32
    BRIVEN_ENCRYPTION_KEYopenssl rand -hex 32
    BRIVEN_RUNTIME_SHARED_SECRETopenssl rand -hex 32
    BRIVEN_OPEN_SIGNUPSfalse (invite-only) or true (public)

    optional:

    namewhat it enables
    BRIVEN_MITTERA_API_URLhttps://api.mittera.eu (or your install)
    BRIVEN_MITTERA_API_KEYbearer token for outbound /api/v1/emails
    BRIVEN_MITTERA_WEBHOOK_SECRETHMAC secret for inbound webhook verify
    BRIVEN_GITHUB_CLIENT_IDgithub oauth signin
    BRIVEN_GITHUB_CLIENT_SECRETgithub oauth signin
  3. assign domains in the coolify Domains tab, one per public-facing service:

    • web${BRIVEN_DOMAIN}
    • apiapi.${BRIVEN_DOMAIN}
    • realtimerealtime.${BRIVEN_DOMAIN}
    • docsdocs.${BRIVEN_DOMAIN}

    postgres, redis, runtime stay internal — leave their domains blank.

  4. deploy. coolify wires letsencrypt + a per-service reverse proxy automatically.

post-boot

same as the dokploy template — sign in via magic link, promote yourself to platform-admin via psql, then create your first project from the dashboard. see ../dokploy/README.md for the full walkthrough.

differences vs. dokploy

  • routing: coolify's per-service Domains UI replaces the traefik.* labels.
  • persistent volumes: coolify auto-manages volume names with project-scoped prefixes; the names declared here (postgres_data, etc.) become briven_postgres_data or similar in coolify's storage tab.
  • upgrades: click Redeploy — coolify re-clones main and rebuilds the images from source. there's no docker compose pull step because nothing is hosted in a registry.

upgrade path

dokploy → coolify migrations work as long as the postgres + minio + runtime_bundles volumes are preserved. shut down the dokploy stack, snapshot the volumes, point coolify at the same data directories. control plane comes back stateful.