lab_1-flask_postgres

0

Описание

лабораторная работа описывающая развертывание веб-приложения (на примере Flask + PostgreSQL) на мощностях Cloud.ru

Языки

  • Shell65,5%
  • HTML23,5%
  • Python7,9%
  • Dockerfile3,1%
7 месяцев назад
8 месяцев назад
7 месяцев назад
8 месяцев назад
8 месяцев назад
8 месяцев назад
8 месяцев назад
README.md

Лабораторная работа 1: Развертывание веб-приложения

Цель работы

Развернуть веб-приложение на Flask с базой данных PostgreSQL в облачной среде.

Структура проекта

lab1_web_deployment/ ├── src/ # Исходный код приложения │ ├── app.py # Основной файл Flask приложения │ ├── models.py # Модели данных │ ├── routes.py # Маршруты API │ └── templates/ # HTML шаблоны ├── config/ # Конфигурационные файлы │ ├── docker-compose.build.yml # Docker Compose для разработки │ ├── docker-compose.deploy.yml # Docker Compose для продакшена │ ├── docker-compose.deploy_no-db.yml # Docker Compose без БД в контейнере │ ├── nginx.conf # Конфигурация Nginx │ ├── env.example # Пример переменных окружения │ ├── env.local # Локальные переменные окружения │ ├── env.no-db # Переменные для запуска без БД в контейнере │ └── requirements.txt # Зависимости Python ├── docs/ # Документация │ ├── deployment.md # Инструкции по развертыванию │ └── deployment_no-db.md # Инструкции по развертыванию без БД в контейнере ├── scripts/ # Скрипты для автоматизации │ ├── deploy.sh # Автоматизация развертывания │ └── check_prerequisites.sh # Проверка предварительных требований (опционально) ├── Dockerfile # Docker образ на Alpine Linux └── README.md # Этот файл

Технологии

  • Backend: Flask (Python 3.9 Alpine)
  • База данных: PostgreSQL 13 Alpine
  • Администрирование БД: Через psql или другие инструменты
  • Веб-сервер: Nginx Alpine (для продакшена)
  • Контейнеризация: Docker
  • Оркестрация: Docker Compose

Требования

  • Python 3.8+
  • Docker и Docker Compose (новый синтаксис)
  • Git
  • Bash (как основной командный интерпретатор)

Предварительные требования

🐳 Docker

Версия: 20.10+ (рекомендуется 24.0+)

Установка:

  • macOS (рекомендуется):

  • Linux: Следуйте инструкциям для Вашего дистрибутива: https://docs.docker.com/engine/install/

  • Windows:

    • Не поддерживается официально
    • Рекомендуется использовать WSL2 с Ubuntu или создать VM с Linux
    • Для WSL2: установите Docker в Ubuntu подсистеме по инструкции выше

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

🔧 Docker Compose

Версия: 2.0+ (встроен в Docker CLI)

Проверка:

Примечание: Если у вас установлен старый

docker-compose
(с дефисом), обновите до нового синтаксиса
docker compose
(с пробелом).

🐍 Python

Версия: 3.8+ (рекомендуется 3.9+)

Проверка:

Установка (если не установлен):

  • macOS:
    brew install python@3.9
  • Ubuntu/Debian:
    sudo apt install python3 python3-pip
  • Fedora/RHEL:
    sudo dnf install python3 python3-pip

📦 Дополнительные инструменты

cURL (для health checks)

Проверка:

Установка (если не установлен):

  • Ubuntu/Debian:
    sudo apt install curl
  • Fedora/RHEL:
    sudo dnf install curl

Git

Проверка:

Установка (если не установлен):

  • macOS:
    brew install git
  • Ubuntu/Debian:
    sudo apt install git
  • Fedora/RHEL:
    sudo dnf install git

🐚 Командный интерпретатор

Требуется: Bash (основной командный интерпретатор)

Проверка:

Примечание: Скрипты автоматизации написаны для Bash. Если используется другой shell (zsh, fish), рекомендуется переключиться на Bash или адаптировать скрипты.

🔍 Опциональная проверка готовности

Если вы хотите проверить готовность своего рабочего места к разработке или локальным тестам, можете использовать готовый скрипт:

Этот скрипт проверит:

  • Версии всех необходимых инструментов
  • Работоспособность Docker
  • Доступность портов
  • Свободное место на диске

🚨 Решение проблем

Docker daemon не запущен

Проблемы с правами доступа (Linux)

Старая версия Docker Compose

Недостаточно места на диске

Проблемы с WSL2 (Windows)

Переключение на Bash (если используется другой shell)

Запуск локально

Режим разработки

Автоматическое развертывание

Доступные сервисы

Режим разработки

Режим продакшена

Режим продакшена без БД в контейнере

Docker Compose файлы

docker-compose.build.yml (разработка)

  • Flask приложение с hot-reload
  • PostgreSQL
  • Health checks для всех сервисов
  • Монтирование исходного кода
  • Переменные окружения с значениями по умолчанию

docker-compose.deploy.yml (продакшен)

  • Использует готовый образ flask-app:latest
  • Nginx как reverse proxy
  • PostgreSQL в контейнере
  • Поддержка SSL/TLS (требует настройки сертификатов)
  • Ограничения ресурсов для всех сервисов
  • Переменные окружения из .env файла
  • Сетевая изоляция через app-network

docker-compose.deploy_no-db.yml (продакшен без БД)

  • Flask приложение и Nginx в контейнерах

  • PostgreSQL установлен на хосте

  • Использует

    network_mode: host

  • extra_hosts: ["web:127.0.0.1"]
    для резолвинга имен

  • Подходит для продакшена с системными сервисами

Health Checks

Все сервисы настроены с health checks и зависимостями:

  • Flask приложение: проверка

    /health
    endpoint через curl

  • PostgreSQL:

    pg_isready -U postgres -d flask_app

  • Nginx: проверка health endpoint

Порядок запуска: PostgreSQL → Flask → Nginx (только в продакшене)

Переменные окружения

Значения по умолчанию (для разработки)

Продакшен значения

Создайте файл

.env
на основе
env.example
:

Особенности реализации

Alpine Linux образы

  • Flask:
    python:3.9-alpine
    с минимальными зависимостями
  • PostgreSQL:
    postgres:13-alpine
    для компактности
  • Nginx:
    nginx:alpine
    для веб-сервера

Автоматизация

  • Скрипт
    deploy.sh
    автоматически:
    • Проверяет предварительные требования
    • Создает бэкапы (если есть права)
    • Останавливает текущие сервисы
    • Очищает неиспользуемые образы
    • Запускает выбранный режим
    • Проверяет здоровье всех сервисов

Мониторинг

  • Health checks для всех сервисов
  • Автоматические перезапуски при сбоях
  • Логирование через Docker Compose

Развертывание

  • Локальное и продакшен: См. файл
    docs/deployment.md
  • Без БД в контейнере: См. файл
    docs/deployment_no-db.md