docker-compose.yml
Rama main · réplica de lectura del repositorio original.
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: