lab_1-flask_postgres
Описание
лабораторная работа описывающая развертывание веб-приложения (на примере Flask + PostgreSQL) на мощностях Cloud.ru
Языки
- Shell65,5%
- HTML23,5%
- Python7,9%
- Dockerfile3,1%
Лабораторная работа 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)
Проверка:
Примечание: Если у вас установлен старый (с дефисом), обновите до нового синтаксиса (с пробелом).
🐍 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)
Запуск локально
Режим разработки
Автоматическое развертывание
Доступные сервисы
Режим разработки
- Приложение: http://localhost:5000
- База данных: localhost:5432
Режим продакшена
-
Приложение: http://localhost:80 (через Nginx) или http://localhost:5000 (прямо)
-
База данных: только внутренний доступ
-
Nginx: http://localhost:80
Режим продакшена без БД в контейнере
- Приложение: http://localhost:5000 (прямо) или http://localhost (через Nginx)
- Nginx: http://localhost (в контейнере, но на хостовом порту 80)
- PostgreSQL: localhost:5432 (на хосте)
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 приложение: проверка
endpoint через curl/health -
PostgreSQL:
pg_isready -U postgres -d flask_app -
Nginx: проверка health endpoint
Порядок запуска: PostgreSQL → Flask → Nginx (только в продакшене)
Переменные окружения
Значения по умолчанию (для разработки)
Продакшен значения
Создайте файл на основе :
Особенности реализации
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