compose.yml151 lines · main
1# briven-core — coolify deployment template (build-from-source mode).
2#
3# Coolify clones the repo from code.konnos.org/flndrn/briven and runs
4# `docker compose build` against the local Dockerfiles. Same shape as
5# the dokploy template, minus the traefik labels — coolify owns
6# routing through its UI.
7#
8# Required env (set via coolify's per-service env UI or in .env):
9# BRIVEN_DOMAIN, BRIVEN_BETTER_AUTH_SECRET,
10# BRIVEN_AUDIT_IP_PEPPER, BRIVEN_ENCRYPTION_KEY,
11# BRIVEN_RUNTIME_SHARED_SECRET, BRIVEN_POSTGRES_PASSWORD,
12# BRIVEN_MITTERA_API_URL + BRIVEN_MITTERA_API_KEY + BRIVEN_MITTERA_WEBHOOK_SECRET (optional),
13# BRIVEN_GOOGLE_CLIENT_ID/SECRET (optional),
14# BRIVEN_OPEN_SIGNUPS (default false).
15#
16# Coolify-specific routing — assign these in the coolify UI per service:
17# web → ${BRIVEN_DOMAIN}
18# api → api.${BRIVEN_DOMAIN}
19# realtime → realtime.${BRIVEN_DOMAIN}
20# docs → docs.${BRIVEN_DOMAIN}
21# minio → s3.${BRIVEN_DOMAIN} (optional, only if you want public bucket access)
22# postgres + redis + runtime stay internal — no public routing.
23#
24# Per DOCKER.md §7: every service caps its log volume to prevent any one
25# noisy container from filling the host disk. Applied via the anchor.
26
27x-logging: &briven-logging
28 driver: json-file
29 options:
30 max-size: '10m'
31 max-file: '3'
32
33services:
34 postgres:
35 image: pgvector/pgvector:pg17
36 restart: unless-stopped
37 logging: *briven-logging
38 environment:
39 POSTGRES_PASSWORD: ${BRIVEN_POSTGRES_PASSWORD}
40 POSTGRES_DB: briven_control
41 volumes:
42 - postgres_data:/var/lib/postgresql/data
43 - ./postgres-init:/docker-entrypoint-initdb.d:ro
44
45 redis:
46 image: redis:7.4-alpine
47 restart: unless-stopped
48 logging: *briven-logging
49 command: redis-server --appendonly yes
50 volumes:
51 - redis_data:/data
52
53 minio:
54 image: minio/minio:latest
55 restart: unless-stopped
56 logging: *briven-logging
57 command: server /data --console-address ':9001'
58 environment:
59 MINIO_ROOT_USER: briven
60 MINIO_ROOT_PASSWORD: ${BRIVEN_POSTGRES_PASSWORD}
61 volumes:
62 - minio_data:/data
63
64 api:
65 build:
66 context: ../..
67 dockerfile: apps/api/Dockerfile
68 restart: unless-stopped
69 logging: *briven-logging
70 depends_on: [postgres, redis]
71 environment:
72 BRIVEN_ENV: production
73 BRIVEN_API_PORT: '3001'
74 BRIVEN_API_ORIGIN: https://api.${BRIVEN_DOMAIN}
75 BRIVEN_WEB_ORIGIN: https://${BRIVEN_DOMAIN}
76 BRIVEN_TRUSTED_ORIGINS: https://${BRIVEN_DOMAIN},https://api.${BRIVEN_DOMAIN}
77 BRIVEN_DATABASE_URL: postgres://postgres:${BRIVEN_POSTGRES_PASSWORD}@postgres:5432/briven_control?sslmode=disable
78 BRIVEN_DATA_PLANE_URL: postgres://postgres:${BRIVEN_POSTGRES_PASSWORD}@postgres:5432/briven_data?sslmode=disable
79 BRIVEN_REDIS_URL: redis://redis:6379
80 BRIVEN_RUNTIME_URL: http://runtime:3003
81 BRIVEN_RUNTIME_SHARED_SECRET: ${BRIVEN_RUNTIME_SHARED_SECRET}
82 BRIVEN_BETTER_AUTH_SECRET: ${BRIVEN_BETTER_AUTH_SECRET}
83 BRIVEN_AUDIT_IP_PEPPER: ${BRIVEN_AUDIT_IP_PEPPER}
84 BRIVEN_ENCRYPTION_KEY: ${BRIVEN_ENCRYPTION_KEY}
85 BRIVEN_MITTERA_API_URL: ${BRIVEN_MITTERA_API_URL:-}
86 BRIVEN_MITTERA_API_KEY: ${BRIVEN_MITTERA_API_KEY:-}
87 BRIVEN_MITTERA_WEBHOOK_SECRET: ${BRIVEN_MITTERA_WEBHOOK_SECRET:-}
88 BRIVEN_GOOGLE_CLIENT_ID: ${BRIVEN_GOOGLE_CLIENT_ID:-}
89 BRIVEN_GOOGLE_CLIENT_SECRET: ${BRIVEN_GOOGLE_CLIENT_SECRET:-}
90 BRIVEN_OPEN_SIGNUPS: ${BRIVEN_OPEN_SIGNUPS:-false}
91 BRIVEN_MINIO_ENDPOINT: http://minio:9000
92 BRIVEN_MINIO_ACCESS_KEY: briven
93 BRIVEN_MINIO_SECRET_KEY: ${BRIVEN_POSTGRES_PASSWORD}
94
95 runtime:
96 build:
97 context: ../..
98 dockerfile: apps/runtime/Dockerfile
99 restart: unless-stopped
100 logging: *briven-logging
101 environment:
102 BRIVEN_ENV: production
103 BRIVEN_RUNTIME_PORT: '3003'
104 BRIVEN_RUNTIME_SHARED_SECRET: ${BRIVEN_RUNTIME_SHARED_SECRET}
105 BRIVEN_RUNTIME_EXECUTOR: deno
106 BRIVEN_RUNTIME_BUNDLE_DIR: /var/lib/briven/bundles
107 volumes:
108 - runtime_bundles:/var/lib/briven/bundles
109
110 realtime:
111 build:
112 context: ../..
113 dockerfile: apps/realtime/Dockerfile
114 restart: unless-stopped
115 logging: *briven-logging
116 depends_on: [postgres]
117 environment:
118 BRIVEN_ENV: production
119 BRIVEN_REALTIME_PORT: '3004'
120 BRIVEN_API_INTERNAL_URL: http://api:3001
121 BRIVEN_RUNTIME_SHARED_SECRET: ${BRIVEN_RUNTIME_SHARED_SECRET}
122 BRIVEN_DATA_PLANE_URL: postgres://postgres:${BRIVEN_POSTGRES_PASSWORD}@postgres:5432/briven_data?sslmode=disable
123
124 web:
125 build:
126 context: ../..
127 dockerfile: apps/web/Dockerfile
128 restart: unless-stopped
129 logging: *briven-logging
130 depends_on: [api]
131 environment:
132 BRIVEN_API_ORIGIN: https://api.${BRIVEN_DOMAIN}
133 BRIVEN_WEB_ORIGIN: https://${BRIVEN_DOMAIN}
134
135 docs:
136 build:
137 context: ../..
138 dockerfile: apps/docs/Dockerfile
139 restart: unless-stopped
140 logging: *briven-logging
141 depends_on: [api]
142 environment:
143 # Used by the /status page + /api/status/incidents.xml RSS feed
144 # to read live incidents from /v1/status/incidents.
145 BRIVEN_API_ORIGIN: https://api.${BRIVEN_DOMAIN}
146
147volumes:
148 postgres_data:
149 redis_data:
150 minio_data:
151 runtime_bundles: