# tf_registry — ПОЛНАЯ история (2026-08-06) ## Итог: что работает сейчас | Сервис | Тип | Домен | Статус | |---|---|---|---| | `registry` | pythonk8s | `registry.pythonk8s.dev.nubes.ru` | Flask (не обновлён, висит старая версия) | | `go-registry` | containerk8s | `go-registry.containerk8s.dev.nubes.ru` | Go ✅ (полностью работает) | ### Что проверено на Go: - `GET /` — HTML с версией v1.0.0 ✅ - `GET /.well-known/terraform.json` ✅ - `GET /v1/providers/nubes-test/nubes/versions` — 17 версий ✅ - `GET /v1/providers/.../download/linux/amd64` — shasum + 2 GPG ключа ✅ - Платформы: darwin, linux, windows ✅ - GPG: `3EC4673EB798238A` (основной) + `CB3A0DF161ECC416` (legacy) ✅ --- ## Хронология ### Этап 1: Flask (pythonk8s) 1. Создан `site/app.py` — 7 роутов, структура `site/` (требование Nubes) 2. `requirements.txt`: flask, boto3 3. Первый деплой — ошибка `Init:Error` (gitea приватный) 4. Репо сделан публичным → деплой успешен 5. API не работал: `versions: []`, `shasum: ""` 6. **Причина:** S3-ключи под `registry.kube5s.ru`, а Flask ищет под `registry.pythonk8s.dev.nubes.ru` 7. Добавлен `S3_PREFIX` в код Flask 8. GPG — в исходниках 1 ключ, живой деплой отдаёт 2 → заменён на 2 ключа 9. Добавлен darwin в платформы ### Этап 2: Go-контейнер (containerk8s) 1. Обнаружен тип сервиса `containerk8s` — generic HTTP контейнер 2. Создана ветка `go-container` 3. Правки Go: порт `:5000` (вместо `:8080`), `PORT` из ENV 4. GPG: 2 ключа в `gpg_key.go` (без импорта registrykeys) 5. Платформы: добавлен darwin 6. Dockerfile: multi-stage (golang:1.24-alpine → alpine:3.21) 7. Gitea Docker registry: `docker login gitea.services.ngcloud.ru -u Nail` ✅ 8. Образ: `gitea.services.ngcloud.ru/nail/tf_registry:latest` 9. S3_PREFIX: хардкод `registry.kube5s.ru` (с TODO-комментарием) 10. VERSION: `const VERSION = "1.0.0"`, на главной странице ### Ошибки при деплое containerk8s 1. `docker build` — `repository name must be lowercase` → `nail/tf_registry` 2. `minio-go/v7` требует Go >= 1.25 → `GOTOOLCHAIN=auto` 3. modify не даёт менять `jsonEnv` → пришлось хардкодить `S3_PREFIX` --- ## Проблема S3_PREFIX **Суть:** S3-объекты хранятся с префиксом `registry.kube5s.ru/...` (старый Go-реестр). Новый реестр имеет домен `go-registry.containerk8s.dev.nubes.ru` — не совпадает. **Текущее решение (временное):** хардкод `s3Prefix = "registry.kube5s.ru"` в `main.go`. ```go // ── TEMPORARY HARDCODE ────────────────────────────────────────────────── // TODO: REMOVE after devops adds jsonEnv editing to containerk8s "modify". // Then read from ENV: s3Prefix = os.Getenv("S3_PREFIX") // And set in UI jsonEnv: "S3_PREFIX": "registry.kube5s.ru" // ───────────────────────────────────────────────────────────────────────── ``` **Правильные решения (на будущее):** Путь 1 — скопировать S3-объекты под новый домен: ``` mc cp s3/.../registry.kube5s.ru/ s3/.../go-registry.containerk8s.dev.nubes.ru/ --recursive ``` Путь 2 — убрать домен из S3-путей вообще: ``` Вместо: {hostname}/{ns}/{name}/{ver}/... Сделать: {ns}/{name}/{ver}/... ``` После любого из путей — `s3Prefix = hostname`, хардкод не нужен. --- ## Структура репозитория ### Ветка `master` ``` tf_registry/ ├── site/ # Flask (НЕ ИСПОЛЬЗУЕТСЯ, мёртвый код) │ └── app.py ├── requirements.txt # Для Flask (НЕ ИСПОЛЬЗУЕТСЯ) ├── server/ # Go-код (LEGACY, без правок) ├── operator/ # Go operator (LEGACY) ├── k8s/ # Манифесты (LEGACY) ├── charts/ # Helm (LEGACY) ├── registrykeys/ # Старый GPG (LEGACY) ├── secrets/ │ ├── env.txt # S3-креды + jsonEnv (в .gitignore) │ └── llm.key # Токены (Gitea, LLM) ├── HISTORY/ # Документация │ ├── README-NEW-CHAT.md │ ├── plan-sonnet-full.md │ ├── 2026-08-06-plan-review.md │ └── 2026-08-06-first-deploy.md ├── Dockerfile # Для Go-контейнера └── .gitignore # secrets/, __pycache__/ ``` ### Ветка `go-container` (АКТУАЛЬНАЯ) ``` server/ ├── main.go # Порт 5000, S3_PREFIX hardcode, VERSION, darwin ├── gpg_key.go # 2 GPG ключа (primary + legacy) ├── docs.go # Без изменений └── gpg/ # Без изменений Dockerfile # golang:1.24-alpine → alpine:3.21 ``` --- ## CI/CD ### Сборка и пуш образа ```bash docker build -t gitea.services.ngcloud.ru/nail/tf_registry:latest . docker push gitea.services.ngcloud.ru/nail/tf_registry:latest ``` ### Деплой - Тип: `containerk8s` (Простой HTTP контейнер) - `registryPath`: `gitea.services.ngcloud.ru/nail/tf_registry:latest` - `resourceRealm`: `iot-naeel` - `jsonEnv`: в UI, креды в `secrets/env.txt` ### Что можно менять в modify - ТОЛЬКО: CPU, Memory, количество узлов - jsonEnv и registryPath — НЕЛЬЗЯ (надо просить devops добавить) --- ## Что дальше 1. **Devops** — добавить редактирование `jsonEnv` в modify для containerk8s 2. **S3** — решить что делать с префиксом (копировать или убрать домен) 3. **Убрать хардкод** — `s3Prefix` из ENV `S3_PREFIX` 4. **Домен** — пересоздать с именем `registry` (вместо `go-registry`) 5. **Удалить Flask** — `site/app.py`, `requirements.txt` из master (мёртвый код) 6. **Удалить старые Go-файлы** — `operator/`, `k8s/`, `charts/`, `registrykeys/` --- ## Креды и доступы | Что | Где | |---|---| | S3 креды | `secrets/env.txt`, K8s Secret `s3-credentials` | | Gitea токен | `secrets/llm.key` (строка `gitea`) | | Docker login | `gitea.services.ngcloud.ru`, user `Nail`, токен `1999993c...` | | ВМ | `ssh naeel@5.172.178.213` | | Кубер | только через ВМ | | Go-реестр (старый) | `https://registry.kube5s.ru` | | Flask-реестр | `https://registry.pythonk8s.dev.nubes.ru` | | Go-реестр (новый) | `https://go-registry.containerk8s.dev.nubes.ru` | | Gitea репо | `https://gitea.services.ngcloud.ru/Nail/tf_registry.git` | --- ## Правила - После каждого коммита → сразу push - Перед деплоем → `docker build && docker push` - `containerk8s` берёт образ из `registryPath`, НЕ клонирует git - Gitea Docker registry требует lowercase-имён: `nail/tf_registry`, не `Nail/...`