Ubuntu — настройка сервера под Flask

Admin Flask, Ubuntu

Настраиваем Linux сервер Ubuntu для работы сайтов на python через фреймворк Flask.

Этот материал из цикла статей по разработке сайтов на python: от локальной разработки до развертывания на удаленном сервере.

В статье работаем на сервере Ubuntu 20.04 с базовой первичной настройкой. Как обновить и сделать первичную настройку сервера Ubuntu.

Мы уже настраивали сервер под Django. Некоторые процессы похожи, а некоторые отличаются.

Перед развертыванием сервера у нас должна быть готова локальная разработка, иначе особого смысла в удаленном сервере нет.

Если сначала подготовить сервер, а только потом разрабатывать локально, то при переносах появится мешанина. Поэтому лучше сначала сделать сайт или приложение в локальной среде, а затем по инструкции ниже настроить и перенести на сервер.

1. Установка пакетов для Python

Обновим пакеты в системе:

sudo apt update

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

sudo apt install python3-pip python3-dev python3-setuptools build-essential libssl-dev libffi-dev

2. Создаем виртуальную среду Python

Если нам нужно перенести сайт из локальной разработки на сервер, то пропускаем этот раздел и смотрим раздел 3, ниже.

Установим пакет python3-venv:

sudo apt install python3-venv

Заходим в папку пользователя:

cd /home/ploshadka

Создаем новую директорию для проекта. Это может быть название сайта:

mkdir ploshadka.net
cd ploshadka.net

Устанавливаем виртуальную среду в директорию venv. Она будет создана в текущей директории:

python3 -m venv venv

В этой изолированной виртуальной среде будут находиться различные модули для работы Python.

Для дальнейшей настройки активируем виртуальную среду:

source venv/bin/activate

3. Переносим локальный проект на удаленный сервер

Если мы переносим локальный проект на сервер, то используем инструкцию переноса приложения python на удаленный сервис.

В этом случае далее в статье, где указаны установки с командой pip можно пропустить, ведь они установлены локально и будут подтянуты на сервер из зависимостей.

4. Устанавливаем Flask

Находясь в виртуальной среде, устанавливаем:

pip install wheel
pip install uwsgi flask

Выходим из виртуальной среды:

deactivate

Дополнительно можно установить SQLAlchemy.

Создадим и проверим стартовую страницу

Создаём файл wsgi.py в корне сайта. Эта будет стартовая точка запуска нашего приложения.

Предварительно в нашем фаерволе ufw должен быть открыт порт:

sudo ufw allow 5000

Мы уже можем запустить наш сайт такой командой:

uwsgi --socket 111.111.111.111:5000 --protocol=http -w wsgi:app --py-autoreload 1

Сайт будет доступен по адресу:

http://111.111.111.111:5000

Поигрались и закрыли доступ снова:

sudo ufw delete allow 5000

Файл настроек

Дальше создадим файл с настройками в корне сайта:

wsgi-config.ini

Внутри него:

[uwsgi]
# Имя файла стартовой страницы без расширения
module = wsgi:app

# Режим мастера и количество рабочих процессоров
master = true
processes = 10

# Создание и очистка сокета
socket = wsgi-socket.sock
chmod-socket = 660
vacuum = true

die-on-term = true

# Автоматически обновляет данные на странице после изменений содержимого сайта
py-autoreload = 1

5. Настраиваем службу systemd

sudo nano /etc/systemd/system/ploshadka.service

Содержимое файла:

[Unit]
Description=uWSGI instance for ploshadka
After=network.target

[Service]
User=ploshadka
Group=www-data
WorkingDirectory=/home/ploshadka/ploshadka.net
Environment="PATH=/home/ploshadka/ploshadka.net/venv/bin"
ExecStart=/home/ploshadka/ploshadka.net/venv/bin/uwsgi --ini wsgi-config.ini

[Install]
WantedBy=multi-user.target

