/opt/canhelp/scripts
NameSizeModeActions
backup.sh31320755editdlrm
deploy-no-install.sh41300755editdlrm
deploy.sh49480755editdlrm
health-check.sh28050755editdlrm
install.sh26500755editdlrm
restart.sh14780755editdlrm
submit-sitemap.mjs18540644editdlrm
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"