# {{projectName}} full-stack DEV docker compose.
#
# Boots Postgres + apps with hot-reload. Each app container runs as
# the HOST user (via `user: ${HOST_UID}:${HOST_GID}`) so files written
# into the bind-mounted workspace land owned by you, not root. Without
# this, switching between docker dev and native pnpm dev leaves
# permission-denied errors on the cached vite deps.
#
# The pnpm-prebaked dev image (docker/dev.Dockerfile) is built once
# on first `up`; subsequent `up` calls reuse the cached layer.
#
# Prereqs on the host BEFORE running this:
#   1. pnpm install in the project root (deps need to exist on host
#      because they're mounted in)
#   2. .env in place — see .env.example
#
# Run:
#   pnpm dev:docker        # wraps `HOST_UID=... HOST_GID=... docker compose up`
#
# Native-pnpm-dev alternative (faster HMR, no container overhead):
#   pnpm dev:hybrid
#
# As you add apps to apps/, copy a service block and bump the port.

x-node-defaults: &node-defaults
  build:
    context: ./
    dockerfile: docker/dev.Dockerfile
  image: {{projectName}}-dev:latest
  user: "${HOST_UID:-1000}:${HOST_GID:-1000}"
  volumes:
    - ./:/workspace:cached
  depends_on:
    mariadb:
      condition: service_healthy

services:
  mariadb:
    image: mariadb:11
    container_name: {{projectName}}-mariadb
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: root
      MARIADB_DATABASE: {{projectNameSnake}}
      MARIADB_USER: app
      MARIADB_PASSWORD: app
    ports:
      - "3307:3306"
    command:
      - "--log-bin=mysql-bin"
      - "--binlog-format=ROW"
      - "--binlog-row-image=FULL"
      - "--server-id=1"
      - "--binlog-expire-logs-seconds=86400"
    volumes:
      - {{projectName}}-mariadbdata:/var/lib/mysql
      - ./docker/mariadb-init.sql:/docker-entrypoint-initdb.d/10-replication.sql:ro
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 2s
      timeout: 2s
      retries: 15

  minio:
    image: minio/minio
    container_name: {{projectName}}-minio
    restart: unless-stopped
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    ports:
      - "9000:9000"
      - "9001:9001"
    command: server /data --console-address ":9001"
    volumes:
      - {{projectName}}-miniodata:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 3s
      timeout: 2s
      retries: 15

  api:
    <<: *node-defaults
    container_name: {{projectName}}-api-dev
    working_dir: /workspace/apps/{{projectName}}/api
    command: pnpm voltro dev .
    environment:
      NODE_ENV: development
      HOME: /tmp
      DB_DIALECT: mariadb
      DB_URL: mysql://app:app@mariadb:3306/{{projectNameSnake}}
      CDC: "1"
      STORAGE_PROVIDER: minio
      S3_ENDPOINT: http://minio:9000
      S3_BUCKET: {{projectNameSnake}}
      S3_ACCESS_KEY_ID: minioadmin
      S3_SECRET_ACCESS_KEY: minioadmin
      S3_FORCE_PATH_STYLE: "1"
      VOLTRO_SESSION_SECRET: ${VOLTRO_SESSION_SECRET:-dev-only-secret-please-rotate-in-prod}
    ports:
      - "4000:4000"

  web:
    <<: *node-defaults
    container_name: {{projectName}}-web-dev
    working_dir: /workspace/apps/{{projectName}}/web
    command: pnpm voltro dev .
    environment:
      NODE_ENV: development
      HOME: /tmp
    ports:
      - "5173:5173"

volumes:
  {{projectName}}-mariadbdata:
  {{projectName}}-miniodata:
