Используем pyenv. Для начала установим файлы, необходимые для установки Python:
apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev
Установка pyenv:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src
Настройка переменных окружения:
sed -Ei -e '/^([^#]|$)/ {a \
export PYENV_ROOT="$HOME/.pyenv"
a \
export PATH="$PYENV_ROOT/bin:$PATH"
a \
' -e ':a' -e '$!{n;ba};}' ~/.profile
echo 'eval "$(pyenv init --path)"' >>~/.profile
echo 'eval "$(pyenv init -)"' >>~/.bashrc
Перелогинимся для применения.
Для управления виртуальными окружениями Python установим модуль pyenv-virtualenv:
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc
Приложение будем размещать в папке /var/www/app
, поэтому установим заодно nginx
:
apt install -y nginx
git clone https://github.com/gothinkster/django-realworld-example-app /var/www/app
Установим нужную версию Python, создадим виртуальное окружение и назначим его папке нашего приложения:
pyenv install 3.5.10
pyenv virtualenv 3.5.10 app
cd /var/www/app/ && pyenv local app
Соберём зависимости проекта:
pip install -r requirements.txt
По заданию у нас PostgreSQL:
apt install -y postgresql
Настроим доступ для локальных пользователей:
vi /etc/postgresql/12/main/pg_hba.conf
# Database administrative login by Unix domain socket
local all postgres trust
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
systemctl restart postgresql
Создадим пользователя БД и базу:
sudo -u postgres createuser -d django
createdb -U django django
Установим библиотеки для взаимодействия с Python:
apt install libpq-dev
pip install psycopg2
Добавим следующие исправления в settings.py
:
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'django',
'USER': 'django',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
STATIC_ROOT = '/var/www/static'
после чего выполним миграции и генерацию статики:
python manage.py migrate
python manage.py collectstatic
В папке приложения:
pip install uwsgi
Добавим сервис для автоматического запуска wsgi
:
vi /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI instance to serve Django app
[Service]
ExecStartPre=-/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown www-data:www-data /run/uwsgi'
ExecStart=/usr/bin/bash -c 'cd /var/www/app; /root/.pyenv/shims/uwsgi --ini wsgi_app.ini'
[Install]
WantedBy=multi-user.target
Настройки для взаимодействия с приложением:
vi wsgi_app.ini
[uwsgi]
module = conduit.wsgi
master = true
processes = 5
uid = root
socket = /run/uwsgi/wsgi_app.sock
chown-socket = www-data:www-data
chmod-socket = 660
vacuum = true
die-on-term = true
Включение, запуск и проверка сервиса:
systemctl daemon-reload
systemctl enable uwsgi
systemctl start uwsgi
systemctl status uwsgi
Настроим сайт для нашего приложения:
vi /etc/nginx/sites-available/es1305-www-1.devops.rebrain.srwx.net
server {
listen 80 default_server;
index index.html index.htm index.nginx-debian.html;
server_name es1305-www-1.devops.rebrain.srwx.net;
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/wsgi_app.sock;
}
location /static/ {
alias /var/www/static/;
}
}
Включим наш сайт и отключим сайт по умолчанию nginx
:
ln -s /etc/nginx/sites-available/es1305-www-1.devops.rebrain.srwx.net /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default
Проверим и перезагрузим nginx
:
chown -R www-data:www-data /var/www
nginx -t
nginx -s reload
Используем certbot для получения сертификата Let’s Encrypt и автоматической настройки nginx
:
apt install certbot python3-certbot-nginx
certbot --nginx -d es1305-www-1.devops.rebrain.srwx.net
nginx -t
nginx -s reload