services: server: build: context: . dockerfile: apps/server/Dockerfile working_dir: /app extra_hosts: - "host.docker.internal:host-gateway" dns: - 8.8.8.8 - 1.1.1.1 command: sh -c "pnpm install || true && pnpm -C /app/apps/server dev" ports: - "${SERVER_PORT:-3001}:${SERVER_PORT:-3001}" volumes: - ./:/app - /app/node_modules - /app/apps/web/node_modules - /app/apps/server/node_modules - ./data:/app/data environment: - NODE_ENV=development - QBIT_BASE_URL=${QBIT_BASE_URL} - QBIT_USERNAME=${QBIT_USERNAME} - QBIT_PASSWORD=${QBIT_PASSWORD} - APP_USERNAME=${APP_USERNAME} - APP_PASSWORD=${APP_PASSWORD} - JWT_SECRET=${JWT_SECRET} - SERVER_PORT=${SERVER_PORT} - WEB_PORT=${WEB_PORT} - WEB_ORIGIN=${WEB_ORIGIN} - WEB_ALLOWED_ORIGINS=${WEB_ALLOWED_ORIGINS} - POLL_INTERVAL_MS=${POLL_INTERVAL_MS} - ENFORCE_INTERVAL_MS=${ENFORCE_INTERVAL_MS} - DEFAULT_DELAY_MS=${DEFAULT_DELAY_MS} - MAX_LOOP_LIMIT=${MAX_LOOP_LIMIT} - WATCHER_SECRET_KEY=${WATCHER_SECRET_KEY} - WATCHER_ENABLED=${WATCHER_ENABLED} - WATCHER_TICK_MS=${WATCHER_TICK_MS} - WATCHER_TIMEOUT_MS=${WATCHER_TIMEOUT_MS} - WATCHER_RUNTIME_DIR=${WATCHER_RUNTIME_DIR} - WSCRAPER_SERVICE_BASE_URL=${WSCRAPER_SERVICE_BASE_URL:-http://host.docker.internal:8787} - WSCRAPER_SERVICE_TOKEN=${WSCRAPER_SERVICE_TOKEN:-} web: build: context: . dockerfile: apps/web/Dockerfile working_dir: /app dns: - 8.8.8.8 - 1.1.1.1 command: sh -c "pnpm install || true && pnpm -C /app/apps/web dev" ports: - "${WEB_PORT:-5173}:${WEB_PORT:-5173}" volumes: - ./:/app - /app/node_modules environment: - NODE_ENV=development - VITE_API_BASE=http://${APP_HOST:-localhost}:${SERVER_PORT:-3001} - WEB_PORT=${WEB_PORT} - WEB_ORIGIN=http://${APP_HOST:-localhost}:${WEB_PORT:-5173} - WEB_ALLOWED_HOSTS=${WEB_ALLOWED_HOSTS:-localhost}