# Расписание ПГУ. # # 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: