راه‌اندازی و Deploy سرور

راهنمای کامل برای راه‌اندازی سرور و Deploy اپلیکیشن‌ها

مقدمه

راه‌اندازی سرور و Deploy اپلیکیشن‌ها یکی از مهم‌ترین مهارت‌های یک برنامه‌نویس است. علی سلمانیان در این مقاله، راهنمای کاملی از راه‌اندازی سرور تا Deploy اپلیکیشن‌های مختلف ارائه می‌دهد. از تنظیمات اولیه تا بهینه‌سازی و امنیت، همه چیز را پوشش می‌دهیم.

انتخاب سرور و سیستم عامل

1. انواع سرور

انتخاب نوع سرور بستگی به نیازهای پروژه دارد:

  • Shared Hosting: برای سایت‌های ساده
  • VPS (Virtual Private Server): برای پروژه‌های متوسط
  • Dedicated Server: برای پروژه‌های بزرگ
  • Cloud Server: برای مقیاس‌پذیری بالا

2. سیستم عامل

# Ubuntu Server (توصیه شده)
# - پشتیبانی طولانی مدت
# - امنیت بالا
# - مستندات کامل
# - جامعه بزرگ

# CentOS/RHEL
# - پایداری بالا
# - مناسب برای enterprise
# - امنیت قوی

# Debian
# - سبک و سریع
# - پایداری بالا
# - مناسب برای سرورهای کوچک

راه‌اندازی اولیه سرور

1. اتصال به سرور

# اتصال با SSH
ssh root@your-server-ip

# اتصال با کاربر خاص
ssh username@your-server-ip

# اتصال با کلید SSH
ssh -i /path/to/private-key username@your-server-ip

# اتصال با پورت خاص
ssh -p 2222 username@your-server-ip

# تنظیم SSH config
# ~/.ssh/config
Host myserver
    HostName your-server-ip
    User username
    Port 22
    IdentityFile ~/.ssh/id_rsa

# استفاده از config
ssh myserver

2. به‌روزرسانی سیستم

# Ubuntu/Debian
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y

# CentOS/RHEL
sudo yum update -y
# یا
sudo dnf update -y

# نصب ابزارهای ضروری
sudo apt install -y curl wget git vim htop tree unzip

# بررسی وضعیت سیستم
htop
df -h
free -h
systemctl status

3. ایجاد کاربر جدید

# ایجاد کاربر جدید
sudo adduser deploy

# اضافه کردن به گروه sudo
sudo usermod -aG sudo deploy

# تنظیم SSH key
mkdir -p /home/deploy/.ssh
cp ~/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys

# غیرفعال کردن login با root
sudo nano /etc/ssh/sshd_config
# PermitRootLogin no
sudo systemctl restart sshd

# تست اتصال با کاربر جدید
ssh deploy@your-server-ip

نصب و تنظیم Nginx

1. نصب Nginx

# نصب Nginx
sudo apt install nginx -y

# شروع سرویس
sudo systemctl start nginx
sudo systemctl enable nginx

# بررسی وضعیت
sudo systemctl status nginx

# تست Nginx
curl http://your-server-ip

# تنظیم فایروال
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable

2. تنظیم Virtual Host

# ایجاد فایل تنظیمات سایت
sudo nano /etc/nginx/sites-available/your-domain.com

# محتوای فایل
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    root /var/www/your-domain.com/public;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

# فعال کردن سایت
sudo ln -s /etc/nginx/sites-available/your-domain.com /etc/nginx/sites-enabled/

# حذف سایت پیش‌فرض
sudo rm /etc/nginx/sites-enabled/default

# تست تنظیمات
sudo nginx -t

# بارگذاری مجدد
sudo systemctl reload nginx

نصب PHP و Extensions

1. نصب PHP

# اضافه کردن repository PHP
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# نصب PHP 8.1
sudo apt install php8.1-fpm php8.1-cli php8.1-mysql php8.1-xml php8.1-gd php8.1-curl php8.1-mbstring php8.1-zip php8.1-bcmath php8.1-intl -y

# نصب Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer

# بررسی نسخه PHP
php -v
composer --version

# تنظیم PHP-FPM
sudo nano /etc/php/8.1/fpm/php.ini

# تغییرات مهم:
# upload_max_filesize = 64M
# post_max_size = 64M
# memory_limit = 256M
# max_execution_time = 300

# راه‌اندازی مجدد PHP-FPM
sudo systemctl restart php8.1-fpm

نصب و تنظیم MySQL

1. نصب MySQL

# نصب MySQL Server
sudo apt install mysql-server -y

# شروع سرویس
sudo systemctl start mysql
sudo systemctl enable mysql

# تنظیم امنیت
sudo mysql_secure_installation

# اتصال به MySQL
sudo mysql

# ایجاد کاربر جدید
CREATE USER 'deploy'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'deploy'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

# تست اتصال
mysql -u deploy -p

# ایجاد دیتابیس
mysql -u deploy -p
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;

