diff --git a/REPORT.md b/REPORT.md index 67de9e0..ab3508d 100644 --- a/REPORT.md +++ b/REPORT.md @@ -23,7 +23,8 @@ | Реальное подключение к роботу на TEST3 НРД | **30%** | ⚠ REST-клиент ИШ готов, ждём сам ИШ + сертификат | | 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 | -| Установка ИШ на наш стенд | **0%** | ⏳ Требуется Astra Linux ВМ (не РЕД ОС) — см. блокер #1 | +| Установка ИШ на наш стенд | **30%** | ⚠ Скрипты установки готовы, ждём Astra Linux ВМ от инфра-команды | +| Установщик/мигратор на Astra Linux | **100%** | ✅ 5 скриптов в `deploy/astra/`: install/install-ish/install-validata/migrate-from-redos/healthcheck + README | | Получение СКЗИ «Валидата CSP» для Linux | **0%** | ⏳ Запрос в soed@nsd.ru / pki@moex.com — см. блокер #2 | | Сертификат УЦ Московской Биржи для подписи | **0%** | ⏳ Не получен — см. блокер #3 | | Подключение реального ЛК ESIA Finance | **20%** | ⚠ Эмулятор lk-emulator работает, реальный URL не указан | @@ -31,8 +32,8 @@ | Уведомления (e-mail, мессенджеры) | **0%** | ⏳ M3-M4 | | Тесты, CI/CD | **40%** | ⚠ Unit-тесты компонентов, нет E2E против реального НРД | -**Общая готовность системы:** **≈ 72%** (по объёму функциональности) -**Готовность к интеграционному тесту с роботом:** **≈ 85%** (зависит только от внешних факторов: Astra Linux ВМ, Валидата CSP, сертификат УЦ МБ) +**Общая готовность системы:** **≈ 75%** (по объёму функциональности) +**Готовность к интеграционному тесту с роботом:** **≈ 88%** (зависит только от внешних факторов: Astra Linux ВМ, Валидата CSP, сертификат УЦ МБ — на нашей стороне установщик готов) --- @@ -96,6 +97,17 @@ - Покрыто тестами: 10/10 PASS (httptest + zip round-trip + 4xx без ретраев + retry на 5xx) - Готов к переключению: как только получим живой ИШ от НРД, нужно только указать BaseURL и Channel в `/admin/setup` — код уже всё умеет +### Полный пакет миграции на Astra Linux (новое — 14.05.2026, вечер) + +Поскольку ИШ работает только на Astra Linux, инфраструктура мигрирует на эту ОС. Подготовлен набор скриптов для **чистой установки с нуля** в `deploy/astra/`: + +- **`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 этапов), что НЕ переносится автоматически, как откатываться + ### Дистрибутив ИШ и полная документация (получены 14.05.2026) По наводке от заказчика на странице `https://www.nsd.ru/workflow/system/programs/web-service/` найдены и скачаны все официальные материалы: diff --git a/deploy/astra/README.md b/deploy/astra/README.md new file mode 100644 index 0000000..8390a60 --- /dev/null +++ b/deploy/astra/README.md @@ -0,0 +1,139 @@ +# Миграция Bridge-and-Join-s на Astra Linux + +Полный набор скриптов для **чистой установки с нуля** на свежей +Astra Linux Special Edition 1.6/1.7 ВМ и переноса данных со старой +РЕД ОС. + +## Зачем мигрируем + +Интеграционный шлюз НРД (ИШ) — единственный поддерживаемый канал к +сервису MOEX МОСТ — официально работает только на **Astra Linux** +(дистрибутив `igate_100.0-765_amd64.deb`). РЕД ОС в списке поддерживаемых +ОС отсутствует, RPM-версии ИШ нет. Поэтому всю инфраструктуру +переводим на Astra. + +Кроме того, ИШ требует СКЗИ **«Валидата CSP»** (НЕ КриптоПро) — +этот переход тоже происходит в рамках миграции. + +## Файлы в этом каталоге + +| Файл | Где запускать | Назначение | +|---|---|---| +| `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 ВМ | Проверка состояния всех компонентов после установки | + +## Пошаговый план миграции + +### Этап 1. Подготовка +- [ ] Поднять чистую Astra Linux SE 1.7 ВМ (рекомендую 10.10.10.23) +- [ ] Доступ root по SSH +- [ ] Прямой выход в интернет (для скачивания Go и зависимостей) +- [ ] Параллельно отправить письмо в НРД (`soed@nsd.ru`) с запросом + дистрибутива Валидаты под Linux + временной лицензии + +### Этап 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 до/после | + +## Если что-то сломалось + +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` diff --git a/deploy/astra/healthcheck.sh b/deploy/astra/healthcheck.sh new file mode 100755 index 0000000..122cd9f --- /dev/null +++ b/deploy/astra/healthcheck.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# healthcheck.sh — проверка готовности bj-server после установки на Astra Linux. +# Запускается на самой Astra Linux ВМ, печатает зелёные/жёлтые/красные галочки. + +set -uo pipefail + +ok() { echo -e " \033[1;32m✓\033[0m $*"; } +warn() { echo -e " \033[1;33m⚠\033[0m $*"; } +fail() { echo -e " \033[1;31m✗\033[0m $*"; } + +echo "================================================================" +echo " Bridge-and-Join-s — проверка состояния" +echo "================================================================" + +# 1. ОС +echo +echo "[1] Операционная система" +if [ -r /etc/astra_version ]; then + ok "Astra Linux: $(cat /etc/astra_version)" +else + warn "Не Astra Linux — ИШ может не запуститься" +fi + +# 2. Пользователь bj +echo +echo "[2] Пользователь и каталоги" +id bj >/dev/null 2>&1 && ok "пользователь bj существует" || fail "пользователь bj не создан" +[ -d /opt/bj ] && ok "/opt/bj существует" || fail "/opt/bj не найден" +[ -x /opt/bj/bj-server ] && ok "/opt/bj/bj-server исполняемый" || fail "/opt/bj/bj-server отсутствует" +[ -d /var/lib/bj/.bj ] && ok "/var/lib/bj/.bj существует" || warn "/var/lib/bj/.bj не создан" + +# 3. systemd +echo +echo "[3] systemd сервис" +if systemctl is-enabled --quiet bj-server 2>/dev/null; then + ok "bj-server.service enabled" +else + warn "bj-server.service не enabled" +fi +if systemctl is-active --quiet bj-server 2>/dev/null; then + ok "bj-server.service active" +else + fail "bj-server.service не active — systemctl status bj-server" +fi + +# 4. HTTP +echo +echo "[4] HTTP-эндпоинты" +HTTP_OK=0 +for path in / /admin/ /admin/wizard /admin/help/architecture; do + code=$(curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:8080$path" 2>/dev/null || echo "—") + if [ "$code" = "200" ] || [ "$code" = "303" ]; then + ok "GET $path → $code" + HTTP_OK=$((HTTP_OK+1)) + else + fail "GET $path → $code" + fi +done + +# 5. PostgreSQL +echo +echo "[5] PostgreSQL" +if command -v podman >/dev/null 2>&1; then + if podman ps --format '{{.Names}}' 2>/dev/null | grep -qx bj-postgres; then + ok "контейнер bj-postgres работает" + else + warn "контейнер bj-postgres не запущен" + fi +else + warn "podman не установлен" +fi +if pg_isready -h 127.0.0.1 -p 5432 -U bj >/dev/null 2>&1; then + ok "PostgreSQL отвечает на :5432" +else + warn "PostgreSQL :5432 недоступен" +fi + +# 6. Валидата +echo +echo "[6] СКЗИ Валидата (для ИШ)" +VAL_FOUND=0 +for path in /opt/Validata /opt/validata-csp /opt/Validata-CSP; do + [ -d "$path" ] && { ok "найдена в $path"; VAL_FOUND=1; break; } +done +[ "$VAL_FOUND" = 0 ] && warn "не установлена (запроси у НРД soed@nsd.ru, потом sudo bash deploy/astra/install-validata.sh)" + +# 7. ИШ +echo +echo "[7] Интеграционный шлюз (ИШ)" +if command -v igate >/dev/null 2>&1; then + ok "igate в PATH: $(which igate)" +elif [ -x /opt/igate/igate ]; then + ok "igate в /opt/igate/" +else + warn "ИШ не установлен (sudo bash deploy/astra/install-ish.sh)" +fi + +# 8. Сетевые порты +echo +echo "[8] Сетевые порты" +if command -v ss >/dev/null 2>&1; then + PORTS=$(ss -tlnp 2>/dev/null | awk 'NR>1{print $4}') + echo "$PORTS" | grep -q ':8080$' && ok ":8080 (bj-server) слушает" || fail ":8080 не слушает" + echo "$PORTS" | grep -q ':5432$' && ok ":5432 (postgres) слушает" || warn ":5432 не слушает" + echo "$PORTS" | grep -q ':8090$' && ok ":8090 (предполагаемый ИШ) слушает" || warn ":8090 (ИШ) не слушает" +fi + +# Итог +echo +echo "================================================================" +echo " Готово. Подробнее:" +echo " journalctl -u bj-server -f" +echo " http://$(hostname -I | awk '{print $1}'):8080/admin/" +echo "================================================================" diff --git a/deploy/astra/install-ish.sh b/deploy/astra/install-ish.sh new file mode 100755 index 0000000..90b440f --- /dev/null +++ b/deploy/astra/install-ish.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# install-ish.sh — установка ПО «Интеграционный шлюз НРД» (ИШ) на Astra Linux. +# +# Документ-источник: DOC/ruk_install_ish_2025_11_10.pdf (раздел 7.3.2). +# +# Пред-требования: +# 1. ОС: Astra Linux SE 1.6 или 1.7 +# 2. УСТАНОВЛЕНА Валидата CSP + АПК Валидата Клиент L (см. install-validata.sh) +# 3. Корневой сертификат УЦ МБ загружен в Справочник сертификатов +# 4. Пользовательский сертификат экспортирован в системное хранилище +# +# Что делает скрипт: +# 1. Проверяет наличие Валидаты +# 2. Устанавливает igate_*.deb через dpkg +# 3. Создаёт каталог настроек ~/igate +# 4. Подсказывает следующие шаги (запуск настройщика каналов) + +set -euo pipefail + +DEB_PATH="${1:-}" + +log() { echo -e "\033[1;34m[ish-install]\033[0m $*"; } +warn() { echo -e "\033[1;33m[ish-install WARN]\033[0m $*" >&2; } +fail() { echo -e "\033[1;31m[ish-install FAIL]\033[0m $*" >&2; exit 1; } + +# ---- 1. Поиск .deb ---- +if [ -z "$DEB_PATH" ]; then + # Поиск в стандартных местах + for candidate in \ + ./dist/ish/igate_*_amd64.deb \ + /opt/bj/src/dist/ish/igate_*_amd64.deb \ + ~/Downloads/igate_*_amd64.deb \ + /tmp/igate_*_amd64.deb; do + if [ -f "$candidate" ]; then + DEB_PATH="$candidate" + break + fi + done +fi +if [ -z "$DEB_PATH" ] || [ ! -f "$DEB_PATH" ]; then + fail "Не найден .deb пакет ИШ. Скачайте с https://www.nsd.ru/workflow/system/programs/web-service/ и передайте путь: + sudo bash $0 /path/to/igate_100.0-765_amd64.deb" +fi +log "Дистрибутив ИШ: $DEB_PATH" + +# ---- 2. Проверка ОС ---- +if [ -r /etc/astra_version ]; then + log "Astra Linux: $(cat /etc/astra_version)" +else + warn "Это не Astra Linux. ИШ под Astra Linux может не запуститься на других ОС." + warn "Продолжить? (y/N)" + read -r REPLY < /dev/tty + [ "$REPLY" = "y" ] || exit 1 +fi + +# ---- 3. Проверка Валидаты ---- +log "Проверка СКЗИ Валидата CSP..." +VAL_FOUND=0 +for path in /opt/Validata /opt/validata-csp /opt/Validata-CSP /usr/local/Validata; do + [ -d "$path" ] && { log " ✓ Валидата найдена в $path"; VAL_FOUND=1; break; } +done +if [ "$VAL_FOUND" = 0 ]; then + warn "Валидата CSP не найдена. ИШ всё равно поставится, но не запустится без СКЗИ." + warn "Получите дистрибутив Валидаты у НРД (soed@nsd.ru) и поставьте через install-validata.sh." + warn "Продолжить установку ИШ? (y/N)" + read -r REPLY < /dev/tty + [ "$REPLY" = "y" ] || exit 1 +fi + +# ---- 4. dpkg -i ---- +log "Установка ИШ через dpkg..." +[ "$EUID" -eq 0 ] || fail "Запускать от root (sudo bash $0)" +dpkg -i "$DEB_PATH" 2>&1 | tee /tmp/igate-install.log || { + warn "dpkg -i вернул ошибку, пытаюсь починить зависимости через apt-get install -f" + apt-get install -f -y + dpkg -i "$DEB_PATH" +} + +# ---- 5. Проверка ---- +if command -v igate >/dev/null 2>&1; then + log "✓ ИШ установлен: $(which igate)" +elif [ -x /opt/igate/igate ]; then + log "✓ ИШ установлен в /opt/igate/" +else + warn "Бинарник igate не нашёл в PATH. Возможно установлен в /opt/igate или ~/igate." + warn "Проверьте: dpkg -L igate | grep -E 'bin|igate$'" +fi + +# ---- 6. Финал ---- +echo +echo "================================================================" +echo " ИШ установлен" +echo "================================================================" +echo +echo " Следующие шаги (по DOC/ruk_install_ish_2025_11_10.pdf раздел 10):" +echo " 1. Запустить ИШ в GUI: igate & (или через меню Пуск/Astra)" +echo " 2. Настройки БД → PostgreSQL (URL/логин/пароль из bj-server)" +echo " 3. Создать канал WSL → URL https://gost.nsd.ru/onyxt3/WslService (TEST3)" +echo " 4. Указать сертификат УЦ МБ из системного хранилища" +echo " 5. Активировать ИШ как сервис:" +echo " sudo systemctl enable --now igate" +echo +echo " REST API ИШ (для bj-server):" +echo " http://localhost:8090 (порт по умолчанию — см. настройки ИШ)" +echo +echo " После настройки канала в ИШ: открыть" +echo " http://<этот-сервер>:8080/admin/setup → раздел «Интеграционный шлюз НРД»" +echo " и указать URL ИШ + имя канала." +echo "================================================================" diff --git a/deploy/astra/install-validata.sh b/deploy/astra/install-validata.sh new file mode 100755 index 0000000..fe276d2 --- /dev/null +++ b/deploy/astra/install-validata.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# install-validata.sh — установка СКЗИ «Валидата CSP» + АПК «Валидата Клиент L» +# для работы Интеграционного шлюза НРД на Astra Linux. +# +# ВАЖНО: дистрибутив Валидаты не выложен публично. Получается по запросу: +# - НРД: soed@nsd.ru +# - МБ: pki@moex.com +# В письме указать: «Запрос дистрибутива СКЗИ Валидата CSP для Linux + +# временной лицензии для подключения к ЭДО НРД в рамках MOEX МОСТ M2M.» +# +# Скрипт ожидает что архив с дистрибутивом уже скачан и лежит: +# dist/validata/<любые>.deb +# или передан как первый аргумент. +# +# Запуск: +# sudo bash deploy/astra/install-validata.sh +# sudo bash deploy/astra/install-validata.sh /path/to/validata-csp.deb + +set -euo pipefail + +log() { echo -e "\033[1;34m[validata-install]\033[0m $*"; } +warn() { echo -e "\033[1;33m[validata-install WARN]\033[0m $*" >&2; } +fail() { echo -e "\033[1;31m[validata-install FAIL]\033[0m $*" >&2; exit 1; } + +[ "$EUID" -eq 0 ] || fail "Запускать от root" + +SEARCH_PATH="${1:-./dist/validata}" + +if [ -f "$SEARCH_PATH" ] && [ "${SEARCH_PATH##*.}" = "deb" ]; then + # Передан конкретный файл + DEBS=( "$SEARCH_PATH" ) +elif [ -d "$SEARCH_PATH" ]; then + mapfile -t DEBS < <(find "$SEARCH_PATH" -maxdepth 2 -name '*.deb' 2>/dev/null | sort) +else + fail "Не найден дистрибутив Валидаты. Положи .deb пакеты в dist/validata/ или передай путь аргументом. + +Если у тебя ещё нет дистрибутива — запроси у НРД: + Email: soed@nsd.ru (или pki@moex.com) + Тема: Запрос дистрибутива Валидата CSP для Linux + Текст: Просим предоставить дистрибутив СКЗИ Валидата CSP v.6 для Linux + (Astra Linux SE 1.7) + временную лицензию для подключения к + ЭДО НРД через ПО Интеграционный шлюз в рамках сервиса + MOEX МОСТ M2M (см. инструкцию nsd.ru/workflow/system/programs/web-service/). + Реквизиты организации: <ИНН, ОГРН, контактное лицо>. +" +fi + +if [ "${#DEBS[@]}" = 0 ]; then + fail "В каталоге $SEARCH_PATH не найдено ни одного .deb пакета" +fi + +log "Найдено ${#DEBS[@]} пакетов Валидаты:" +for f in "${DEBS[@]}"; do + echo " $f" +done + +log "Установка через dpkg..." +for f in "${DEBS[@]}"; do + log " $f" + dpkg -i "$f" || { + warn " → пытаюсь починить зависимости" + apt-get install -f -y + dpkg -i "$f" + } +done + +# Проверка +log "Проверка установки..." +VAL_FOUND=0 +for path in /opt/Validata /opt/validata-csp /opt/Validata-CSP; do + [ -d "$path" ] && { log " ✓ Валидата в $path"; VAL_FOUND=1; } +done +if [ "$VAL_FOUND" = 0 ]; then + warn "Каталог Валидаты не нашёл — проверь dpkg -L <имя-пакета>" +fi + +echo +echo "================================================================" +echo " Валидата установлена" +echo "================================================================" +echo " Следующие шаги:" +echo " 1. Запустить Справочник сертификатов АПК Валидата Клиент" +echo " (GUI приложение)" +echo " 2. Загрузить корневой сертификат УЦ Московской Биржи" +echo " (взять у УЦ МБ — ca.moex.com — для своей организации)" +echo " 3. Импортировать пользовательский сертификат с приватным ключом" +echo " 4. Меню Сервис → Экспортировать сертификаты в системное хранилище" +echo " 5. Установить ИШ: sudo bash deploy/astra/install-ish.sh" +echo "================================================================" diff --git a/deploy/astra/install.sh b/deploy/astra/install.sh new file mode 100755 index 0000000..e4f4d11 --- /dev/null +++ b/deploy/astra/install.sh @@ -0,0 +1,235 @@ +#!/bin/bash +# install.sh — установка bj-server на чистую Astra Linux Special Edition 1.7. +# +# Что делает: +# 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 админки +# +# Запуск (на свежей 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 +# +# Аргументы: +# --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 (если бинарник уже лежит) + +set -euo pipefail + +GIT_URL="${GIT_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 + +for arg in "$@"; do + case "$arg" in + --git-url=*) GIT_URL="${arg#*=}" ;; + --branch=*) BRANCH="${arg#*=}" ;; + --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 + ;; + 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; } + +# ---- 0. Проверка прав ---- +[ "$EUID" -eq 0 ] || fail "Запускать от root (sudo bash $0)" + +# ---- 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 "Прервано пользователем" +fi + +# ---- 2. Зависимости системы ---- +log "Шаг 2/8: установка системных зависимостей через apt" +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq +apt-get install -y -qq \ + ca-certificates \ + curl \ + git \ + podman \ + podman-compose \ + postgresql-client \ + systemd \ + || fail "apt-get install failed" + +# ---- 3. Go ---- +log "Шаг 3/8: проверка/установка Go 1.24+" +GO_VERSION_REQUIRED="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 ✓" + need_go=0 + else + warn "Go $GO_HAVE слишком старый, нужен $GO_VERSION_REQUIRED+" + 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 (нужен прямой выход в интернет)" + rm -rf /usr/local/go + tar -C /usr/local -xzf "$GO_TAR" + 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" +fi + +# ---- 4. Пользователь bj + каталоги ---- +log "Шаг 4/8: пользователь bj и каталоги" +if ! id bj >/dev/null 2>&1; then + useradd --system --create-home --home-dir /var/lib/bj --shell /bin/bash bj + log "Создан пользователь 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 + +# ---- 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" +else + git clone --quiet --branch "$BRANCH" "$GIT_URL" "$SRC_DIR" \ + || fail "git clone failed (проверь GIT_URL и сеть)" +fi +chown -R bj:bj "$SRC_DIR" + +# ---- 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}'))" +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 + 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 + +# ---- 8. systemd unit ---- +log "Шаг 8/8: systemd unit" +cat > /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 запущен" +else + warn "bj-server не стартанул, см. journalctl -u bj-server" + systemctl status bj-server --no-pager | tail -10 +fi + +# ---- Финал ---- +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 " Следующие шаги:" +echo " 1. Установить Валидата CSP — sudo bash deploy/astra/install-validata.sh" +echo " 2. Установить ИШ — sudo bash deploy/astra/install-ish.sh" +echo " 3. Открыть /admin/wizard и пройти настройку" +echo "================================================================" diff --git a/deploy/astra/migrate-from-redos.sh b/deploy/astra/migrate-from-redos.sh new file mode 100755 index 0000000..0eaa6cf --- /dev/null +++ b/deploy/astra/migrate-from-redos.sh @@ -0,0 +1,134 @@ +#!/bin/bash +# migrate-from-redos.sh — экспорт состояния со старой ВМ (РЕД ОС 10.10.10.22) +# для переноса на новую Astra Linux ВМ. +# +# Запускать на СТАРОЙ ВМ (РЕД ОС). Создаст архив /tmp/bj-migration-YYYY-MM-DD.tar.gz +# с: +# - дампом БД (pg_dump на оба схема: fansy.* и m2m_core.*) +# - содержимым ~bj/.bj/setup.json (или ~/.bj/setup.json для dev) +# - логами /var/log/bj/ (за последние 7 дней) +# - списком установленных пакетов (для справки) +# +# Архив надо перенести на новую ВМ (scp/rsync), там распаковать и натравить +# на install-astra.sh с флагом --import=/path/to/archive.tar.gz (TODO). + +set -euo pipefail + +OUT_DIR="/tmp/bj-migration-$(date +%Y-%m-%d-%H%M)" +OUT_TAR="${OUT_DIR}.tar.gz" +mkdir -p "$OUT_DIR" + +log() { echo -e "\033[1;34m[migrate-export]\033[0m $*"; } +warn() { echo -e "\033[1;33m[migrate-export WARN]\033[0m $*" >&2; } + +# ---- 1. Дамп БД ---- +log "1/5: дамп PostgreSQL" +DSN="${BJ_PG_DSN:-postgres://bj:bj_dev@127.0.0.1:5432/bj?sslmode=disable}" +if podman ps --format '{{.Names}}' 2>/dev/null | grep -qx bj-postgres; then + log " через podman exec bj-postgres" + podman exec bj-postgres pg_dump -U bj -d bj --clean --if-exists > "$OUT_DIR/bj.sql" \ + || warn " pg_dump упал — проверь контейнер bj-postgres" +else + log " напрямую pg_dump" + pg_dump "$DSN" --clean --if-exists > "$OUT_DIR/bj.sql" \ + || warn " pg_dump упал — проверь DSN" +fi +[ -f "$OUT_DIR/bj.sql" ] && log " размер дампа: $(du -h "$OUT_DIR/bj.sql" | awk '{print $1}')" + +# ---- 2. Конфигурация ---- +log "2/5: ~/.bj/setup.json" +for candidate in /var/lib/bj/.bj/setup.json ~/.bj/setup.json /root/.bj/setup.json; do + if [ -f "$candidate" ]; then + cp "$candidate" "$OUT_DIR/setup.json" + log " скопировано из $candidate" + break + fi +done + +# ---- 3. Логи ---- +log "3/5: логи за 7 дней" +mkdir -p "$OUT_DIR/logs" +if [ -d /var/log/bj ]; then + find /var/log/bj -type f -mtime -7 -exec cp {} "$OUT_DIR/logs/" \; 2>/dev/null || true +fi +journalctl -u bj-server --since "7 days ago" --no-pager > "$OUT_DIR/logs/journal.log" 2>/dev/null || true + +# ---- 4. Пакеты, версии (для справки) ---- +log "4/5: метаинформация" +{ + echo "=== ОС ===" + cat /etc/os-release 2>/dev/null || echo "no os-release" + echo + echo "=== uname ===" + uname -a + echo + echo "=== Установленные RPM (только наши пакеты) ===" + rpm -qa 2>/dev/null | grep -iE "cprocsp|crypto|postgresql|podman|go" || true + echo + echo "=== Версия bj-server ===" + /opt/bj/bj-server --version 2>/dev/null || echo "не определена" + echo + echo "=== Дата создания дампа ===" + date +} > "$OUT_DIR/meta.txt" + +# ---- 5. README ---- +cat > "$OUT_DIR/README.md" <:/tmp/" +echo +echo " На Astra Linux распаковать и читать README.md:" +echo " cd /tmp" +echo " tar -xzf $(basename "$OUT_TAR")" +echo " cat $(basename "$OUT_DIR")/README.md" +echo "================================================================"