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
+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 "================================================================"