مقدمه
راهاندازی سرور و 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 ها را بررسی کنید
مقالات مرتبط
برای یادگیری بیشتر، مقالات زیر را مطالعه کنید:
- برنامه نویسی بکاند با Laravel و PHP
- راهنمای کامل طراحی سایت با React.js
- مدیریت پروژه با Git و GitHub
نتیجهگیری
راهاندازی سرور و Deploy اپلیکیشنها مهارت مهمی برای هر برنامهنویس است. با رعایت اصول امنیت و بهینهسازی، میتوانید سرورهای پایدار و کارآمد داشته باشید. علی سلمانیان آماده کمک به شما در راهاندازی و مدیریت سرورهایتان است.