# Артефактория 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//manifest.json` | подписанный манифест канала | | GET | `/v1//files/` | артефакт по имени | | 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.