docs: history — DDoS-Guard 403 fix + registry server fix
This commit is contained in:
@@ -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/` |
|
||||
Reference in New Issue
Block a user