diff --git a/HISTORY/2026-07-01_ddos_guard_403_and_registry_fix.md b/HISTORY/2026-07-01_ddos_guard_403_and_registry_fix.md new file mode 100644 index 0000000..cf004b0 --- /dev/null +++ b/HISTORY/2026-07-01_ddos_guard_403_and_registry_fix.md @@ -0,0 +1,136 @@ +# 2026-07-01 — DDoS-Guard 403 + Registry Fix + +## Проблема 1: 403 от DDoS-Guard при вызове ColdFusion API + +### Симптомы +Terraform provider возвращал `HTTP статус 403` при создании ресурса `nubes_s3bucket`. + +### Причина +5 мест в коде делали HTTP-запросы к API без заголовка `User-Agent`. DDoS-Guard блокирует запросы без User-Agent. + +### Исправление (v5.0.75) + +| Файл | Строка | Функция | +|---|---|---| +| `universal_rebuild/internal/core/client.go` | ~522 | `FindExistingInstances` (пагинированный поиск) | +| `universal_rebuild/internal/core/client.go` | ~597 | `GetInstanceState` | +| `universal_rebuild/internal/core/client.go` | ~644 | `GetInstanceStateRaw` | +| `universal_rebuild/internal/core/client.go` | ~865 | `doRequest` | +| `universal_rebuild/internal/resources_core/domain_collision.go` | ~99 | проверка коллизий доменов | + +Все прямые HTTP-вызовы теперь добавляют `req.Header.Set("User-Agent", "Mozilla/5.0")`. +Пакетная константа `userAgent` вынесена на уровень пакета в `client.go`. + +### Другие условия обхода DDoS-Guard (уже были настроены): +- `TLSNextProto = make(map[string]func(...))` — отключение HTTP/2 ALPN +- `?endpoint=` формат с rawQuery (без %2F) +- `req.Close = true` (свежий TCP на каждый запрос) +- `InsecureSkipVerify = true` +- Fresh Transport (не клон DefaultTransport) + +--- + +## Проблема 2: Registry-server не отдавал API + +### Симптомы +```bash +curl https://terra.k8c.ru/v1/providers/nubes-test/nubes/versions +# → "Not Found" + +terraform init +# → "provider registry terra.k8c.ru does not have a provider named terra.k8c.ru/nubes-test/nubes" +``` + +### Причина +Две ошибки в коде registry-server (`/home/naeel/terra/registry/operator/cmd/registry/main.go` на ВМ 5.172.178.213): + +1. **Неполный ID в ответе `listVersions`:** +```go +// Было: +ID: fmt.Sprintf("%s/%s", namespace, pType) // "nubes-test/nubes" +// Стало: +ID: fmt.Sprintf("%s/%s/%s", hostname, namespace, pType) // "terra.k8c.ru/nubes-test/nubes" +``` +Terraform сверяет `id` из ответа с `source` в конфигурации. Без hostname — mismatch. + +2. **Docker-сборка исключала модуль `registrykeys/`:** +В `.dockerignore` была строка `registrykeys/`. Модуль содержит GPG-ключ, необходимый для сборки. +Убрал из `.dockerignore` + добавил `COPY registrykeys ./registrykeys` в Dockerfile. + +3. **GPG-ключ не совпадал:** +Registry-server публиковал ключ `CB3A0DF161ECC416` (tazet@narod.ru), а SHA256SUMS был подписан ключом `3EC4673EB798238A` (Nubes Provider). +Обновил `registrykeys/public_key.go` на ключ `Nubes Provider`. + +### Хронология фиксов реестра + +| Тег Docker-образа | Что исправлено | +|---|---| +| `router-fix` | Индексы в роутере (ошибочно — terraform шлёт URL без hostname) | +| `router-fix-v2` | ID в listVersions (добавлен hostname) | +| `router-fix-v3` | Откат роутера + только ID fix | +| `gpg-fix` | Обновлён GPG ключ на Nubes Provider | + +### Финальный образ +`naeel/terraform-registry-server:gpg-fix` — работает в k8s (namespace: terra, deployment: registry-server). + +### Важное замечание про URL +Terraform шлёт запросы БЕЗ hostname в пути: +``` +GET /v1/providers/{namespace}/{type}/versions +GET /v1/providers/{namespace}/{type}/{version}/download/{os}/{arch} +``` +(не `/v1/providers/{hostname}/{namespace}/{type}/...`) + +Роутер в registry-server корректно парсит такой формат. + +--- + +## Проблема 3: Медленное скачивание с локальной машины + +### Симптомы +`curl` с локальной машины (Krupski) качает 12 МБ zip ~30 секунд (600 байт/сек). + +### Причина +Локальная машина не в VPN/не в ЦОДе. Трафик идёт через DDoS-Guard, который режет скорость. + +### Решение +Работать с ВМ (5.172.178.213), которая в том же ЦОДе: +```bash +# С ВМ — 1.4 секунды на 12 МБ +ssh naeel@5.172.178.213 +cd /home/naeel/terra/terraform/TEST_STAND/buck0 +terraform init # ~2 сек +terraform apply # ~34 сек +``` + +--- + +## Результат + +``` +✅ terraform init — v5.0.75 загружен из реестра +✅ terraform apply — buck0 создан (RUNNING, id: 7ef02214-c334-40a1-ac4d-bc0123183cc0) +✅ S3 пути — terraform-registry/terra.k8c.ru/nubes-test/nubes/5.0.75/ +✅ S3 пути (old) — terraform-registry/terra.k8c.ru/nubes/nubes/5.0.75/ +``` + +## Структура S3 для провайдера + +``` +terraform-registry/terra.k8c.ru/{namespace}/nubes/{version}/ + terraform-provider-nubes_{version}_SHA256SUMS + terraform-provider-nubes_{version}_SHA256SUMS.sig + terraform-provider-nubes_{version}_linux_amd64.zip +``` + +## Ключевые пути + +| Что | Где | +|---|---| +| Исходники registry-server | `/home/naeel/terra/registry/` (ВМ) | +| Dockerfile | `operator/build/Dockerfile.registry` | +| GPG ключ (pub) | `operator/registrykeys/public_key.go` | +| Registry образ | `naeel/terraform-registry-server:gpg-fix` | +| k8s deployment | `terra/registry-server` | +| S3 credentials | k8s secret `terra/s3-credentials` | +| Provider source | `universal_rebuild/` |