r[ae]ym
Freym Setup

Docker Compose

Using this Docker Compose file, you can quickly set up a local development environment for Fr[ae]ym.

This setup includes all the necessary components to get started with Fr[ae]ym:

Credentials

Don't forget to login to our currently private docker registry using: docker login ghcr.io

docker-compose.yaml
name: fraeym-dev

services:
  sync:
    image: ghcr.io/fraeym/sync:v1.0.0
    restart: unless-stopped
    healthcheck: &healthcheck
      test: ["CMD", "/health"]
      interval: 5s
      timeout: 2s
      retries: 3
      start_period: 5s
    ports:
      - 127.0.0.1:9101:9000
      - 127.0.0.1:3101:3000
    environment:
      - APP_ENV=development
      - LOG_LEVEL=info

  streams:
    image: ghcr.io/fraeym/streams:v1.0.0
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
        restart: true
      sync:
        condition: service_healthy
        restart: true
    healthcheck: *healthcheck
    ports:
      - 127.0.0.1:9102:9000
      - 127.0.0.1:3102:3000
    environment:
      - APP_ENV=development
      - LOG_LEVEL=info
      - AUTH_SECRET=change-me
      - SYNC_CLIENT_ADDRESS=sync:9000
      - SYNC_CLIENT_APP_PREFIX=streams
      - POSTGRES_CONNECTION=postgres://postgres:change-me@postgres:5432?pool_max_conns=10&pool_min_conns=1

  projections:
    image: ghcr.io/fraeym/projections:v1.0.0
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
        restart: true
      sync:
        condition: service_healthy
        restart: true
      streams:
        condition: service_healthy
        restart: true
    healthcheck: *healthcheck
    ports:
      - 127.0.0.1:9103:9000
      - 127.0.0.1:3103:3000
    environment:
      - APP_ENV=development
      - LOG_LEVEL=info
      - CORS_ALLOW_ORIGINS=*
      - PROJECTION_TASK_INTERVAL=3000
      - POSTGRES_CONNECTION=postgres://postgres:change-me@postgres:5432?pool_max_conns=10&pool_min_conns=1
      - SYNC_CLIENT_ADDRESS=sync:9000
      - SYNC_CLIENT_APP_PREFIX=projections
      - STREAMS_CLIENT_ADDRESS=streams:9000
      - STREAMS_CLIENT_GROUP_ID=projections
      - AUTH_SECRET=change-me

  crud:
    image: ghcr.io/fraeym/crud:v1.0.0
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
        restart: true
      sync:
        condition: service_healthy
        restart: true
      streams:
        condition: service_healthy
        restart: true
      projections:
        condition: service_healthy
        restart: true
      s3:
        condition: service_healthy
        restart: true
      imgproxy:
        condition: service_healthy
        restart: true
    healthcheck: *healthcheck
    ports:
      - 127.0.0.1:9104:9000
      - 127.0.0.1:3104:3000
    environment:
      - APP_ENV=development
      - LOG_LEVEL=info
      - POSTGRES_CONNECTION=postgres://postgres:change-me@postgres:5432?pool_max_conns=10&pool_min_conns=1
      - SYNC_CLIENT_ADDRESS=sync:9000
      - SYNC_CLIENT_APP_PREFIX=crud
      - STREAMS_CLIENT_ADDRESS=streams:9000
      - STREAMS_CLIENT_GROUP_ID=crud
      - PROJECTIONS_CLIENT_ADDRESS=projections:9000
      - AUTH_SECRET=change-me
      - HTTP_REQUEST_BODY_LIMIT=50
      - S3_ENDPOINT=s3:9000
      - S3_ACCESS_KEY=root
      - S3_SECRET_KEY=change-me
      - S3_SSL=false
      - S3_BUCKET=crud

  deployments:
    image: ghcr.io/fraeym/deployments:v1.0.0
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
        restart: true
      sync:
        condition: service_healthy
        restart: true
      streams:
        condition: service_healthy
        restart: true
      projections:
        condition: service_healthy
        restart: true
      crud:
        condition: service_healthy
        restart: true
    healthcheck: *healthcheck
    ports:
      - 127.0.0.1:9105:9000
      - 127.0.0.1:3105:3000
    environment:
      - APP_ENV=development
      - LOG_LEVEL=info
      - API_TOKEN=change-me
      - SYNC_CLIENT_ADDRESS=sync:9000
      - SYNC_CLIENT_APP_PREFIX=deployments
      - AUTH_CLIENT_ADDRESS=auth:9000
      - CRUD_CLIENT_ADDRESS=crud:9000
      - PROJECTIONS_CLIENT_ADDRESS=projections:9000
      - POSTGRES_CONNECTION=postgres://postgres:change-me@postgres:5432?pool_max_conns=10&pool_min_conns=1

  auth:
    image: ghcr.io/fraeym/auth:v1.0.0
    restart: unless-stopped
    depends_on:
      sync:
        condition: service_healthy
        restart: true
      streams:
        condition: service_healthy
        restart: true
      crud:
        condition: service_healthy
        restart: true
      deployments:
        condition: service_healthy
        restart: true
    healthcheck: *healthcheck
    ports:
      - 127.0.0.1:9106:9000
      - 127.0.0.1:3106:3000
    environment:
      - APP_ENV=development
      - LOG_LEVEL=info
      - AUTH_SECRET=change-me
      - AUTH_SECRET_INITIAL_PW=change-me
      - CRUD_CLIENT_ADDRESS=crud:9000
      - STREAMS_CLIENT_ADDRESS=streams:9000
      - STREAMS_CLIENT_GROUP_ID=auth
      - SYNC_CLIENT_ADDRESS=sync:9000
      - SYNC_CLIENT_APP_PREFIX=auth
      - DEPLOYMENTS_CLIENT_ADDRESS=deployments:9000
      - DEPLOYMENTS_NAMESPACE=FraymAuth

  postgres:
    image: postgres:17.5-alpine
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"]
      interval: 30s
      timeout: 60s
      retries: 5
      start_period: 80s
    ports:
      - 127.0.0.1:5433:5432
    volumes:
      - ./.data/postgresql/data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=change-me
    command:
      - postgres
      - -c
      - log_statement=none
      - -c
      - log_connections=off
      - -c
      - log_disconnections=off
      - -c
      - log_min_messages=panic

  s3:
    image: quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 5s
      timeout: 5s
      retries: 5
    environment:
      - MINIO_ROOT_USER=root
      - MINIO_ROOT_PASSWORD=change-me
    command: server /data --console-address ":9001"
    volumes:
      - ./.data/s3/data:/data

  imgproxy:
    image: darthsim/imgproxy:v3.30.1
    restart: unless-stopped
    depends_on:
      s3:
        condition: service_healthy
        restart: true
    healthcheck:
      test: ["CMD", "imgproxy", "health"]
      timeout: 10s
      interval: 10s
      retries: 3
    environment:
      - IMGPROXY_MAX_SRC_RESOLUTION=50.0
      - IMGPROXY_ALLOWED_SOURCES=s3://
      - IMGPROXY_USE_S3=true
      - IMGPROXY_S3_ENDPOINT=http://s3:9000
      - AWS_ACCESS_KEY_ID=root
      - AWS_SECRET_ACCESS_KEY=change-me

Secrets

The configuration will use the following secrets:

SecretValue
JWT Secretexample256bitlongsecretforjwtgen
Management API Tokenexample-management-token
Postgres Userpostgres
Postgres Passwordexample

Exposed ports

The configuration will expose the following ports on your local machine:

ServicePort
Postgres5432
Streams3001
Projections3002
CRUD3003
Auth3004
Deployments3005

On this page