Упаковка и запуск в продакшн — развёртывание на Railway

В этой главе вы узнаете о настройке производственной среды FastAPI и развернёте блог в продакшене с помощью Railway.


Управление конфигурацией производственной среды

(venv) $ pip install pydantic-settings python-dotenv

Пример

# Путь к файлу: config.py
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    """Конфигурация приложения (автоматически читается из файла .env)"""
    app_name: str = "EXAMPLE blog"
    debug: bool = False
    secret_key: str = "dev-secret-key-change-me"
    database_url: str = "sqlite:///./blog.db"
    access_token_expire_minutes: int = 60 * 24 * 7   # 7 дней

    class Config:
        env_file = ".env"     # Укажите файл переменных окружения

settings = Настройки()

Создайте.envФайл:

SECRET_KEY=a1b2c3d4...your-real-secret-key
DATABASE_URL=sqlite:///./blog.db
DEBUG=False

Сгенерируйте файлы зависимостей

(venv) $ pip freeze > requirements.txt

Подтвердите, что включены основные зависимости:fastapi、uvicorn、sqlalchemy、jinja2、alembic、passlib、python-jose、python-multipart、sqladmin、pydantic-settings.


Настройте Procfile и команду запуска

FastAPI использует ASGI-сервер, в отличие от WSGI во Flask/Django:

web: uvicorn main:app --host 0.0.0.0 --port $PORT

Если требуется несколько воркеров (рекомендуется для продакшена):

web: gunicorn -k uvicorn.workers.UvicornWorker -w 4 main:app

WSGI против ASGI:Django/Flask используют Gunicorn(сервер WSGI),FastAPI использует Uvicorn(сервер ASGI)。Gunicorn сам по себе является WSGI, но может быть доступен черезuvicorn.workers.UvicornWorkerЗапустите ASGI-приложение.


Отправьте на GitHub

$ git init
$ echo "venv/" > .gitignore
$ echo "__pycache__/" >> .gitignore
$ echo "*.pyc" >> .gitignore
$ echo ".env" >> .gitignore
$ git add .
$ git commit -m "初始化 FastAPI 博客项目"
$ git branch -M main
$ git remote add origin https://github.com/你的用户名/fastapi-blog.git
$ git push -u origin main

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

  1. Посетитеrailway.app, войдите с помощью GitHub
  2. Новый проект → Развернуть из репозитория GitHub → Выберите fastapi-blog
  3. Railway автоматически обнаруживает Procfile
  4. Задайте переменные окружения в Variables
  5. Нажмите Deploy

Настройка переменных окружения

Имя переменнойЗначениеОписание
SECRET_KEYСлучайно сгенерированная длинная строкаКлюч подписи JWT
DATABASE_URLВнедряется RailwayПродакшен-база данных

После успешного развёртывания вы получите ссылку. Перейдите на /docs, чтобы посмотреть документацию Swagger, и на /admin, чтобы получить доступ к админ-панели.


Сравнение фреймворков

ОсобенностиFastAPIDjangoFlask
ORMSQLAlchemyDjango ORM (встроенный)Flask-SQLAlchemy
Валидация данныхPydanticФормы DjangoFlask-WTF
Организация маршрутовAPIRouterurls.pyBlueprint
Аутентификация пользователейJWT + OAuth2Аутентификация на основе сессий (встроенная)Flask-Login(Сессия)
Миграции базы данныхAlembicmakemigrations / migrateFlask-Migrate
Панель администратораsqladminDjango AdminFlask-Admin
Документация API/docs (авто)Требуется drf-spectacularТребуется Flasgger
ServerUvicorn(ASGI)Gunicorn(WSGI)Gunicorn(WSGI)

Следующие направления обучения

Направление обученияКому это подходитРекомендуемая отправная точка
Асинхронный SQLAlchemyТребуется более высокая производительность при конкурентной нагрузкеПереключите синхронный Session на AsyncSession
Разделение фронтенда и бэкенда: FastAPI + Vue3/ReactАрхитектура SPA + APIЗамените шаблоны Jinja2 на Vue3/React, а FastAPI будет выступать исключительно в роли API-бэкенда.
WebSocketНужна push-доставка в реальном времени (чат, уведомления)FastAPI нативно поддерживает WebSocket: @app.websocket()
PostgreSQLБаза данных промышленного уровняЗамените DATABASE_URL, установите asyncpg или psycopg2
Другие расширения