---
type: infra-requirements
work_item_id: ET-006
version: 1
status: approved
created_at: 2026-05-22
authors:
  - "agent:architect"
---

# Infra Requirements — ET-006

ET-006 — **чисто фронтендовая** фича. Парсинг и хранение GPX полностью
клиентские (см. BRD §2, ADR-003). Бэкенд, БД, OSRM и сетевая конфигурация
**не затрагиваются**.

## 1. Сводка: инфраструктурных изменений нет

| Аспект | Изменение |
|---|---|
| Новые контейнеры | нет |
| Новые порты | нет |
| Новые тома (volumes) | нет |
| Изменения `docker-compose.yml` | нет |
| Изменения `Dockerfile` | нет |
| Изменения nginx / reverse proxy | нет |
| Пересборка OSRM-графа | не требуется |
| Миграции БД | нет (см. `08-data-requirements.md`) |
| Новые переменные окружения | нет |
| Новые внешние зависимости (npm/pip) | нет |

## 2. Новый статический ассет `gpx.js`

ADR-002 вводит новый файл `src/web/gpx.js`. Дополнительной конфигурации
не требуется:

- `Dockerfile` уже копирует каталог целиком: `COPY src/web/ ./src/web/`.
- `docker-compose.yml` монтирует `./src/web:/app/src/web` (dev).
- FastAPI отдаёт статику через `app.mount("/", StaticFiles(directory=STATIC_DIR,
  html=True))` — файл доступен по `/gpx.js` автоматически.
- Подключение — тег `<script src="gpx.js">` в `index.html` (см. ADR-002).

## 3. Загрузка файла 50 МБ — без серверной нагрузки

ТЗ REQ-F-03 разрешает GPX-файлы до 50 МБ. Файл читается в браузере
(`<input type="file">` + `FileReader` / `File.text()`) и **никогда не
загружается на сервер**.

Следствия:

- Лимит `client_max_body_size` в nginx — **не релевантен** (нет upload).
- Ограничения размера тела запроса в FastAPI — **не релевантны**.
- Сетевой трафик и дисковая нагрузка сервера от ET-006 — нулевые.

## 4. CSP / заголовки безопасности

- CSP-заголовок в проекте сейчас не задаётся (проверено: `main.py`,
  `index.html`). Дополнительных директив ET-006 не требует.
- Web Worker отклонён в ADR-003 → директива `worker-src` не нужна даже
  при возможном будущем введении CSP.
- Сторонних CDN/доменов ET-006 не добавляет (парсинг нативный `DOMParser`,
  профиль высот — нативный `<canvas>`).

## 5. Деплой

Стандартный процесс, без особых окон и без простоя сервисов:

1. Merge PR в trunk.
2. `make build` — пересборка Docker-образа (включает новый `gpx.js`).
3. `make deploy-test` → `docker compose up -d` на mva154.
4. Smoke-test на test-окружении
   (`https://openclaw.mva154.duckdns.org/enduro/`):
   - открыть `/gpx.js` — отдаётся 200;
   - загрузить тестовый GPX, убедиться в отрисовке трека.

Простой `/api/route` и прочих API — **отсутствует** (бэкенд не меняется).

## 6. Rollback

Откат — обычный откат фронтенд-файлов (`index.html`, `app.js`, `app.css`,
`gpx.js`) через revert PR и повторную сборку образа. Серверного состояния,
БД-изменений или графа, которые надо откатывать, нет. Время отката
ограничено только временем пересборки/перезапуска контейнера (~1–2 мин).

## 7. CI

- ESLint покрывает новый `gpx.js` (цель `make lint`, уже включает eslint).
- Бэкенд-тесты (`pytest`) ET-006 не затрагивает.
- Пересборки графа в pipeline нет — не релевантно.
