В этой статье я распишу, как мы в компании настраиваем наши сервера для работы с Django проектами. Инструкция общая и иемеет место критика, но для нас это быстрый и самый отпимальный варинт выработанный за несколько лет работы.
Чтобы запустить Django проект на сервере мы используем связку nginx + gunicorn + postgres, сервер с операционнной системой Ubuntu. Все совпадения это лишь совпадения и не более. И так приступим, для начала нам понадобится сам сервер с установленной ОС Ubuntu, заказывем любой VPS.
Чтобы соединиться с сервером используем ssh.
ssh root@12.34.56.78
# root: имя пользователя, под которым будет выполнено подключение к серверу
# 12.34.56.78: ip-адрес сервера
Сервер запросит пароль, вводим его и попадаем в терминал на сервере.
Чтобы запустить Django проект на сервере мы используем связку nginx + gunicorn + postgres, сервер с операционнной системой Ubuntu. Все совпадения это лишь совпадения и не более. И так приступим, для начала нам понадобится сам сервер с установленной ОС Ubuntu, заказывем любой VPS.
Чтобы соединиться с сервером используем ssh.
ssh root@12.34.56.78
# root: имя пользователя, под которым будет выполнено подключение к серверу
# 12.34.56.78: ip-адрес сервера
Сервер запросит пароль, вводим его и попадаем в терминал на сервере.
В терминале вводим команды в порядке очереди:
1. Подготовка сервера, загрузка проекта, установка зависимостей
sudo apt update & sudo apt upgrade -y
sudo apt install python3-pip python3-venv postgresql postgresql-contrib nginx
cd /home/
git clone https://github.com/ваш_проект/ваш_проект.git
python3 -m venv env
. env/bin/activate
cd test_project/
pip install -r requirements.txt
pip install gunicorn psycopg2-binary==2.8.6
2. Настройка gunicorn
sudo nano /etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/home/todo_project
Environment=LANG=ru
ExecStart=/home/todo_project/todoenv/bin/gunicorn \
--access-logfile /var/log/gunicorn/todo_project.log \
--error-logfile /var/log/gunicorn/todo_project.log \
--log-file /var/log/gunicorn/todo_project.log \
--workers 3 \
--bind unix:/run/gunicorn.sock \
todo.wsgi:application
[Install]
WantedBy=multi-user.target
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn
file /run/gunicorn.sock
sudo journalctl -u gunicorn
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
3. Настройка nginx
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
sudo systemctl start nginx
sudo nano /etc/nginx/sites-available/test
server {
listen 80;
server_name 104.248.141.144;
location /static/ {
root /home/todo_project;
}
location /media/ {
root /home/todo_project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
location /robots.txt {
alias /home/todo_project/robots.txt;
}
}
# server {
# server_name www.example.com;
# return 301 http://example.com$request_uri;
# }
# server {
# listen 80;
# server_name 104.248.141.144;
# return 301 http://example.com$request_uri;
# }
sudo nginx -t
sudo ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled
nginx.conf сжатие gzip, client_max_body_size 20m;
4. Настройка Postgres
locale
sudo dpkg-reconfigure locales
sudo reboot
locale
sudo systemctl status postgresql
sudo -u postgres psql -c 'select now()'
sudo -u postgres psql
CREATE DATABASE tododb;
CREATE USER testuser WITH ENCRYPTED PASSWORD 'ваш_пароль';
GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
python manage.py migrate
scp dump.json root@ip_ваш_сервер:/home/test_project
python manage.py loaddata dump.json
5. Django static и media
ls
ls project_static/
ls project_static/css/
заходим в админку и не видим статики
python manage.py collectstatic
появилась в админке, на сайте нет
2 способа изменить файлы (на самом сервере и через гит)
ls
ls static/
ls static/css/
заходим в админку в задачу с медиафайлом, его нет
scp -r media/ root@ip_ваш_сервер:/home/tеst_project
проверяем доступность медиа
заходим на несуществующую страницу
меняем дебаг на False, добавляем айпишник
проверяем статику и медиа
6. Юзеры и права
создаем отдельного юзера для запуска gunicorn
adduser gunicorn
chgrp gunicorn /home/test_project
chmod -R 775 /home/test_project
7. Несколько проектов на одном сервере ubuntu
1. если есть домен
2. по ip, но на разных портах
копируем другой проект на удаленный сервер
(из текущей папки)
scp -r "$PWD" root@ip_ваш_сервер:/home/ваш_второй_проект
создаем виртуальное окружение для проекта, устанавливаем зависимости, настраиваем gunicorn и nginx
python3 -m venv env
. yatubeenv/bin/activate
pip install -r requirements.txt
pip install gunicorn
sudo nano /etc/systemd/system/gunicorn-two.socket
sudo nano /etc/systemd/system/gunicorn-two.service
sudo systemctl start gunicorn-two
sudo systemctl enable gunicorn-two
sudo systemctl status gunicorn-two
sudo nano /etc/nginx/sites-available/two
sudo nginx -t
sudo ln -s /etc/nginx/sites-available/two /etc/nginx/sites-enabled
sudo systemctl reload nginx
sudo ufw allow 81
Как видите запустить Django проект на сервере ubuntu в связке nginx и gunicorn совсем не сложно. Если все команды выполнены правильно и не было никаких ошибок, то ваш проект успешно запустится на сервере и будет доступен из вне. Спасибо за внимание!