راه‌اندازی SSL با Let's Encrypt

1. نصب Certbot

# نصب Certbot
sudo apt install certbot python3-certbot-nginx -y

# دریافت گواهی SSL
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

# تست تجدید خودکار
sudo certbot renew --dry-run

# تنظیم تجدید خودکار
sudo crontab -e
# اضافه کردن این خط:
# 0 12 * * * /usr/bin/certbot renew --quiet

# بررسی گواهی‌ها
sudo certbot certificates

2. تنظیم Nginx برای HTTPS

# فایل تنظیمات بعد از SSL
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com www.your-domain.com;
    root /var/www/your-domain.com/public;
    index index.php index.html index.htm;

    # SSL Configuration
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/your-domain.com/chain.pem;

    # Security Headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

Deploy Laravel Application

1. آماده‌سازی سرور

# ایجاد دایرکتوری پروژه
sudo mkdir -p /var/www/your-domain.com
sudo chown -R deploy:deploy /var/www/your-domain.com

# کلون کردن پروژه
cd /var/www/your-domain.com
git clone https://github.com/username/your-laravel-app.git .

# نصب dependencies
composer install --optimize-autoloader --no-dev

# تنظیم مجوزها
sudo chown -R www-data:www-data /var/www/your-domain.com
sudo chmod -R 755 /var/www/your-domain.com
sudo chmod -R 775 /var/www/your-domain.com/storage
sudo chmod -R 775 /var/www/your-domain.com/bootstrap/cache

# کپی فایل تنظیمات
cp .env.example .env
nano .env

# تنظیمات مهم در .env:
# APP_ENV=production
# APP_DEBUG=false
# DB_HOST=127.0.0.1
# DB_DATABASE=myapp_db
# DB_USERNAME=deploy
# DB_PASSWORD=strong_password

# تولید کلید اپلیکیشن
php artisan key:generate

# اجرای migration ها
php artisan migrate --force

# کش کردن تنظیمات
php artisan config:cache
php artisan route:cache
php artisan view:cache

2. تنظیم Nginx برای Laravel

# فایل تنظیمات Nginx برای Laravel
server {
    listen 443 ssl http2;
    server_name your-domain.com www.your-domain.com;
    root /var/www/your-domain.com/public;
    index index.php index.html index.htm;

    # SSL Configuration
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    # Security Headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # Gzip Compression
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    # Cache static files
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # Deny access to sensitive files
    location ~ /\.ht {
        deny all;
    }
    
    location ~ /\.env {
        deny all;
    }
}

Deploy React Application

1. Build کردن React App

# در سیستم محلی
npm run build

# یا با yarn
yarn build

