bac55cbdfd
Поскольку Интеграционный шлюз НРД (ИШ) официально работает только на 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%
236 lines
8.9 KiB
Bash
Executable File
236 lines
8.9 KiB
Bash
Executable File
#!/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 "================================================================"
|