version: '3.8' services: gatekeeper: image: timelines-gatekeeper:dev stop_grace_period: 0s ports: - "80:80" build: context: ./app/gatekeeper-proxy dockerfile: ./Dockerfile networks: dev-minio: dev-playwright: aliases: - app.gatekeeper styx: image: timelines-styx:dev build: context: ./ args: DOCKER_UID: ${DOCKER_UID} DOCKER_GID: ${DOCKER_GID} dockerfile: ./app/styx-frontend/Dockerfile user: "${DOCKER_UID}:${DOCKER_GID}" environment: NODE_ENV: development DANGEROUSLY_DISABLE_HOST_CHECK: "true" # For React dev server to work behind Gatekeeper # Fake docker secrets environment: development volumes: - ./app/styx-frontend/src:/app/styx/src:cached - ./app/styx-frontend/public:/app/styx/public:cached - ./app/ts-shared/src:/app/ts-shared/src:cached - ./library:/library:cached - type: bind source: ./app/styx-frontend/rsbuild.config.ts target: /app/styx/rsbuild.config.ts - type: bind source: ./app/styx-frontend/tsconfig.json target: /app/styx/tsconfig.json - type: bind source: ./app/styx-frontend/index.html target: /app/styx/index.html - type: bind source: ./.prettierrc.js target: /app/styx/.prettierrc.js - type: bind source: ./eslint.config.mjs target: /app/styx/eslint.config.mjs ports: - 8080:8080 command: npm run start tty: true restart: unless-stopped rhea: image: timelines-rhea:dev build: context: ./ dockerfile: ./app/rhea-backend/Dockerfile environment: NODE_ENV: development DATABASE_URL: postgresql://docker:docker@rhea-postgres:5432/db?schema=public # Fake docker secrets environment: development jwt-secret: secretkey s3_endpoint: http://s3-minio:9000 s3_bucket_id: bucket s3_access_key_id: devuser s3_access_key_secret: devsecret volumes: - rhea-db:/mnt/volume_rhea_postgres:ro - ./app/rhea-backend/src:/app/rhea/src:cached - ./app/rhea-backend/prisma:/app/rhea/prisma:cached - ./app/ts-shared/src:/app/ts-shared/src:cached - ./library:/library:cached - ./scripts:/scripts:ro - type: bind source: ./eslint.config.mjs target: /app/rhea/eslint.config.mjs - type: bind source: ./app/rhea-backend/prisma.config.ts target: /app/rhea/prisma.config.ts - type: bind source: ./app/rhea-backend/tsconfig.json target: /app/rhea/tsconfig.json ports: - 3000:3000 command: npm run start healthcheck: start_interval: 1s tty: true restart: unless-stopped networks: - dev-minio calliope: image: timelines-calliope:dev build: context: ./ dockerfile: ./app/calliope-websockets/Dockerfile environment: NODE_ENV: development # Fake docker secrets environment: development jwt_secret: secretkey volumes: - ./app/calliope-websockets/src:/app/calliope/src:cached - ./app/ts-shared/src:/app/ts-shared/src:cached - ./library:/library:cached - ./scripts:/scripts:ro - type: bind source: ./eslint.config.mjs target: /app/calliope/eslint.config.mjs - type: bind source: ./app/calliope-websockets/tsconfig.json target: /app/calliope/tsconfig.json ports: - 3001:3001 command: npm run start tty: true restart: unless-stopped orpheus: image: timelines-orpheus:dev build: context: ./ dockerfile: ./app/orpheus-mcp/Dockerfile environment: NODE_ENV: development # Fake docker secrets environment: development jwt_secret: secretkey REQUIRE_OAUTH: "false" volumes: - ./app/orpheus-mcp/src:/app/orpheus/src:cached - ./app/ts-shared/src:/app/ts-shared/src:cached - ./library:/library:cached - ./scripts:/scripts:ro - type: bind source: ./eslint.config.mjs target: /app/orpheus/eslint.config.mjs - type: bind source: ./app/orpheus-mcp/tsconfig.json target: /app/orpheus/tsconfig.json ports: - 3002:3002 command: npm run start tty: true restart: unless-stopped thetis: image: timelines-thetis:dev build: context: ./ dockerfile: ./app/thetis-landing/Dockerfile environment: NODE_ENV: development volumes: - ./app/thetis-landing/src:/app/thetis/src:cached - ./app/thetis-landing/public:/app/thetis/public:cached - ./app/thetis-landing/vendor:/app/thetis/vendor:cached - type: bind source: ./app/thetis-landing/astro.config.ts target: /app/thetis/astro.config.ts - type: bind source: ./app/thetis-landing/tailwind.config.js target: /app/thetis/tailwind.config.js - type: bind source: ./app/thetis-landing/tsconfig.json target: /app/thetis/tsconfig.json ports: - 8081:8081 command: npm run dev tty: true restart: unless-stopped rhea-postgres: environment: POSTGRES_USER: docker POSTGRES_PASSWORD: docker POSTGRES_DB: db ports: - 5432:5432 volumes: - rhea-db:/var/lib/postgresql/data/:cached healthcheck: start_interval: 1s restart: unless-stopped rhea-migrate: image: timelines-rhea:dev pull_policy: never environment: DATABASE_URL: postgresql://docker:docker@rhea-postgres:5432/db?schema=public volumes: - ./app/rhea-backend/prisma:/app/rhea/prisma:cached - ./app/ts-shared/src:/app/ts-shared/src:cached - type: bind source: ./app/rhea-backend/prisma.config.ts target: /app/rhea/prisma.config.ts depends_on: rhea: condition: service_started rhea-postgres: condition: service_healthy command: sh -c "npx prisma migrate deploy && npx prisma db seed" networks: - backend-rhea-db library-build: image: node:26-alpine user: "${DOCKER_UID}:${DOCKER_GID}" volumes: - ./library:/library:cached command: node /library/build.mjs restart: unless-stopped stop_grace_period: 0s redis: ports: - "6379:6379" healthcheck: start_period: 10s start_interval: 1s s3-minio: image: pgsty/minio:RELEASE.2026-08-04T00-00-00Z ports: - "9000:9000" # API - "9001:9001" # Console environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: adminpassword MINIO_BROWSER_LOG_LEVEL: debug MINIO_API_LOG_LEVEL: debug volumes: - minio_data:/data command: server /data --console-address ":9001" healthcheck: test: [ "CMD", "curl", "-f", "http://s3-minio:9000/minio/health/live" ] interval: 5s timeout: 5s retries: 3 start_period: 10s start_interval: 1s networks: - dev-minio s3-minio-setup: image: pgsty/mc:RELEASE.2026-09-16T00-00-00Z depends_on: s3-minio: condition: service_healthy entrypoint: > /bin/sh -c " mc alias set minio-dev http://s3-minio:9000 admin adminpassword; mc mb --ignore-existing minio-dev/bucket; mc admin user add minio-dev devuser devsecret; mc admin policy attach minio-dev readwrite --user devuser; echo 'MinIO setup completed successfully'; " networks: - dev-minio chronos: image: timelines-chronos:dev build: context: ./app/chronos-backups dockerfile: ./Dockerfile environment: # S3 connection (MinIO) S3_ENDPOINT: http://s3-minio:9000 S3_BUCKET: bucket S3_ACCESS_KEY_ID: devuser S3_ACCESS_KEY_SECRET: devsecret # Backrest config BACKREST_DATA: /data BACKREST_CONFIG: /config/config.json BACKREST_PORT: 0.0.0.0:9898 XDG_CACHE_HOME: /cache ports: - "9898:9898" volumes: - backrest_data:/data:cached - backrest_config:/config:cached - backrest_cache:/cache:cached depends_on: rhea-postgres: condition: service_healthy s3-minio: condition: service_healthy networks: - dev-minio restart: unless-stopped volumes: redis: rhea-db: minio_data: backrest_data: backrest_config: backrest_cache: networks: dev-minio: dev-playwright: name: neverkin-playwright