- migrations/001_initial_schema.sql: DDL idempotente con CREATE TABLE/INDEX IF NOT EXISTS - database.py: run_migrations() aplica .sql pendientes en orden; init_db() queda como alias - health.py: servidor aiohttp en puerto 8080 — GET /health, GET /health/history, POST /webhook Watcher loop alerta al admin por Telegram si el poller no actualiza en N horas - config.py: webhook_url, webhook_secret, health_port, health_alert_hours - poller.py: on_poll_done callback (conecta con health.record_poll) - main.py: arranca HealthServer, llama run_migrations, modo webhook opt-in via WEBHOOK_URL - Dockerfile + docker-compose.yml + .dockerignore - pyproject.toml: aiohttp>=3.9 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
25 lines
525 B
Docker
25 lines
525 B
Docker
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
|
|
|
|
WORKDIR /app
|
|
|
|
# Copiar archivos de dependencias primero (cache de layers)
|
|
COPY pyproject.toml uv.lock ./
|
|
|
|
# Instalar dependencias (sin el proyecto mismo todavía)
|
|
RUN uv sync --frozen --no-install-project
|
|
|
|
# Copiar el resto del código
|
|
COPY . .
|
|
|
|
# Instalar el proyecto
|
|
RUN uv sync --frozen
|
|
|
|
# Directorio de datos persistente (montar como volumen)
|
|
RUN mkdir -p /app/data && chown -R 1000:1000 /app/data
|
|
|
|
USER 1000
|
|
|
|
EXPOSE 8080
|
|
|
|
ENTRYPOINT ["uv", "run", "python", "main.py"]
|