Production-ready FastAPI приложение с автоматическим деплоем на VPS
Полноценное решение для автоматического развертывания FastAPI приложения на VPS с нулевым временем простоя (zero-downtime deployment). Проект демонстрирует современные DevOps практики и production-ready инфраструктуру.
- ⚡ Zero-downtime deployment — обновления без остановки сервиса
- 🔒 Автоматический HTTPS — Let's Encrypt сертификаты из коробки
- 🐳 Полная контейнеризация — Docker + Docker Registry
- 🔄 Auto-update — Watchtower следит за новыми версиями
- 📦 Версионирование — поддержка множественных версий образов
- 🛡️ Security-first — best practices безопасности
| Компонент | Технология | Назначение |
|---|---|---|
| Backend | FastAPI 0.104+ | Современный async веб-фреймворк |
| Контейнеризация | Docker | Изоляция и портируемость |
| Reverse Proxy | Traefik 2.10 | Автоматический HTTPS и маршрутизация |
| SSL | Let's Encrypt | Бесплатные SSL сертификаты |
| Registry | Docker Registry | Приватное хранилище образов |
| Auto-update | Watchtower | Автоматическое обновление контейнеров |
| CI/CD | Makefile | Автоматизация деплоя |
- 🚀 Одна команда для деплоя —
make bpи всё готово - 📊 REST API — готовые endpoints с документацией
- 📝 Auto-documentation — Swagger UI + ReDoc из коробки
- 🔍 Health checks — мониторинг состояния приложения
- 🔄 Rolling updates — обновления без простоя
- 🏷️ Semantic versioning — управление версиями
- 🌐 Multi-domain — поддержка нескольких доменов
# Клонировать репозиторий
git clone https://github.com/ergon73/vps-autodeploy-fastapi.git
cd vps-autodeploy-fastapi
# Установить зависимости
pip install -r requirements.txt
# Запустить приложение
python main.pyОткройте http://localhost:8000 — приложение работает! 🎉
# Собрать и запустить
docker build -t fastapi-app .
docker run -p 8000:8000 fastapi-app# 1. Настроить окружение
cp env.example .env
nano .env # укажите свои данные
# 2. Задеплоить одной командой
make bp # build + push
# 3. Watchtower автоматически обновит приложение на сервере (~30 сек)# Главная страница
curl https://app.your-domain.com/
# Информация о приложении
curl https://app.your-domain.com/info
# Версия
curl https://app.your-domain.com/version
# Health check
curl https://app.your-domain.com/healthОткройте /docs для интерактивной API документации с возможностью тестирования endpoints.
Перед использованием замените все шаблонные значения на свои реальные данные!
-
Скопируйте файл с шаблонными настройками:
cp env.example .env
-
Отредактируйте .env файл с вашими данными:
nano .env
-
Обновите Makefile:
# Configuration (ЗАМЕНИТЕ НА СВОИ ДАННЫЕ!) REGISTRY_HOST = registry.your-domain.com REGISTRY_USER = your-username REGISTRY_PASSWORD = your-password IMAGE_NAME = fastapi-test-app APP_VERSION = 1.0.1
-
Настройте DNS записи:
app.your-domain.com→ IP вашего сервераregistry.your-domain.com→ IP вашего сервера
- Реальные пароли и токены
- Файлы
.envс реальными данными - SSL сертификаты и ключи
- Конфигурационные файлы с секретами
| Документ | Описание |
|---|---|
| ARCHITECTURE.md | 🏗️ Детальная архитектура и схема инфраструктуры |
| DEPLOYMENT.md | 🚀 Пошаговые инструкции по развертыванию |
| OPERATIONS.md | ⚙️ Команды управления и troubleshooting |
| DOCKER-HUB.md | 🐳 Интеграция с Docker Hub |
┌─────────────────────────────────────────────────────────┐
│ Internet │
│ ┌──────────────────────────────────────────────┐ │
│ │ DNS: app.your-domain.com │ │
│ │ registry.your-domain.com │ │
│ └───────────────────┬──────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────┐ │
│ │ VPS Server (Ubuntu 22.04) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ Traefik (Reverse Proxy) │ │ │
│ │ │ • Automatic HTTPS │ │ │
│ │ │ • Let's Encrypt │ │ │
│ │ └────────┬──────────────┬──────────────┘ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ FastAPI App │ │ Registry │ │ │
│ │ │ :8000 │ │ :5000 │ │ │
│ │ └──────┬───────┘ └──────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ Watchtower │ │ │
│ │ │ • Auto-update containers │ │ │
│ │ │ • Pull new images │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ │ │
│ │ Docker Network: traefik-network │ │
│ └───────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
| Endpoint | Метод | Описание |
|---|---|---|
/ |
GET | Главная страница с информацией о приложении |
/health |
GET | Health check для мониторинга |
/info |
GET | Детальная информация о системе |
/version |
GET | Текущая версия приложения |
/changelog |
GET | История изменений |
/current-date |
GET | Текущая дата и время сервера |
/docs |
GET | Swagger UI документация |
/redoc |
GET | ReDoc документация |
Перед использованием замените все шаблонные значения на свои реальные данные!
-
Скопируйте файл с шаблонными настройками:
cp env.example .env
-
Отредактируйте .env файл с вашими данными:
nano .env
-
Обновите Makefile:
# Configuration (ЗАМЕНИТЕ НА СВОИ ДАННЫЕ!) REGISTRY_HOST = registry.your-domain.com REGISTRY_USER = your-username REGISTRY_PASSWORD = your-password IMAGE_NAME = fastapi-test-app APP_VERSION = 1.0.1
-
Настройте DNS записи:
app.your-domain.com→ IP вашего сервераregistry.your-domain.com→ IP вашего сервера
- Реальные пароли и токены
- Файлы
.envс реальными данными - SSL сертификаты и ключи
- Конфигурационные файлы с секретами
# Основные команды
make help # Показать все доступные команды
make build # Собрать Docker образ
make push # Отправить образ в Registry
make bp # Build + Push (основная команда для деплоя)
# Управление версиями
make bump-patch # Увеличить patch версию (1.0.0 → 1.0.1)
make bump-minor # Увеличить minor версию (1.0.0 → 1.1.0)
make bump-major # Увеличить major версию (1.0.0 → 2.0.0)
# Локальная разработка
make run # Запустить локально
make stop # Остановить локальный контейнер
make logs # Показать логи
# Проверка
make check-deploy # Проверить статус деплоя@app.get("/new-endpoint")
async def new_endpoint():
return {"message": "New endpoint"}# 1. Внести изменения в код
nano main.py
# 2. Увеличить версию
make bump-patch
# 3. Задеплоить
make bp
# 4. Подождать ~30 секунд (Watchtower обновит автоматически)
# 5. Проверить
curl https://app.your-domain.com/version# Проверить версии в Registry
curl -k -u your-username:your-password \
https://registry.your-domain.com/v2/fastapi-test-app/tags/list
# Локальные логи
make logs
# Логи на сервере
ssh your-server "docker logs -f fastapi-app"
# Проверить статус
make check-deploy| Компонент | Реализация |
|---|---|
| HTTPS | Let's Encrypt автоматические сертификаты |
| TLS | 1.2+ only, современные cipher suites |
| Headers | Security headers через Traefik |
| Container | Непривилегированный пользователь |
| Firewall | UFW, только порты 22, 80, 443 |
| Secrets | .env файлы не в Git |
| Registry | HTTP Basic Auth |
- Response time: ~50-200ms
- Container restart: ~2-3 секунды
- Deployment time: ~30 секунд
- Downtime: 0 секунд (zero-downtime)
- SSL handshake: ~100ms
Проблема: Не удается авторизоваться в Registry
# Проверить доступность Registry
curl -k https://registry.your-domain.com/v2/
# Проверить учетные данные
make loginПроблема: Образ не обновляется
# Проверить логи Watchtower
docker logs watchtower -f
# Принудительное обновление
docker compose pull && docker compose up -dПроблема: Приложение недоступно
# Проверить статус контейнеров
docker ps
# Проверить логи приложения
docker logs fastapi-app
# Проверить логи Traefik
docker logs traefik✅ DevOps практики:
- Полный CI/CD пайплайн
- Infrastructure as Code
- Zero-downtime deployment
- Версионирование образов
✅ Production-ready решение:
- Автоматический HTTPS
- Мониторинг и логирование
- Health checks
- Безопасность
✅ Современный стек:
- FastAPI (async Python)
- Docker ecosystem
- Reverse proxy (Traefik)
- Автоматизация (Makefile)
- ✅ Добавлен endpoint
/changelog - ✅ Обновлена информация о версии
- ✅ Демонстрация множественных версий в Registry
- ✅ Улучшена документация
- ✅ Первоначальный релиз
- ✅ Базовые endpoints
- ✅ Docker контейнеризация
- ✅ Автодеплой на VPS
Проект открыт для улучшений! Если вы нашли баг или хотите добавить функционал:
- Fork проекта
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменений (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Откройте Pull Request
Георгий Белянин
MIT License - смотрите LICENSE для деталей
Сделано с ❤️ для демонстрации современных DevOps практик
⭐ Поставьте звезду, если проект был полезен!