3.8 KiB
Dev Report: Enduro Trails Фаза 3 — Bugfix
Дата: 2026-05-04 Статус: DONE
Задача
Исправить 2 бага в Enduro Trails Фаза 3:
- app.py: OSRM возвращает
code: "TooBig"приalternatives=5→ 404 - app.js:
formatDuration(86400)→"1 дн 0 ч"вместо"1 дн"
Сделано
- Прочитал app.py и app.js
- Баг 1: добавил retry-логику в POST
/api/route— сначалаalternatives=3, затемalternatives=false - Баг 2: исправил ветку
days > 0вformatDuration— добавил проверкуhours === 0 && mins === 0 - Обновил файлы в workspace
- Задеплоил через Node.js ssh2 (SSH бинарник не работает из контейнера — GLIBC mismatch)
- Обнаружил что контейнер собран из образа (не bind-mount) → использовал
docker cpдля копирования файлов в контейнер - Перезапустил контейнер (
docker compose restart) - Проверил что фикс выжил после рестарта (TooBig: 4 вхождения в контейнере)
- Прогнал тест — маршрут возвращается, pct sum = 100
Изменённые файлы
workspace/tasks/enduro-trails/prototype/app.py— retry-логика TooBig (строки ~500-525)workspace/tasks/enduro-trails/prototype/static/app.js— formatDuration fix
Результат
Баг 1 — TooBig fix
OSRM на mva154 имеет максимум 3 альтернативы (не 5). Любой запрос с alternatives=5 возвращает TooBig.
Retry-цепочка: alternatives=5 → TooBig → alternatives=3 → если снова TooBig → alternatives=false.
Тест короткого маршрута (37.6184,55.7512 → 37.8,55.85):
routes count: 3
distance_m: 18858
pct sum: 100 OK
Тест длинного маршрута ~127км (37.6184,55.7512 → 36.7,56.3):
routes count: 1
distance_m: 127088
pct sum: 100 OK
Баг 2 — formatDuration fix
formatDuration(86400): "1 дн" ✅ (было "1 дн 0 ч")
formatDuration(90000): "1 дн 1 ч" ✅
formatDuration(93600): "1 дн 2 ч" ✅
Проблемы и решения
SSH бинарник не работает из контейнера
GLIBC mismatch: ssh: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.38' not found
→ Решение: Node.js скрипт с npm ssh2 для всех SSH операций.
Stale lock на mva154
Осталась незавершённая сессия от 2026-05-03 (add-swap-4g). PID 78077 мёртв. → Решение: удалил lock directory вручную, создал новую сессию.
Контейнер собран из образа (не bind-mount)
docker compose restart перезапускает контейнер из существующего образа — файлы на хосте не попадают внутрь.
→ Решение: docker cp для копирования файлов прямо в работающий контейнер, затем restart.
→ Урок: при следующем деплое либо добавить bind-mount в docker-compose.yml, либо делать docker compose build && docker compose up -d.
Следующий шаг
Для постоянного решения — добавить bind-mount в docker-compose.yml:
volumes:
- /home/slin/enduro-trails/data:/data
- /home/slin/enduro-trails/prototype/app.py:/app/app.py
- /home/slin/enduro-trails/prototype/static:/app/static
Тогда деплой = просто скопировать файл на хост + docker compose restart.