Deploy Django проекта на VPS
В данной статье я расскажу как просто развернуть ваш Django проект на базе сервера (VPS, VDS, Dedicated) на базе Ubuntu. Для этого вам предстоит пройти пройти простые и понятные шаги, описанные в данной статье. Deploy Django проекта проще чем кажется.
Стэк:
- Сервер на базе Ubuntu;
- PostgreSQL;
- Nginx;
- Gunicorn;
- Django проект;
Проверка локалей на сервере:
При подключении к серверу из под пользователя root. Необходимо проверить локали системы. Командой:
locale
Они должны выглядеть следующим образом:
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Либо ru_RU, но обязательно UTF-8.
Создание базы данных:
Подключаемся к postgres:
sudo -u postgres psql
Создаем базу данных с пользователем:
CREATE DATABASE database_name WITH ENCODING='UTF-8';
CREATE USER database_user WITH PASSWORD '<password>';
ALTER ROLE database_user SET client_encoding TO 'utf8';
ALTER ROLE database_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE database_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE database_name TO database_user;
Создание пользователя:
Проект не должен крутится на сервере из под под пользователя root. Все процессы должны запускаться под любым другим пользователем, которого мы создадим далее.
Добавляем пользователя в Ubuntu:
adduser user_name
Добавляем нашего пользователя в группы sudo и www-data:
usermod -aG sudo user_name
usermod -aG www-data user_name
Переключаемся на нашего пользователя:
su - user_name
Клонирование и настройка проекта:
Важно: Все последующие действия из этого раздела, выполнять из под созданного нами пользователя.
Переходим в папку нашего пользователя (если она не создалась при создании пользователя, то создать её):
cd /home/user_name/
Клониурем репозиторий с проектом:
git clone repository_name
Переходим в папку с проектом и создаем виртуальное окружение:
virtualenv venv --python=python<version>
Активируем виртуальное окружение:
activate venv/bin/activate
Устанавливаем зависимости проекта:
pip install -r requirement_file.txt
Указываем настройки подключения к базе данных (которую мы создали ранее, в разделе “Создание базы данных”.
Применяем миграции:
python manage.py migrate
Собираем статику:
python manage.py collectstatic
Пробуем запустить проект через runserver:
python manage.py runserver 0.0.0.0:8000
Далее переходим в браузере по адресу http://<ip_нашего_сервера>:8000. Если открывается ваш проект, значит все сделано правильно и переходим к следующему шагу.
Устанавливаем gunicorn внутри виртуального окружения (если не было указано в requirements):
pip install gunicorn
Кофигурация Gunicorn:
Переключаемся обратно на пользователя root (т.к из под созданного пользователя, вы не сможете создать файл конфигурации, из-за отсутствия прав на директории):
Создаем файл конфигурации:
nano /etc/systemd/system/project_name.gunicorn.service
Где project_name - название вашего проекта.
Добавляем в этот файл следующее содержимое и сохраняем его:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=<linux user>
Group=www-data
WorkingDirectory=<project_root_directory>
ExecStart=<project_root_directory>/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:<project_root_directory>server.sock <Project main application>.wsgi:application
[Install]
WantedBy=multi-user.target
Где:
<project_root_directory> - путь до вашего проекта, например: “/home/my_user/my_project/”.
<Project main application> - название главного приложения (где лежат главные urls.py, settings.py и сам .wsgi файл.
<linux_user> - созданный нами пользователь, из под которого будет крутится проект.
Активируем кофигурацию gunicorn и запускаем процесс:
sudo systemctl enable <project_name>.gunicorn
sudo systemctl start <project_name>.gunicorn
Проверяем запустился ли gunicorn демон (нет ли ошибок в файле):
sudo systemctl status <project_name>.gunicorn
Если видим зеленую надпись Active running, то значит ошибок нет, и все идет по плану.
Конфигурация Nginx
Аналогично как и в предыдущем разделе, создание файла конфигруации NGINX необходимо производить из под root пользователя.
Создаем файл конфигурации:
etc/nginx/sites-available/<project_name>
Вписываем в созданный файл следующую конфигурацию:
server {
listen 80;
server_name <server_ip or domain_name>;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root <directory_root>;
}
location /media/ {
root <directory_root>;
}
location /admin/static/ {
root <directory_root>;
}
location / {
include proxy_params;
proxy_pass http://unix:<directory_root>/server.sock;
}
}
Затем сохраняем его.
В даннной конфигруации мы задали настройки маршрутизации запросов. Статику, медиа файлы отдает nginx (не напрягая при этом сам наш проект), а остальные запросы передает в gunicorn.
Создаем символическую ссылку:
sudo ln -s /etc/nginx/sites-available/<project_name> /etc/nginx/sites-enabled/<project_name>
Проверяем корректность кофигурации NGINX:
sudo nginx -t
Если видим, что “syntax is ok”, то значит все идет по плану.
Перезагружаем NGINX:
sudo systemctl restart nginx
Финал:
Всё! Если вы проделали все шаги правильно, то перейдя по ip адресу сервера или домену (смотря что вы укаали в конфигурации nginx в директиве “server_name”, то вы увидите свой проект.
Полезная статья? - Скажи спасибо в комментариях!
Спасибо!
Спасибо 🙏
Aug 27 23:34:15 220410.fornex.cloud gunicorn[1507]: [2022-08-27 23:34:15 +0300] [1507] [ERROR] Can't connect to/server.sock
Что делать?
Спасибо :)
Очень лаконично, всё по делу. Спасибо! С путями долго промучился, но в итоге завелся сервак)
Спасибо!
Гайд не о чем, не работает ничего. Как минимум в гайде не хватает gunicorn.socket, через который nginx и запускает сайт через этот самый gunicorn
Статья очень помогла. Ничего лишнего, для новичка то самое,