PostgreSQL хранит обычные данные: пользователи, документы, метаданные, настройки. К нему подключается приложение для записей и настроек.
pgvector — расширение PostgreSQL. Оно добавляет тип «вектор» и индексы (IVFFlat, HNSW) для поиска ближайших соседей. Плюс: одна база для всего — и таблицы, и векторы; привычные бэкапы и транзакции. Удобно, если объём векторов средний и вы уже используете PostgreSQL.
Qdrant — отдельный сервис только для векторного поиска. Open source, можно развернуть у себя. Подходит для больших коллекций и сценариев, когда хочется вынести векторный поиск в отдельный слой.
| Решение | Развёртывание | Когда выбирать |
|---|---|---|
| pgvector | Расширение PostgreSQL, одна БД | Уже есть PostgreSQL; средний объём векторов; нужны транзакции и бэкапы в одном месте |
| Qdrant | Отдельный сервис | Нужен отдельный векторный слой; большие объёмы; фильтры и метаданные к векторам |
В этой инструкции поднимаем PostgreSQL и Qdrant в Docker Compose. При желании в той же PostgreSQL можно включить pgvector и хранить векторы там — оба варианта допустимы.
Создаём папку и переходим в неё:
mkdir -p ./data/postgres-qdrant && cd $_
Создаём файл docker-compose.yml с двумя сервисами: PostgreSQL и Qdrant.
version: '3.8'
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: your_secure_password
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U appuser"]
interval: 5s
timeout: 5s
retries: 5
qdrant:
image: qdrant/qdrant:latest
volumes:
- qdrant_storage:/qdrant/storage
ports:
- "6333:6333"
environment:
QDRANT__SERVICE__GRPC_PORT: 6334
volumes:
pgdata:
qdrant_storage:
Не забудьте заменить your_secure_password на свой надёжный пароль.
| Сервис | Порт | Назначение |
|---|---|---|
| PostgreSQL | 5432 | Подключение приложения, миграции, метаданные |
| Qdrant REST | 6333 | Веб-интерфейс (dashboard), API коллекций, проверка здоровья |
| Qdrant gRPC | 6334 | Быстрый поиск по векторам из приложения |
Запускаем сервисы в фоне:
docker compose up -d
Проверяем, что контейнеры работают:
docker compose ps
Оба сервиса должны быть в состоянии running.
PostgreSQL — подключение и простой запрос:
psql -h localhost -U appuser -d appdb -c "SELECT 1"
В ответ должно вернуться 1.
Qdrant — веб-интерфейс или API:
http://localhost:6333/dashboardcurl http://localhost:6333/collectionsЕсли сервер отвечает — стек готов к использованию.
Если решите хранить векторы прямо в PostgreSQL, используйте образ с расширением pgvector. Замените образ в docker-compose.yml:
postgres:
image: pgvector/pgvector:pg15
# остальные параметры (environment, volumes, ports, healthcheck) — как выше
После первого запуска подключитесь к БД и выполните:
CREATE EXTENSION IF NOT EXISTS vector;
Дальше можно создавать таблицы с полем типа vector(N), где N — размерность векторов (например, 384 или 1536), и строить индексы для быстрого поиска.
Бэкапы: для PostgreSQL используйте pg_dump по расписанию; данные Qdrant лежат в volume qdrant_storage — при необходимости копируйте каталог или настройте резервное копирование контейнера.
И вот с помощью этих шагов у вас запущены PostgreSQL и Qdrant в Docker Compose. Для средних объёмов можно ограничиться одним PostgreSQL с pgvector; для отдельного векторного слоя — Qdrant уже готов к работе.