doc: HISTORY/ARCHITECTURE.md — архитектура, S3, GPG, сборка провайдера
This commit is contained in:
@@ -0,0 +1,168 @@
|
|||||||
|
# tf_registry — Архитектура и рабочий процесс
|
||||||
|
|
||||||
|
## Что такое этот реестр
|
||||||
|
|
||||||
|
Собственный реестр Terraform-провайдеров по протоколу HashiCorp Provider Registry Protocol.
|
||||||
|
Позволяет публиковать и распространять кастомные Terraform-провайдеры без HashiCorp Registry.
|
||||||
|
|
||||||
|
**Текущий URL:** `https://go-registry.containerk8s.dev.nubes.ru`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Как это работает
|
||||||
|
|
||||||
|
### Загрузка провайдера (пользователь)
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
nubes = {
|
||||||
|
source = "go-registry.containerk8s.dev.nubes.ru/nubes-test/nubes"
|
||||||
|
version = "5.1.16"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Terraform сам делает:
|
||||||
|
1. `GET /.well-known/terraform.json` → узнаёт API-путь
|
||||||
|
2. `GET /v1/providers/nubes-test/nubes/versions` → список версий и платформ
|
||||||
|
3. `GET /v1/providers/.../download/linux/amd64` → JSON с URL для скачивания
|
||||||
|
4. Скачивает zip, проверяет SHA256, проверяет GPG-подпись
|
||||||
|
5. Всё — провайдер установлен
|
||||||
|
|
||||||
|
Никакой аутентификации не нужно.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## S3-структура
|
||||||
|
|
||||||
|
Все данные хранятся в S3 (`terraform-registry`). Никакой БД нет.
|
||||||
|
|
||||||
|
```
|
||||||
|
{префикс}/{namespace}/{name}/{version}/
|
||||||
|
├── terraform-provider-{name}_{ver}_{os}_{arch}.zip — бинарник провайдера
|
||||||
|
├── terraform-provider-{name}_{ver}_SHA256SUMS — контрольные суммы
|
||||||
|
└── terraform-provider-{name}_{ver}_SHA256SUMS.sig — GPG-подпись сумм
|
||||||
|
|
||||||
|
docs/{namespace}/{name}/{version}/
|
||||||
|
├── index.html — документация провайдера
|
||||||
|
└── ... — любые статические файлы
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:** префикс (первая часть пути в S3) сейчас — `registry.kube5s.ru` (временный хардкод).
|
||||||
|
Планируется либо сменить на свой домен, либо убрать префикс совсем.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## GPG-подпись
|
||||||
|
|
||||||
|
### Зачем
|
||||||
|
Terraform требует, чтобы SHA256SUMS были подписаны GPG. Это гарантирует, что провайдер не подменён.
|
||||||
|
|
||||||
|
### Как работает
|
||||||
|
1. **Приватный ключ** — хранится у того, кто заливает провайдер (`secrets/private_key.asc`)
|
||||||
|
2. **Публичный ключ** — вшит в код реестра (`gpg_key.go` → `/v1/providers/.../download` отдаёт его)
|
||||||
|
3. Terraform при `init` сверяет подпись SHA256SUMS с публичным ключом
|
||||||
|
|
||||||
|
### Текущие ключи
|
||||||
|
| Key ID | Роль |
|
||||||
|
|---|---|
|
||||||
|
| `3EC4673EB798238A` | Основной (текущий) |
|
||||||
|
| `CB3A0DF161ECC416` | Legacy (старый) |
|
||||||
|
|
||||||
|
Оба отдаются в `signing_keys.gpg_public_keys` — Terraform пробует каждый.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Как залить новый провайдер
|
||||||
|
|
||||||
|
### Скрипт `build-provider.sh`
|
||||||
|
|
||||||
|
Находится в `server/build-provider.sh`. Делает:
|
||||||
|
1. Компилирует Go-провайдер под linux/windows/darwin × amd64
|
||||||
|
2. Упаковывает в zip
|
||||||
|
3. Генерирует SHA256SUMS
|
||||||
|
4. Импортирует приватный GPG-ключ из `secrets/private_key.asc`
|
||||||
|
5. Подписывает SHA256SUMS
|
||||||
|
6. Заливает zip + SHA256SUMS + .sig в S3
|
||||||
|
|
||||||
|
### Требования
|
||||||
|
```bash
|
||||||
|
# Переменные окружения
|
||||||
|
S3_ENDPOINT=s3.msk-1.ngcloud.ru
|
||||||
|
S3_ACCESS_KEY=...
|
||||||
|
S3_SECRET_KEY=...
|
||||||
|
S3_BUCKET=terraform-registry
|
||||||
|
|
||||||
|
# GPG
|
||||||
|
secrets/private_key.asc # приватный ключ для подписи
|
||||||
|
|
||||||
|
# Исходники провайдера
|
||||||
|
universal_rebuild/ # директория с Go-кодом провайдера
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск
|
||||||
|
```bash
|
||||||
|
VERSION=5.1.17 ./server/build-provider.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Документация
|
||||||
|
|
||||||
|
Эндпоинт `/docs/{ns}/{name}/{ver}/...` отдаёт статику из S3:
|
||||||
|
```
|
||||||
|
docs/{ns}/{name}/{ver}/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
Работает как статический веб-сервер: HTML, CSS, JS, изображения — всё, что положишь в `docs/` в S3.
|
||||||
|
Логика поиска (1:1 с Go-кодом):
|
||||||
|
1. Точный путь (`docs/ns/name/ver/style.css`)
|
||||||
|
2. Если нет расширения — `{путь}/index.html`
|
||||||
|
3. Fallback — `docs/ns/name/ver/index.html`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Эндпоинты
|
||||||
|
|
||||||
|
| Метод | URL | Ответ |
|
||||||
|
|---|---|---|
|
||||||
|
| GET | `/` | HTML с версией |
|
||||||
|
| 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, shasum, GPG ключи |
|
||||||
|
| GET | `/v1/proxy?bucket=...&key=...` | Стриминг файла из S3 |
|
||||||
|
| GET | `/docs/{ns}/{name}/{ver}/...` | Статика из S3 |
|
||||||
|
| GET | `/healthz`, `/readyz` | `"ok"` 200 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CI/CD
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сборка образа
|
||||||
|
docker build -t gitea.services.ngcloud.ru/nail/tf_registry:latest .
|
||||||
|
|
||||||
|
# Пуш в Gitea Docker Registry
|
||||||
|
docker push gitea.services.ngcloud.ru/nail/tf_registry:latest
|
||||||
|
|
||||||
|
# Редеплой — через UI modify (меняет только CPU/memory/replicas, подхватывает :latest)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Платформы
|
||||||
|
|
||||||
|
Детектятся по имени zip-файла:
|
||||||
|
- `_darwin_amd64.zip` → macOS Intel
|
||||||
|
- `_linux_amd64.zip` → Linux
|
||||||
|
- `_windows_amd64.zip` → Windows
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Текущие проблемы
|
||||||
|
|
||||||
|
1. **S3_PREFIX** — хардкод `registry.kube5s.ru` (TODO в коде)
|
||||||
|
2. **modify** — нельзя менять `jsonEnv` в UI (надо просить devops)
|
||||||
|
3. **Домен** — `go-registry` вместо `registry` (можно пересоздать)
|
||||||
Reference in New Issue
Block a user