8.2.3 Розгортання та налаштування продакшн-сервера для Django

The Host Django Banner

Django — популярний фреймворк на Python для розробки безпечних і масштабованих веб-додатків. У цьому посібнику ми покроково розгорнемо сервер на Ubuntu та налаштуємо його для продакшн-розміщення Django-проєкту.

Цей посібник допоможе вам розгорнути Django-проєкт на Ubuntu-сервері, використовуючи Gunicorn, Nginx і PostgreSQL — типову конфігурацію для продакшн-середовищ.

Перед початком варто переконатися, що:

Налаштування сервера та залежностей

Оновлення системи та встановлення залежностей

Для початку підключіться до сервера по SSH та оновіть системні пакети:

sudo apt update && sudo apt upgrade -y

Потім встановіть Python 3, pip, venv, Git, Nginx та інші базові утиліти:

sudo apt install python3 python3-pip python3-venv git nginx curl -y

Встановлення python3-venv обов’язкове для створення віртуального середовища. Без нього команда python3 -m venv працювати не буде.

Налаштування веб-сервера Nginx

Nginx буде обробляти вхідні запити і проксіювати їх в Gunicorn:

sudo nano /etc/nginx/sites-available/projectname
server {
    listen 80;
    server_name yourdomain.com;

    location = /static/ {
        root /var/www/projectname;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

Створіть симлінк і перевірте конфігурацію:

sudo ln -s /etc/nginx/sites-available/projectname /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Переконайтеся, що в settings.py змінна ALLOWED_HOSTS включає ваш домен або IP-адресу, інакше Django заблокує вхідні з’єднання.

Встановлення та налаштування Gunicorn

Gunicorn — це WSGI-сервер, через який Django працює в продакшн-середовищі:

pip install gunicorn
gunicorn --workers 3 --bind unix:/run/gunicorn.sock projectname.wsgi:application

Для постійної роботи Gunicorn створимо systemd-сервіс:

sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/var/www/projectname
ExecStart=/var/www/projectname/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock projectname.wsgi:application

[Install]
WantedBy=multi-user.target

Активуйте сервіс:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Встановлення SSL (Let’s Encrypt)

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com

Сертифікати Let’s Encrypt автоматично оновлюються кожні 90 днів.

Безпека та оптимізація

Налаштування UFW (Uncomplicated Firewall)

Активуємо брандмауер:

sudo ufw allow 'Nginx Full'
sudo ufw enable

Налаштування iptables

Для розширеного захисту можна використовувати iptables:

# Встановлення iptables-persistent для збереження правил
sudo apt install iptables-persistent -y

# Базові правила безпеки
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Блокування всього іншого вхідного трафіку
sudo iptables -A INPUT -j DROP

# Збереження правил
sudo netfilter-persistent save

Також рекомендується:

  • Встановити fail2ban для захисту від брутфорса
  • Вимкнути DEBUG в продакшені
  • Використовувати .env для зберігання чутливих даних
  • Налаштувати регулярне резервне копіювання
  • Обмежити спроби входу в адмінку Django

Налаштування Django-проєкту

Клонування Django-проєкту

Припустимо, ваш проєкт розміщений в репозиторії GitHub. Переходимо в директорію, де Ви плануєте розмістити Ваш проєкт:

cd /var/www/
sudo git clone https://github.com/username/projectname.git
sudo chown -R $USER:$USER projectname
cd projectname

Замініть https://github.com/username/projectname.git на ваш власний репозиторій. Переконайтеся, що структура проєкту включає файл manage.py.

Налаштування віртуального середовища

Віртуальне середовище дозволяє ізолювати залежності проєкту:

python3 -m venv venv
source venv/bin/activate

Після активації встановіть залежності з requirements.txt:

pip install --upgrade pip
pip install -r requirements.txt

Налаштування бази даних

Якщо проєкт використовує PostgreSQL, встановимо необхідні пакети і створимо користувача та базу даних:

sudo apt install postgresql postgresql-contrib libpq-dev -y
sudo -u postgres createuser myuser --interactive
sudo -u postgres createdb mydb

Не забудьте задати надійний пароль для бази даних. Пароль буде використовуватися в settings.py.

Відкрийте settings.py і пропишіть дані підключення:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'your_password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Виконання міграцій і збірка статики

Тепер підготуємо базу і зберемо статичні файли:

python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --noinput

Команда collectstatic збирає всі CSS, JS та зображення в папку staticfiles, щоб Nginx міг роздавати їх напряму.

Після всіх виконаних дій ви маєте в браузері побачити сторінку щойно створеного сайту Django: