Вы находитесь на странице: 1из 11

Установка проекта на сервере.md 08.04.

2023

Установка проекта на сервере


Начальные установки
Все описанные действия выполняются на ОС Ubuntu Server 22.04 x64.

Сервер можно установить локально на виртуальной машине (VMWare или VirtualBox) или
возспользоваться облачным сервером (например, Yandex Cloud)

Установка необходимых пакетов


Обновляем системны пакеты (на всякий случай):

sudo apt update


sudo apt upgrade

Настройка локализации сервера


Проверяем локализацию

locale

Результат выполнения команды (примерно):

LANG=en_US.UTF-8
LANGUAGE=
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_CTYPE и LC_COLLATE должно
быть ru_RU.UTF-8. Если сервер настроен иначе — установите русскую локализацию с помощью
встроенной утилиты dpkg-reconfigure:

sudo dpkg-reconfigure locales

Не забываем перезапустить сервер

1 / 11
Установка проекта на сервере.md 08.04.2023

sudo reboot

Установка необходимых пакетов


Для работы потребуются следующие пакеты:

python3-pip - менеджер пакетов питона


python3-venv - для создания виртуального окружения
git - для работы с репозиториями на GitHub (должен быть уже установлен в системе)
nginx - HTTP-сервер
postgresql - объекто-ориентированная реляционная БД
postgresql-contrib - дополнительные функции/возможности для PostgreSQL

Устанавливаем их командой:

sudo apt install python3-pip python3-venv git nginx postgresql postgresql-contrib


-y

Ключ -y указывает установщику соглашаться на все запросы.

Создание SSH ключа для работы с GitHub


Создаем ssh ключ:

ssh-keygen

Смотрим созданный публичный ssh ключ:

cat ~/.ssh/id_rsa.pub

Копируем результат вывода и регистрируем его на GitHub

Клонирование проекта
Для дальнейшей работы будем использовать проект hw05_final

Сделаем некоторые дополнительные приготовления.

создадим группу developers

sudo addgroup developers

2 / 11
Установка проекта на сервере.md 08.04.2023

Добавим пользователя, из под которого мы работаем, в группу developers

sudo adduser <ваш логин> developers

создадим в корне папку develop

sudo mkdir /develop

изменим группу папки /develop на developers

sudo chgrp developers /develop

изменим права на папку /develop, что бы члены группы developers могли в ней работать

sudo chmod 775 /develop

проверяем, что все прошло успешно командой ls -la /develop. Результат должен быть
примерно такой:

drwxrwxr-x 2 root developers 4096 апр 6 18:08 .


drwxr-xr-x 20 root root 4096 апр 6 18:08 ..

Выходим из системы и перелогиниваемся, что бы права вступили в силу.

Клонируем проект с GitHub

Переходим в созданный каталог develop и клонируем наш проект hw05_final с GitHub через SSH
ссылку

git clone <ссылка на клонирование вашего репозитория hw05_final по SSH>

Переходим в каталог со склонированным проектом (hw05_final)

Подготовка проекта к запуску


Установка зависимостей

1. Устанавливаем вируальное окружение

3 / 11
Установка проекта на сервере.md 08.04.2023

python3 -m venv venv

2. Активируем виртуальное окружение

source ./venv/bin/activate

!!! Все дальнейнейшие действия с python в рамках проекта проводятся при АКТИВНОМ
виртуальном окружении !!!

3. Устанавливаем следующие пакеты python для работы проекта

Django (версия 3.2 или выше для корректной работы с PostgreSQL)


Pillow
sorl-thumbnail
gunicorn
python-dotenv
psycopg2-binary (версии 2.9 или выше для корректной работы с PostgreSQL)

pip install django==3.2 Pillow sorl-thumbnail gunicorn python-dotenv psycopg2-


binary

Настройка БД PostgreSQL

Создаём БД PostgreSQL и пользователя для работы с ней

1. Запускаем postgresql

sudo -u postgres psql

2. Создаем БД

CREATE DATABASE yatube;

3. Создаем пользователя, от имени которого будем работать с БД yatube

CREATE USER yatube_user WITH ENCRYPTED PASSWORD 'xxxyyyzzz';

4. И даем ему права на БД yatube

4 / 11
Установка проекта на сервере.md 08.04.2023

GRANT ALL PRIVILEGES ON DATABASE yatube TO yatube_user;

5. Проверяем, что все создалось

\l

Примерный результат

Name Owner Encoding Collate Ctype Access privileges

ru_RU.UTF- ru_RU.UTF-
postgres postgres UTF8
8 8

ru_RU.UTF- ru_RU.UTF-
template0 postgres UTF8 =c/postgres postgres=CTc/postgres
8 8

