Files
psu-schedule/docker-compose.yml

76 lines
3.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Расписание ПГУ.
#
# docker compose up -d --build → http://localhost:3001
# DOMAIN=schedule.example.by docker compose --profile https up -d --build
# → https://schedule.example.by
#
# Установка PWA на телефон требует HTTPS: для публичного адреса включите
# профиль https (Caddy сам получит сертификат Let's Encrypt) либо поставьте
# приложение за свой обратный прокси.
services:
app:
build: .
image: psu-schedule:latest
restart: unless-stopped
ports:
# Без HTTPS-прокси приложение доступно напрямую; за прокси можно
# ограничить локальным адресом: APP_BIND=127.0.0.1
- "${APP_BIND:-0.0.0.0}:${APP_PORT:-3001}:3001"
environment:
HOST: 0.0.0.0
PORT: 3001
TZ: Europe/Minsk
# Оповещения владельцу в Telegram (см. README): токен бота от @BotFather
# и id чата. Значения удобно держать в файле .env рядом с этим файлом.
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-}
TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-}
# Публичный адрес для ссылок в сообщениях, например https://psu.rumblur.by
PSU_PUBLIC_URL: ${PSU_PUBLIC_URL:-}
# Путь к LibreOffice для импорта старых .doc уже есть в образе.
volumes:
# Кэш каталога, таблицы недель и распознанных документов.
# Переживает пересборку образа; удаление тома только замедлит первый запуск.
- psu-data:/app/.data
healthcheck:
# Здоров = готов: каталог, таблица недель и индекс загружены (/api/ready).
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3001/api/ready').then((r) => process.exit(r.ok ? 0 : 1), () => process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
# Первый запуск без кэша скачивает и разбирает все документы каталога;
# с кэшем в томе psu-data сервер готов за несколько секунд.
start_period: 120s
start_interval: 3s
caddy:
image: caddy:2.8.4-alpine
profiles: ["https"]
restart: unless-stopped
depends_on:
app:
condition: service_healthy
environment:
DOMAIN: ${DOMAIN:-}
# DOMAIN проверяется внутри контейнера: обычный `docker compose up`
# без профиля https не должен его требовать.
entrypoint: ["/bin/sh", "-c"]
command:
- >-
caddy reverse-proxy
--from "$${DOMAIN:?Укажите DOMAIN, например schedule.example.by}"
--to app:3001
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
# Сертификаты: без тома Caddy запрашивал бы их заново при каждом запуске.
- caddy-data:/data
- caddy-config:/config
volumes:
psu-data:
caddy-data:
caddy-config: