feat: живой цикл M2M с НРД + мастер установки ключа на флешку
Инфраструктура M2M (живой обмен с НРД через ИШ): - обработка M2MTransferResponse: ERROR(M2Mxx) → заявка Отклонена, сохранение ответа; INFO → ждём Decision; идемпотентность поллера - fallback-корреляция ответов с нулевым GUID (M2M14/M2M17) по FIFO - сырой XML ответа НРД в карточке заявки (для пересылки в ТП) - тестовый пакет роботу приведён к эталону m2m_robot_samples (CostInfo=Yes, 4 бумаги, IsolationStatus, DocumentSeries=сценарий); override паспорта - редирект из теста сразу в карточку заявки Мастер установки ключа Валидаты на флешку (admin/setup/keywizard): - пошаговый: загрузка .7z+пароль → выбор флешки → запись → справочник сертификатов (CRL) → перезапуск+проверка ИШ → готово - привилегированный воркер (bj-keymedia) в host-namespace через файл-обмен, bj-server остаётся в песочнице - сохранение структуры профиля архива (spr<N>), перечисление съёмных USB Прочее: - пакет-доказательство для ТП НРД + форма регистрации участника M2M - эталонные образцы робота (DOC/m2m_robot_samples) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# Артефактория 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.
|
||||
@@ -0,0 +1,21 @@
|
||||
[Unit]
|
||||
Description=Bridge-and-Join-s — Artifactory (раздача релизов и обновлений)
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=bj-updates
|
||||
Group=bj-updates
|
||||
ExecStart=/opt/bj-artifactory/bj-artifactory --addr 127.0.0.1:8090 --root /var/lib/bj-artifactory/releases
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
NoNewPrivileges=true
|
||||
ProtectSystem=strict
|
||||
ProtectHome=true
|
||||
ReadOnlyPaths=/var/lib/bj-artifactory
|
||||
PrivateTmp=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,44 @@
|
||||
# nginx.conf — reverse-proxy для bj-artifactory с TLS.
|
||||
# Раздаёт релизы и обновления bj-server по HTTPS.
|
||||
#
|
||||
# Установка: положить в /etc/nginx/sites-available/, заменить server_name
|
||||
# и пути сертификатов, выпустить TLS через certbot, symlink в sites-enabled.
|
||||
#
|
||||
# updates.example.com → bj-artifactory на 127.0.0.1:8090
|
||||
#
|
||||
# bj-artifactory запускается как systemd-сервис (см. artifactory.service).
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name updates.example.com;
|
||||
# Редирект на HTTPS (кроме ACME-челленджа certbot).
|
||||
location /.well-known/acme-challenge/ { root /var/www/certbot; }
|
||||
location / { return 301 https://$host$request_uri; }
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name updates.example.com;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/updates.example.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/updates.example.com/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
# Манифесты маленькие — не кэшируем агрессивно (быстрое распространение релизов).
|
||||
location /v1/ {
|
||||
proxy_pass http://127.0.0.1:8090;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
# Артефакты могут быть крупными (jar ~20МБ) — без буферизации тела.
|
||||
proxy_buffering off;
|
||||
client_max_body_size 0;
|
||||
}
|
||||
|
||||
location /healthz {
|
||||
proxy_pass http://127.0.0.1:8090;
|
||||
}
|
||||
|
||||
# Всё остальное — 404.
|
||||
location / { return 404; }
|
||||
}
|
||||
Reference in New Issue
Block a user