5.4 KiB
5.4 KiB
Plan: Flask Registry — tf_registry (ПОЛНЫЙ ОРИГИНАЛ)
Создан на основе CHAT_SUMMARY_2026-08-06.md + анализа Go-кода. Сохранён из session-памяти в постоянный HISTORY.
TL;DR
Переписать Go-реестр (server/main.go) на Python/Flask для деплоя как managed-сервис в облаке.
Логика 1:1 — те же эндпоинты, та же S3-структура, тот же GPG-ключ.
Анализ Go-кода
ENV-переменные (те же в Flask):
| Переменная | По умолчанию |
|---|---|
REGISTRY_HOSTNAME |
localhost:8080 |
S3_ENDPOINT |
— |
S3_ACCESS_KEY |
— |
S3_SECRET_KEY |
— |
S3_BUCKET |
terraform-registry |
S3-структура путей (ключи):
Провайдер: {hostname}/{namespace}/{name}/{version}/terraform-provider-{name}_{version}_{os}_{arch}.zip
SHA256: {hostname}/{namespace}/{name}/{version}/terraform-provider-{name}_{version}_SHA256SUMS
Подпись: {hostname}/{namespace}/{name}/{version}/terraform-provider-{name}_{version}_SHA256SUMS.sig
Docs: docs/{namespace}/{name}/{version}/{path}
Эндпоинты:
| Метод | URL | Что делает |
|---|---|---|
| GET | /.well-known/terraform.json |
Discovery: {"providers.v1": "/v1/providers/"} |
| GET | /v1/providers/{ns}/{name}/versions |
Список версий + платформ из S3 |
| GET | /v1/providers/{ns}/{name}/{ver}/download/{os}/{arch} |
JSON с URL для скачивания |
| GET | /v1/proxy?bucket=...&key=... |
Стриминг файла из S3 |
| GET | /docs/{ns}/{name}/{ver}/... |
Статика документации из S3 |
| GET | /healthz, /readyz |
Отвечают "ok" 200 |
| GET | / |
HTML-страница "ONLINE" |
Платформы (listVersions):
Только два паттерна из имён файлов (в исходниках):
_linux_amd64.zip→{os: linux, arch: amd64}_windows_amd64.zip→{os: windows, arch: amd64}
⚠️ Живой Go-деплой также отдаёт
darwin_amd64— operator собрал более новую версию.
GPG-ключ:
Жёстко зашит в registrykeys/public_key.go:
KeyID = "CB3A0DF161ECC416"(legacy)ASCIIArmor = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n..."Flask просто возвращает его как строку в JSON — никакого python-gnupg не нужно.
⚠️ Живой Go-деплой отдаёт ДВА ключа: основной
3EC4673EB798238A+ legacyCB3A0DF161ECC416.
Прокси:
Параметры: ?bucket=...&key=... (НЕ ?url=... — в chat summary ошибка).
Стримит файл через Response(stream_with_context(...)).
Docs:
Кандидаты S3-ключей (в порядке попытки):
docs/{ns}/{name}/{ver}/{rest}(точный путь)docs/{ns}/{name}/{ver}/{rest}/index.html(если нет расширения)docs/{ns}/{name}/{ver}/index.html(fallback) MIME по расширению файла.
Файлы для создания:
tf_registry/
├── site/
│ └── app.py # ~300 строк, весь Flask
└── requirements.txt # flask, boto3
Шаги:
Фаза 1 — Git-реорганизация (опционально)
git checkout -b golang— сохранить Go-кодgit checkout master- Удалить:
server/,operator/,k8s/,charts/,scripts/,registrykeys/,REGISTRY_OVERVIEW.md - Оставить:
site/app.py,requirements.txt,README.md
Фаза 2 — Flask app.py
Структура app.py:
- Импорты:
flask,boto3,os,mimetypes,io - Конфиг из ENV (5 переменных выше)
- S3-клиент:
boto3.client('s3', endpoint_url=..., aws_access_key_id=..., aws_secret_access_key=...) - GPG_KEY_ID и GPG_ASCII_ARMOR — константы
- Роуты в точном соответствии с таблицей выше
Фаза 3 — Проверка
python -m py_compile site/app.py- Деплой в managed-сервис
registryчерез UI curl /.well-known/terraform.jsoncurl /v1/providers/nubes-test/nubes/versionsterraform initс новымsource
Решения:
- GPG: только публичный ключ в JSON, никакой криптографии в Flask
- Прокси:
?bucket=&key=(не?url=) - Платформы: linux_amd64 + windows_amd64 (как в исходниках Go) → + darwin (как в живом деплое)
- Домен:
registry.pythonk8s.dev.nubes.ru - S3_PREFIX:
registry.kube5s.ru(S3-ключи под старым хостнеймом)
Исключено из scope:
- Operator (остаётся в ветке golang)
- K8s-манифесты
- Docker-образы
- Docs-сервер как отдельный деплоймент
Расхождения исходники vs живой деплой (обнаружены при проверке):
| Что | Исходники | Живой Go |
|---|---|---|
| Платформы | linux, windows | linux, windows, darwin |
| GPG-ключи | 1 ключ (CB3A0D...) | 2 ключа (3EC467... + CB3A0D...) |
id в versions |
nubes-test/nubes |
registry.kube5s.ru/nubes-test/nubes |