#!/bin/bash # install.sh — установка bj-server на чистую Astra Linux Special Edition 1.7. # # Что делает: # 1. Проверяет ОС (Astra Linux) # 2. Устанавливает зависимости (Go, podman, postgresql-client, certmgr-...) # 3. Создаёт системного пользователя bj и каталоги /opt/bj /var/lib/bj # 4. Клонирует/обновляет репозиторий # 5. Собирает bj-server (go build) # 6. Кладёт systemd unit и стартует сервис # 7. Печатает URL админки # # Запуск (на свежей Astra Linux ВМ): # curl -sSL https://git.zetit.ru/zuevav/Bridge-and-Join-s/raw/main/deploy/astra/install.sh | sudo bash # либо # sudo bash deploy/astra/install.sh # # Аргументы: # --git-url=URL репозиторий, по умолчанию https://git.zetit.ru/zuevav/Bridge-and-Join-s.git # --branch=NAME ветка, по умолчанию main # --bind=ADDR адрес слушания (по умолчанию :8080) # --no-postgres не поднимать postgres контейнер (если БД где-то снаружи) # --skip-build пропустить go build (если бинарник уже лежит) set -euo pipefail GIT_URL="${GIT_URL:-https://git.zetit.ru/zuevav/Bridge-and-Join-s.git}" BRANCH="${BRANCH:-main}" BIND_ADDR="${BIND_ADDR:-:8080}" SKIP_POSTGRES=0 SKIP_BUILD=0 for arg in "$@"; do case "$arg" in --git-url=*) GIT_URL="${arg#*=}" ;; --branch=*) BRANCH="${arg#*=}" ;; --bind=*) BIND_ADDR="${arg#*=}" ;; --no-postgres) SKIP_POSTGRES=1 ;; --skip-build) SKIP_BUILD=1 ;; --help|-h) sed -n '2,/^set/p' "$0" | head -n -1 | sed 's/^# //;s/^#//' exit 0 ;; esac done log() { echo -e "\033[1;34m[bj-install]\033[0m $*"; } warn() { echo -e "\033[1;33m[bj-install WARN]\033[0m $*" >&2; } fail() { echo -e "\033[1;31m[bj-install FAIL]\033[0m $*" >&2; exit 1; } # ---- 0. Проверка прав ---- [ "$EUID" -eq 0 ] || fail "Запускать от root (sudo bash $0)" # ---- 1. Проверка ОС ---- log "Шаг 1/8: проверка ОС" if [ -r /etc/astra_version ]; then ASTRA_VER=$(cat /etc/astra_version) log "Astra Linux: $ASTRA_VER ✓" elif grep -qi astra /etc/os-release 2>/dev/null; then ASTRA_VER=$(grep '^PRETTY_NAME' /etc/os-release | cut -d'"' -f2) log "Astra Linux: $ASTRA_VER ✓" else warn "Это не Astra Linux. Скрипт рассчитан на Astra SE 1.6+/1.7." warn "Для других Debian-based (Ubuntu, Debian) большая часть шагов сработает," warn "но ИШ потом не встанет без Astra Linux SE. Продолжить? (y/N)" read -r REPLY < /dev/tty [ "$REPLY" = "y" ] || fail "Прервано пользователем" fi # ---- 2. Зависимости системы ---- log "Шаг 2/8: установка системных зависимостей через apt" export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq \ ca-certificates \ curl \ git \ podman \ podman-compose \ postgresql-client \ systemd \ || fail "apt-get install failed" # ---- 3. Go ---- log "Шаг 3/8: проверка/установка Go 1.24+" GO_VERSION_REQUIRED="1.24" need_go=1 if command -v go >/dev/null 2>&1; then GO_HAVE=$(go version | awk '{print $3}' | sed 's/go//') if [ "$(printf '%s\n%s' "$GO_VERSION_REQUIRED" "$GO_HAVE" | sort -V | head -1)" = "$GO_VERSION_REQUIRED" ]; then log "Go $GO_HAVE ✓" need_go=0 else warn "Go $GO_HAVE слишком старый, нужен $GO_VERSION_REQUIRED+" fi fi if [ "$need_go" = 1 ]; then GO_TAR=/tmp/go.tar.gz log "Качаю Go $GO_VERSION_REQUIRED ..." curl -sSL "https://go.dev/dl/go${GO_VERSION_REQUIRED}.linux-amd64.tar.gz" -o "$GO_TAR" \ || fail "не получилось скачать Go (нужен прямой выход в интернет)" rm -rf /usr/local/go tar -C /usr/local -xzf "$GO_TAR" ln -sf /usr/local/go/bin/go /usr/local/bin/go ln -sf /usr/local/go/bin/gofmt /usr/local/bin/gofmt log "Go установлен в /usr/local/go" fi # ---- 4. Пользователь bj + каталоги ---- log "Шаг 4/8: пользователь bj и каталоги" if ! id bj >/dev/null 2>&1; then useradd --system --create-home --home-dir /var/lib/bj --shell /bin/bash bj log "Создан пользователь bj" fi install -d -o bj -g bj -m 0755 /opt/bj /var/lib/bj /var/log/bj install -d -o bj -g bj -m 0700 /var/lib/bj/.bj # ~/.bj для setup.json # ---- 5. Клон/обновление репо ---- SRC_DIR=/opt/bj/src log "Шаг 5/8: исходники в $SRC_DIR" if [ -d "$SRC_DIR/.git" ]; then log "Репо уже есть, обновляю до origin/$BRANCH" git -C "$SRC_DIR" fetch --quiet origin git -C "$SRC_DIR" checkout --quiet "$BRANCH" git -C "$SRC_DIR" reset --hard --quiet "origin/$BRANCH" else git clone --quiet --branch "$BRANCH" "$GIT_URL" "$SRC_DIR" \ || fail "git clone failed (проверь GIT_URL и сеть)" fi chown -R bj:bj "$SRC_DIR" # ---- 6. Сборка bj-server ---- log "Шаг 6/8: сборка bj-server" if [ "$SKIP_BUILD" = "1" ]; then log "пропущено (--skip-build)" else sudo -u bj -H bash -c "cd $SRC_DIR && /usr/local/bin/go build -o /opt/bj/bj-server ./cmd/bj-server" \ || fail "go build failed" chown bj:bj /opt/bj/bj-server chmod 0755 /opt/bj/bj-server log "Бинарник: /opt/bj/bj-server ($(du -h /opt/bj/bj-server | awk '{print $1}'))" fi # Web-templates встроены через go:embed — отдельно копировать не нужно. # ---- 7. PostgreSQL ---- if [ "$SKIP_POSTGRES" = "1" ]; then log "Шаг 7/8: PostgreSQL пропущен (--no-postgres)" else log "Шаг 7/8: PostgreSQL в podman-контейнере" cd "$SRC_DIR" if podman ps --format '{{.Names}}' | grep -qx bj-postgres; then log "Контейнер bj-postgres уже запущен" else sudo -u bj -H podman-compose -f deploy/docker-compose/docker-compose.yml up -d postgres \ || warn "podman-compose не сработал — БД нужно поднять руками" sleep 3 fi # Накат миграций for mig in migrations/fansy-store/*.sql migrations/m2m-core/*.sql; do log " миграция: $(basename "$mig")" sudo -u bj -H podman exec -i bj-postgres psql -U bj -d bj < "$mig" 2>/dev/null || true done fi # ---- 8. systemd unit ---- log "Шаг 8/8: systemd unit" cat > /etc/systemd/system/bj-server.service </dev/null 2>&1 systemctl restart bj-server sleep 2 if systemctl is-active --quiet bj-server; then log "✓ bj-server запущен" else warn "bj-server не стартанул, см. journalctl -u bj-server" systemctl status bj-server --no-pager | tail -10 fi # ---- Финал ---- IP=$(hostname -I | awk '{print $1}') echo echo "================================================================" echo " bj-server установлен" echo "================================================================" echo " Web-админка: http://$IP$BIND_ADDR/admin/" echo " Wizard: http://$IP$BIND_ADDR/admin/wizard" echo " Архитектура: http://$IP$BIND_ADDR/admin/help/architecture" echo " Логи: journalctl -u bj-server -f" echo " tail -f /var/log/bj/bj-server.log" echo " Сервис: systemctl status bj-server" echo echo " Следующие шаги:" echo " 1. Установить Валидата CSP — sudo bash deploy/astra/install-validata.sh" echo " 2. Установить ИШ — sudo bash deploy/astra/install-ish.sh" echo " 3. Открыть /admin/wizard и пройти настройку" echo "================================================================"