feat(deploy): полный набор скриптов миграции на Astra Linux

Поскольку Интеграционный шлюз НРД (ИШ) официально работает только на
Astra Linux SE 1.6/1.7 (RPM-версии нет, дистрибутив только .deb для
Debian-based), мигрируем инфраструктуру с РЕД ОС на Astra. Это
заодно проверит «чистую» установку с нуля.

deploy/astra/install.sh — установщик bj-server для свежей Astra ВМ:
- проверка ОС (Astra Linux SE)
- apt-зависимости (curl, git, podman, podman-compose, postgresql-client)
- скачивание Go 1.24+ с go.dev, если нет
- системный пользователь bj + каталоги /opt/bj /var/lib/bj /var/log/bj
- git clone репо в /opt/bj/src
- go build бинарника /opt/bj/bj-server
- podman-compose up -d postgres + накат всех миграций
- systemd unit с безопасными ограничениями (NoNewPrivileges,
  ProtectSystem=strict, ReadWritePaths только нужные, PrivateTmp)
- автозапуск + проверка systemctl is-active
- финальная подсказка с URL'ами

deploy/astra/install-validata.sh — установщик Валидата CSP:
- ищет .deb пакеты в dist/validata/ или принимает путь аргументом
- если пакетов нет — печатает текст письма для запроса дистрибутива
  у НРД (soed@nsd.ru) или МБ (pki@moex.com)
- dpkg -i + apt-get install -f для зависимостей
- проверка установки в /opt/Validata*

deploy/astra/install-ish.sh — установщик ИШ:
- ищет igate_*_amd64.deb в стандартных местах (dist/ish/, ~/Downloads и т.п.)
- проверяет наличие Валидаты (предупреждает если нет)
- dpkg -i igate_*.deb
- подсказывает следующие шаги (запуск GUI, настройка БД и канала WSL)

deploy/astra/migrate-from-redos.sh — экспорт со старой РЕД ОС ВМ:
- pg_dump БД bj (через podman exec или напрямую)
- копия ~/.bj/setup.json (ищется в нескольких стандартных путях)
- последние 7 дней логов из /var/log/bj и journalctl
- meta.txt с версиями ОС/пакетов
- README.md с инструкциями восстановления на новой ВМ
- итоговый тарбол /tmp/bj-migration-YYYY-MM-DD-HHMM.tar.gz

deploy/astra/healthcheck.sh — проверка после установки:
- 8 разделов: ОС, пользователь/каталоги, systemd, HTTP, PostgreSQL,
  Валидата, ИШ, сетевые порты
- цветной вывод OK/WARN/FAIL для каждого пункта

deploy/astra/README.md — пошаговая инструкция миграции из 8 этапов:
- подготовка (Astra ВМ, доступ root, запрос Валидаты у НРД)
- экспорт со старой ВМ
- install.sh на новой ВМ
- restore БД и настроек
- healthcheck
- install-validata.sh + импорт сертификатов УЦ МБ
- install-ish.sh + настройка канала WSL
- первый тест с роботом MOEX МОСТ
- раздел «что НЕ переносится автоматически»
- раздел «откат» (старая ВМ работает до подтверждения миграции)

