#!/usr/bin/env bash # ============================================================ # vendor.sh — скачивает ВСЕ npm-зависимости + Docker-образы # в vendor/ для оффлайн-билда в изолированной среде. # # Запускать на машине С ИНТЕРНЕТОМ. Результат: # vendor/npm-cache/ — npm cache (все tarballs) # vendor/npm-cache.tar.gz — архив npm cache # vendor/docker-images.tar — base Docker images # # Перенести vendor/ на изолированную машину. # ============================================================ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" VENDOR_DIR="$REPO_ROOT/vendor" CACHE_DIR="$VENDOR_DIR/npm-cache" echo "=== GooSeek vendor: скачивание зависимостей ===" echo "Репозиторий: $REPO_ROOT" echo "Vendor: $VENDOR_DIR" echo "" # ---------------------------------------------------------- # 1. npm cache — все сервисы # ---------------------------------------------------------- rm -rf "$CACHE_DIR" mkdir -p "$CACHE_DIR" for pkg in "$REPO_ROOT"/services/*/package.json; do svc_dir="$(dirname "$pkg")" svc_name="$(basename "$svc_dir")" if [ ! -f "$svc_dir/package-lock.json" ] && [ ! -f "$REPO_ROOT/package-lock.json" ]; then echo "--- Пропускаю $svc_name (нет package-lock.json) ---" continue fi echo "=== npm cache: $svc_name ===" (cd "$svc_dir" && npm install --cache "$CACHE_DIR" --prefer-offline --ignore-scripts 2>&1) || { echo " WARN: npm install для $svc_name завершился с ошибкой, продолжаем..." } rm -rf "$svc_dir/node_modules" done echo "=== npm cache: workspace root (web-svc, auth-svc) ===" (cd "$REPO_ROOT" && npm install --cache "$CACHE_DIR" --prefer-offline --ignore-scripts 2>&1) || { echo " WARN: npm install для workspace root завершился с ошибкой, продолжаем..." } rm -rf "$REPO_ROOT/node_modules" for svc_dir in "$REPO_ROOT"/services/*/; do rm -rf "$svc_dir/node_modules" done echo "" echo "=== Упаковка npm cache ===" tar -czf "$VENDOR_DIR/npm-cache.tar.gz" -C "$VENDOR_DIR" npm-cache NPM_SIZE=$(du -sh "$VENDOR_DIR/npm-cache.tar.gz" | cut -f1) echo " npm-cache.tar.gz: $NPM_SIZE" # ---------------------------------------------------------- # 2. Docker base images # ---------------------------------------------------------- IMAGES=( "node:22-alpine" "node:20-alpine" "redis:7-alpine" "searxng/searxng:latest" "ghost:6-alpine" "mysql:8" "postgres:16-alpine" "willfarrell/autoheal:latest" "unclecode/crawl4ai:latest" ) echo "" echo "=== Docker images: pull ===" for img in "${IMAGES[@]}"; do echo " pull $img" docker pull "$img" 2>&1 | tail -1 done echo "" echo "=== Docker images: save ===" docker save -o "$VENDOR_DIR/docker-images.tar" "${IMAGES[@]}" DOCKER_SIZE=$(du -sh "$VENDOR_DIR/docker-images.tar" | cut -f1) echo " docker-images.tar: $DOCKER_SIZE" # ---------------------------------------------------------- # Итого # ---------------------------------------------------------- echo "" echo "=== Готово ===" echo " $VENDOR_DIR/npm-cache.tar.gz ($NPM_SIZE)" echo " $VENDOR_DIR/docker-images.tar ($DOCKER_SIZE)" echo "" echo "Перенесите vendor/ на изолированную машину:" echo " scp -r vendor/ user@server:~/GooSeek/vendor/"