#!/bin/bash set -e ENVIRONMENT=${1:-beta} TIMESTAMP=$(date +%Y%m%d-%H%M%S) APP_NAME="your-app-name" # مسیرهای مختلف برای محیط‌های مختلف if [ "$ENVIRONMENT" = "production" ]; then DEPLOY_PATH="/opt/production/$APP_NAME" PM2_ECOSYSTEM="ecosystem.config.js" else DEPLOY_PATH="/opt/beta/$APP_NAME" PM2_ECOSYSTEM="ecosystem.beta.config.js" fi echo "🚀 Starting deployment to $ENVIRONMENT environment..." # ایجاد دایرکتوری در صورت عدم وجود sudo mkdir -p $DEPLOY_PATH sudo mkdir -p $DEPLOY_PATH/releases sudo mkdir -p $DEPLOY_PATH/shared/logs # استخراج آرشیو جدید RELEASE_DIR="$DEPLOY_PATH/releases/release-$TIMESTAMP" sudo mkdir -p $RELEASE_DIR # پیدا کردن آخرین فایل آرشیو ARCHIVE_FILE=$(ls -t /tmp/deploy-*.tar.gz | head -n1) sudo tar -xzf $ARCHIVE_FILE -C $RELEASE_DIR # نصب dependencies cd $RELEASE_DIR sudo npm ci --only=production # کپی فایل‌های پیکربندی از shared if [ -f "$DEPLOY_PATH/shared/.env" ]; then sudo cp "$DEPLOY_PATH/shared/.env" $RELEASE_DIR/ fi # ایجاد symlink برای logs sudo ln -sfn $DEPLOY_PATH/shared/logs $RELEASE_DIR/logs # تست سریع برای اطمینان از صحت کد echo "🧪 Running quick tests..." sudo npm test # ذخیره کردن لینک فعلی برای rollback if [ -L "$DEPLOY_PATH/current" ]; then PREVIOUS_RELEASE=$(readlink $DEPLOY_PATH/current) echo "Previous release: $PREVIOUS_RELEASE" fi # بروزرسانی symlink به نسخه جدید sudo ln -sfn $RELEASE_DIR $DEPLOY_PATH/current # تنظیم مالکیت فایل‌ها sudo chown -R $USER:$USER $DEPLOY_PATH # راه‌اندازی/ری‌استارت PM2 cd $DEPLOY_PATH/current if pm2 list | grep -q $APP_NAME; then echo "🔄 Restarting existing PM2 process..." pm2 restart $PM2_ECOSYSTEM --env $ENVIRONMENT else echo "🆕 Starting new PM2 process..." pm2 start $PM2_ECOSYSTEM --env $ENVIRONMENT fi # ذخیره پیکربندی PM2 pm2 save echo "✅ Deployment completed successfully!" # پاک‌سازی نسخه‌های قدیمی (نگه‌داری 5 نسخه اخیر) sudo find $DEPLOY_PATH/releases -maxdepth 1 -name "release-*" -type d | sort -r | tail -n +6 | xargs sudo rm -rf # پاک‌سازی فایل آرشیو sudo rm -f $ARCHIVE_FILE echo "🧹 Cleanup completed!"