#!/usr/bin/env bash # Запуск GooSeek в Docker (без Kubernetes) # Сервисы из deploy/k3s/deploy.config.yaml (true) # # Использование: # ./deploy/docker/run.sh # build + up (vendor если есть) # ./deploy/docker/run.sh --no-cache # build без кэша + up # ./deploy/docker/run.sh --web # только web-svc — быстро # ./deploy/docker/run.sh --up # только up (без build) # ./deploy/docker/run.sh --down # остановить # ./deploy/docker/run.sh --vendor # скачать npm + docker images в vendor/ # ./deploy/docker/run.sh --offline # строгий оффлайн-билд (vendor обязателен) # ./deploy/docker/run.sh --load-images # загрузить Docker images из vendor/ # # Оффлайн-билд: vendor/npm-cache/ монтируется в Dockerfile через additional_contexts. # Docker images: vendor/docker-images.tar загружается через docker load. set -e export DOCKER_BUILDKIT=1 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml" ENV_FILE="$REPO_ROOT/.env" VENDOR_DIR="$REPO_ROOT/vendor" VENDOR_CACHE="$VENDOR_DIR/npm-cache" VENDOR_ARCHIVE="$VENDOR_DIR/npm-cache.tar.gz" VENDOR_IMAGES="$VENDOR_DIR/docker-images.tar" cd "$REPO_ROOT" COMPOSE_ENV="docker compose -f $COMPOSE_FILE --env-file $ENV_FILE" BUILD_SERVICES=( reverse-proxy llm-svc auth-svc api-gateway geo-device-svc localization-svc discover-svc travel-svc cache-worker-tech search-svc master-agents-svc chat-svc projects-svc library-svc web-svc ) build_sequential() { local extra_flags="${1:-}" for svc in "${BUILD_SERVICES[@]}"; do echo "=== Build: $svc ===" $COMPOSE_ENV build $extra_flags "$svc" done } # ------------------------------------------------------- # ensure_vendor — распаковать npm-cache.tar.gz если нужно # ------------------------------------------------------- ensure_vendor() { if [ -d "$VENDOR_CACHE" ] && [ "$(ls -A "$VENDOR_CACHE" 2>/dev/null)" ]; then return 0 fi if [ -f "$VENDOR_ARCHIVE" ]; then echo "Распаковка $VENDOR_ARCHIVE ..." mkdir -p "$VENDOR_DIR" tar -xzf "$VENDOR_ARCHIVE" -C "$VENDOR_DIR" echo "npm-cache распакован." return 0 fi # additional_contexts в docker-compose.yml требует существующую директорию mkdir -p "$VENDOR_CACHE" return 1 } # ------------------------------------------------------- # load_docker_images — загрузить base images из архива # ------------------------------------------------------- load_docker_images() { if [ -f "$VENDOR_IMAGES" ]; then echo "Загрузка Docker images из $VENDOR_IMAGES ..." docker load -i "$VENDOR_IMAGES" echo "Docker images загружены." else echo "WARN: $VENDOR_IMAGES не найден, пропускаю загрузку images." fi } # ------------------------------------------------------- # print_status — вывод адресов сервисов # ------------------------------------------------------- print_status() { echo "" echo "Сервисы запущены:" echo " web-svc: http://localhost:3000" echo " api-gateway: http://localhost:3015" echo " auth-svc: http://localhost:3014" echo " llm-svc: http://localhost:3020" echo " chat-svc: http://localhost:3005" echo " master-agents: http://localhost:3018" echo " search-svc: http://localhost:3001" echo " redis: localhost:6379" echo " ghost: http://localhost:2368 (Admin: /ghost)" echo "" echo "Самовосстановление: healthcheck + autoheal (перезапуск unhealthy контейнеров)." } case "${1:-}" in --vendor) echo "=== Скачивание vendor (npm + Docker images) ===" bash "$SCRIPT_DIR/vendor.sh" ;; --load-images) load_docker_images ;; --offline) if ! ensure_vendor; then echo "ОШИБКА: vendor/npm-cache не найден и vendor/npm-cache.tar.gz отсутствует." echo "Сначала выполните: ./deploy/docker/run.sh --vendor" exit 1 fi load_docker_images echo "" echo "=== Оффлайн-билд ===" build_sequential $COMPOSE_ENV up -d --force-recreate print_status ;; --no-cache) ensure_vendor || echo "WARN: vendor не найден, билд будет скачивать из интернета." build_sequential "--no-cache" $COMPOSE_ENV up -d --force-recreate echo "" echo "Сервисы пересобраны без кэша и запущены." print_status ;; --web) ensure_vendor || echo "WARN: vendor не найден, билд будет скачивать из интернета." $COMPOSE_ENV build --no-cache web-svc $COMPOSE_ENV up -d --force-recreate web-svc reverse-proxy echo "" echo "web-svc пересобран и перезапущен. Обнови страницу (Ctrl+Shift+R)." ;; --down) $COMPOSE_ENV down echo "Остановлено." ;; --up) $COMPOSE_ENV up -d print_status ;; *) ensure_vendor || echo "WARN: vendor не найден, билд будет скачивать из интернета." build_sequential $COMPOSE_ENV up -d --force-recreate print_status echo "LLM: настройте .env (LLM_PROVIDER=timeweb или ollama)." ;; esac