#!/usr/bin/env bash # Выкладка Lead Radar на VPS: исходники → сборка образов на сервере → контейнеры. # Запускается НА MAC из папки leadradar: ./deploy.sh # Перед первым запуском на VPS должен лежать /opt/leadradar/.env (см. deploy/.env.production.example). set -euo pipefail VPS_HOST="${VPS_HOST:-root@188.116.21.175}" SSH_KEY="${SSH_KEY:-$HOME/.ssh/yandp_vps}" REMOTE_DIR="/opt/leadradar" NPM_CONTAINER="nginx-proxy-manager" SSH="ssh -i $SSH_KEY -o IdentitiesOnly=yes" cd "$(dirname "$0")" echo "→ Проверки перед выкладкой" pnpm typecheck pnpm test # Файл compose проверяется здесь, а не на сервере: ошибка в нём не должна доезжать до выкладки. POSTGRES_PASSWORD=check APP_URL=https://check NPM_NETWORK=proxy docker compose -f deploy/docker-compose.prod.yml config -q echo "→ Загрузка исходников на $VPS_HOST" $SSH "$VPS_HOST" "mkdir -p $REMOTE_DIR/app $REMOTE_DIR/backups" rsync -az --delete -e "$SSH" \ --exclude node_modules --exclude dist --exclude data --exclude '.env' --exclude '.env.*' --exclude .git --exclude .DS_Store \ ./ "$VPS_HOST:$REMOTE_DIR/app/" echo "→ Сборка и запуск на сервере" $SSH "$VPS_HOST" REMOTE_DIR="$REMOTE_DIR" NPM_CONTAINER="$NPM_CONTAINER" bash -s <<'REMOTE' set -euo pipefail cd "$REMOTE_DIR" [ -f .env ] || { echo "Нет $REMOTE_DIR/.env — создайте его по образцу app/deploy/.env.production.example"; exit 1; } NET=$(docker inspect "$NPM_CONTAINER" -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{"\n"}}{{end}}' | head -n1) [ -n "$NET" ] || { echo "Не удалось определить сеть NPM"; exit 1; } COMPOSE="docker compose --env-file .env -f app/deploy/docker-compose.prod.yml" NPM_NETWORK="$NET" BACKUP_DIR="$REMOTE_DIR/backups" $COMPOSE up -d --build # Сервис стартует не мгновенно (миграции, запуск бота): ждём до минуты. for i in $(seq 1 30); do if docker exec "$NPM_CONTAINER" curl -sf -o /dev/null "http://leadradar-web/api/health"; then echo " ✓ NPM видит leadradar-web, API отвечает" exit 0 fi sleep 2 done echo " ⚠ leadradar-web не отвечает — смотрите: docker logs leadradar-api" exit 1 REMOTE echo "Готово."