Files
template-app/compose.dev.yaml
T

144 lines
5.3 KiB
YAML

# SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
# Local development, and the one place the three Postgres roles of a linked managed database are
# created by hand: on ConusAI Cloud the platform provisions them (data-services DS21), and
# `dev/postgres-roles.sql` runs the same statements so what works here works there.
#
# pnpm dev # the whole app on this machine: Postgres in Docker, the fake platform, the
# # migrate job, the demo data, the worker and the web shell (scripts/dev.mjs)
# docker compose -f compose.yaml -f compose.dev.yaml up --build # all of it as containers
#
# Nothing here is deployed: the platform reads compose.yaml alone (conusai.json's `compose.file`).
#
# The platform is the fake one of @conusai-kit/testing, selected on purpose by CONUSAI_FAKE_PLATFORM=1
# in a development run: the app refuses that switch in a production run, and refuses to start in one
# without the real platform's variables (config/src/env.ts).
x-development: &development
NODE_ENV: development
CONUSAI_FAKE_PLATFORM: "1"
CONUSAI_API_URL: http://platform:4010/api
CONUSAI_API_TOKEN: dev-token
CONUSAI_PROJECT_ID: "1"
CONUSAI_ORG_ID: dev
# The development Postgres below has pgvector, so the knowledge module stores its vectors there.
KNOWLEDGE_VECTOR_STORE: pgvector
services:
postgres:
# Postgres 18 with pgvector: development chooses the pgvector store (KNOWLEDGE_VECTOR_STORE above),
# and the migrate job creates the table with the extension.
image: pgvector/pgvector:pg18
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: appdev
volumes:
# Postgres 18 keeps its data in a version subdirectory, so the volume belongs one level up:
# a mount at /var/lib/postgresql/data makes the image refuse the directory it finds.
- postgres-data:/var/lib/postgresql
- ./dev/postgres-roles.sql:/docker-entrypoint-initdb.d/10-roles.sql:ro
# Published on loopback only, for `pnpm dev`, which runs the processes on this machine.
ports: ["127.0.0.1:${DEV_POSTGRES_PORT:-55433}:5432"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d appdev"]
interval: 5s
timeout: 5s
retries: 20
restart: unless-stopped
# The platform's services as the app uses them -- Blob, OCR, the AI gateway, audit, usage -- in
# memory, from the same image: it is a dependency of the template's tests, so it is in the image.
platform:
build:
context: .
dockerfile: Dockerfile
target: runtime
working_dir: /app
command: ["node", "node_modules/@conusai-kit/testing/dist/fake-platform/cli.js"]
environment:
PORT: "4010"
HOST: 0.0.0.0
PUBLIC_URL: http://platform:4010
expose: ["4010"]
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:4010/__e2e/health').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"]
interval: 5s
timeout: 5s
retries: 20
init: true
restart: unless-stopped
migrate:
environment: *development
depends_on:
postgres:
condition: service_healthy
# The demo data (apps/worker/src/seed.ts), once the schema is there. Safe to run again.
seed:
build:
context: .
dockerfile: Dockerfile
target: runtime
working_dir: /app
command: ["node", "apps/worker/dist/seed-main.js"]
environment:
<<: *development
CONUSAI_PUBLIC_URL: ${CONUSAI_PUBLIC_URL:-http://127.0.0.1:3000}
POSTGRES_URL: ${POSTGRES_URL}
POSTGRES_READER_URL: ${POSTGRES_READER_URL}
depends_on:
migrate:
condition: service_completed_successfully
platform:
condition: service_healthy
restart: "no"
init: true
web:
environment:
<<: *development
AUTH_DEV_LOGIN: "1"
AUTH_INSECURE_COOKIES: "1"
# Published on loopback only, so the app opens at http://127.0.0.1:3000 and nowhere else.
ports: ["127.0.0.1:3000:3000"]
depends_on:
postgres:
condition: service_healthy
migrate:
condition: service_completed_successfully
# The demo data is there when the app opens.
seed:
condition: service_completed_successfully
platform:
condition: service_healthy
worker:
environment: *development
depends_on:
postgres:
condition: service_healthy
migrate:
condition: service_completed_successfully
platform:
condition: service_healthy
# kit:convex-better-auth:begin
# With AUTH_PROVIDER=convex-better-auth: a Better Auth deployment on this machine, from the
# platform's pinned self-hosted Convex image. Started only when asked for (better-auth/README.md):
# docker compose -f compose.yaml -f compose.dev.yaml --profile better-auth up -d better-auth-backend
better-auth-backend:
profiles: ["better-auth"]
image: build.conusai.com/conusai/convex-backend@sha256:1738f1673f8d63161043a7859710d2301b1e9d6271e06afbb7af31594ea3a58f
environment:
CONVEX_CLOUD_ORIGIN: http://127.0.0.1:3210
CONVEX_SITE_ORIGIN: http://127.0.0.1:3211
# Published on loopback only, for `pnpm dev` and `node better-auth/deploy.mjs` on this machine.
ports: ["127.0.0.1:3210:3210", "127.0.0.1:3211:3211"]
volumes:
- better-auth-data:/convex/data
restart: unless-stopped
# kit:convex-better-auth:end
volumes:
postgres-data:
better-auth-data: # kit:convex-better-auth