|
|
#!/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!" |