В данном проекте моей задачей было задеплоить проект Kittygram на удалённый сервер. Kittygram — социальная сеть для обмена фотографиями любимых питомцев. Это полностью рабочий проект, который состоит из бэкенд-приложения на Django и фронтенд-приложения на React. Проект готов к деплою на удалённый сервер.
- Python 3.10.6;
- Django 3.2.3;
- Django REST framework 3.12.4;
- Gunicorn 20.1.0;
- Nginx 1.18.0;
- Node.js 18.16.1.
Инструкция написана для сервера с установленной ОС Ubuntu 22.04.1 LTS.
-
Подключитесь к удалённому серверу;
-
Подключите сервер к аккаунту на GitHub;
-
Клонируйте проект на сервер;
-
Далее установите на сервер пакетный менеджер и утилиту для создания виртуального окружения:
sudo apt install python3-pip python3-venv -y
- Перейдите в директорию с бэкенд-приложением проекта:
cd infra_sprint1/backend/
- Создайте и активируйте виртуальное окружение, установите пакеты из файла requirements.txt:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
- Выполните миграции и создайте суперюзера:
python manage.py migrate
python manage.py createsuperuser
- Перейдите в директорию с файлом settings.py и откройте его в редакторе Nano:
nano settings.py
- Отредактируйте этот файл - в список ALLOWED_HOSTS добавьте внешний IP-адрес вашего сервера для доступа к приложению по внешнему интерфейсу, адреса 127.0.0.1 и localhost для доступа к приложению по внутреннему интерфейсу:
ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx', '127.0.0.1', 'localhost']
Фронтенд-приложение проекта написано на React. Чтобы его запустить, нужно установить на сервер пакетный менеджер npm и установить зависимости для фронтенд-приложения.
- Находясь на сервере, из любой директории выполните команду:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\
sudo apt-get install -y nodejs
- Теперь можно установить зависимости для фронтенд-приложения. Перейдите в директорию infra_sprint1/frontend/ и выполните команду:
npm i
- На удалённом сервере при активированном виртуальном окружении проекта установите пакет gunicorn:
pip install gunicorn==20.1.0
- Выполните команду создания и открытия в Nano конфигурационного файла для демона WSGI-сервера gunicorn:
sudo nano /etc/systemd/system/gunicorn_kittygram.service
- Подставьте в код из листинга свои данные, добавьте этот код в файл gunicorn_kittygram.service и сохраните изменения:
[Unit]
Description=gunicorn_kittygram daemon
After=network.target
[Service]
User=<имя-пользователя-в-системе>
WorkingDirectory=/home/<имя-пользователя-в-системе>/<директория-с-проектом>/<директория-с-файлом-manage.py>/
ExecStart=/home/<имя-пользователя-в-системе>/<директория-с-проектом>/<путь-до-gunicorn-в-виртуальном-окружении> --bind 0.0.0.0:8080 kittygram_backend.wsgi
[Install]
WantedBy=multi-user.target
- Запустите процесс gunicorn_kittygram.service:
sudo systemctl start gunicorn
- Дополнительной командой добавьте процесс Gunicorn в список автозапуска операционной системы на удалённом сервере:
sudo systemctl enable gunicorn
- Находясь на удалённом сервере, из любой директории выполните команду:
sudo apt install nginx -y
- А потом запустите Nginx командой:
sudo systemctl start nginx
- Перейдите в директорию infra_sprint1/frontend и выполните команду:
npm run build
- Чтобы Nginx раздавал статику, он должен знать, где она лежит. У веб-сервера есть системная директория, которую он использует по умолчанию для доступа к статическим файлам, — /var/www/. Скопируйте в эту директорию содержимое папки .../frontend/build/:
sudo cp -r /home/<имя-пользователя-в-системе>/infra_sprint1/frontend/build/. /var/www/kittygram/
- Через редактор Nano откройте файл конфигурации веб-сервера:
sudo nano /etc/nginx/sites-enabled/default
- Удалите все настройки из файла, запишите и сохраните новые:
server {
listen 80;
server_name <внешний-IP-адрес-вашего-сервера>;
location /api/ {
proxy_pass http://127.0.0.1:8080;
client_max_body_size 20M;
}
location /admin/ {
proxy_pass http://127.0.0.1:8080;
client_max_body_size 20M;
}
location /media/ {
alias /var/www/kittygram/media/;
}
location / {
root /var/www/kittygram;
index index.html index.htm;
try_files $uri /index.html;
}
}
- Для проверки файла конфигурации на ошибки выполните команду:
sudo nginx -t
- Далее перезагрузите конфигурацию Nginx:
sudo systemctl reload nginx
- На удалённом сервере при активированном виртуальном окружении перейдите в директорию с файлом manage.py и выполните команду:
python manage.py collectstatic
- Скопируйте файлы статики бэкенда в системную директорию /var/www/kittygram/:
sudo cp -r /home/<имя-пользователя-в-системе>/infra_sprint1/backend/static_backend/ /var/www/kittygram/
- Чтобы изменения в файле settings.py вступили в силу, перезапустите Gunicorn:
sudo systemctl restart gunicorn
Пилипенко Артем