Heat Routing Service

Сервис автоматического моделирования трасс подключения перспективных ОКС к существующим тепловым сетям для кейса ЛЦТ 2026.

О проекте и команде

Программа создана для хакатона «Лидеры цифровой трансформации» командой PipeSVG:

  • Максим Кукушкин — программирование, деплой;
  • Анна Аржинт — дизайн, UI;
  • Роман Смирнов — менеджер проекта, администрирование.

Москва, 2026.

Проект находится на начальном этапе. Ход разработки: docs/DEVELOPMENT_LOG.md. Технические правила: docs/TECHNICAL_SPEC.md. Подробная пошаговая инструкция для ручного запуска: docs/LOCAL_RUN_GUIDE.md. Запуск на Ubuntu VM после загрузки в SourceCraft/Yandex Cloud: docs/DEPLOYMENT_GUIDE.md.

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

Требования: Java 11, Docker, Colima и Docker Compose. PostgreSQL и Maven глобально не нужны.

Самый простой запуск после клонирования репозитория:

chmod +x run.sh
./run.sh start

Пересборка и перезапуск после изменения кода или параметров:

./run.sh restart

Например, временно запустить на порту 8090 с тремя соединениями к базе:

./run.sh restart --port 8090 --db-pool 3

Справка по всем командам: ./run.sh --help. Постоянные параметры находятся в .env. PID старого локального JAR запоминать не нужно: при запуске скрипт сам обнаруживает и останавливает именно PipeSVG на выбранном порту, но не завершает посторонние процессы.

Проверка Java-сборки без глобального Maven:

./mvnw test
colima start
docker-compose up --build

После запуска:

После импорта GeoJSON итоговые методы:

  • GET /api/v1/calculations/{id}/variants?limit=3 — до трёх ранжированных вариантов;
  • GET /api/v1/calculations/{id}/result.geojson?limit=3 — итоговая геометрия и полная стоимостная сводка.

Как загрузить и пересчитать новый GeoJSON

Демонстрационная карта всегда использует последний успешно импортированный расчёт из PostgreSQL. Файл, просто скопированный в каталог сервера, автоматически не выбирается.

  1. Откройте Swagger: http://АДРЕС_СЕРВЕРА/swagger-ui.html.
  2. Раскройте POST /api/v1/calculations и нажмите Try it out.
  3. В поле file выберите новый файл .geojson, затем нажмите Execute.
  4. Скопируйте поле id из ответа. Загрузка автоматически запускает фоновый импорт — отдельной команды импорта нет.
  5. Раскройте GET /api/v1/calculations/{id}, вставьте полученный id и выполняйте запрос, пока поле status не станет IMPORTED. Статус FAILED означает, что файл не прошёл импорт или проверку; текст ошибки нужно смотреть в ответе и журнале.
  6. Откройте http://АДРЕС_СЕРВЕРА/demo.html. Простое открытие страницы ничего не считает.
  7. Нажмите Запустить расчёт. Будет обработан последний расчёт со статусом IMPORTED.

То же самое без Swagger (подставьте адрес и путь к файлу):

curl -F 'file=@/полный/путь/данные.geojson' \
  http://АДРЕС_СЕРВЕРА/api/v1/calculations

curl http://АДРЕС_СЕРВЕРА/api/v1/calculations/ПОЛУЧЕННЫЙ_ID

Не удаляйте Docker volume PostgreSQL командой docker-compose down -v: вместе с томом исчезнут сведения об импортированных расчётах. Обычные restart, stop/start и docker-compose up -d --build без -v сохраняют их.

Безопасность загрузки

Swagger — только интерфейс к API, а не механизм авторизации. Текущая демонстрационная конфигурация не проверяет пользователя: если сервер и endpoint загрузки доступны из Интернета, посторонний человек тоже может загрузить файл и запустить расчёт.

При импорте действуют технические проверки: пустые файлы отклоняются, размер ограничен 3 ГБ, имя очищается, файл сохраняется под UUID вне исходного имени, GeoJSON читается потоково, а структура, геометрии и ссылки проходят валидацию. Эти проверки защищают обработку данных, но не заменяют контроль доступа и не определяют, кому разрешена загрузка.

Перед публичной эксплуатацией закройте изменяющие данные endpoints авторизацией на Nginx или в приложении. Минимум следует защитить:

  • POST /api/v1/calculations — загрузка и импорт;
  • POST /api/v1/demo/latest/jobs — запуск ресурсоёмкого расчёта.

Для открытой демонстрации можно оставить публичными demo.html и безопасные GET-запросы, а загрузку разрешить только организаторам либо с отдельным логином и паролем.

Остановка:

docker-compose down
colima stop

Пароль базы в docker-compose.yml предназначен только для локальной разработки и не должен использоваться в опубликованной среде.