Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
49 lines
2.4 KiB
Bash
Executable File
49 lines
2.4 KiB
Bash
Executable File
#!/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 "Готово."
|