Files
tf_registry/HISTORY/2026-08-06-plan-review.md
T

92 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-08-06 — Ревизия плана Flask-реестра
## Контекст
Переписываем Go-реестр (`server/main.go`) на Python/Flask для managed-сервиса в облаке.
Логика 1:1 — те же эндпоинты, та же S3-структура, тот же GPG-ключ.
## Файлы прочитаны
| Файл | Строки | Что |
|---|---|---|
| `server/main.go` | 1-289 | Весь HTTP-сервер: 7 роутов, S3, GPG |
| `server/docs.go` | 1-200 | Docs-сервер с кандидатами ключей |
| `server/gpg_key.go` | 1-50 | Прокси к `registrykeys` пакету |
| `registrykeys/public_key.go` | 1-50 | Константы KeyID + ASCIIArmor |
| `CHAT_SUMMARY_2026-08-06.md` | 1-100 | Контекст: архитектура, S3-структура, ENV |
## План (из plan.md) — TL;DR
- **Фаза 1**: git checkout -b golang → удалить Go-код из master
- **Фаза 2**: `app.py` (~250-300 строк Flask) + `requirements.txt` (flask, boto3)
- **Фаза 3**: py_compile → деплой → curl-проверки → terraform init
### Эндпоинты (из Go-кода):
| URL | Ответ |
|---|---|
| `GET /.well-known/terraform.json` | `{"providers.v1": "/v1/providers/"}` |
| `GET /v1/providers/{ns}/{name}/versions` | JSON: id, versions[], warnings[] |
| `GET /v1/providers/{ns}/{name}/{ver}/download/{os}/{arch}` | JSON: download_url, shasums_url, sig_url, shasum, signing_keys |
| `GET /v1/proxy?bucket=...&key=...` | Стриминг файла из S3 |
| `GET /docs/{ns}/{name}/{ver}/...` | Статика из S3 (кандидаты ключей) |
| `GET /healthz` | `"ok"` 200 |
| `GET /readyz` | `"ok"` 200 |
| `GET /` | HTML-страница "ONLINE" |
### S3-ключи:
```
{hostname}/{namespace}/{name}/{version}/terraform-provider-{name}_{ver}_{os}_{arch}.zip
{hostname}/{namespace}/{name}/{version}/terraform-provider-{name}_{ver}_SHA256SUMS
{hostname}/{namespace}/{name}/{version}/terraform-provider-{name}_{ver}_SHA256SUMS.sig
docs/{namespace}/{name}/{version}/{path}
```
### ENV-переменные:
- `REGISTRY_HOSTNAME` (default: `localhost:8080`)
- `S3_ENDPOINT`
- `S3_ACCESS_KEY`
- `S3_SECRET_KEY`
- `S3_BUCKET` (default: `terraform-registry`)
## 6 замечаний к плану
### 1. ⚠️ S3-пагинация (ВАЖНО)
Go: `ListObjects` → канал с авто-пагинацией (все объекты).
boto3: `list_objects_v2` → макс 1000 за раз.
**Надо:** `Paginator` или цикл с `ContinuationToken`.
### 2. Docs-кандидаты (точность)
Go-логика чуть точнее, чем описано в плане:
- `rest` пустой → только `index.html`
- `rest` не пустой: exact → (если `/` на конце ИЛИ нет расширения → `{rest}/index.html`) → `index.html`
- Для `.css`/`.js` НЕ пробуется `{rest}/index.html`
### 3. Content-Length при стриминге
Go ставит через `obj.Stat()`. Flask `stream_with_context` — нет.
**Надо:** `head_object` → взять `ContentLength` → выставить вручную.
### 4. boto3 + MinIO
```python
boto3.client('s3',
endpoint_url=f'https://{s3_endpoint}',
use_ssl=True,
config=Config(signature_version='s3v4')
)
```
Без `s3v4` могут быть ошибки подписи на MinIO.
### 5. /readyz
Go: комментарий «Проверить S3», но реально просто `"ok"`.
Делать 1:1 → просто `"ok"`.
### 6. Порядок роутов во Flask
Flask матчит сверху вниз. `/` должен быть последним, чтобы не перехватить `/docs/`.
## Решения (подтверждены)
- GPG: только константа, без python-gnupg ✅
- Прокси: `?bucket=&key=` (НЕ `?url=`) ✅
- Платформы: только `linux_amd64` + `windows_amd64`
- Домен: `registry.pythonk8s.dev.nubes.ru`