Команды службы uWSGI

Запуск службы:

sudo systemctl start ploshadka

Положим сервис в автозагрузку при запуске сервера:

sudo systemctl enable ploshadka

Проверка статуса:

sudo systemctl status ploshadka

Перезагрузка:

sudo systemctl restart ploshadka

Если меняете файл службы, то следует перезапустить демон:

systemctl daemon-reload

Если иногда требуется перезагрузить systemctl в авто-режиме без пароля.

6. Настройка Nginx

Установим nginx на сервер:

sudo apt update
sudo apt install nginx

Добавим разрешение в наш брандмауэр ufw. Посмотрим возможные конфигурации:

sudo ufw app list

А добавим:

sudo ufw allow 'Nginx Full'

Настроим базовую конфигурацию для nginx:

sudo nano /etc/nginx/sites-available/ploshadka.net
При копировании следующей инструкции, нужно быть внимательным, чтобы не допустить ошибки unknown directive.

Содержимое файла:

server {
    listen 80;
    server_name ploshadka.net www.ploshadka.net;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/ploshadka/ploshadka.net/wsgi-socket.sock;
    }
}

Проверим на ошибки в синтаксисе файла:

sudo nginx -t

Активируем настройки нового сайта для nginx:

sudo ln -s /etc/nginx/sites-available/ploshadka.net /etc/nginx/sites-enabled/ploshadka.net

Если встречается ошибка «command not found», попробовать очистить строку от лишних символов, которые вставляют отдельные редакторы.

Перезагрузим nginx:

sudo systemctl restart nginx

Сайт готов и должен работать по адресу http://:

http://ploshadka.net

7. Получаем сертификат Let’s Encrypt для https

Делать строго после настройки nginx конфига для сайта (предыдущий пункт).

Устанавливаем Certbot для Nginx:

sudo apt install certbot python3-certbot-nginx

Certbot самостоятельно будет обновлять сертификат за 30 дней до истечения срока.

Запрашиваем сертификат для своего сайта:

sudo certbot --nginx -d твой-сайт.net -d www.твой-сайт.net

Выбираем самостоятельное добавление конфигурации. Автоматически Certbot любит добавлять дубли.

После установки снова открываем файл nginx:

sudo nano /etc/nginx/sites-available/ploshadka.net

И меняем содержимое на такое:

server {
    server_name ploshadka.net www.ploshadka.net;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/ploshadka/ploshadka.net/wsgi-socket.sock;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ploshadka.net/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ploshadka.net/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.ploshadka.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = ploshadka.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name ploshadka.net www.ploshadka.net;
    return 404; # managed by Certbot
}

Опять проверим файл на ошибки синтаксиса:

sudo nginx -t

Перезагрузим nginx:

sudo systemctl restart nginx

Проверить время окончания сертификата можно так:

sudo systemctl status certbot.timer

8. Устанавливаем PostgreSQL

Установим PostgreSQL на сервер:

sudo apt-get install postgresql postgresql-contrib libpq-dev

Активируем виртуальную среду python (предварительно надо быть в каталоге сайта):

source venv/bin/activate

Теперь устанавливаем пакет psycopg2, который является python-postgreSQL адаптером:

pip install psycopg2

На случай проблем команда перезагрузки сервиса PostgreSQL в Ubuntu:

sudo systemctl restart postgresql.service

Перед созданием баз данных и пользователей не лишним будет ознакомиться с особенностями кодировок в PostgreSQL. Это поможет избежать возможных проблем при миграции базы данных с локальной разработки на удаленный сервер.

Дальше создаем и настраиваем пользователя и базу данных в PostgreSQL.

После настройки базы данных в PostgreSQL подключиться к ней можно с локального компьютера.

Если в локальной разработке уже есть нужные нам данные в БД, то перенесем их на удаленный сервер.

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Ubuntu — настройка сервера под Flask"