name: cymelle services: db: image: postgres:18-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-cymelle} POSTGRES_USER: ${POSTGRES_USER:-cymelle} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-cymelle} ports: - "${POSTGRES_PORT:-5432}:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-cymelle} -d ${POSTGRES_DB:-cymelle}", ] interval: 5s timeout: 5s retries: 10 api: image: eclipse-temurin:17-jdk-jammy working_dir: /workspace command: ./gradlew --no-daemon bootRun environment: PORT: 8080 SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/${POSTGRES_DB:-cymelle} SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-cymelle} SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-cymelle} APP_CORS_ALLOWED_ORIGINS: ${APP_CORS_ALLOWED_ORIGINS:-http://localhost:3000} SEED_DATA: ${SEED_DATA:-true} LOW_STOCK_THRESHOLD: ${LOW_STOCK_THRESHOLD:-10} FARE_BASE_FARE: ${FARE_BASE_FARE:-100.00} FARE_PER_KM_RATE: ${FARE_PER_KM_RATE:-50.00} FARE_MINIMUM_FARE: ${FARE_MINIMUM_FARE:-150.00} FARE_DEFAULT_SURGE_MULTIPLIER: ${FARE_DEFAULT_SURGE_MULTIPLIER:-1.0} FARE_CURRENCY: ${FARE_CURRENCY:-KES} PAYSTACK_SECRET_KEY: ${PAYSTACK_SECRET_KEY:-} PAYSTACK_PUBLIC_KEY: ${PAYSTACK_PUBLIC_KEY:-} PAYSTACK_CALLBACK_URL: ${PAYSTACK_CALLBACK_URL:-http://localhost:3000/payments/paystack/callback} PAYSTACK_WEBHOOK_SECRET: ${PAYSTACK_WEBHOOK_SECRET:-} PAYSTACK_API_BASE_URL: ${PAYSTACK_API_BASE_URL:-https://api.paystack.co} ports: - "${API_PORT:-8080}:8080" volumes: - ./orders-backend:/workspace - gradle-cache:/root/.gradle depends_on: db: condition: service_healthy web: image: node:24-bookworm-slim working_dir: /app command: sh -c "corepack enable && pnpm install --frozen-lockfile && pnpm dev --host 0.0.0.0" environment: HOST: 0.0.0.0 PORT: 3000 VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://localhost:8080/api} ports: - "${WEB_PORT:-3000}:3000" volumes: - ./orders-frontend:/app - frontend-node-modules:/app/node_modules depends_on: - api volumes: postgres-data: gradle-cache: frontend-node-modules: