Документация / Администрирование

Веб-приложение Flask + nginx

Обновлено 12.10.2026

Пример веб-приложения с интерфейсом задач, JSON API и SQLite. Цепочка запросов: nginx → Waitress → Flask → SQLite. Проверено на публичном образе Extended 0.1.604 x86_64, 12 октября 2026 года.

Подготовка

Скачайте исходники примера и распакуйте архив на хосте. Перенесите каталог webdemo в /root/webdemo гостевой ОС. Если SSH уже настроен, на хосте можно использовать SFTP:

sftp -i ~/.ssh/synapse_demo -o IdentitiesOnly=yes -P 2226 root@127.0.0.1

В приглашении SFTP, из каталога распакованного архива:

put -r webdemo /root/
bye

Настройка доступа описана в инструкции по SSH. В госте нужны /bin/python3, /bin/nginx и доступ к сети. Пример рассчитан на Extended; наличие этих программ в других редакциях здесь не проверялось.

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

В консоли гостевой ОС:

cd /root/webdemo
python3 -m pip install --target vendor -r requirements.txt

В примере закреплены Flask 3.1.3 и Waitress 3.0.2 с зависимостями. Пакеты устанавливаются в каталог приложения; встроенные библиотеки Python не заменяются.

Проверка приложения

python3 /root/webdemo/flask_app.py

Waitress слушает 127.0.0.1:8081. Из второй консоли проверьте:

curl -i http://127.0.0.1:8081/healthz

Ожидается HTTP 200 и {"database":"ok","status":"ok"}. Для перехода к запуску как службы остановите ручной процесс Ctrl+C.

Настройка nginx

Если nginx уже используется, сначала сохраните его текущую конфигурацию. Для отдельной демонстрационной VM:

cp /etc/nginx/nginx.conf /root/nginx-before-demo.conf
cp /root/webdemo/nginx.conf /etc/nginx/nginx.conf
mkdir -p /run /var/log /var/lib/nginx
nginx -t

Поставляемая конфигурация принимает HTTP на порту 80 и передаёт запросы Waitress на 127.0.0.1:8081. Для этой сборки используются master_process off, daemon off и метод событий poll. Домен и TLS в этом примере не настраиваются.

Автозапуск

Создайте файл /etc/services/python-demo в nano:

#!/bin/sh
exec /bin/python3 /root/webdemo/flask_app.py

Сохраните прежнее описание службы nginx. Затем файл /etc/services/nginx должен содержать:

#!/bin/sh
exec /bin/nginx

Включите службы:

chmod 755 /etc/services/python-demo /etc/services/nginx
service enable python-demo
service enable nginx
service restart python-demo
service restart nginx
service list
curl -i http://127.0.0.1/healthz
curl -sS http://127.0.0.1/api/status

Службы должны показывать состояние running. Журнал приложения: /var/log/python-demo.log, журналы nginx: /var/log/nginx.log и /var/log/nginx-access.log.

Открытие на хосте

При запуске QEMU добавьте к существующему -netdev user,id=net0 перенаправление порта:

-netdev user,id=net0,hostfwd=tcp:127.0.0.1:18888-:80

Если уже есть перенаправление SSH, объедините параметры в одном -netdev:

-netdev user,id=net0,hostfwd=tcp:127.0.0.1:2226-:22,hostfwd=tcp:127.0.0.1:18888-:80

Откройте в браузере хоста http://127.0.0.1:18888/. Это локальный адрес вашего компьютера; приложение и база данных работают внутри Синапс ОС. Кадры примера доступны в галерее.

Данные и проверка

Задачи сохраняются в /root/webdemo/tasks.sqlite. Интерфейс позволяет создавать и переименовывать задачи, менять статус, фильтровать и удалять их. API: GET /api/tasks, POST /api/tasks, GET, PATCH и DELETE /api/tasks/ID.

Проверены 18 запросов API, действия в браузере и сохранение задач после sync и перезагрузки F12. Обе службы запустились автоматически. Нагрузочное тестирование не проводилось. Для копирования данных используйте резервные копии.

Особенности сборки 0.1.604

В штатном скрипте запуска nginx аргумент $@ передавался буквально. Прямой exec /bin/nginx в описании службы обходит эту ошибку.

Второй обход включён в flask_app.py: если os.set_blocking возвращает EINVAL на Синапс ОС, флаги неблокирующего канала устанавливаются через fcntl. Это необходимо для запуска Waitress в проверенном образе. Обход действует только внутри процесса приложения; ядро и библиотека Waitress не изменяются.

Пример не содержит авторизации: запускайте его с указанным локальным перенаправлением QEMU. Подключение публичного адреса требует отдельной настройки доступа.