Files
psu-schedule/docker-compose.yml
Zakhar Timoshenko 3ae7b38fca feat: implement dashboard with authentication and event logging
- Added dashboard functionality at /status with Basic Auth using DASHBOARD_PASSWORD.
- Created server-side event logging to track catalog and university status.
- Implemented traffic metrics tracking and display on the dashboard.
- Enhanced API tests to cover new dashboard features and authentication.
- Introduced CSS and JS for dashboard styling and functionality.
- Added tests for dashboard access control and data retrieval.
2026-10-21 00:04:33 +03:00

79 lines
3.6 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:-}
# Пароль дашборда /status (вход через окно браузера, имя любое);
# без него дашборд выключен.
DASHBOARD_PASSWORD: ${DASHBOARD_PASSWORD:-}
# Публичный адрес для ссылок в сообщениях, например 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: