name: Deploy on: push: branches: [main] concurrency: group: deploy-production cancel-in-progress: false jobs: deploy: name: Deploy to Production runs-on: ubuntu-latest timeout-minutes: 10 steps: - name: Deploy via SSH uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_KEY }} port: ${{ secrets.SSH_PORT }} script_stop: true script: | set -euo pipefail export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" cd /home/${{ secrets.SSH_USER }}/ss echo "$(date '+%Y-%m-%d %H:%M:%S') - Starting deployment..." echo "$(date '+%Y-%m-%d %H:%M:%S') - Pulling latest changes..." git pull origin main echo "$(date '+%Y-%m-%d %H:%M:%S') - Installing dependencies..." pnpm install --frozen-lockfile echo "$(date '+%Y-%m-%d %H:%M:%S') - Building..." pnpm build echo "$(date '+%Y-%m-%d %H:%M:%S') - Installing Playwright Chromium (if missing)..." cd apps/web && npx playwright install chromium --with-deps 2>/dev/null || true echo "$(date '+%Y-%m-%d %H:%M:%S') - Pre-rendering public pages..." pnpm prerender || echo "WARNING: Pre-render failed (non-fatal)" cd /home/${{ secrets.SSH_USER }}/ss echo "$(date '+%Y-%m-%d %H:%M:%S') - Running database migrations..." cd apps/api && pnpm db:push && cd ../.. echo "$(date '+%Y-%m-%d %H:%M:%S') - Reloading PM2 processes..." pm2 reload ecosystem.config.js echo "$(date '+%Y-%m-%d %H:%M:%S') - Deployment complete!"