From 7c2b0302f754bad1e3f00609287b9e9ebde01067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 6 Aug 2026 09:39:41 +0400 Subject: [PATCH] =?UTF-8?q?v1.0.0=20=E2=80=94=20=D0=BC=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20Flask=20(site/app.?= =?UTF-8?q?py),=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20manag?= =?UTF-8?q?ed-=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-06-plan-review.md | 91 +++++++++++++++++++++++++++ requirements.txt | 1 + site/__pycache__/app.cpython-312.pyc | Bin 0 -> 590 bytes site/app.py | 14 +++++ 4 files changed, 106 insertions(+) create mode 100644 HISTORY/2026-08-06-plan-review.md create mode 100644 requirements.txt create mode 100644 site/__pycache__/app.cpython-312.pyc create mode 100644 site/app.py diff --git a/HISTORY/2026-08-06-plan-review.md b/HISTORY/2026-08-06-plan-review.md new file mode 100644 index 0000000..d13a6e8 --- /dev/null +++ b/HISTORY/2026-08-06-plan-review.md @@ -0,0 +1,91 @@ +# 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` ✅ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +flask diff --git a/site/__pycache__/app.cpython-312.pyc b/site/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a95642f33e05eb6aad40addcbd57e32883db244f GIT binary patch literal 590 zcmYjO&ubGw6n^t#eJUw%Oe-Xzi4nY{-= zPuVuqSSzhGIvZQbj;rKLKTg!(&a2dDIGDqOt>+J(Z9jg}`T!HHo8EOgQ6Qbrld|jl zr*UFGk&f5v)q8`?@IxWrDE*)|&bWeZ2;a)9C$EqFv;KK$?VPVEy_MOn8+d-`x~YZj z=;4o+uqB%DP825@??ozU)of*Iwy~qzRJt#%481_QZpN@|W~iv2$XU&dseY&|B+Y85 z0-~wi2qMw%$}NS*gZ``dDY~2yLN1Dxq4g7Pem6^_M+ec6tf_registry v{VERSION}" + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000)