~/icsd.ir — bash
SYSTEM_ONLINE

🚀 فصل ۱۱: دیپلوی روی سرور

حالا که پروژه‌ت آماده شده، وقتشه روی سرور واقعی اجراش کنی!

حالا که پروژه‌ت آماده شده، وقتشه روی سرور واقعی اجراش کنی!

🎒 آماده‌سازی پروژه

۱. ساخت requirements.txt

📟 ترمینال
pip freeze > requirements.txt

۲. اضافه کردن .gitignore

.gitignore
# محیط مجازی
venv/
env/

# پایتون
__pycache__/
*.pyc
*.pyo

# جنگو
*.log
db.sqlite3
media/
staticfiles/

# تنظیمات حساس
.env
local_settings.py

# IDE
.vscode/
.idea/
*.swp

🔐 متغیرهای محیطی

اطلاعات حساس (مثل SECRET_KEY، رمز دیتابیس) رو نباید توی کد ذخیره کنی.

📟 ترمینال
pip install python-decouple
.env
SECRET_KEY=your-very-long-random-secret-key-here
DEBUG=False
ALLOWED_HOSTS=icsd.ir,www.icsd.ir
DATABASE_URL=mysql://user:pass@localhost:3306/dbname
EMAIL_HOST_USER=noreply@icsd.ir
EMAIL_HOST_PASSWORD=your-password
settings.py
from decouple import config

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='').split(',')

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': config('DB_NAME'),
        'USER': config('DB_USER'),
        'PASSWORD': config('DB_PASSWORD'),
        'HOST': config('DB_HOST', default='localhost'),
        'PORT': config('DB_PORT', default='3306'),
    }
}
🔴

خیلی مهم!

فایل .env رو هرگز در git نذار. در .gitignore اضافه کن.

🛡️ تنظیمات امنیتی برای Production

settings.py (production)
# تنظیمات امنیتی
DEBUG = False
ALLOWED_HOSTS = ['icsd.ir', 'www.icsd.ir']

# امنیت HTTPS
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

# HSTS
SECURE_HSTS_SECONDS = 31536000  # یک سال
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

# سایر امنیتی
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'
SECURE_REFERRER_POLICY = 'same-origin'

# تنظیمات سشن
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True

# فایل‌های static
STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/icsd/staticfiles/'
MEDIA_URL = '/media/'
MEDIA_ROOT = '/var/www/icsd/media/'

# لاگ‌گیری
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': '/var/log/django/error.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

🦄 Gunicorn

Gunicorn یه سرور WSGI تولیدیه. سرور توسعه جنگو (runserver) برای production مناسب نیست.

📟 ترمینال (سرور)
pip install gunicorn

# تست اجرا
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

# با تنظیمات بیشتر
gunicorn myproject.wsgi:application 
    --bind 127.0.0.1:8000 
    --workers 3 
    --timeout 60 
    --access-logfile /var/log/gunicorn/access.log 
    --error-logfile /var/log/gunicorn/error.log

تعداد Worker مناسب

🧮

فرمول Worker

Workers = (2 × CPU cores) + 1
مثلاً برای ۲ هسته: ۵ worker

🌐 Nginx

Nginx به‌عنوان Reverse Proxy جلوی Gunicorn قرار می‌گیره و فایل‌های static رو هم سرو می‌کنه.

نصب

📟 ترمینال (Ubuntu)
sudo apt update
sudo apt install nginx

تنظیمات Nginx

