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: