schedule-service

Self-hosted сервис адаптивного расписания дня, синхронизируемого с CalDAV-календарём (Baikal → нативная синхронизация с Календарём iPhone).

Идея

  • Шаблон дня хранится в Postgres как набор блоков двух типов:
    • RELATIVE — смещение от времени пробуждения (например, "завтрак: wake+105 мин")
    • FIXED — жёсткая привязка к часу и дню недели (например, дейли в 10:15 по будням)
  • По триггеру "проснулся" (через iOS Shortcuts → POST /api/wake) сервис вычисляет реальные времена на сегодня и создаёт/обновляет события в Baikal через CalDAV.
  • POST /api/shift пересчитывает и сдвигает ещё не начавшиеся сегодняшние события.
  • Список покупок (shopping_item) пополняется голосом через кастомный навык Алисы (вебхук /api/alice/webhook), читается бэкендом при наступлении блока категории SHOPPING_TRIP.
  • Фронт на React для ручного администрирования шаблона — собирается в один jar вместе с бэкендом.

Стек

  • Spring Boot 3.3, Java 17
  • Spring Data JPA + PostgreSQL (ddl-auto: update, без Flyway — осознанное упрощение для домашнего проекта)
  • RestTemplate + ical4j для CalDAV-синхронизации с Baikal
  • React (сборка встраивается в classpath:/static)

Текущий статус

Готово:

  • Entities: ScheduleBlock, ShoppingItem
  • Repositories
  • CaldavProperties / RestTemplateConfig
  • Базовый application.yml

В работе / следующие шаги:

  • ScheduleCalculationService — расчёт конкретных времён на день из шаблона
  • CaldavSyncService — построение VEVENT (ical4j) и PUT в Baikal, детерминированный UID (например sha256(date + title)) для идемпотентного обновления
  • WakeControllerPOST /api/wake, POST /api/shift
  • ScheduleBlockController, ShoppingController — CRUD для фронта
  • AliceWebhookController — приём команд от навыка Алисы
  • React-фронт для администрирования
  • Dockerfile + манифесты Deployment/Service для k3s (namespace media)

Локальный запуск

# 1. Прокинуть Postgres из кластера
kubectl port-forward -n media svc/postgres-postgresql 5432:5432

# 2. Создать БД и пользователя (один раз)
psql -h localhost -U postgres -c "CREATE DATABASE schedule;"
psql -h localhost -U postgres -c "CREATE USER schedule_user WITH PASSWORD 'changeme';"
psql -h localhost -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE schedule TO schedule_user;"

# 3. Поправить src/main/resources/application.yml (пароли caldav/db)

# 4. Запуск
mvn spring-boot:run

Baikal доступен напрямую по NodePort (192.168.1.100:30019), отдельный port-forward не нужен.

Референсные данные шаблона (обсуждены, вводятся вручную через фронт/API после его готовности)

Пробуждение ~9:00, отбой ~23:30. Полный список блоков и офсетов — см. историю разработки проекта, часть значений помечена как оценочная и подлежит уточнению по факту использования.

Статические события:

Событие Время Дни
Дейли НСИ 10:15 будни
Дейли Mesh 12:30 будни
Созвон НСИ→ПГ 15:00 вторник
S
Description
Сервис создание расписания на день
Readme
1.2 MiB
Languages
JavaScript 89.5%
Java 8.7%
CSS 1.5%
Dockerfile 0.3%