# Артефактория Bridge-and-Join-s

Сервис раздачи релизов и обновлений (#18). Клиенты (bj-server auto-update,
install.sh) скачивают **подписанный** манифест канала, проверяют подпись
зашитым публичным ключом и обновляют компоненты.

## Компоненты

- `internal/release` — формат манифеста + подпись Ed25519 (sign/verify, хеши).
- `cmd/bj-release` — инструмент издателя: генерация ключей, сборка и подпись манифеста.
- `cmd/bj-artifactory` — HTTP-сервер раздачи манифеста и артефактов.
- `deploy/artifactory/` — nginx (TLS) + systemd unit.

## Модель доверия

Один корневой Ed25519-ключ. Приватный (`signing.priv`) держит издатель в
секрете (НЕ в git). Публичный (`signing.pub`) зашивается в bj-server и в
install.sh. Манифест подписывается целиком — клиент проверяет подпись ДО
доверия версиям и хешам артефактов, затем сверяет sha256 каждого скачанного
файла с манифестом.

## Релизный цикл (издатель)

```bash
# 1. Однократно — сгенерировать ключи подписи (приватный хранить в секрете!)
bj-release keygen -out ./keys/signing
#   → keys/signing.priv (секрет), keys/signing.pub
#   Публичный base64 из вывода — зашить в bj-server (auto-update, #20)

# 2. Собрать артефакты релиза в каталог
mkdir -p dist/stable
cp bj-server crypto-service.jar dist/stable/
cp deploy/linux/install-validata.sh deploy/ish/configure-ish.sql dist/stable/

# 3. Собрать + подписать манифест
bj-release build -dir dist/stable -version 1.0.0 -channel stable \
    -key keys/signing.priv -keyid main -out dist/stable/manifest.json \
    -notes "Первый релиз"

# 4. Выложить каталог в хранилище артефактории
rsync -a dist/stable/ server:/var/lib/bj-artifactory/releases/stable/
```

## Сервер

```bash
bj-artifactory --addr 127.0.0.1:8090 --root /var/lib/bj-artifactory/releases
```

Раскладка хранилища:

```
releases/
  stable/
    manifest.json          ← подписанный SignedManifest
    bj-server
    crypto-service.jar
    install-validata.sh
    configure-ish.sql
  beta/
    manifest.json
    ...
```

## HTTP API

| Метод | Путь | Ответ |
|---|---|---|
| GET | `/v1/<channel>/manifest.json` | подписанный манифест канала |
| GET | `/v1/<channel>/files/<name>` | артефакт по имени |
| GET | `/healthz` | `ok` |

За TLS-reverse-proxy (`nginx.conf`). Прод: `updates.example.com` → 127.0.0.1:8090.

## Дальше

- **#19 License-сервер** — манифест/обновления гейтятся годовым ключом.
- **#20 Auto-update в bj-server** — горутина: качает манифест канала, проверяет
  подпись, сравнивает версии, atomic-replace бинарей, systemctl restart.
