x-app-build: &app-build context: . dockerfile_inline: | FROM node:20-bookworm-slim@sha256:2cf067cfed83d5ea958367df9f966191a942351a2df77d6f0193e162b5febfc0 WORKDIR /app ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright RUN apt-get update && apt-get install -y --no-install-recommends iputils-ping postgresql-client \ && rm -rf /var/lib/apt/lists/* COPY package.json package-lock.json ./ RUN npm ci RUN npx playwright install --with-deps chromium && chmod -R 755 /ms-playwright COPY . . RUN npm run build RUN mkdir -p /app/backups /app/.next/cache \ && chown -R node:node /app/backups /app/.next/cache EXPOSE 3000 USER node HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \ CMD node -e "fetch('http://127.0.0.1:3000/api/health').then((res)=>process.exit(res.status===200?0:1)).catch(()=>process.exit(1))" CMD ["npm", "run", "start"] services: db: image: postgres:16-alpine@sha256:cf78e76683b9ca8c5733cbbdce6c9262b45b6767934dd0a95e671f9a0fc20685 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Run the Docker installer to create .env} POSTGRES_DB: ${POSTGRES_DB:-uptimemonitoring} ports: - "127.0.0.1:5433:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-uptimemonitoring}"] interval: 5s timeout: 5s retries: 10 web: build: *app-build restart: unless-stopped depends_on: db: condition: service_healthy environment: NODE_ENV: production POSTGRES_HOST: db POSTGRES_PORT: 5432 POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Run the Docker installer to create .env} POSTGRES_DB: ${POSTGRES_DB:-uptimemonitoring} APP_URL: ${APP_URL:-http://localhost:3000} APP_UPDATE_REPO: ${APP_UPDATE_REPO:-} AUTH_SECRET: ${AUTH_SECRET:?Run the Docker installer to create .env} AUTH_TRUST_PROXY_HEADERS: ${AUTH_TRUST_PROXY_HEADERS:-false} AUTH_TRUSTED_PROXY_COUNT: ${AUTH_TRUSTED_PROXY_COUNT:-1} AUTH_SESSION_ID: ${AUTH_SESSION_ID:-default-session} APP_ENCRYPTION_SECRET: ${APP_ENCRYPTION_SECRET:?Run the Docker installer to create .env} AUTOMATIC_BACKUP_DIRECTORY: ${AUTOMATIC_BACKUP_DIRECTORY:-/app/backups} PG_DUMP_PATH: ${PG_DUMP_PATH:-pg_dump} PG_RESTORE_PATH: ${PG_RESTORE_PATH:-pg_restore} METRICS_AUTH_TOKEN: ${METRICS_AUTH_TOKEN:-} MONITOR_ALLOW_PRIVATE_TARGETS: ${MONITOR_ALLOW_PRIVATE_TARGETS:-true} WORKER_CONCURRENCY: ${WORKER_CONCURRENCY:-20} WORKER_POLL_INTERVAL_MS: ${WORKER_POLL_INTERVAL_MS:-10000} SCREENSHOT_CONCURRENCY: ${SCREENSHOT_CONCURRENCY:-3} WORKER_CONNECTIVITY_CHECK_ENABLED: ${WORKER_CONNECTIVITY_CHECK_ENABLED:-true} WORKER_CONNECTIVITY_TIMEOUT_MS: ${WORKER_CONNECTIVITY_TIMEOUT_MS:-5000} WORKER_CONNECTIVITY_TARGETS: ${WORKER_CONNECTIVITY_TARGETS:-https://www.google.com/generate_204,https://www.cloudflare.com/cdn-cgi/trace,https://www.msftconnecttest.com/connecttest.txt} DISABLE_EMBEDDED_WORKER_SPAWN: "true" ports: - "3000:3000" command: npm run docker:web healthcheck: test: [ "CMD-SHELL", "node -e \"fetch('http://127.0.0.1:3000/api/health').then((res)=>process.exit(res.status===200?0:1)).catch(()=>process.exit(1))\"", ] interval: 15s timeout: 10s retries: 10 start_period: 20s worker: build: *app-build restart: unless-stopped depends_on: web: condition: service_healthy environment: NODE_ENV: production POSTGRES_HOST: db POSTGRES_PORT: 5432 POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Run the Docker installer to create .env} POSTGRES_DB: ${POSTGRES_DB:-uptimemonitoring} APP_URL: ${APP_URL:-http://localhost:3000} AUTH_SECRET: ${AUTH_SECRET:?Run the Docker installer to create .env} AUTH_SESSION_ID: ${AUTH_SESSION_ID:-default-session} APP_ENCRYPTION_SECRET: ${APP_ENCRYPTION_SECRET:?Run the Docker installer to create .env} AUTOMATIC_BACKUP_DIRECTORY: ${AUTOMATIC_BACKUP_DIRECTORY:-/app/backups} PG_DUMP_PATH: ${PG_DUMP_PATH:-pg_dump} PG_RESTORE_PATH: ${PG_RESTORE_PATH:-pg_restore} MONITOR_ALLOW_PRIVATE_TARGETS: ${MONITOR_ALLOW_PRIVATE_TARGETS:-true} WORKER_CONCURRENCY: ${WORKER_CONCURRENCY:-20} WORKER_POLL_INTERVAL_MS: ${WORKER_POLL_INTERVAL_MS:-10000} SCREENSHOT_CONCURRENCY: ${SCREENSHOT_CONCURRENCY:-3} WORKER_CONNECTIVITY_CHECK_ENABLED: ${WORKER_CONNECTIVITY_CHECK_ENABLED:-true} WORKER_CONNECTIVITY_TIMEOUT_MS: ${WORKER_CONNECTIVITY_TIMEOUT_MS:-5000} WORKER_CONNECTIVITY_TARGETS: ${WORKER_CONNECTIVITY_TARGETS:-https://www.google.com/generate_204,https://www.cloudflare.com/cdn-cgi/trace,https://www.msftconnecttest.com/connecttest.txt} WORKER_AUTO_START: "true" command: npm run docker:worker volumes: - backups:/app/backups healthcheck: disable: true volumes: pgdata: backups: