#!/usr/bin/env bash set -euo pipefail APP_NAME="chat-one-service" APP_ROOT="${APP_ROOT:-/srv/chat-one-service}" REPO_URL="${REPO_URL:-}" BRANCH="${BRANCH:-main}" KEEP_RELEASES="${KEEP_RELEASES:-5}" if [[ -z "$REPO_URL" ]]; then echo "REPO_URL is required. Example:" echo " REPO_URL=git@github.com:org/chat-one-service.git scripts/deploy.sh" exit 1 fi command -v yarn >/dev/null 2>&1 || { echo "yarn is required" exit 1 } command -v pm2 >/dev/null 2>&1 || { echo "pm2 is required" exit 1 } command -v git >/dev/null 2>&1 || { echo "git is required" exit 1 } RELEASES_DIR="$APP_ROOT/releases" SHARED_DIR="$APP_ROOT/shared" CURRENT_LINK="$APP_ROOT/current" RELEASE_NAME="$(date +%Y%m%d_%H%M%S)" RELEASE_DIR="$RELEASES_DIR/$RELEASE_NAME" mkdir -p "$RELEASES_DIR" "$SHARED_DIR/logs" echo "==> Cloning repository" git clone --branch "$BRANCH" --depth 1 "$REPO_URL" "$RELEASE_DIR" if [[ ! -f "$SHARED_DIR/.env" ]]; then echo "Missing $SHARED_DIR/.env" exit 1 fi ln -sfn "$SHARED_DIR/.env" "$RELEASE_DIR/.env" cd "$RELEASE_DIR" echo "==> Installing dependencies" yarn install --frozen-lockfile echo "==> Building project" yarn build echo "==> Running database migrations" npx prisma migrate deploy echo "==> Switching current symlink" ln -sfn "$RELEASE_DIR" "$CURRENT_LINK" if pm2 describe "$APP_NAME" >/dev/null 2>&1; then echo "==> Reloading PM2 process" pm2 reload "$APP_NAME" --update-env else echo "==> Starting PM2 process" pm2 start "$CURRENT_LINK/ecosystem.config.js" --env production fi echo "==> Smoke check" curl -fsS "http://127.0.0.1:${PORT:-3000}/api/docs" >/dev/null echo "==> Cleaning old releases (keep $KEEP_RELEASES)" ls -1dt "$RELEASES_DIR"/* 2>/dev/null | tail -n +"$((KEEP_RELEASES + 1))" | xargs -r rm -rf echo "Deploy success. Current release: $RELEASE_DIR"