docs: history — DDoS-Guard 403 fix + registry server fix

This commit is contained in:
“Naeel”
2026-07-01 17:20:02 +04:00
parent b32424ac14
commit 8e9691eaba
@@ -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/` |