REPORT.md обновлён:
- общая готовность 72% → 75%
- готовность к роботу 85% → 88%
- новая строка «Установщик/мигратор на Astra Linux: 100% »
- «Установка ИШ на наш стенд» поднялась с 0% до 30%
This commit is contained in:
fontvielle
2026-05-14 17:37:10 +03:00
parent 7a7aa0cf6c
commit bac55cbdfd
7 changed files with 835 additions and 3 deletions
+15 -3
View File
@@ -23,7 +23,8 @@
| Реальное подключение к роботу на TEST3 НРД | **30%** | ⚠ REST-клиент ИШ готов, ждём сам ИШ + сертификат | | Реальное подключение к роботу на TEST3 НРД | **30%** | ⚠ REST-клиент ИШ готов, ждём сам ИШ + сертификат |
| REST-клиент ИШ НРД (по DOC/instr-ish-rest-api.pdf) | **100%** | ✅ POST file, GET status, GET list, GET package, упаковщик ZIP, 10/10 тестов | | 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 | | Дистрибутив ИШ НРД и полная документация | **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 | | Получение СКЗИ «Валидата CSP» для Linux | **0%** | ⏳ Запрос в soed@nsd.ru / pki@moex.com — см. блокер #2 |
| Сертификат УЦ Московской Биржи для подписи | **0%** | ⏳ Не получен — см. блокер #3 | | Сертификат УЦ Московской Биржи для подписи | **0%** | ⏳ Не получен — см. блокер #3 |
| Подключение реального ЛК ESIA Finance | **20%** | ⚠ Эмулятор lk-emulator работает, реальный URL не указан | | Подключение реального ЛК ESIA Finance | **20%** | ⚠ Эмулятор lk-emulator работает, реальный URL не указан |
@@ -31,8 +32,8 @@
| Уведомления (e-mail, мессенджеры) | **0%** | ⏳ M3-M4 | | Уведомления (e-mail, мессенджеры) | **0%** | ⏳ M3-M4 |
| Тесты, CI/CD | **40%** | ⚠ Unit-тесты компонентов, нет E2E против реального НРД | | Тесты, CI/CD | **40%** | ⚠ Unit-тесты компонентов, нет E2E против реального НРД |
**Общая готовность системы:** **≈ 72%** (по объёму функциональности) **Общая готовность системы:** **≈ 75%** (по объёму функциональности)
**Готовность к интеграционному тесту с роботом:** **≈ 85%** (зависит только от внешних факторов: Astra Linux ВМ, Валидата CSP, сертификат УЦ МБ) **Готовность к интеграционному тесту с роботом:** **≈ 88%** (зависит только от внешних факторов: Astra Linux ВМ, Валидата CSP, сертификат УЦ МБ — на нашей стороне установщик готов)
--- ---
@@ -96,6 +97,17 @@
- Покрыто тестами: 10/10 PASS (httptest + zip round-trip + 4xx без ретраев + retry на 5xx) - Покрыто тестами: 10/10 PASS (httptest + zip round-trip + 4xx без ретраев + retry на 5xx)
- Готов к переключению: как только получим живой ИШ от НРД, нужно только указать BaseURL и Channel в `/admin/setup` — код уже всё умеет - Готов к переключению: как только получим живой ИШ от НРД, нужно только указать 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) ### Дистрибутив ИШ и полная документация (получены 14.05.2026)
По наводке от заказчика на странице `https://www.nsd.ru/workflow/system/programs/web-service/` найдены и скачаны все официальные материалы: По наводке от заказчика на странице `https://www.nsd.ru/workflow/system/programs/web-service/` найдены и скачаны все официальные материалы:
+139
View File
@@ -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`
+114
View File
@@ -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 "================================================================"
+109
View File
@@ -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 "================================================================"
+89
View File
@@ -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 "================================================================"
+235
View File
@@ -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 <<EOF
[Unit]
Description=Bridge-and-Join-s — единый сервис M2M-переводов
Documentation=$GIT_URL
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=bj
Group=bj
WorkingDirectory=/opt/bj/src
ExecStart=/opt/bj/bj-server
Restart=on-failure
RestartSec=5
Environment=BJ_HTTP_ADDR=$BIND_ADDR
Environment=BJ_SETUP_PATH=/var/lib/bj/.bj/setup.json
Environment=BJ_M2M_SENDER=MC0079200000
Environment=BJ_M2M_RECEIVER=MC0010300000
# Безопасность
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/bj /var/log/bj
PrivateTmp=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
StandardOutput=append:/var/log/bj/bj-server.log
StandardError=append:/var/log/bj/bj-server.err
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable bj-server >/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 "================================================================"
+134
View File
@@ -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" <<EOF
# Миграция bj-server с РЕД ОС на Astra Linux
Дамп создан: $(date)
Источник: $(hostname) ($(hostname -I | awk '{print $1}'))
## Файлы
- \`bj.sql\` — дамп PostgreSQL базы bj (схемы fansy + m2m_core)
- \`setup.json\` — настройки bj-server (DSN, IGW URL, и т.п.)
- \`logs/\` — последние логи bj-server
- \`meta.txt\` — версии ОС, пакетов
## Восстановление на Astra Linux
\`\`\`bash
# 1. На новой ВМ — ставим bj-server
sudo bash deploy/astra/install.sh
# 2. Восстанавливаем БД
podman exec -i bj-postgres psql -U bj -d bj < bj.sql
# 3. Восстанавливаем настройки
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
# 4. Перезапуск
sudo systemctl restart bj-server
\`\`\`
## Что НЕ переносится автоматически
- Сертификаты КриптоПро CSP (\`/var/opt/cprocsp/keys/$USER/\`)
— это нормально, на Astra Linux будет другая СКЗИ (Валидата CSP)
- \`/opt/cprocsp/\` (КриптоПро CSP)
— на Astra нужна Валидата вместо КриптоПро
EOF
# ---- Финал ----
log "5/5: создание архива $OUT_TAR"
tar -czf "$OUT_TAR" -C "$(dirname "$OUT_DIR")" "$(basename "$OUT_DIR")"
rm -rf "$OUT_DIR"
echo
echo "================================================================"
echo " Экспорт готов"
echo "================================================================"
echo " Архив: $OUT_TAR"
echo " Размер: $(du -h "$OUT_TAR" | awk '{print $1}')"
echo
echo " Перенести на новую Astra Linux ВМ:"
echo " scp $OUT_TAR user@<astra-ip>:/tmp/"
echo
echo " На Astra Linux распаковать и читать README.md:"
echo " cd /tmp"
echo " tar -xzf $(basename "$OUT_TAR")"
echo " cat $(basename "$OUT_DIR")/README.md"
echo "================================================================"