PostgreSQL
Для создания базы данных мы обновим файл docker-compose.yml добавив блок под названием db. В этом блоке мы пропишем учетные данные пользователя и имя базы, и том, на котором будем хранить базу. Обратите внимание на версию образа postgres, возможно вы захотите её изменить.
services:
web:
# Берем Dockerfile из каталога app
build: app
# Запускаем тестовый сервер
command: uvicorn app.main:app --host 0.0.0.0
# куда будут помещены данные из каталога app
volumes:
- .:/app
# Открываем порт 8000 внутри и снаружи
ports:
- 8000:8000
depends_on:
- db
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
POSTGRES_USER: "postgres_user"
POSTGRES_PASSWORD: "postgres_password"
POSTGRES_DB: "postgres_database"
volumes:
postgres_data:
Обычно в контейнерах базы данных не запускают (исключения локальная разработка и тесты). Если вам нужно запускать базу в контейнере, то скорее всего вы будете делать это не единожды. В обычном случае, если не описывать volume для контейнера с базой, каждое пересоздание контейнера приведет к уничтожению базы и данных. В случае выше мы описали создание внешнего docker-тома postgres_data, который будет хранить данные на случай пересоздания контейнера.
Изменим настройки подключения к БД в FastAPI, для этого в файле app/backend/db.py внесем имзенения:
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase
engine = create_async_engine('postgresql+asyncpg://postgres_user:postgres_password@db:5432/postgres_database',
echo=False)
async_session_maker = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
class Base(DeclarativeBase):
pass
Также нам нужно изменить настройки подключения для Alembic, изменим строчку подключения в alembic.ini
sqlalchemy.url = postgresql+asyncpg://postgres_user:postgres_password@db:5432/postgres_database
Теперь удалим предыдущий контейнер:
docker-compose down -v
Выполним билд и запуск наших контейнеров еще раз:
docker-compose up -d --build
Откроем Docker Desktop и посмотрим на контейнеры:
Как мы видим они работают, перейдем к миграциям, и запустим их:
docker-compose exec web alembic upgrade head
Убедимся, что были созданы таблицы нашего проекта FastAPI:
docker-compose exec db psql --username=postgres_user --dbname=postgres_database
\l
Также мы можем выполнить команду \c postgres_database и \dt после, чтобы посмотреть таблицы в БД.
На данном этапе мы можем проверить работу с базой данных, добавляя данные, но далее она у нас очиститься, так как мы еще не раз будем пересоздавать наш контейнер. Поэтому пока мы не будем ничего в неё добавлять.
Перейдем по адресу http://127.0.0.1:8000/docs/ и проверим работает ли наш проект:
Попробуем получить все категории:
Как мы видим, наш проект прекрасно работает(выводя пустой список, а не ошибку подключения), в следующем разделе мы начнем подготовку проекта к деплою, добавив сервер приложений Gunicorn и веб-сервер NGINX.