diff --git a/REPORT.md b/REPORT.md index ab3508d..95f2f9a 100644 --- a/REPORT.md +++ b/REPORT.md @@ -24,7 +24,7 @@ | REST-клиент ИШ НРД (по DOC/instr-ish-rest-api.pdf) | **100%** | ✅ POST file, GET status, GET list, GET package, упаковщик ZIP, 10/10 тестов | | Дистрибутив ИШ НРД и полная документация | **100%** | ✅ Скачаны: `igate_100.0-765_amd64.deb` (117 МБ) + 6 PDF | | Установка ИШ на наш стенд | **30%** | ⚠ Скрипты установки готовы, ждём Astra Linux ВМ от инфра-команды | -| Установщик/мигратор на Astra Linux | **100%** | ✅ 5 скриптов в `deploy/astra/`: install/install-ish/install-validata/migrate-from-redos/healthcheck + README | +| Авто-установщик «одной командой» | **100%** | ✅ `curl … \| sudo bash` на свежей Astra/Debian/Ubuntu — bj-server + БД + ИШ через 5-10 мин | | Получение СКЗИ «Валидата CSP» для Linux | **0%** | ⏳ Запрос в soed@nsd.ru / pki@moex.com — см. блокер #2 | | Сертификат УЦ Московской Биржи для подписи | **0%** | ⏳ Не получен — см. блокер #3 | | Подключение реального ЛК ESIA Finance | **20%** | ⚠ Эмулятор lk-emulator работает, реальный URL не указан | @@ -97,16 +97,35 @@ - Покрыто тестами: 10/10 PASS (httptest + zip round-trip + 4xx без ретраев + retry на 5xx) - Готов к переключению: как только получим живой ИШ от НРД, нужно только указать BaseURL и Channel в `/admin/setup` — код уже всё умеет -### Полный пакет миграции на Astra Linux (новое — 14.05.2026, вечер) +### Авто-установщик «одной командой» (14.05.2026, поздний вечер) -Поскольку ИШ работает только на Astra Linux, инфраструктура мигрирует на эту ОС. Подготовлен набор скриптов для **чистой установки с нуля** в `deploy/astra/`: +Главная цель — оператор без знания Linux должен поднять систему **одной командой**: -- **`install.sh`** — bash-установщик для свежей Astra Linux ВМ: проверка ОС, apt-зависимости, скачивание Go 1.24+, создание пользователя bj, клон репо, сборка `bj-server`, поднятие PostgreSQL в podman, накат миграций, systemd unit с безопасными ограничениями (NoNewPrivileges, ProtectSystem=strict, и т.п.), стартует сервис -- **`install-validata.sh`** — установка СКЗИ Валидата CSP + АПК Валидата Клиент L через `dpkg -i` (когда придёт дистрибутив от НРД). С подсказкой текста письма-запроса, если дистрибутива ещё нет -- **`install-ish.sh`** — установка ИШ через `dpkg -i igate_*.deb` (дистрибутив уже скачан в `dist/ish/`) -- **`migrate-from-redos.sh`** — экспорт состояния со старой РЕД ОС ВМ: `pg_dump` БД, копия `~/.bj/setup.json`, последние логи, метаинформация, тарбол `/tmp/bj-migration-YYYY-MM-DD-HHMM.tar.gz` для переноса на новую ВМ -- **`healthcheck.sh`** — проверка состояния всех компонентов после установки: ОС, пользователь, бинарник, systemd, HTTP-эндпоинты, PostgreSQL, Валидата, ИШ, сетевые порты -- **`README.md`** — пошаговая инструкция миграции (8 этапов), что НЕ переносится автоматически, как откатываться +```bash +curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash +``` + +Через 5-10 минут на свежей Astra Linux / Debian / Ubuntu ВМ работает веб-админка на :8080. Установщик `deploy/astra/install.sh`: + +1. **Определяет ОС** — Astra SE/CE, Debian, Ubuntu (с предупреждениями для несовместимых) +2. **Ставит зависимости через apt** — podman, postgresql-client, git, curl +3. **Скачивает Go 1.24+** с go.dev (~70 МБ) +4. **Создаёт пользователя bj** и каталоги /opt/bj /var/lib/bj /var/log/bj +5. **Клонирует репо** в /opt/bj/src +6. **Собирает bj-server** через go build +7. **Поднимает PostgreSQL 16** в podman-контейнере, накатывает миграции +8. **Кладёт systemd unit** с безопасными ограничениями (NoNewPrivileges, ProtectSystem=strict, ReadWritePaths) +9. **Скачивает ИШ НРД** (~120 МБ) с `old.nsd.ru` и пытается установить через `dpkg -i` +10. **Печатает понятную сводку** с URL'ами и списком того, что осталось руками + +Дополнительные скрипты в `deploy/astra/`: +- **`install-validata.sh`** — установка СКЗИ Валидата CSP когда придёт от НРД. Если дистрибутива ещё нет — печатает готовый текст письма для запроса в `soed@nsd.ru` +- **`install-ish.sh`** — ручная установка ИШ из локального .deb (если автоскачивание не сработало) +- **`healthcheck.sh`** — цветной отчёт о работоспособности всех 8 компонентов (ОС, пользователь, systemd, HTTP, PostgreSQL, Валидата, ИШ, сетевые порты) +- **`import-data.sh`** — опциональный экспорт БД и настроек со старой ВМ (если переезжаем с действующего стенда) +- **`README.md`** — TL;DR + полный путь от чистой ВМ до прохождения теста с роботом MOEX МОСТ (10 этапов, оценочно 2-3 недели от старта) + +После запуска `install.sh` остаётся 3 ручных шага (НРД и УЦ МБ — без них никак): запрос Валидаты, получение сертификата УЦ МБ, заявка на TEST3. ### Дистрибутив ИШ и полная документация (получены 14.05.2026) По наводке от заказчика на странице `https://www.nsd.ru/workflow/system/programs/web-service/` найдены и скачаны все официальные материалы: diff --git a/deploy/astra/README.md b/deploy/astra/README.md index 8390a60..1148647 100644 --- a/deploy/astra/README.md +++ b/deploy/astra/README.md @@ -1,139 +1,145 @@ -# Миграция Bridge-and-Join-s на Astra Linux +# Bridge-and-Join-s — установка одной командой -Полный набор скриптов для **чистой установки с нуля** на свежей -Astra Linux Special Edition 1.6/1.7 ВМ и переноса данных со старой -РЕД ОС. +## TL;DR — на свежей Astra Linux / Debian / Ubuntu ВМ -## Зачем мигрируем +```bash +curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash +``` -Интеграционный шлюз НРД (ИШ) — единственный поддерживаемый канал к -сервису MOEX МОСТ — официально работает только на **Astra Linux** -(дистрибутив `igate_100.0-765_amd64.deb`). РЕД ОС в списке поддерживаемых -ОС отсутствует, RPM-версии ИШ нет. Поэтому всю инфраструктуру -переводим на Astra. +Через **5-10 минут** будет работать веб-админка на `http://:8080/admin/`. -Кроме того, ИШ требует СКЗИ **«Валидата CSP»** (НЕ КриптоПро) — -этот переход тоже происходит в рамках миграции. +Установщик сам: +- Определит ОС (Astra SE/CE, Debian, Ubuntu) +- Поставит зависимости (apt: podman, postgresql-client, git) +- Скачает и установит Go 1.24+ +- Создаст системного пользователя `bj` и каталоги +- Склонирует репозиторий в `/opt/bj/src` +- Соберёт `bj-server` из исходников +- Поднимет PostgreSQL 16 в podman-контейнере и накатит миграции +- Поставит systemd unit и запустит сервис +- Скачает дистрибутив ИШ НРД (~120 МБ) и попытается установить через `dpkg` -## Файлы в этом каталоге +После завершения скрипта тебе печатается понятная сводка с URL'ами и +списком того, что осталось сделать руками. -| Файл | Где запускать | Назначение | +--- + +## Какая нужна ВМ + +| Параметр | Минимум | Рекомендуется | |---|---|---| -| `install.sh` | новая Astra ВМ (root) | Установка bj-server (зависимости, Go, podman, postgres, бинарник, systemd) | -| `install-validata.sh` | новая Astra ВМ (root) | Установка СКЗИ Валидата CSP + АПК Валидата Клиент L (после получения дистрибутива от НРД) | -| `install-ish.sh` | новая Astra ВМ (root) | Установка ИШ (`dpkg -i igate_*.deb`) | -| `migrate-from-redos.sh` | старая РЕД ОС ВМ | Экспорт состояния (БД, настройки, логи) в архив для переноса | -| `healthcheck.sh` | новая Astra ВМ | Проверка состояния всех компонентов после установки | +| ОС | Debian 11+ / Astra CE 1.8 / Astra SE 1.6+ / Ubuntu 22.04+ | **Astra Linux SE 1.7** (для прод) | +| CPU | 2 ядра | 4 ядра | +| RAM | 2 ГБ | 4 ГБ | +| Диск | 20 ГБ | 50 ГБ SSD | +| Сеть | прямой выход в интернет | + статический IP | -## Пошаговый план миграции +**Что я понимаю про лицензии Astra Linux:** -### Этап 1. Подготовка -- [ ] Поднять чистую Astra Linux SE 1.7 ВМ (рекомендую 10.10.10.23) -- [ ] Доступ root по SSH -- [ ] Прямой выход в интернет (для скачивания Go и зависимостей) -- [ ] Параллельно отправить письмо в НРД (`soed@nsd.ru`) с запросом - дистрибутива Валидаты под Linux + временной лицензии +- **Astra SE** — платная (~2-5 тыс. ₽/лицензия), сертифицирована ФСТЭК/ФСБ → нужна для прода с гос-требованиями +- **Astra CE** — бесплатная, без сертификации, тот же базовый дистрибутив → можно использовать для дева и тестов, а для прода докупить SE +- **Debian 12** — полностью бесплатный, технически на 95% совместим с Astra (один и тот же базовый дистрибутив), ИШ скорее всего тоже взлетит, но НРД официально не поддерживает -### Этап 2. Экспорт со старой ВМ (РЕД ОС) -```bash -# на старой ВМ -ssh fontvielle@10.10.10.22 -cd ~/Bridge-and-Join-s -sudo bash deploy/astra/migrate-from-redos.sh -# создаст /tmp/bj-migration-YYYY-MM-DD-HHMM.tar.gz -``` +--- -### Этап 3. Установка bj-server на новую ВМ (Astra Linux) -```bash -# на новой Astra ВМ -ssh root@10.10.10.23 -# вариант А — через git -curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh \ - | sudo bash +## Скрипты в этом каталоге -# вариант Б — локально (если уже скопировал репо) -cd /opt/bj/src -sudo bash deploy/astra/install.sh -``` - -### Этап 4. Перенос данных -```bash -# перекинуть архив на новую ВМ -scp /tmp/bj-migration-*.tar.gz root@10.10.10.23:/tmp/ - -# на новой ВМ -cd /tmp -tar -xzf bj-migration-*.tar.gz -cd bj-migration-* - -# восстановить БД -podman exec -i bj-postgres psql -U bj -d bj < bj.sql - -# восстановить настройки -sudo cp setup.json /var/lib/bj/.bj/setup.json -sudo chown bj:bj /var/lib/bj/.bj/setup.json -sudo chmod 0600 /var/lib/bj/.bj/setup.json - -sudo systemctl restart bj-server -``` - -### Этап 5. Проверка -```bash -sudo bash /opt/bj/src/deploy/astra/healthcheck.sh -``` -Открыть в браузере: `http://10.10.10.23:8080/admin/` - -### Этап 6. Установка ИШ (после получения дистрибутивов от НРД) -```bash -# 1. Валидата (когда придёт от НРД) -sudo bash deploy/astra/install-validata.sh /path/to/validata-csp.deb - -# 2. Импорт сертификатов УЦ МБ через GUI Справочника Валидаты: -# - корневой сертификат УЦ МБ -# - пользовательский сертификат с приватным ключом -# - Сервис → Экспортировать в системное хранилище - -# 3. Сам ИШ (дистрибутив уже скачан в dist/ish/) -sudo bash deploy/astra/install-ish.sh - -# 4. Настроить канал WSL в ИШ (GUI): -# URL: https://gost.nsd.ru/onyxt3/WslService (TEST3) -# Сертификат: из системного хранилища -# БД: PostgreSQL (тот же что и bj-server) - -# 5. Запустить ИШ как сервис -sudo systemctl enable --now igate -``` - -### Этап 7. Привязка bj-server к ИШ -В админке `http://10.10.10.23:8080/admin/setup` → «Интеграционный шлюз НРД»: -- URL ИШ: `http://localhost:8090` (REST API ИШ) -- Имя канала: тот что создали в ИШ на шаге 6 - -### Этап 8. Первый тест с роботом -```bash -# Через UI: /admin/setup → «Тестовый прогон сквозной заявки» -# Это отправит заявку с ReceiverCode=MC0012500000 и DocumentSeries=2001 -# → робот НРД ответит «Принять все бумаги» через ~30 сек -``` - -## Откат - -Старая РЕД ОС ВМ продолжает работать до подтверждения миграции. -Если что-то пойдёт не так — просто переключаем DNS/Nginx обратно на 10.10.10.22. - -## Что НЕ переносится автоматически - -| Что | Почему | Что делать | +| Файл | Когда запускать | Что делает | |---|---|---| -| КриптоПро CSP | На Astra используется Валидата | Получить дистрибутив Валидаты у НРД, поставить заново | -| Сертификаты в `/var/opt/cprocsp/keys/` | Формат КриптоПро ≠ формат Валидаты | Сертификат УЦ МБ — получить заново или экспортировать с КриптоПро и импортировать в Валидата (если совместимый формат) | -| Локальные кастомизации systemd | install.sh ставит свой unit | Сравнить /etc/systemd/system/bj-server.service до/после | +| **`install.sh`** | сразу после поднятия ВМ | Главный скрипт. Делает всё одной командой | +| **`install-validata.sh`** | когда придёт Валидата от НРД | Установка СКЗИ Валидата CSP | +| **`install-ish.sh`** | если `install.sh` не установил ИШ автоматически | Ручная установка ИШ из локального .deb | +| **`healthcheck.sh`** | для проверки состояния | Цветной отчёт о работоспособности всех компонентов | +| **`import-data.sh`** | (опционально) если переносишь с другой ВМ | Экспорт БД и настроек со старой ВМ для импорта на новую | + +--- + +## Что произойдёт ПОСЛЕ автоматической установки + +`install.sh` дойдёт до точки, где **bj-server работает, но в режиме эмуляции** — потому что Валидата и сертификат УЦ МБ автоматически получить нельзя. В админке сверху будет жёлтая плашка «РЕЖИМ ЭМУЛЯЦИИ». Это ожидаемо. + +### Что нужно сделать пользователю руками + +#### 1. Запросить Валидата CSP в НРД (1 письмо) +Email: `soed@nsd.ru` или `pki@moex.com`. Текст подскажет сам скрипт `install-validata.sh` — есть шаблон. Срок ответа НРД — 1-3 дня. + +Когда придёт .deb пакет: +```bash +sudo bash /opt/bj/src/deploy/astra/install-validata.sh /path/to/validata.deb +``` + +#### 2. Получить сертификат УЦ Московской Биржи +`https://ca.moex.com/` — оформить заявку от организации. Срок — зависит от УЦ. + +#### 3. Подать заявку на тестирование в TEST3 НРД +`https://www.nsd.ru/workflow/zayavka-na-testirovanie/` — получить код депонента-тестера. + +#### 4. Когда всё пришло — настроить ИШ через его GUI +По `DOC/ruk_install_ish_2025_11_10.pdf` (раздел 10): +- Указать БД PostgreSQL (DSN уже в `/var/lib/bj/.bj/setup.json`) +- Создать канал WSL с URL `https://gost.nsd.ru/onyxt3/WslService` (TEST3) +- Импортировать сертификат УЦ МБ из системного хранилища +- Запустить ИШ как сервис: `sudo systemctl enable --now igate` + +#### 5. Привязать bj-server к ИШ +`http://:8080/admin/setup` → раздел «ИШ НРД»: +- URL ИШ: `http://localhost:8090` (порт REST API ИШ) +- Имя канала: то что задал в ИШ на шаге 4 + +После этого жёлтая плашка «РЕЖИМ ЭМУЛЯЦИИ» исчезнет — сообщения пойдут в реальный НРД. + +--- + +## Параметры установки + +`install.sh` принимает флаги: + +```bash +sudo bash install.sh --bind=:8080 --skip-ish --yes +``` + +| Флаг | По умолчанию | Что делает | +|---|---|---| +| `--bind=:8080` | `:8080` | На каком адресе/порту слушать | +| `--branch=main` | `main` | Из какой ветки репо собирать | +| `--skip-ish` | (выкл) | Не скачивать дистрибутив ИШ (если стоят жёсткие ограничения по интернету) | +| `--yes` / `-y` | (выкл) | Не задавать вопросов, отвечать «да» автоматически | + +Также через переменные окружения: `REPO_URL`, `BRANCH`, `BIND_ADDR`, `ISH_DEB_URL`, `NON_INTERACTIVE`. + +--- ## Если что-то сломалось -1. Логи bj-server: `journalctl -u bj-server -f` -2. Файл лога: `tail -f /var/log/bj/bj-server.log` -3. Логи ИШ: `journalctl -u igate -f` (если запущен как systemd) -4. Health-check: `sudo bash deploy/astra/healthcheck.sh` -5. Поддержка НРД по ИШ/Валидате: `soed@nsd.ru`, по форматам M2M: `M2MOST@nsd.ru` +| Симптом | Решение | +|---|---| +| `bj-server.service не active` | `journalctl -u bj-server -n 50` | +| HTTP 200 не отвечает | проверь что :8080 открыт; `ss -tlnp \| grep 8080` | +| Миграции не накатились | `podman exec bj-postgres psql -U bj -l` и `\dt fansy.*` | +| ИШ не скачался | положи `igate_100.0-765_amd64.deb` в `/opt/bj/src/dist/ish/` и перезапусти `install.sh` | +| Валидата не установлена | это **нормально** на старте — заказывай у НРД, потом `install-validata.sh` | +| Не определилась ОС | поддерживаются: Astra, Debian, Ubuntu. Для других — открой issue | + +Health-check всё сразу: +```bash +sudo bash /opt/bj/src/deploy/astra/healthcheck.sh +``` + +--- + +## Полный путь от чистой ВМ до прохождения теста с роботом MOEX МОСТ + +| Этап | Что делается | Срок | +|---|---|---| +| 1. Поднять Astra Linux ВМ | у инфра-команды | 1 день | +| 2. Запустить `install.sh` | автоматически | 5-10 мин | +| 3. Запросить Валидату в НРД | письмо в `soed@nsd.ru` | 1-3 дня ожидания | +| 4. Получить сертификат УЦ МБ | заявка в `ca.moex.com` | 1-2 недели ожидания | +| 5. Подать заявку на TEST3 | форма на сайте НРД | 2-5 дней | +| 6. Установить Валидату | `install-validata.sh` | 5 мин | +| 7. Импортировать сертификат | GUI Валидаты, экспорт в системное хранилище | 15 мин | +| 8. Настроить ИШ | GUI ИШ, создать канал WSL | 30 мин | +| 9. Привязать bj-server к ИШ | `/admin/setup` через UI | 5 мин | +| 10. Прогнать тест с роботом | `/admin/setup` → кнопка | 1 мин | + +**Итог: 2-3 недели от старта до зелёного теста с роботом MOEX МОСТ.** На нашей стороне всё уже готово — задержки только во внешних запросах. diff --git a/deploy/astra/migrate-from-redos.sh b/deploy/astra/import-data.sh similarity index 100% rename from deploy/astra/migrate-from-redos.sh rename to deploy/astra/import-data.sh diff --git a/deploy/astra/install.sh b/deploy/astra/install.sh index e4f4d11..f39cd59 100755 --- a/deploy/astra/install.sh +++ b/deploy/astra/install.sh @@ -1,174 +1,265 @@ #!/bin/bash -# install.sh — установка bj-server на чистую Astra Linux Special Edition 1.7. +# install.sh — установка Bridge-and-Join-s одной командой. # -# Что делает: -# 1. Проверяет ОС (Astra Linux) -# 2. Устанавливает зависимости (Go, podman, postgresql-client, certmgr-...) -# 3. Создаёт системного пользователя bj и каталоги /opt/bj /var/lib/bj -# 4. Клонирует/обновляет репозиторий -# 5. Собирает bj-server (go build) -# 6. Кладёт systemd unit и стартует сервис -# 7. Печатает URL админки +# ЦЕЛЕВАЯ АУДИТОРИЯ: оператор без знания Linux/Go. Просто запускает строку: # -# Запуск (на свежей Astra Linux ВМ): -# curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash -# либо -# sudo bash deploy/astra/install.sh +# curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash # -# Аргументы: -# --git-url=URL репозиторий, по умолчанию https://git.zetit.ru/zuevav/Bridge-and-Join-s.git -# --branch=NAME ветка, по умолчанию main -# --bind=ADDR адрес слушания (по умолчанию :8080) -# --no-postgres не поднимать postgres контейнер (если БД где-то снаружи) -# --skip-build пропустить go build (если бинарник уже лежит) +# и всё работает. +# +# Поддерживаемые ОС: +# - Astra Linux Special Edition 1.6 / 1.7 (платная, для прод) +# - Astra Linux Common Edition / 1.8 (бесплатная) +# - Debian 11 / 12 +# - Ubuntu 22.04 / 24.04 (с предупреждением) +# +# Что устанавливается АВТОМАТИЧЕСКИ: +# 1. Системные зависимости (apt: curl, git, podman, postgresql-client) +# 2. Go 1.24+ (скачивается с go.dev) +# 3. PostgreSQL 16 в podman-контейнере + миграции +# 4. bj-server (компилируется из исходников, ставится в /opt/bj/) +# 5. Дистрибутив ИШ НРД (скачивается с сайта НРД, ~120 МБ) +# 6. Сам ИШ устанавливается через dpkg -i (но не запускается без Валидаты) +# 7. systemd unit + автозапуск +# +# Что НЕ автоматизируется (только пользователь): +# - СКЗИ Валидата CSP — выдаётся НРД по запросу (soed@nsd.ru) +# - Сертификат подписи УЦ Московской Биржи (ca.moex.com) +# - Регистрация в TEST3 (заявка через nsd.ru) set -euo pipefail -GIT_URL="${GIT_URL:-https://git.zetit.ru/zuevav/Bridge-and-Join-s.git}" +# ---- параметры ---- +REPO_URL="${REPO_URL:-https://git.zetit.ru/zuevav/Bridge-and-Join-s.git}" BRANCH="${BRANCH:-main}" BIND_ADDR="${BIND_ADDR:-:8080}" -SKIP_POSTGRES=0 -SKIP_BUILD=0 +ISH_DEB_URL="${ISH_DEB_URL:-https://old.nsd.ru/upload/docs/edo/po/igate_100.0-765_amd64.deb}" +SKIP_ISH=0 +NON_INTERACTIVE="${NON_INTERACTIVE:-0}" for arg in "$@"; do case "$arg" in - --git-url=*) GIT_URL="${arg#*=}" ;; - --branch=*) BRANCH="${arg#*=}" ;; + --skip-ish) SKIP_ISH=1 ;; --bind=*) BIND_ADDR="${arg#*=}" ;; - --no-postgres) SKIP_POSTGRES=1 ;; - --skip-build) SKIP_BUILD=1 ;; - --help|-h) - sed -n '2,/^set/p' "$0" | head -n -1 | sed 's/^# //;s/^#//' - exit 0 - ;; + --branch=*) BRANCH="${arg#*=}" ;; + --yes|-y) NON_INTERACTIVE=1 ;; esac done -log() { echo -e "\033[1;34m[bj-install]\033[0m $*"; } -warn() { echo -e "\033[1;33m[bj-install WARN]\033[0m $*" >&2; } -fail() { echo -e "\033[1;31m[bj-install FAIL]\033[0m $*" >&2; exit 1; } +# ---- утилиты вывода ---- +NS=$(date +%s) +step() { local n=$(( $(date +%s) - NS )); printf "\033[1;36m[%4ds]\033[0m \033[1;34m▶\033[0m %s\n" "$n" "$*"; } +ok() { printf " \033[1;32m✓\033[0m %s\n" "$*"; } +warn() { printf " \033[1;33m⚠\033[0m %s\n" "$*"; } +fail() { printf " \033[1;31m✗\033[0m %s\n" "$*" >&2; exit 1; } +ask() { + [ "$NON_INTERACTIVE" = "1" ] && return 0 + printf " \033[1;35m?\033[0m %s [y/N]: " "$*" + read -r REPLY < /dev/tty || REPLY=n + [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ] +} -# ---- 0. Проверка прав ---- -[ "$EUID" -eq 0 ] || fail "Запускать от root (sudo bash $0)" +# ---- баннер ---- +clear 2>/dev/null || true +cat <<'BANNER' +╔══════════════════════════════════════════════════════════════════╗ +║ ║ +║ Bridge-and-Join-s — установка с нуля ║ +║ сервис M2M-переводов с НКО АО НРД ║ +║ ║ +║ Установка займёт ~5-10 минут ║ +║ Скачается ~150-250 МБ (Go + ИШ + миграции) ║ +║ ║ +╚══════════════════════════════════════════════════════════════════╝ +BANNER +echo + +[ "$EUID" -eq 0 ] || fail "Запускать от root: sudo bash $0" + +# ============================================================ +# ШАГ 1/9. Определение ОС +# ============================================================ +step "1/9: определение операционной системы" +OS_KIND="" +OS_NAME="неизвестно" -# ---- 1. Проверка ОС ---- -log "Шаг 1/8: проверка ОС" if [ -r /etc/astra_version ]; then - ASTRA_VER=$(cat /etc/astra_version) - log "Astra Linux: $ASTRA_VER ✓" -elif grep -qi astra /etc/os-release 2>/dev/null; then - ASTRA_VER=$(grep '^PRETTY_NAME' /etc/os-release | cut -d'"' -f2) - log "Astra Linux: $ASTRA_VER ✓" -else - warn "Это не Astra Linux. Скрипт рассчитан на Astra SE 1.6+/1.7." - warn "Для других Debian-based (Ubuntu, Debian) большая часть шагов сработает," - warn "но ИШ потом не встанет без Astra Linux SE. Продолжить? (y/N)" - read -r REPLY < /dev/tty - [ "$REPLY" = "y" ] || fail "Прервано пользователем" + OS_NAME="Astra Linux $(cat /etc/astra_version)" + OS_KIND="astra" +elif [ -r /etc/os-release ]; then + . /etc/os-release + OS_NAME="$PRETTY_NAME" + case "${ID:-}" in + astra) OS_KIND="astra" ;; + debian) OS_KIND="debian" ;; + ubuntu) OS_KIND="ubuntu" ;; + *) + case "${ID_LIKE:-}" in + *debian*) OS_KIND="debian-like" ;; + esac + ;; + esac fi +ok "Обнаружено: $OS_NAME" -# ---- 2. Зависимости системы ---- -log "Шаг 2/8: установка системных зависимостей через apt" +case "$OS_KIND" in + astra) + ok "Astra Linux — полностью поддерживается, ИШ заработает официально" + ;; + debian|"debian-like") + warn "Debian-based — bj-server установится, ИШ скорее всего тоже" + warn "(но официально НРД его не поддерживает на Debian; для прод-инфры лучше Astra Linux SE)" + ;; + ubuntu) + warn "Ubuntu — bj-server установится, но ИШ может потребовать допилов" + ask "Продолжить?" || exit 1 + ;; + *) + fail "Неподдерживаемая ОС. Поддерживаются: Astra Linux (SE/CE), Debian, Ubuntu" + ;; +esac + +# ============================================================ +# ШАГ 2/9. Системные пакеты +# ============================================================ +step "2/9: установка системных пакетов через apt" export DEBIAN_FRONTEND=noninteractive -apt-get update -qq +apt-get update -qq >/dev/null apt-get install -y -qq \ - ca-certificates \ - curl \ - git \ - podman \ - podman-compose \ - postgresql-client \ - systemd \ - || fail "apt-get install failed" + ca-certificates curl wget git tar gzip \ + podman postgresql-client \ + >/dev/null 2>&1 +# podman-compose доступен либо как apt-пакет, либо как pip — пробуем оба +if ! command -v podman-compose >/dev/null 2>&1; then + apt-get install -y -qq podman-compose >/dev/null 2>&1 || \ + apt-get install -y -qq python3-pip >/dev/null 2>&1 && pip3 install --quiet podman-compose 2>/dev/null || true +fi +command -v podman >/dev/null && ok "podman: $(podman --version | awk '{print $3}')" || fail "podman не установился" +command -v git >/dev/null && ok "git: $(git --version | awk '{print $3}')" || fail "git не установился" -# ---- 3. Go ---- -log "Шаг 3/8: проверка/установка Go 1.24+" -GO_VERSION_REQUIRED="1.24" +# ============================================================ +# ШАГ 3/9. Go 1.24+ +# ============================================================ +step "3/9: Go 1.24+" need_go=1 if command -v go >/dev/null 2>&1; then GO_HAVE=$(go version | awk '{print $3}' | sed 's/go//') - if [ "$(printf '%s\n%s' "$GO_VERSION_REQUIRED" "$GO_HAVE" | sort -V | head -1)" = "$GO_VERSION_REQUIRED" ]; then - log "Go $GO_HAVE ✓" + if printf '%s\n%s' "1.24" "$GO_HAVE" | sort -V | head -1 | grep -q '^1.24$'; then + ok "Go $GO_HAVE — подходит" need_go=0 else - warn "Go $GO_HAVE слишком старый, нужен $GO_VERSION_REQUIRED+" + warn "Go $GO_HAVE — слишком старый, обновляю" fi fi if [ "$need_go" = 1 ]; then - GO_TAR=/tmp/go.tar.gz - log "Качаю Go $GO_VERSION_REQUIRED ..." - curl -sSL "https://go.dev/dl/go${GO_VERSION_REQUIRED}.linux-amd64.tar.gz" -o "$GO_TAR" \ - || fail "не получилось скачать Go (нужен прямой выход в интернет)" + GO_VER="1.24.0" + ok "качаю Go $GO_VER с go.dev (~70 МБ)..." + curl -sSL "https://go.dev/dl/go${GO_VER}.linux-amd64.tar.gz" -o /tmp/go.tar.gz \ + || fail "не получилось скачать Go (нужен интернет)" rm -rf /usr/local/go - tar -C /usr/local -xzf "$GO_TAR" + tar -C /usr/local -xzf /tmp/go.tar.gz ln -sf /usr/local/go/bin/go /usr/local/bin/go ln -sf /usr/local/go/bin/gofmt /usr/local/bin/gofmt - log "Go установлен в /usr/local/go" + rm -f /tmp/go.tar.gz + ok "Go $GO_VER установлен в /usr/local/go" fi -# ---- 4. Пользователь bj + каталоги ---- -log "Шаг 4/8: пользователь bj и каталоги" +# ============================================================ +# ШАГ 4/9. Пользователь bj и каталоги +# ============================================================ +step "4/9: системный пользователь bj и каталоги" if ! id bj >/dev/null 2>&1; then useradd --system --create-home --home-dir /var/lib/bj --shell /bin/bash bj - log "Создан пользователь bj" + ok "создан пользователь bj" +else + ok "пользователь bj уже существует" fi install -d -o bj -g bj -m 0755 /opt/bj /var/lib/bj /var/log/bj -install -d -o bj -g bj -m 0700 /var/lib/bj/.bj # ~/.bj для setup.json +install -d -o bj -g bj -m 0700 /var/lib/bj/.bj +ok "каталоги: /opt/bj /var/lib/bj /var/log/bj" -# ---- 5. Клон/обновление репо ---- -SRC_DIR=/opt/bj/src -log "Шаг 5/8: исходники в $SRC_DIR" -if [ -d "$SRC_DIR/.git" ]; then - log "Репо уже есть, обновляю до origin/$BRANCH" - git -C "$SRC_DIR" fetch --quiet origin - git -C "$SRC_DIR" checkout --quiet "$BRANCH" - git -C "$SRC_DIR" reset --hard --quiet "origin/$BRANCH" +# ============================================================ +# ШАГ 5/9. Клон репо и сборка bj-server +# ============================================================ +step "5/9: клон репозитория и сборка bj-server" +SRC=/opt/bj/src +if [ -d "$SRC/.git" ]; then + sudo -u bj -H git -C "$SRC" fetch --quiet origin + sudo -u bj -H git -C "$SRC" reset --hard --quiet "origin/$BRANCH" + ok "репо обновлено до $BRANCH" else - git clone --quiet --branch "$BRANCH" "$GIT_URL" "$SRC_DIR" \ - || fail "git clone failed (проверь GIT_URL и сеть)" + sudo -u bj -H git clone --quiet --branch "$BRANCH" "$REPO_URL" "$SRC" \ + || fail "git clone failed" + ok "репо склонирован" fi -chown -R bj:bj "$SRC_DIR" +chown -R bj:bj "$SRC" -# ---- 6. Сборка bj-server ---- -log "Шаг 6/8: сборка bj-server" -if [ "$SKIP_BUILD" = "1" ]; then - log "пропущено (--skip-build)" -else - sudo -u bj -H bash -c "cd $SRC_DIR && /usr/local/bin/go build -o /opt/bj/bj-server ./cmd/bj-server" \ - || fail "go build failed" - chown bj:bj /opt/bj/bj-server - chmod 0755 /opt/bj/bj-server - log "Бинарник: /opt/bj/bj-server ($(du -h /opt/bj/bj-server | awk '{print $1}'))" +ok "компиляция bj-server..." +sudo -u bj -H bash -c "cd $SRC && /usr/local/bin/go build -o /opt/bj/bj-server ./cmd/bj-server" \ + || fail "go build failed" +chown bj:bj /opt/bj/bj-server +chmod 0755 /opt/bj/bj-server +ok "бинарник: /opt/bj/bj-server ($(du -h /opt/bj/bj-server | awk '{print $1}'))" + +# ============================================================ +# ШАГ 6/9. PostgreSQL в podman + миграции +# ============================================================ +step "6/9: PostgreSQL в podman + миграции БД" +cd "$SRC" +if ! podman ps --format '{{.Names}}' 2>/dev/null | grep -qx bj-postgres; then + sudo -u bj -H podman-compose -f deploy/docker-compose/docker-compose.yml up -d postgres \ + 2>/dev/null || { + warn "podman-compose не сработал, пробую podman run напрямую" + sudo -u bj -H podman run -d --name bj-postgres \ + -e POSTGRES_USER=bj -e POSTGRES_PASSWORD=bj_dev -e POSTGRES_DB=bj \ + -p 127.0.0.1:5432:5432 \ + docker.io/library/postgres:16-alpine + } + sleep 5 fi - -# Web-templates встроены через go:embed — отдельно копировать не нужно. - -# ---- 7. PostgreSQL ---- -if [ "$SKIP_POSTGRES" = "1" ]; then - log "Шаг 7/8: PostgreSQL пропущен (--no-postgres)" -else - log "Шаг 7/8: PostgreSQL в podman-контейнере" - cd "$SRC_DIR" - if podman ps --format '{{.Names}}' | grep -qx bj-postgres; then - log "Контейнер bj-postgres уже запущен" - else - sudo -u bj -H podman-compose -f deploy/docker-compose/docker-compose.yml up -d postgres \ - || warn "podman-compose не сработал — БД нужно поднять руками" - sleep 3 +# Ждём pg_isready +for i in 1 2 3 4 5 6 7 8 9 10; do + if sudo -u bj -H podman exec bj-postgres pg_isready -U bj -d bj >/dev/null 2>&1; then + ok "PostgreSQL готов" + break fi - # Накат миграций - for mig in migrations/fansy-store/*.sql migrations/m2m-core/*.sql; do - log " миграция: $(basename "$mig")" - sudo -u bj -H podman exec -i bj-postgres psql -U bj -d bj < "$mig" 2>/dev/null || true - done -fi + sleep 2 +done -# ---- 8. systemd unit ---- -log "Шаг 8/8: systemd unit" +# Накат миграций +MIG_COUNT=0 +for mig in migrations/fansy-store/*.sql migrations/m2m-core/*.sql; do + if [ -f "$mig" ]; then + sudo -u bj -H podman exec -i bj-postgres psql -U bj -d bj -v ON_ERROR_STOP=0 < "$mig" >/dev/null 2>&1 && \ + MIG_COUNT=$((MIG_COUNT+1)) + fi +done +ok "миграций накачено: $MIG_COUNT" + +# Сохраняем DSN +cat > /var/lib/bj/.bj/setup.json < /etc/systemd/system/bj-server.service </dev/null 2>&1 systemctl restart bj-server - sleep 2 if systemctl is-active --quiet bj-server; then - log "✓ bj-server запущен" + ok "bj-server.service active" else - warn "bj-server не стартанул, см. journalctl -u bj-server" - systemctl status bj-server --no-pager | tail -10 + warn "bj-server не стартанул, см. journalctl -u bj-server -n 30" fi -# ---- Финал ---- +# ============================================================ +# ШАГ 8/9. ИШ НРД — скачивание и установка +# ============================================================ +if [ "$SKIP_ISH" = "1" ]; then + step "8/9: ИШ НРД — пропущено (--skip-ish)" +else + step "8/9: Интеграционный шлюз НРД (ИШ)" + ISH_LOCAL="$SRC/dist/ish/igate_100.0-765_amd64.deb" + if [ -f "$ISH_LOCAL" ]; then + ok "дистрибутив ИШ уже в репо: $ISH_LOCAL" + else + ok "качаю дистрибутив ИШ с НРД (~120 МБ)..." + mkdir -p "$(dirname "$ISH_LOCAL")" + if curl -sSL -A "Mozilla/5.0" "$ISH_DEB_URL" -o "$ISH_LOCAL" --max-time 600; then + ok "скачан: $(du -h "$ISH_LOCAL" | awk '{print $1}')" + else + warn "не получилось скачать ИШ автоматически" + warn "скачайте вручную: $ISH_DEB_URL" + warn "и положите в $ISH_LOCAL, потом перезапустите этот скрипт" + ISH_LOCAL="" + fi + fi + + if [ -n "$ISH_LOCAL" ] && [ -f "$ISH_LOCAL" ]; then + ok "установка ИШ через dpkg..." + if dpkg -i "$ISH_LOCAL" >/dev/null 2>&1; then + ok "ИШ установлен" + else + # Часто dpkg падает на зависимостях — пробуем apt-get install -f + apt-get install -f -y >/dev/null 2>&1 + if dpkg -i "$ISH_LOCAL" >/dev/null 2>&1; then + ok "ИШ установлен (после починки зависимостей)" + else + warn "ИШ не встал — возможно нет Валидаты или системных пакетов" + warn "это нормально на текущем этапе — продолжаем" + fi + fi + fi +fi + +# ============================================================ +# ШАГ 9/9. Финальная проверка +# ============================================================ +step "9/9: проверка готовности" +sleep 1 +CODE=$(curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1${BIND_ADDR}/admin/" 2>/dev/null || echo "—") +[ "$CODE" = "200" ] && ok "веб-админка отвечает: HTTP 200" || warn "веб-админка пока не отвечает (HTTP $CODE) — проверь логи" + IP=$(hostname -I | awk '{print $1}') echo -echo "================================================================" -echo " bj-server установлен" -echo "================================================================" -echo " Web-админка: http://$IP$BIND_ADDR/admin/" -echo " Wizard: http://$IP$BIND_ADDR/admin/wizard" -echo " Архитектура: http://$IP$BIND_ADDR/admin/help/architecture" -echo " Логи: journalctl -u bj-server -f" -echo " tail -f /var/log/bj/bj-server.log" -echo " Сервис: systemctl status bj-server" +echo "╔══════════════════════════════════════════════════════════════════╗" +echo "║ УСТАНОВКА BJ-SERVER ЗАВЕРШЕНА ║" +echo "╚══════════════════════════════════════════════════════════════════╝" +echo +echo " Веб-админка: http://$IP${BIND_ADDR}/admin/" +echo " Мастер настройки: http://$IP${BIND_ADDR}/admin/wizard" +echo " Архитектура: http://$IP${BIND_ADDR}/admin/help/architecture" +echo " Новости: http://$IP${BIND_ADDR}/admin/news" +echo +echo " Логи: tail -f /var/log/bj/bj-server.log" +echo " Сервис: systemctl status bj-server" +echo +echo " ──── ЧТО ОСТАЛОСЬ СДЕЛАТЬ (НЕ АВТОМАТИЧЕСКИ) ───────────────" +echo +echo " 1. Запросить СКЗИ Валидата CSP у НРД:" +echo " Email: soed@nsd.ru" +echo " Текст: «Запрос дистрибутива Валидата CSP для Linux + временной" +echo " лицензии для подключения к ЭДО НРД в рамках MOEX МОСТ M2M.»" +echo +echo " 2. Получить сертификат подписи в УЦ Московской Биржи:" +echo " https://ca.moex.com/" +echo +echo " 3. Подать заявку на тестирование в TEST3:" +echo " https://www.nsd.ru/workflow/zayavka-na-testirovanie/" +echo +echo " 4. Когда придёт Валидата — поставить:" +echo " sudo bash $SRC/deploy/astra/install-validata.sh /path/to/validata-*.deb" +echo +echo " 5. Когда заработает ИШ — указать его URL в /admin/setup → «ИШ НРД»" +echo +echo " ──── ПРОВЕРКА СОСТОЯНИЯ ВСЕГО ──────────────────────────────" +echo " sudo bash $SRC/deploy/astra/healthcheck.sh" echo -echo " Следующие шаги:" -echo " 1. Установить Валидата CSP — sudo bash deploy/astra/install-validata.sh" -echo " 2. Установить ИШ — sudo bash deploy/astra/install-ish.sh" -echo " 3. Открыть /admin/wizard и пройти настройку" -echo "================================================================"