Files
psu-schedule/docker-compose.yml
Zakhar Timoshenko c0487e4c2a feat: enhance user-agent identification and implement backoff strategy for university source requests
- Added PSU_CONTACT environment variable to docker-compose for owner contact in User-Agent.
- Updated source.js to include user-agent construction with service version and contact information.
- Implemented exponential backoff strategy for failed requests to the university, with retry logic based on HTTP response status.
- Modified status.js to display backoff information in the status response.
- Adjusted watch.js to reduce request frequency during university downtime.
- Enhanced test coverage with new backoff.test.js to validate backoff behavior and user-agent format.
2026-10-22 01:17:54 +03:00

82 lines
3.9 KiB
YAML
Raw Permalink 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:-}
# Контакт владельца в User-Agent запросов к университету (почта или ссылка),
# чтобы администраторы Nextcloud знали, кому написать: mailto:you@example.com
PSU_CONTACT: ${PSU_CONTACT:-}
# Путь к 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: