От идеи до облака за вечер: Как я собрал портфолио на FastAPI и запустил его на Railway.
Привет, дорогой читатель! 👋 Сегодня расскажу тебе историю о том, как я превратил пару сотен строк кода в работающее портфолио, которое теперь живёт в облаке и даже умеет отправлять письма. Звучит как магия? На самом деле, всё проще, чем кажется. Давай разберём по косточкам.
Зачем вообще FastAPI для статичного сайта? 🤔
Справедливый вопрос! Ведь для визитки обычно хватает HTML/CSS. Но я хотел три вещи:
- Контактную форму, которая реально работает (а не просто красивая кнопка)
- Автоматическую отправку писем мне и пользователю
- Лёгкую масштабируемость — вдруг захочу добавить API для блога?
И тут на сцену выходит FastAPI — фреймворк от Себастьяна Рамиреса, который взорвал мир Python-бэкендов в 2018 году. Его философия — скорость, простота и автоматическая документация. Представь: ты описываешь данные через Pydantic, а фреймворк сам генерирует OpenAPI-спецификацию и красивый Swagger UI. Разве это не чудо?
Аналитика: FastAPI обогнал по скорости даже Flask и Django REST Framework в тестах TechEmpower, благодаря асинхронности на Starlette и валидации через Pydantic. Крупные клиенты? Microsoft, Uber, Netflix экспериментируют с ним.
Архитектура: Что под капотом?
Мой проект — это классическое MVC (Model-View-Controller), но в терминах FastAPI:
Видишь этот lifespan? Это новинка FastAPI 0.104+ — менеджер контекста для управления жизненным циклом приложения. Раньше были события startup/shutdown, но теперь всё элегантнее и асинхроннее.
Шаблонизация: Jinja2 как старый друг
Хотя FastAPI часто используют для чистого API, он отлично работает с шаблонами:
В папке templates лежит index.html — обычный HTML с Bootstrap 5, но с магией Jinja2:
Статика (CSS, JS, картинки) монтируется одной строкой:
Самое интересное: контактная форма с двойной отправкой
А теперь давай разберём самую сочную часть — форму обратной связи. Я хотел, чтобы:
- Мне приходило уведомление о новом сообщении
- Отправитель получал автоответ
- Всё работало асинхронно, чтобы пользователь не ждал
Pydantic v2: Валидация как искусство
Сначала определяем модель данных:
Pydantic v2, выпущенный в 2023, стал на 5-50x быстрее благодаря Rust-компонентам. Проверка EmailStr использует регулярные выражения RFC 5322 — никаких фейковых email'ов!
SMTP: Старый-добрый протокол в новом свете
Для отправки почты я использовал стандартную библиотеку smtplib с STARTTLS (порт 587):
Важный момент: для Gmail нужно использовать App Password, а не обычный пароль. Это OAuth2-упрощённая схема, которую Google ввел в 2022 для повышения безопасности.
BackgroundTasks: Магия асинхронности
Вот где FastAPI показывает свою элегантность:
Пользователь мгновенно получает ответ, а письма отправляются в фоне. Если что-то пойдёт не так с email — форма всё равно отработает успешно! BackgroundTasks использует тот же event loop, что и основное приложение, но без блокировки.
Логирование: Что происходит внутри?
Я добавил детальное логирование, чтобы видеть каждый шаг:
В продакшене можно настроить JSON-логи для Elasticsearch или Sentry, но для стартапа хватает и такого.
Деплой на Railway: От локальной машины к облаку за 5 минут
Railway — это Platform-as-a-Service от бывших инженеров AWS и Google, запущенный в 2020. Их философия: "деплой должен быть простым как git push".
Шаг 1: Подготовка зависимостей
requirements.txt — минималистичный:
Procfile для Railway:
Шаг 2: Переменные окружения — секреты в безопасности
Никаких паролей в коде! Railway имеет встроенный Vault-like storage для секретов:
В панели Railway добавляем переменные:
- SMTP_SERVER=smtp.gmail.com
- SMTP_PORT=587
- SMTP_USERNAME=ваш@gmail.com
- SMTP_PASSWORD=пароль-приложения ← вот это критично!
- RECIPIENT_EMAIL=куда_отправлять@gmail.com
Шаг 3: Git push и магия начинается
Railway автоматически:
- Определяет Python-проект
- Устанавливает зависимости через pip
- Запускает uvicorn с правильными параметрами
- Выдаёт HTTPS-домен с Let's Encrypt сертификатом
А теперь самое интересное: Railway использует Nixpacks — открытый инструмент для сборки образов. Это как Dockerfile, но умнее. Он сам определяет, что у тебя Python-проект и как его собрать.
Проблемы и их решения 🛠
Проблема 1: SMTP не работает в продакшене
Решение: Вместо прямого SMTP к Gmail можно использовать SendGrid или Mailgun (у них есть бесплатные тарифы). Их API надёжнее и не блокируются провайдерами.
Проблема 2: Статика не обновляется
Решение: Я добавил хэши в имена CSS-файлов или можно использовать CDN. Но для простого портфолио хватает и встроенной раздачи.
Проблема 3: Нужна база данных для хранения сообщений
Решение: Railway предлагает PostgreSQL в один клик. В FastAPI достаточно добавить:
Что можно улучшить?
- HTTPS редирект — FastAPI легко настраивается через middleware
- Rate limiting — чтобы спамеры не завалили форму
- Telegram-уведомления — кроме email, слать сообщение в Telegram бот
- Кэширование через Redis (есть на Railway за $7/мес)
Итог: что получилось?
За один вечер я собрал:
- Сайт-портфолио с адаптивным дизайном
- Рабочую контактную форму с двойной отправкой
- Автоматический деплой с HTTPS
- Мониторинг через Railway Dashboard
Общая стоимость? $0 на стартовом тарифе Railway. Бесплатно дают $5 кредитов, которых хватит на несколько месяцев работы.
FastAPI доказал, что он идеален не только для микросервисов, но и для маленьких проектов. Асинхронность, автоматическая документация и скорость разработки — это тот самый sweet spot.
Документация для углубления:
🙌 Ну что, вдохновился?Если статья была полезной и ты тоже хочешь собрать своё портфолио на FastAPI — ставь лайк! Подписывайся, дальше разберём, как добавить к этому блог с комментариями и подпиской на рассылку.
Пиши в комментариях, с какими сложностями столкнулся при деплое своих проектов? Используешь Railway, Heroku или свой сервер? Давай обсудим!