# proxy-contur Прокси-сервис для тендерного контура (Synology upstream). > **Legacy Cesium note.** Контурные endpoints этого сервиса остаются > поддерживаемым назначением. Его `/proxy/cesium/fetch` сохраняется только как > историческая совместимость и не является production-маршрутом Foundry Map. > Канонический Cesium egress: `Map Gateway → dc-amd-proxy → dc-amd-connector → > Windows VPN`; см. `services/dc-amd-proxy/OPERATIONS.md`. ## Назначение Сервис принимает запросы от локального backend NodeDC и делает внешний трафик: 1. Поиск тендеров (Contour search). 2. Карточка закупки (Contour purchases). 3. Fetch документов по `url` с stream passthrough (без base64). 4. Ограниченный VPN egress для Platform Map Gateway / Cesium. ## Endpoints 1. `GET /healthz` 2. `POST /proxy/contour/search` 3. `GET /proxy/contour/purchases/:purchaseId` 4. `GET /proxy/contour/limit-groups` 5. `GET /proxy/fetch?url=` 6. `GET /proxy/cesium/fetch?url=` ## Auth Если задан `PROXY_TOKEN`, требуется: 1. `x-proxy-token: ` или 2. `Authorization: Bearer ` ## Contour API key Рекомендуемый режим: 1. Задать `CONTOUR_API_KEY` в `.env` на стороне `proxy-contur`. 2. После этого ключ Контура не нужно передавать в каждом запросе. Совместимость: 1. Если `CONTOUR_API_KEY` не задан, сервис возьмёт ключ из запроса (`x-kontur-apikey` / query / body), как раньше. ## Security По умолчанию включено: 1. Только `http/https`. 2. Блок private/local/loopback сетей. 3. Проверка каждого redirect. 4. Лимиты timeout/size/redirect count. `/proxy/cesium/fetch` дополнительно принимает только канонические hosts Cesium Ion и Bing, проверяет каждый redirect и не допускает произвольные outbound headers. Внутренние `x-nodedc-cesium-authorization` и `x-nodedc-map-referer` передаёт только Map Gateway через закрытую сеть `nodedc-map-egress`; в логах query credentials маскируются. ## Quick Start ```bash cd proxy-contur cp .env.example .env npm install npm run start ``` ## Docker Compose Start ```bash cd proxy-contur cp .env.example .env docker compose up -d --build ``` Проверка: ```bash docker compose ps curl -sS http://172.22.0.222:8787/healthz | jq ``` Остановка: ```bash docker compose down ``` ## Пример запросов Проверка: ```bash curl -sS http://172.22.0.222:8787/healthz | jq ``` Contour search: ```bash curl -sS -X POST "http://172.22.0.222:8787/proxy/contour/search" \ -H "x-proxy-token: change-me" \ -H "content-type: application/json" \ -d '{"PageNumber":0,"PageSize":50}' | jq ``` Contour purchase: ```bash curl -sS "http://172.22.0.222:8787/proxy/contour/purchases/12345" \ -H "x-proxy-token: change-me" | jq ``` Fetch file stream: ```bash curl -L -o out.bin \ "http://172.22.0.222:8787/proxy/fetch?url=https%3A%2F%2Fexample.com%2Ffile.pdf" \ -H "x-proxy-token: change-me" ```