/etc/nginx/sites-available/icsd
server {
    listen 80;
    server_name icsd.ir www.icsd.ir;
    
    # هدایت به HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name icsd.ir www.icsd.ir;
    
    # SSL
    ssl_certificate /etc/letsencrypt/live/icsd.ir/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/icsd.ir/privkey.pem;
    
    # امنیت
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    # حداکثر حجم آپلود
    client_max_body_size 20M;
    
    # فایل‌های Static
    location /static/ {
        alias /var/www/icsd/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
    
    # فایل‌های Media
    location /media/ {
        alias /var/www/icsd/media/;
        expires 7d;
    }
    
    # درخواست‌ها به Gunicorn
    location / {
        proxy_pass http://127.0.0.1:8000;
        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_redirect off;
    }
    
    # لاگ
    access_log /var/log/nginx/icsd.access.log;
    error_log /var/log/nginx/icsd.error.log;
}
📟 ترمینال
# فعال‌سازی سایت
sudo ln -s /etc/nginx/sites-available/icsd /etc/nginx/sites-enabled/

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

# ری‌استارت
sudo systemctl reload nginx

⚙️ Systemd Service برای Gunicorn

برای اینکه Gunicorn به‌صورت سرویس اجرا بشه:

/etc/systemd/system/gunicorn-icsd.service
[Unit]
Description=Gunicorn for ICSD
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/icsd
EnvironmentFile=/var/www/icsd/.env
ExecStart=/var/www/icsd/venv/bin/gunicorn 
    --workers 3 
    --bind 127.0.0.1:8000 
    --access-logfile /var/log/gunicorn/access.log 
    --error-logfile /var/log/gunicorn/error.log 
    myproject.wsgi:application

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
📟 ترمینال
# فعال‌سازی و اجرا
sudo systemctl daemon-reload
sudo systemctl start gunicorn-icsd
sudo systemctl enable gunicorn-icsd

# بررسی وضعیت
sudo systemctl status gunicorn-icsd

# دیدن لاگ‌ها
sudo journalctl -u gunicorn-icsd -f

🔒 SSL با Let’s Encrypt (رایگان)

📟 ترمینال
# نصب Certbot
sudo apt install certbot python3-certbot-nginx

# دریافت گواهی
sudo certbot --nginx -d icsd.ir -d www.icsd.ir

# تمدید خودکار (هر ۹۰ روز یکبار باید تمدید بشه)
sudo certbot renew --dry-run

✅ چک‌لیست نهایی دیپلوی

قبل از دیپلوی

  • تست محلی پروژه
  • اجرای python manage.py check --deploy
  • ساخت requirements.txt
  • اضافه کردن .env.example
  • بررسی .gitignore

روی سرور

  • نصب پایتون و pip
  • کلون پروژه از git
  • ساخت محیط مجازی
  • نصب پکیج‌ها: pip install -r requirements.txt
  • ساخت فایل .env با متغیرهای production
  • نصب و راه‌اندازی دیتابیس
  • اجرای migrations: python manage.py migrate
  • جمع‌آوری static: python manage.py collectstatic
  • ساخت superuser: python manage.py createsuperuser
  • تست با runserver یا Gunicorn
  • تنظیم Gunicorn و Nginx
  • تنظیم systemd service
  • دریافت SSL
  • تنظیم backup خودکار دیتابیس

دستور بررسی امنیت جنگو

📟 ترمینال
python manage.py check --deploy

این دستور همه نکات امنیتی رو چک می‌کنه و هشدار می‌ده.

📦 اسکریپت دیپلوی خودکار

برای اپدیت‌های بعدی، یه اسکریپت بساز:

deploy.sh
#!/bin/bash

cd /var/www/icsd

# گرفتن آخرین تغییرات
git pull origin main

# فعال کردن محیط مجازی
source venv/bin/activate

# نصب پکیج‌های جدید
pip install -r requirements.txt

# اجرای migrations
python manage.py migrate --noinput

# جمع‌آوری static
python manage.py collectstatic --noinput

# ری‌استارت Gunicorn
sudo systemctl restart gunicorn-icsd

echo "✅ دیپلوی موفق!"
📟 ترمینال
chmod +x deploy.sh
./deploy.sh
🎉

تبریک!

حالا سایتت روی اینترنت زنده‌ست! کاربران از کل دنیا می‌تونن استفاده کنن.

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.