Ctrl K
ComunidadGuías…

docker-compose.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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: