Вы только что написали свой первый скрипт на Python и теперь хотите сделать настоящий API. Не сайт. Не веб-приложение. Просто API - чистый, быстрый, без лишнего. Но что взять? Django? Flask? FastAPI? Нужно ли использовать PostgreSQL? Нужен ли Docker? Сколько всего этого должно быть, чтобы просто заработать на первом API? Всё, что вам нужно - это минимум. Не больше. Ни одного лишнего инструмента. Ни одной лишней зависимости.
Ядро: Python 3.12
Начните с самого простого. Python - это язык, на котором пишут большинство API, потому что он прост в изучении и работает быстро. Версия 3.12 - это то, что стоит использовать в 2026 году. Она быстрее, чем 3.10, стабильнее, чем 3.11, и поддерживается официально до 2028 года. Никаких экспериментов с альтернативами вроде PyPy или Rust. Вы не пишете драйвер для графической карты. Вы пишете API. Python - идеальный выбор.
Установите его через pyenv (если на Linux/macOS) или скачайте с python.org (если на Windows). Потом создайте виртуальное окружение: python -m venv api_env. Активируйте его. Теперь всё, что вы установите, будет изолировано. Никаких конфликтов с другими проектами.
Фреймворк: FastAPI
Вы могли бы взять Flask - и это было бы нормально. Но FastAPI - это следующий шаг. Он не просто легковесный. Он автоматически генерирует документацию API на основе типов данных. Написали def get_user(id: int): - и у вас сразу есть интерактивная документация по адресу /docs. Никаких рукописных Swagger-файлов. Никаких отдельных инструментов для тестирования. Вы пишете код - и сразу видите, как он работает.
FastAPI использует ASGI - это значит, что он может обрабатывать одновременно тысячи запросов. Он не медленнее Flask, но работает быстрее в продакшене. Установите его одной командой: pip install fastapi uvicorn. Уверен, вы уже знаете, что такое uvicorn? Это сервер, который запускает ваш FastAPI-код. Без него API не запустится. Две зависимости - и всё.
Хранение данных: SQLite
Да, вы можете использовать PostgreSQL. Или MySQL. Или MongoDB. Но зачем? Вы делаете первый API. Это не Instagram. Это не сервис с миллионами пользователей. Вам нужен простой способ хранить данные - и всё.
SQLite - это файл. Да, просто файл. Он хранит всё: таблицы, индексы, данные. Никаких серверов. Никаких паролей. Никаких подключений. Установите sqlite3 - он уже есть в Python. Никаких дополнительных пакетов. Создайте файл database.db - и начните работать. Никто не узнает, что вы используете SQLite, пока не посмотрит в код. Это не «непрофессионально». Это - разумно.
Для работы с базой используйте sqlite3 из стандартной библиотеки. Не нужно ORM вроде SQLAlchemy. Вы не пишете сложное приложение с десятками моделей. Вы пишете простой API. Простые запросы. Простые таблицы. Это работает.
Проверка данных: Pydantic
FastAPI использует Pydantic - это не просто библиотека. Это система проверки и приведения данных. Когда вы пишете class User(BaseModel): name: str; age: int - Pydantic автоматически проверяет, что имя - это строка, а возраст - число. Если приходит строка вместо числа - он сразу отвечает ошибкой 422. Без лишнего кода. Без кучи if.
Это не опционально. Это часть FastAPI. Вы не устанавливаете его отдельно - он уже входит в состав. Но вы должны его использовать. Без него вы рискуете принимать битые данные. Без него вы не получите автоматическую документацию. Это не «дополнительно». Это основа.
Деплой: uvicorn + systemd (Linux)
Вы написали API. Потестировали. Теперь нужно запустить его на сервере. Не на вашем ноутбуке. Не в Docker-контейнере. Просто на VPS.
Запускать uvicorn main:app --host 0.0.0.0 --port 8000 - это не продакшен. Это тест. Настоящий способ - это systemd. Это системный менеджер сервисов в Linux. Вы создаёте файл /etc/systemd/system/api.service с описанием, где лежит ваш код, какой пользователь запускает, какие переменные окружения нужны. Потом включаете сервис: sudo systemctl enable api и sudo systemctl start api. Сервер перезагрузится - и ваш API останется живым. Никаких Docker, никаких Nginx, никаких reverse-proxy. Просто uvicorn + systemd. Это работает на любом дистрибутиве Linux: Ubuntu, Debian, CentOS - неважно.
Логи и мониторинг: файлы и curl
Вы не нужны Prometheus. Не нужны Grafana. Не нужны Sentry. Вы делаете первый API. Вам нужно знать: работает ли он? Отвечает ли? Есть ли ошибки?
Запишите логи в файл. Просто добавьте в команду запуска: uvicorn main:app --host 0.0.0.0 --port 8000 >> /var/log/api.log 2>&1. Теперь все ошибки и запросы пишутся в /var/log/api.log. Потом просто смотрите: tail -f /var/log/api.log. Если что-то сломалось - вы увидите это сразу.
Тестируйте через curl: curl http://localhost:8000/users. Это проще, чем Postman. Это быстрее, чем Swagger UI. Это работает на любом сервере. Это - ваш инструмент.
Что не нужно: Docker, Nginx, Redis, PostgreSQL
Вы можете услышать: «Docker - это стандарт». Но он не нужен, если вы не развертываете 10 сервисов. Вы не делаете микросервисы. Вы делаете один API. Docker добавляет сложность. Он требует знаний о сетях, портах, volumes. Это перебор.
Nginx? Он нужен, если вы делаете HTTPS, балансировку или кэширование. Вы не делаете это. У вас один API. FastAPI и systemd - это всё, что вам нужно.
Redis? Нужен для кэширования. Вы не кэшируете. PostgreSQL? Нужен для больших данных. У вас - десятки записей. SQLite хватит на год. Даже на два.
Вы не должны усложнять. Вы должны просто запустить. И сделать так, чтобы это работало. Без лишнего.
Пример: как выглядит ваш первый API
Вот всё, что вам нужно в файле main.py:
from fastapi import FastAPI
from pydantic import BaseModel
import sqlite3
app = FastAPI()
class User(BaseModel):
name: str
age: int
@app.get("/users")
def get_users():
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute("SELECT name, age FROM users")
rows = cursor.fetchall()
conn.close()
return [{"name": row[0], "age": row[1]} for row in rows]
@app.post("/users")
def create_user(user: User):
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (user.name, user.age))
conn.commit()
conn.close()
return {"message": "User created"}
Создайте базу: sqlite3 database.db "CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)"
Запустите: uvicorn main:app --host 0.0.0.0 --port 8000
Откройте http://localhost:8000/docs - и вы увидите интерактивную документацию. Протестируйте через кнопки. Потом запустите на сервере через systemd. И всё. Ваш первый API работает. Без лишнего.
Что дальше?
Когда вы начнёте получать больше трафика - тогда подумайте о Nginx, о HTTPS, о Redis. Когда вы начнёте хранить миллионы записей - тогда перейдите на PostgreSQL. Когда вы начнёте масштабироваться - тогда придет Docker. Но пока вы просто начинаете - всё, что вам нужно, - это Python, FastAPI, SQLite и systemd.
Не пытайтесь сделать всё идеально. Сделайте просто. Сделайте рабочим. Сделайте - и потом улучшайте. Это и есть настоящий путь разработчика.
Можно ли использовать Django вместо FastAPI для первого API?
Можно, но это не оптимально. Django - это полноценный фреймворк для веб-сайтов с админкой, шаблонами, формами и ORM. Для API он тяжеловат. FastAPI проще, быстрее и даёт автоматическую документацию. Если вы делаете чистый API - FastAPI лучше. Django лучше, если вы делаете сайт с интерфейсом. Для первого API - выбирайте FastAPI.
Почему не использовать PostgreSQL сразу?
PostgreSQL требует отдельного сервера, настройки пользователей, паролей, резервного копирования и мониторинга. SQLite - это один файл. Вы можете скопировать его, залить на GitHub, перенести на другой сервер - и всё работает. Для первого API с десятками или сотнями записей SQLite надёжнее и проще. PostgreSQL - это когда у вас уже есть нагрузка, а не когда вы только начинаете.
Нужен ли Docker для деплоя?
Нет. Docker добавляет слой абстракции, который не нужен, когда вы управляете одним сервисом. systemd на Linux - это стандартный, надёжный и проверенный способ запуска Python-приложений. Docker полезен, когда вы разворачиваете несколько сервисов (база, кэш, API, веб-интерфейс). Для одного API - это перебор. Учитесь сначала работать с базовыми инструментами, прежде чем переходить к контейнерам.
Как протестировать API без Postman?
FastAPI автоматически генерирует интерактивную документацию по адресу /docs. Там вы можете отправлять запросы прямо из браузера. Альтернатива - curl в терминале. Например: curl -X POST http://localhost:8000/users -H "Content-Type: application/json" -d '{"name":"Иван","age":25}'. Это быстрее, чем Postman, и работает на любом сервере. Postman - это удобно, но не обязательно.
Что делать, если API перестал работать после перезагрузки сервера?
Если вы используете systemd, то сервис автоматически запускается при загрузке системы. Если он не запустился - проверьте логи: sudo journalctl -u api. Там вы увидите, почему процесс не запустился: ошибка в пути к файлу, отсутствие виртуального окружения, неправильные права. systemd не «сломался» - он просто не смог запустить приложение. Ищите причину в логах - и исправляйте. Это нормальная часть разработки.