ru_RU.UTF- ru_RU.UTF-
template1 postgres UTF8 =c/postgres postgres=CTc/postgres
8 8

ru_RU.UTF- ru_RU.UTF- =Tc/postgres postgres=CTc/postgres


yatube postgres UTF8
8 8 yatube_user=CTc/postgres

6. Выходим из postgresql

\q

Настройки проекта

1. В папке с файлом settings.py создаем файл .env для хранения настроек следующего
содержания:

# ...директория_проекта/yatube/yatube/.env
# Укажите, что используете postgresql
DB_ENGINE=django.db.backends.postgresql
# Укажите имя созданной базы данных
DB_NAME=yatube
# Укажите имя пользователя
POSTGRES_USER=yatube_user
# Укажите пароль для пользователя
POSTGRES_PASSWORD=xxxyyyzzz
# Укажите localhost
DB_HOST=127.0.0.1
# Укажите порт для подключения к базе
DB_PORT=5432

5 / 11
Установка проекта на сервере.md 08.04.2023

2. В файл settings.py вносим следующие изменения:

from dotenv import load_dotenv

load_dotenv()

...

DATABASES = {
'default': {
'ENGINE': os.getenv('DB_ENGINE', 'django.db.backends.postgresql'),
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('POSTGRES_USER'),
'PASSWORD': os.getenv('POSTGRES_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'PORT': os.getenv('DB_PORT')
}
}

3. В файле settings.py в переменную ALLOWED_HOSTS добавляем IP адрес сервера, на котором


будет работать проект, и доменное имя (если оно есть), связанное с сервером.

4. Выполняем миграции

python manage.py migrate

5. Не забываем создать суперпользователя

python manage.py createsuperuser

6. Собираем статику в одно место

в settings.py прописываем настройки для статики

STATIC_URL = '/static/' # префикс для url


STATIC_ROOT = os.path.join(BASE_DIR, 'static/') # папка, в которой будет лежать
статика

!!! Обратите внимание, что STATICFILES_DIRS не должна содержать папку, на которую указывает
STATIC_ROOT. Саму в себя папку не получится скопировать. Рекомендуют при разработке все свои
статические файлы держать в другой папке, например, asserts (STATICFILES_DIRS =
[os.path.join(BASE_DIR, 'asserts')]) !!!

6 / 11
Установка проекта на сервере.md 08.04.2023

запускаем python manage.py collectstatic. Вся статика будет собрана в каталог static/
проекта

Настройки gunicorn

Сервер gunicorn должен:

запускаться при старте системы;


работать непрерывно;
перезапускаться, если по какой-то причине отключится.

Эти задачи решит systemd.

1. Создаём юнит для сервера Gunicorn:

в директории /etc/systemd/system/ создать файл gunicorn.service;


описать в файле команды для запуска, путь до проекта и виртуального окружения и права на
запуск процесса:

[Unit]
# это текстовое описание юнита, пояснение для разработчика
Description=gunicorn daemon

# при старте операционной системы запускать процесс только после того,


# как операционная система загрузится и настроит подключение к сети
After=network.target

[Service]
# от чьего имени запускать процесс:
# укажите имя, под которым вы подключались к серверу
User=<ваш логин>

# адрес к директории, где установлен Gunicorn


# /home/<ваш логин>/<директория-с-проектом-yatube>/<директория-с-файлом-
manage.py>/
WorkingDirectory=/develop/hw05_final/yatube/

# команду, которую вы запускали руками, теперь будет запускать systemd:


# в указанной директории будет выполнена команда bind
# и по запросу к 127.0.0.1:8000 будет выполнен файл запуска приложения yatube.wsgi
# /home/<ваш логин>/<директория-с-проектом-yatube>/<путь-до-gunicorn-в-
виртуальном-окружении> --bind 127.0.0.1:8000 yatube.wsgi:application
ExecStart=/develop/hw05_final/venv/bin/gunicorn --bind 127.0.0.1:8000
yatube.wsgi:application

[Install]
# группировка юнитов
WantedBy=multi-user.target

2. Запускаем gunicorn

7 / 11
Установка проекта на сервере.md 08.04.2023

sudo systemctl start gunicorn

3. Настраиваем систему на автоматический запуск gunicorn

sudo systemctl enable gunicorn

4. Проверяем, что gunicorn запустился

sudo systemctl status gunicorn

Настройка nginx

1. Настраиваем файрвол

sudo ufw allow 'Nginx Full'


sudo ufw allow OpenSSH

2. Запускаем файрвол

sudo ufw enable

Проверить внесённые изменения можно командой sudo ufw status

3. Запускаем nginx

sudo systemctl start nginx

4. Изменяем конфигурацию nginx по умолчанию /etc/nginx/sites-enabled/default. Заменяем


содержимое файла следующим:

# инструкции для nginx


server {
# следи за портом 80 на сервере с IP <ваш-ip>
listen 80;
server_name <ваш-ip>;

# если в адресе запроса есть аргумент '/static/' - верни файл из этой


директории
location /static/ {
# root /home/<имя_пользователя>/<название_проекта>/<папка_где_manage.py>/;
8 / 11
Установка проекта на сервере.md 08.04.2023

root /develop/hw05_final/yatube/;
}

# медиа файлы
location /media/ {
# root /home/<имя_пользователя>/<название_проекта>/<папка_где_manage.py>/;
root /develop/hw05_final/yatube/;
}

# любой другой запрос передай серверу Gunicorn


location / {
include proxy_params;
# передавать запросы нужно на внутренний IP на порт 8000
proxy_pass http://127.0.0.1:8000;
}
}

5. Проверяем конфигурацию nginx

sudo nginx -t

# текст успешной проверки:


# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

Запуск проекта
Выполняем следующие команды:

sudo systemctl daemon-reload


sudo systemctl restart gunicorn
sudo systemctl reload nginx

Открываем браузер и открываем HTML страницу по адресу сервера.

Настройка доступа к сайту по HTTPS


Создание самоподписанного SSL сертефиката

1. Создаем папку для хранения серификатов и переходим в неё

mkdir /develop/cert
cd /develop/cert

2. Cоздаем закрытый ключ, csr и подписанный сертификат:

9 / 11
Установка проекта на сервере.md 08.04.2023

openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out
domain.crt

Обязательно заполнять только Common Name (e.g. server FQDN or YOUR name). Если создаем
сертификат для сайта, то в этом поле нужно указать домен этого сайта.

3. Меняем права доступа для созданных сертификатов

chmod 664 domain.crt


chmod 664 domain.key

4. Настраиваем nginx для работы по HTTPS В раздел server файла настроек nginx
/etc/nginx/sites-enabled/default после listen 80 добавляем следующие строки

listen 443 ssl;


server_name <доменное имя>;
ssl_certificate /develop/cert/domain.crt;
ssl_certificate_key /develop/cert/domain.key;

5. Перезапускаем nginx

sudo systemctl reload nginx

6. Пробуем зайти на сайт по протоколу HTTPS. Скорее всего браузер и антивирус будут ругаться на
то, что сертификат невозможно проверить. Игнорируем этот запрос (ведь мы сами создали этот
сертификат) и продолжаем работу.

Создание SSL сертефиката для домена

!!! Перед автоматической настройкой сертификата в фале настроек nginx в строке server_name
вместо IP адреса указать доменное имя !!!

Сертификат будем получать от бесплатного сервера Let’s Encrypt c помощью специального пакета
certbot

1. Устанавливаем certbot

sudo apt install snapd


sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

10 / 11
Установка проекта на сервере.md 08.04.2023

2. Получение сертефиката

sudo certbot --nginx

В процессе оформления сертификата вам нужно будет указать свою электронную почту и ответить на
несколько вопросов.

“Enter email address” (англ. «введите почту»). Почта нужна для предупреждений, что сертификат
пора обновить.
“Please read the Terms of Service...” (англ. «прочитайте правила сервиса»). Прочитайте правила по
ссылке, введите y и нажмите Enter.
“Would you be willing to share your email address with the Electronic Frontier Foundation?” (англ.
«хотите ли вы поделиться своей почтой с Фондом электронных рубежей»). Отметьте на своё
усмотрение y (да) или n (нет) и нажмите Enter.
“Please enter the domain name(s) you would like on your certificate” (англ. «пожалуйста, введите
доменные имена, которые вы хотели бы видеть в своем сертификате»). Введите добавленное в
проект доменное имя, нажмите Enter.

certbot отправит ваши данные на сервер Let's Encrypt и там будет выпущен сертификат, который
автоматически сохранится на вашем сервере. Также будет изменена конфигурация nginx: добавятся
нужные настройки и будут прописаны пути к сертификату.

3. Перезапускаем nginx

sudo systemctl reload nginx

4. Обновление сертификата Бесплатный сертификат нужно обновлять минимум раз в три месяца.
Certbot делает это по умолчанию, если вы не меняли стандартных настроек. Убедиться, что всё
обновляется, можно с помощью команды:

sudo certbot renew --dry-run

Если по каким-то причинам автообновление не происходит, то можно выполнить следующую команду:

sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx
start"

Эта команда обновит сертификат и перезапустит nginx.

11 / 11

Вам также может понравиться