refactor(deploy): «одна команда — всё работает» для нового стенда
Переосмысление установщика по фидбеку: установщик должен делать чистую
установку «с нуля», а не миграцию. От пользователя требуется одна
команда и больше ничего:
curl -sSL https://.../install.sh | sudo bash
deploy/astra/install.sh переписан:
- 9 чётких этапов с прогресс-индикатором (секунды от старта)
- Авто-определение ОС: Astra SE → официально, Astra CE/Debian → warn,
Ubuntu → ask, остальные → fail
- Авто-скачивание дистрибутива ИШ (~120 МБ) с old.nsd.ru
- Авто-установка ИШ через dpkg (но если упадёт — это OK, продолжаем)
- НЕинтерактивный режим (--yes) для CI/автоматизации
- Финальная сводка с URL'ами + список ручных шагов
- Дефолтный setup.json создаётся сразу, чтоб bj-server понимал DSN
- ProtectSystem=strict, ReadWritePaths только нужные, PrivateTmp в
systemd unit'е
deploy/astra/migrate-from-redos.sh → переименован в import-data.sh
и стал ОПЦИОНАЛЬНЫМ (для тех кто переезжает с действующего стенда).
Главный путь — чистая установка через install.sh.
deploy/astra/README.md перетряхнут:
- TL;DR с одной командой в самом верху
- Объяснение Astra SE vs Astra CE vs Debian (платное/бесплатное)
- 5 скриптов вместо 6
- Раздел «что произойдёт после установки» — режим эмуляции, что
осталось руками
- 10-этапный путь от чистой ВМ до прохождения теста с роботом MOEX МОСТ
REPORT.md обновлён: установщик описан как «одна команда» вместо
«миграция», % готовности не изменился (но качество улучшилось).
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
| 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 |
|
||||||
| Установка ИШ на наш стенд | **30%** | ⚠ Скрипты установки готовы, ждём Astra Linux ВМ от инфра-команды |
|
| Установка ИШ на наш стенд | **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 |
|
| Получение СКЗИ «Валидата 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 не указан |
|
||||||
@@ -97,16 +97,35 @@
|
|||||||
- Покрыто тестами: 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, вечер)
|
### Авто-установщик «одной командой» (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, и т.п.), стартует сервис
|
```bash
|
||||||
- **`install-validata.sh`** — установка СКЗИ Валидата CSP + АПК Валидата Клиент L через `dpkg -i` (когда придёт дистрибутив от НРД). С подсказкой текста письма-запроса, если дистрибутива ещё нет
|
curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash
|
||||||
- **`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, Валидата, ИШ, сетевые порты
|
Через 5-10 минут на свежей Astra Linux / Debian / Ubuntu ВМ работает веб-админка на :8080. Установщик `deploy/astra/install.sh`:
|
||||||
- **`README.md`** — пошаговая инструкция миграции (8 этапов), что НЕ переносится автоматически, как откатываться
|
|
||||||
|
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)
|
### Дистрибутив ИШ и полная документация (получены 14.05.2026)
|
||||||
По наводке от заказчика на странице `https://www.nsd.ru/workflow/system/programs/web-service/` найдены и скачаны все официальные материалы:
|
По наводке от заказчика на странице `https://www.nsd.ru/workflow/system/programs/web-service/` найдены и скачаны все официальные материалы:
|
||||||
|
|||||||
+129
-123
@@ -1,139 +1,145 @@
|
|||||||
# Миграция Bridge-and-Join-s на Astra Linux
|
# Bridge-and-Join-s — установка одной командой
|
||||||
|
|
||||||
Полный набор скриптов для **чистой установки с нуля** на свежей
|
## TL;DR — на свежей Astra Linux / Debian / Ubuntu ВМ
|
||||||
Astra Linux Special Edition 1.6/1.7 ВМ и переноса данных со старой
|
|
||||||
РЕД ОС.
|
|
||||||
|
|
||||||
## Зачем мигрируем
|
```bash
|
||||||
|
curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash
|
||||||
|
```
|
||||||
|
|
||||||
Интеграционный шлюз НРД (ИШ) — единственный поддерживаемый канал к
|
Через **5-10 минут** будет работать веб-админка на `http://<ip>:8080/admin/`.
|
||||||
сервису MOEX МОСТ — официально работает только на **Astra Linux**
|
|
||||||
(дистрибутив `igate_100.0-765_amd64.deb`). РЕД ОС в списке поддерживаемых
|
|
||||||
ОС отсутствует, RPM-версии ИШ нет. Поэтому всю инфраструктуру
|
|
||||||
переводим на Astra.
|
|
||||||
|
|
||||||
Кроме того, ИШ требует СКЗИ **«Валидата 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) |
|
| ОС | Debian 11+ / Astra CE 1.8 / Astra SE 1.6+ / Ubuntu 22.04+ | **Astra Linux SE 1.7** (для прод) |
|
||||||
| `install-validata.sh` | новая Astra ВМ (root) | Установка СКЗИ Валидата CSP + АПК Валидата Клиент L (после получения дистрибутива от НРД) |
|
| CPU | 2 ядра | 4 ядра |
|
||||||
| `install-ish.sh` | новая Astra ВМ (root) | Установка ИШ (`dpkg -i igate_*.deb`) |
|
| RAM | 2 ГБ | 4 ГБ |
|
||||||
| `migrate-from-redos.sh` | старая РЕД ОС ВМ | Экспорт состояния (БД, настройки, логи) в архив для переноса |
|
| Диск | 20 ГБ | 50 ГБ SSD |
|
||||||
| `healthcheck.sh` | новая Astra ВМ | Проверка состояния всех компонентов после установки |
|
| Сеть | прямой выход в интернет | + статический IP |
|
||||||
|
|
||||||
## Пошаговый план миграции
|
**Что я понимаю про лицензии Astra Linux:**
|
||||||
|
|
||||||
### Этап 1. Подготовка
|
- **Astra SE** — платная (~2-5 тыс. ₽/лицензия), сертифицирована ФСТЭК/ФСБ → нужна для прода с гос-требованиями
|
||||||
- [ ] Поднять чистую Astra Linux SE 1.7 ВМ (рекомендую 10.10.10.23)
|
- **Astra CE** — бесплатная, без сертификации, тот же базовый дистрибутив → можно использовать для дева и тестов, а для прода докупить SE
|
||||||
- [ ] Доступ root по SSH
|
- **Debian 12** — полностью бесплатный, технически на 95% совместим с Astra (один и тот же базовый дистрибутив), ИШ скорее всего тоже взлетит, но НРД официально не поддерживает
|
||||||
- [ ] Прямой выход в интернет (для скачивания 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 используется Валидата | Получить дистрибутив Валидаты у НРД, поставить заново |
|
| **`install.sh`** | сразу после поднятия ВМ | Главный скрипт. Делает всё одной командой |
|
||||||
| Сертификаты в `/var/opt/cprocsp/keys/` | Формат КриптоПро ≠ формат Валидаты | Сертификат УЦ МБ — получить заново или экспортировать с КриптоПро и импортировать в Валидата (если совместимый формат) |
|
| **`install-validata.sh`** | когда придёт Валидата от НРД | Установка СКЗИ Валидата CSP |
|
||||||
| Локальные кастомизации systemd | install.sh ставит свой unit | Сравнить /etc/systemd/system/bj-server.service до/после |
|
| **`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://<ip>: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)
|
| `bj-server.service не active` | `journalctl -u bj-server -n 50` |
|
||||||
4. Health-check: `sudo bash deploy/astra/healthcheck.sh`
|
| HTTP 200 не отвечает | проверь что :8080 открыт; `ss -tlnp \| grep 8080` |
|
||||||
5. Поддержка НРД по ИШ/Валидате: `soed@nsd.ru`, по форматам M2M: `M2MOST@nsd.ru`
|
| Миграции не накатились | `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 МОСТ.** На нашей стороне всё уже готово — задержки только во внешних запросах.
|
||||||
|
|||||||
+287
-138
@@ -1,174 +1,265 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# install.sh — установка bj-server на чистую Astra Linux Special Edition 1.7.
|
# install.sh — установка Bridge-and-Join-s одной командой.
|
||||||
#
|
#
|
||||||
# Что делает:
|
# ЦЕЛЕВАЯ АУДИТОРИЯ: оператор без знания Linux/Go. Просто запускает строку:
|
||||||
# 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
|
# 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)
|
# - Astra Linux Special Edition 1.6 / 1.7 (платная, для прод)
|
||||||
# --no-postgres не поднимать postgres контейнер (если БД где-то снаружи)
|
# - Astra Linux Common Edition / 1.8 (бесплатная)
|
||||||
# --skip-build пропустить go build (если бинарник уже лежит)
|
# - 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
|
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}"
|
BRANCH="${BRANCH:-main}"
|
||||||
BIND_ADDR="${BIND_ADDR:-:8080}"
|
BIND_ADDR="${BIND_ADDR:-:8080}"
|
||||||
SKIP_POSTGRES=0
|
ISH_DEB_URL="${ISH_DEB_URL:-https://old.nsd.ru/upload/docs/edo/po/igate_100.0-765_amd64.deb}"
|
||||||
SKIP_BUILD=0
|
SKIP_ISH=0
|
||||||
|
NON_INTERACTIVE="${NON_INTERACTIVE:-0}"
|
||||||
|
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
--git-url=*) GIT_URL="${arg#*=}" ;;
|
--skip-ish) SKIP_ISH=1 ;;
|
||||||
--branch=*) BRANCH="${arg#*=}" ;;
|
|
||||||
--bind=*) BIND_ADDR="${arg#*=}" ;;
|
--bind=*) BIND_ADDR="${arg#*=}" ;;
|
||||||
--no-postgres) SKIP_POSTGRES=1 ;;
|
--branch=*) BRANCH="${arg#*=}" ;;
|
||||||
--skip-build) SKIP_BUILD=1 ;;
|
--yes|-y) NON_INTERACTIVE=1 ;;
|
||||||
--help|-h)
|
|
||||||
sed -n '2,/^set/p' "$0" | head -n -1 | sed 's/^# //;s/^#//'
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
log() { echo -e "\033[1;34m[bj-install]\033[0m $*"; }
|
# ---- утилиты вывода ----
|
||||||
warn() { echo -e "\033[1;33m[bj-install WARN]\033[0m $*" >&2; }
|
NS=$(date +%s)
|
||||||
fail() { echo -e "\033[1;31m[bj-install FAIL]\033[0m $*" >&2; exit 1; }
|
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
|
if [ -r /etc/astra_version ]; then
|
||||||
ASTRA_VER=$(cat /etc/astra_version)
|
OS_NAME="Astra Linux $(cat /etc/astra_version)"
|
||||||
log "Astra Linux: $ASTRA_VER ✓"
|
OS_KIND="astra"
|
||||||
elif grep -qi astra /etc/os-release 2>/dev/null; then
|
elif [ -r /etc/os-release ]; then
|
||||||
ASTRA_VER=$(grep '^PRETTY_NAME' /etc/os-release | cut -d'"' -f2)
|
. /etc/os-release
|
||||||
log "Astra Linux: $ASTRA_VER ✓"
|
OS_NAME="$PRETTY_NAME"
|
||||||
else
|
case "${ID:-}" in
|
||||||
warn "Это не Astra Linux. Скрипт рассчитан на Astra SE 1.6+/1.7."
|
astra) OS_KIND="astra" ;;
|
||||||
warn "Для других Debian-based (Ubuntu, Debian) большая часть шагов сработает,"
|
debian) OS_KIND="debian" ;;
|
||||||
warn "но ИШ потом не встанет без Astra Linux SE. Продолжить? (y/N)"
|
ubuntu) OS_KIND="ubuntu" ;;
|
||||||
read -r REPLY < /dev/tty
|
*)
|
||||||
[ "$REPLY" = "y" ] || fail "Прервано пользователем"
|
case "${ID_LIKE:-}" in
|
||||||
|
*debian*) OS_KIND="debian-like" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
ok "Обнаружено: $OS_NAME"
|
||||||
|
|
||||||
# ---- 2. Зависимости системы ----
|
case "$OS_KIND" in
|
||||||
log "Шаг 2/8: установка системных зависимостей через apt"
|
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
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
apt-get update -qq
|
apt-get update -qq >/dev/null
|
||||||
apt-get install -y -qq \
|
apt-get install -y -qq \
|
||||||
ca-certificates \
|
ca-certificates curl wget git tar gzip \
|
||||||
curl \
|
podman postgresql-client \
|
||||||
git \
|
>/dev/null 2>&1
|
||||||
podman \
|
# podman-compose доступен либо как apt-пакет, либо как pip — пробуем оба
|
||||||
podman-compose \
|
if ! command -v podman-compose >/dev/null 2>&1; then
|
||||||
postgresql-client \
|
apt-get install -y -qq podman-compose >/dev/null 2>&1 || \
|
||||||
systemd \
|
apt-get install -y -qq python3-pip >/dev/null 2>&1 && pip3 install --quiet podman-compose 2>/dev/null || true
|
||||||
|| fail "apt-get install failed"
|
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+"
|
# ШАГ 3/9. Go 1.24+
|
||||||
GO_VERSION_REQUIRED="1.24"
|
# ============================================================
|
||||||
|
step "3/9: Go 1.24+"
|
||||||
need_go=1
|
need_go=1
|
||||||
if command -v go >/dev/null 2>&1; then
|
if command -v go >/dev/null 2>&1; then
|
||||||
GO_HAVE=$(go version | awk '{print $3}' | sed 's/go//')
|
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
|
if printf '%s\n%s' "1.24" "$GO_HAVE" | sort -V | head -1 | grep -q '^1.24$'; then
|
||||||
log "Go $GO_HAVE ✓"
|
ok "Go $GO_HAVE — подходит"
|
||||||
need_go=0
|
need_go=0
|
||||||
else
|
else
|
||||||
warn "Go $GO_HAVE слишком старый, нужен $GO_VERSION_REQUIRED+"
|
warn "Go $GO_HAVE — слишком старый, обновляю"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [ "$need_go" = 1 ]; then
|
if [ "$need_go" = 1 ]; then
|
||||||
GO_TAR=/tmp/go.tar.gz
|
GO_VER="1.24.0"
|
||||||
log "Качаю Go $GO_VERSION_REQUIRED ..."
|
ok "качаю Go $GO_VER с go.dev (~70 МБ)..."
|
||||||
curl -sSL "https://go.dev/dl/go${GO_VERSION_REQUIRED}.linux-amd64.tar.gz" -o "$GO_TAR" \
|
curl -sSL "https://go.dev/dl/go${GO_VER}.linux-amd64.tar.gz" -o /tmp/go.tar.gz \
|
||||||
|| fail "не получилось скачать Go (нужен прямой выход в интернет)"
|
|| fail "не получилось скачать Go (нужен интернет)"
|
||||||
rm -rf /usr/local/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/go /usr/local/bin/go
|
||||||
ln -sf /usr/local/go/bin/gofmt /usr/local/bin/gofmt
|
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
|
fi
|
||||||
|
|
||||||
# ---- 4. Пользователь bj + каталоги ----
|
# ============================================================
|
||||||
log "Шаг 4/8: пользователь bj и каталоги"
|
# ШАГ 4/9. Пользователь bj и каталоги
|
||||||
|
# ============================================================
|
||||||
|
step "4/9: системный пользователь bj и каталоги"
|
||||||
if ! id bj >/dev/null 2>&1; then
|
if ! id bj >/dev/null 2>&1; then
|
||||||
useradd --system --create-home --home-dir /var/lib/bj --shell /bin/bash bj
|
useradd --system --create-home --home-dir /var/lib/bj --shell /bin/bash bj
|
||||||
log "Создан пользователь bj"
|
ok "создан пользователь bj"
|
||||||
|
else
|
||||||
|
ok "пользователь bj уже существует"
|
||||||
fi
|
fi
|
||||||
install -d -o bj -g bj -m 0755 /opt/bj /var/lib/bj /var/log/bj
|
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
|
# ШАГ 5/9. Клон репо и сборка bj-server
|
||||||
log "Шаг 5/8: исходники в $SRC_DIR"
|
# ============================================================
|
||||||
if [ -d "$SRC_DIR/.git" ]; then
|
step "5/9: клон репозитория и сборка bj-server"
|
||||||
log "Репо уже есть, обновляю до origin/$BRANCH"
|
SRC=/opt/bj/src
|
||||||
git -C "$SRC_DIR" fetch --quiet origin
|
if [ -d "$SRC/.git" ]; then
|
||||||
git -C "$SRC_DIR" checkout --quiet "$BRANCH"
|
sudo -u bj -H git -C "$SRC" fetch --quiet origin
|
||||||
git -C "$SRC_DIR" reset --hard --quiet "origin/$BRANCH"
|
sudo -u bj -H git -C "$SRC" reset --hard --quiet "origin/$BRANCH"
|
||||||
|
ok "репо обновлено до $BRANCH"
|
||||||
else
|
else
|
||||||
git clone --quiet --branch "$BRANCH" "$GIT_URL" "$SRC_DIR" \
|
sudo -u bj -H git clone --quiet --branch "$BRANCH" "$REPO_URL" "$SRC" \
|
||||||
|| fail "git clone failed (проверь GIT_URL и сеть)"
|
|| fail "git clone failed"
|
||||||
|
ok "репо склонирован"
|
||||||
fi
|
fi
|
||||||
chown -R bj:bj "$SRC_DIR"
|
chown -R bj:bj "$SRC"
|
||||||
|
|
||||||
# ---- 6. Сборка bj-server ----
|
ok "компиляция bj-server..."
|
||||||
log "Шаг 6/8: сборка bj-server"
|
sudo -u bj -H bash -c "cd $SRC && /usr/local/bin/go build -o /opt/bj/bj-server ./cmd/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"
|
|| fail "go build failed"
|
||||||
chown bj:bj /opt/bj/bj-server
|
chown bj:bj /opt/bj/bj-server
|
||||||
chmod 0755 /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 "бинарник: /opt/bj/bj-server ($(du -h /opt/bj/bj-server | awk '{print $1}'))"
|
||||||
fi
|
|
||||||
|
|
||||||
# Web-templates встроены через go:embed — отдельно копировать не нужно.
|
# ============================================================
|
||||||
|
# ШАГ 6/9. PostgreSQL в podman + миграции
|
||||||
# ---- 7. PostgreSQL ----
|
# ============================================================
|
||||||
if [ "$SKIP_POSTGRES" = "1" ]; then
|
step "6/9: PostgreSQL в podman + миграции БД"
|
||||||
log "Шаг 7/8: PostgreSQL пропущен (--no-postgres)"
|
cd "$SRC"
|
||||||
else
|
if ! podman ps --format '{{.Names}}' 2>/dev/null | grep -qx bj-postgres; then
|
||||||
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 \
|
sudo -u bj -H podman-compose -f deploy/docker-compose/docker-compose.yml up -d postgres \
|
||||||
|| warn "podman-compose не сработал — БД нужно поднять руками"
|
2>/dev/null || {
|
||||||
sleep 3
|
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
|
fi
|
||||||
# Накат миграций
|
# Ждём pg_isready
|
||||||
for mig in migrations/fansy-store/*.sql migrations/m2m-core/*.sql; do
|
for i in 1 2 3 4 5 6 7 8 9 10; do
|
||||||
log " миграция: $(basename "$mig")"
|
if sudo -u bj -H podman exec bj-postgres pg_isready -U bj -d bj >/dev/null 2>&1; then
|
||||||
sudo -u bj -H podman exec -i bj-postgres psql -U bj -d bj < "$mig" 2>/dev/null || true
|
ok "PostgreSQL готов"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 2
|
||||||
done
|
done
|
||||||
fi
|
|
||||||
|
|
||||||
# ---- 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 <<EOF
|
||||||
|
{
|
||||||
|
"postgres": {"dsn": "postgres://bj:bj_dev@127.0.0.1:5432/bj?sslmode=disable"},
|
||||||
|
"crypto": {"provider": "stub", "socket_path": "/run/bj/crypto.sock"},
|
||||||
|
"nsd": {},
|
||||||
|
"lk": {},
|
||||||
|
"ca_certs": {},
|
||||||
|
"news": {},
|
||||||
|
"updated_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chown bj:bj /var/lib/bj/.bj/setup.json
|
||||||
|
chmod 0600 /var/lib/bj/.bj/setup.json
|
||||||
|
ok "DSN сохранён в /var/lib/bj/.bj/setup.json"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ШАГ 7/9. systemd unit
|
||||||
|
# ============================================================
|
||||||
|
step "7/9: systemd unit для bj-server"
|
||||||
cat > /etc/systemd/system/bj-server.service <<EOF
|
cat > /etc/systemd/system/bj-server.service <<EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Bridge-and-Join-s — единый сервис M2M-переводов
|
Description=Bridge-and-Join-s — единый сервис M2M-переводов
|
||||||
Documentation=$GIT_URL
|
Documentation=$REPO_URL
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
Wants=network-online.target
|
Wants=network-online.target
|
||||||
|
|
||||||
@@ -176,7 +267,7 @@ Wants=network-online.target
|
|||||||
Type=simple
|
Type=simple
|
||||||
User=bj
|
User=bj
|
||||||
Group=bj
|
Group=bj
|
||||||
WorkingDirectory=/opt/bj/src
|
WorkingDirectory=$SRC
|
||||||
ExecStart=/opt/bj/bj-server
|
ExecStart=/opt/bj/bj-server
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
@@ -186,15 +277,11 @@ Environment=BJ_SETUP_PATH=/var/lib/bj/.bj/setup.json
|
|||||||
Environment=BJ_M2M_SENDER=MC0079200000
|
Environment=BJ_M2M_SENDER=MC0079200000
|
||||||
Environment=BJ_M2M_RECEIVER=MC0010300000
|
Environment=BJ_M2M_RECEIVER=MC0010300000
|
||||||
|
|
||||||
# Безопасность
|
|
||||||
NoNewPrivileges=true
|
NoNewPrivileges=true
|
||||||
ProtectSystem=strict
|
ProtectSystem=strict
|
||||||
ProtectHome=true
|
ProtectHome=true
|
||||||
ReadWritePaths=/var/lib/bj /var/log/bj
|
ReadWritePaths=/var/lib/bj /var/log/bj
|
||||||
PrivateTmp=true
|
PrivateTmp=true
|
||||||
ProtectKernelTunables=true
|
|
||||||
ProtectKernelModules=true
|
|
||||||
ProtectControlGroups=true
|
|
||||||
|
|
||||||
StandardOutput=append:/var/log/bj/bj-server.log
|
StandardOutput=append:/var/log/bj/bj-server.log
|
||||||
StandardError=append:/var/log/bj/bj-server.err
|
StandardError=append:/var/log/bj/bj-server.err
|
||||||
@@ -202,34 +289,96 @@ StandardError=append:/var/log/bj/bj-server.err
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable bj-server >/dev/null 2>&1
|
systemctl enable bj-server >/dev/null 2>&1
|
||||||
systemctl restart bj-server
|
systemctl restart bj-server
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
if systemctl is-active --quiet bj-server; then
|
if systemctl is-active --quiet bj-server; then
|
||||||
log "✓ bj-server запущен"
|
ok "bj-server.service active"
|
||||||
else
|
else
|
||||||
warn "bj-server не стартанул, см. journalctl -u bj-server"
|
warn "bj-server не стартанул, см. journalctl -u bj-server -n 30"
|
||||||
systemctl status bj-server --no-pager | tail -10
|
|
||||||
fi
|
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}')
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
echo
|
echo
|
||||||
echo "================================================================"
|
echo "╔══════════════════════════════════════════════════════════════════╗"
|
||||||
echo " bj-server установлен"
|
echo "║ УСТАНОВКА BJ-SERVER ЗАВЕРШЕНА ║"
|
||||||
echo "================================================================"
|
echo "╚══════════════════════════════════════════════════════════════════╝"
|
||||||
echo " Web-админка: http://$IP$BIND_ADDR/admin/"
|
echo
|
||||||
echo " Wizard: http://$IP$BIND_ADDR/admin/wizard"
|
echo " Веб-админка: http://$IP${BIND_ADDR}/admin/"
|
||||||
echo " Архитектура: http://$IP$BIND_ADDR/admin/help/architecture"
|
echo " Мастер настройки: http://$IP${BIND_ADDR}/admin/wizard"
|
||||||
echo " Логи: journalctl -u bj-server -f"
|
echo " Архитектура: http://$IP${BIND_ADDR}/admin/help/architecture"
|
||||||
echo " tail -f /var/log/bj/bj-server.log"
|
echo " Новости: http://$IP${BIND_ADDR}/admin/news"
|
||||||
|
echo
|
||||||
|
echo " Логи: tail -f /var/log/bj/bj-server.log"
|
||||||
echo " Сервис: systemctl status bj-server"
|
echo " Сервис: systemctl status bj-server"
|
||||||
echo
|
echo
|
||||||
echo " Следующие шаги:"
|
echo " ──── ЧТО ОСТАЛОСЬ СДЕЛАТЬ (НЕ АВТОМАТИЧЕСКИ) ───────────────"
|
||||||
echo " 1. Установить Валидата CSP — sudo bash deploy/astra/install-validata.sh"
|
echo
|
||||||
echo " 2. Установить ИШ — sudo bash deploy/astra/install-ish.sh"
|
echo " 1. Запросить СКЗИ Валидата CSP у НРД:"
|
||||||
echo " 3. Открыть /admin/wizard и пройти настройку"
|
echo " Email: soed@nsd.ru"
|
||||||
echo "================================================================"
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user