# آپلود فایل‌های build شده
scp -r build/* deploy@your-server-ip:/var/www/your-domain.com/

# یا با rsync
rsync -avz --delete build/ deploy@your-server-ip:/var/www/your-domain.com/

2. تنظیم Nginx برای React

# فایل تنظیمات Nginx برای React SPA
server {
    listen 443 ssl http2;
    server_name your-domain.com www.your-domain.com;
    root /var/www/your-domain.com;
    index index.html;

    # SSL Configuration
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    # Security Headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # Gzip Compression
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;

    # Serve static files
    location / {
        try_files $uri $uri/ /index.html;
    }

    # Cache static assets
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # API proxy (اگر backend جداگانه دارید)
    location /api/ {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Deploy Android Application

1. راه‌اندازی Fastlane

# نصب Fastlane
sudo gem install fastlane

# یا با bundler
gem install bundler
bundle init
bundle add fastlane

# راه‌اندازی Fastlane در پروژه
cd /path/to/android/project
fastlane init

# فایل Fastfile
default_platform(:android)

platform :android do
  desc "Deploy to Google Play Store"
  lane :deploy do
    gradle(
      task: "bundle",
      build_type: "Release"
    )
    
    upload_to_play_store(
      track: "internal",
      aab: "app/build/outputs/bundle/release/app-release.aab"
    )
  end
  
  desc "Build APK for testing"
  lane :build_apk do
    gradle(
      task: "assemble",
      build_type: "Release"
    )
  end
end

# اجرای Fastlane
fastlane deploy

CI/CD با GitHub Actions

1. Laravel CI/CD

# .github/workflows/deploy.yml
name: Deploy Laravel App

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.1'
        extensions: mbstring, dom, fileinfo, mysql
        coverage: none
    
    - name: Install dependencies
      run: composer install --no-dev --optimize-autoloader
    
    - name: Deploy to server
      uses: appleboy/ssh-action@v0.1.5
      with:
        host: {{ secrets.HOST }}
        username: {{ secrets.USERNAME }}
        key: {{ secrets.SSH_KEY }}
        script: |
          cd /var/www/your-domain.com
          git pull origin main
          composer install --no-dev --optimize-autoloader
          php artisan migrate --force
          php artisan config:cache
          php artisan route:cache
          php artisan view:cache
          sudo systemctl reload nginx

2. React CI/CD

# .github/workflows/deploy-react.yml
name: Deploy React App

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
        cache: 'npm'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Build
      run: npm run build
    
    - name: Deploy to server
      uses: appleboy/ssh-action@v0.1.5
      with:
        host: {{ secrets.HOST }}
        username: {{ secrets.USERNAME }}
        key: {{ secrets.SSH_KEY }}
        script: |
          cd /var/www/your-domain.com
          git pull origin main
          npm ci
          npm run build
          sudo systemctl reload nginx

مانیتورینگ و Logging

1. نصب و تنظیم Logrotate

# تنظیم Logrotate
sudo nano /etc/logrotate.d/nginx

# محتوای فایل:
/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 $(cat /var/run/nginx.pid)
        fi
    endscript
}

# تست Logrotate
sudo logrotate -d /etc/logrotate.d/nginx

2. مانیتورینگ با htop و iotop

# نصب ابزارهای مانیتورینگ
sudo apt install htop iotop nethogs -y

# مانیتورینگ CPU و Memory
htop

# مانیتورینگ I/O
sudo iotop

# مانیتورینگ Network
sudo nethogs

# مانیتورینگ Disk Usage
df -h
du -sh /var/www/*

# مانیتورینگ Logs
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

Backup و Recovery

1. Backup خودکار دیتابیس

#!/bin/bash
# /home/deploy/backup-db.sh

# تنظیمات
DB_NAME="myapp_db"
DB_USER="deploy"
DB_PASS="strong_password"
BACKUP_DIR="/home/deploy/backups"
DATE=$(date +%Y%m%d_%H%M%S)

# ایجاد دایرکتوری backup
mkdir -p $BACKUP_DIR

# Backup دیتابیس
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql

# فشرده‌سازی
gzip $BACKUP_DIR/db_backup_$DATE.sql

# حذف backup های قدیمی (بیش از 7 روز)
find $BACKUP_DIR -name "db_backup_*.sql.gz" -mtime +7 -delete

# تنظیم cron job
# crontab -e
# 0 2 * * * /home/deploy/backup-db.sh

2. Backup فایل‌های اپلیکیشن

#!/bin/bash
# /home/deploy/backup-files.sh

# تنظیمات
APP_DIR="/var/www/your-domain.com"
BACKUP_DIR="/home/deploy/backups"
DATE=$(date +%Y%m%d_%H%M%S)

# ایجاد دایرکتوری backup
mkdir -p $BACKUP_DIR

# Backup فایل‌ها
tar -czf $BACKUP_DIR/files_backup_$DATE.tar.gz -C $APP_DIR .

# حذف backup های قدیمی (بیش از 7 روز)
find $BACKUP_DIR -name "files_backup_*.tar.gz" -mtime +7 -delete

# تنظیم cron job
# 0 3 * * * /home/deploy/backup-files.sh

بهینه‌سازی Performance

1. تنظیمات Nginx

# /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    # Basic Settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 64M;

    # Gzip Settings
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml+rss
        application/atom+xml
        image/svg+xml;

    # Rate Limiting
    limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;
    limit_req_zone $binary_remote_addr zone=api:10m rate=100r/m;

    # Include site configurations
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

2. تنظیمات PHP-FPM

# /etc/php/8.1/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
listen = /var/run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

# Logging
php_admin_value[error_log] = /var/log/php8.1-fpm.log
php_admin_flag[log_errors] = on

# Performance
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 300
php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M

📋 چک‌لیست راه‌اندازی سرور:

  • ✅ به‌روزرسانی سیستم
  • ✅ ایجاد کاربر جدید
  • ✅ تنظیم SSH
  • ✅ نصب Nginx
  • ✅ نصب PHP
  • ✅ نصب MySQL
  • ✅ تنظیم SSL
  • ✅ Deploy اپلیکیشن
  • ✅ تنظیم Backup
  • ✅ مانیتورینگ

✅ نکات مهم سرور:

  • امنیت: همیشه از SSL استفاده کنید
  • Backup: Backup منظم داشته باشید
  • مانیتورینگ: وضعیت سرور را بررسی کنید
  • به‌روزرسانی: سیستم را به‌روز نگه دارید
  • Logs: Log ها را بررسی کنید

مقالات مرتبط

برای یادگیری بیشتر، مقالات زیر را مطالعه کنید:

نتیجه‌گیری

راه‌اندازی سرور و Deploy اپلیکیشن‌ها مهارت مهمی برای هر برنامه‌نویس است. با رعایت اصول امنیت و بهینه‌سازی، می‌توانید سرورهای پایدار و کارآمد داشته باشید. علی سلمانیان آماده کمک به شما در راه‌اندازی و مدیریت سرورهایتان است.

درباره نویسنده

علی سلمانیان - برنامه نویس وب و اندروید با تخصص در DevOps و Server Management. متخصص Linux، Nginx، Docker و CI/CD.

📧 alisalmanian1395@gmail.com | 📱 +98 938 822 2808