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
После запуска:
- статус сервиса: http://localhost:8080/api/v1/status
- health: http://localhost:8080/actuator/health
- Swagger UI: http://localhost:8080/swagger-ui.html
После импорта GeoJSON итоговые методы:
-
GET /api/v1/calculations/{id}/variants?limit=3— до трёх ранжированных вариантов; -
GET /api/v1/calculations/{id}/result.geojson?limit=3— итоговая геометрия и полная стоимостная сводка.
Как загрузить и пересчитать новый GeoJSON
Демонстрационная карта всегда использует последний успешно импортированный расчёт из PostgreSQL. Файл, просто скопированный в каталог сервера, автоматически не выбирается.
- Откройте Swagger:
http://АДРЕС_СЕРВЕРА/swagger-ui.html. - Раскройте
POST /api/v1/calculationsи нажмите Try it out. - В поле
fileвыберите новый файл.geojson, затем нажмите Execute. - Скопируйте поле
idиз ответа. Загрузка автоматически запускает фоновый импорт — отдельной команды импорта нет. - Раскройте
GET /api/v1/calculations/{id}, вставьте полученныйidи выполняйте запрос, пока полеstatusне станетIMPORTED. СтатусFAILEDозначает, что файл не прошёл импорт или проверку; текст ошибки нужно смотреть в ответе и журнале. - Откройте
http://АДРЕС_СЕРВЕРА/demo.html. Простое открытие страницы ничего не считает. - Нажмите Запустить расчёт. Будет обработан последний расчёт со статусом
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 предназначен только для локальной разработки и не должен
использоваться в опубликованной среде.