Edit: /opt/canhelp/scripts/deploy.sh (4948B)
#!/usr/bin/env bash
# =============================================================================
# deploy.sh — клонирование / обновление, сборка, миграции, перезапуск
# Использование:
# scripts/deploy.sh — обновление (git pull + rebuild)
# scripts/deploy.sh --fresh — первый деплой (git clone)
# =============================================================================
set -euo pipefail
APP_DIR="/opt/canhelp"
REPO="https://github.com/doncodeserg/CanHelp.git"
BRANCH="master"
ENV_FILE="$APP_DIR/.env"
LOG_FILE="$APP_DIR/deploy.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
mkdir -p "$APP_DIR"
: > "$LOG_FILE"
log() { echo "[$TIMESTAMP] $*" | tee -a "$LOG_FILE"; }
log "====== DEPLOY START ======"
# ─── 1. Проверка .env ─────────────────────────────────────────────────────────
if [[ ! -f "$ENV_FILE" ]]; then
echo "ОШИБКА: $ENV_FILE не найден. Создайте его перед деплоем."
exit 1
fi
# ─── 2. Клонирование или обновление ──────────────────────────────────────────
if [[ "${1:-}" == "--fresh" ]]; then
log "[1/7] Клонирование репозитория"
# rm -rf "$APP_DIR"
git clone --branch "$BRANCH" "$REPO" "$APP_DIR"
cp "$ENV_FILE" "$APP_DIR/.env" 2>/dev/null || true
else
log "[1/7] Обновление репозитория (git pull)"
cd "$APP_DIR"
git fetch origin "$BRANCH"
git checkout "$BRANCH" 2>/dev/null || git checkout -b "$BRANCH" "origin/$BRANCH"
git reset --hard "FETCH_HEAD"
fi
cd "$APP_DIR"
# ─── 3. Docker (PostgreSQL + Redis) ──────────────────────────────────────────
log "[2/7] Запуск Docker-сервисов"
docker compose up -d --quiet-pull
# Ждём готовности PostgreSQL
for i in {1..20}; do
docker compose exec -T postgres pg_isready -U canhelp -d canhelp &>/dev/null && break
sleep 2
done
# ─── 4. npm install ──────────────────────────────────────────────────────────
log "[3/7] Установка npm-зависимостей"
npm ci --include=dev
# ─── 5. Миграции ─────────────────────────────────────────────────────────────
log "[4/7] Миграции базы данных"
# Проверка подключения к БД
set -a
source "$ENV_FILE"
set +a
if ! docker compose exec -T postgres psql -U canhelp -c '\q' &>/dev/null; then
log "ОШИБКА: не удаётся подключиться к PostgreSQL. Обновите пароль:"
log " docker compose exec postgres psql -U canhelp -c \"ALTER USER canhelp WITH PASSWORD '\${DB_PASSWORD}'\""
log " Затем перезапустите деплой."
exit 1
fi
DRIZZLE_BIN="$APP_DIR/node_modules/.bin/drizzle-kit"
[[ ! -f "$DRIZZLE_BIN" ]] && DRIZZLE_BIN="$APP_DIR/packages/db/node_modules/.bin/drizzle-kit"
(cd "$APP_DIR/packages/db" && "$DRIZZLE_BIN" migrate)
# ─── 6. Сборка приложений ────────────────────────────────────────────────────
log "[5/7] Сборка Web"
if [[ -f "$APP_DIR/apps/web/.env.local" ]]; then
log "[5/7] ВНИМАНИЕ: найден apps/web/.env.local, временно отключаю его для production build"
mv "$APP_DIR/apps/web/.env.local" "$APP_DIR/apps/web/.env.local.bak"
fi
(cd "$APP_DIR/apps/web" && "$APP_DIR/node_modules/.bin/next" build)
if [[ -f "$APP_DIR/apps/web/.env.local.bak" ]]; then
mv "$APP_DIR/apps/web/.env.local.bak" "$APP_DIR/apps/web/.env.local"
fi
# ─── 8. Директории ───────────────────────────────────────────────────────────
mkdir -p "$APP_DIR/apps/api/uploads"
# ─── 9. Перезапуск PM2 ───────────────────────────────────────────────────────
log "[6/7] Перезапуск сервисов через PM2"
if pm2 list | grep -q "canhelp"; then
pm2 reload ecosystem.config.js --update-env
else
pm2 start ecosystem.config.js
pm2 save
fi
log "====== DEPLOY DONE ======"
echo ""
echo "✓ Деплой завершён. Проверьте статус: pm2 status"