Qdrant — это векторная база данных, которую используют для поиска похожих текстов, изображений и других объектов. Например, Qdrant часто применяют в чат‑ботах, RAG‑системах, рекомендательных сервисах и приложениях на базе искусственного интеллекта.

Однако после установки Qdrant важно правильно настроить доступ и хранение данных. Если просто открыть порт базы данных в интернет, злоумышленники могут попытаться получить доступ к коллекциям или удалить данные.

По официальной инструкции, Qdrant ставится буквально в одну команду — это просто, но доступ к нему будет у всего интернета.

В этой статье мы установим Qdrant на Ubuntu 24.04 и настроим:

  • безопасный доступ через Tailscale;

  • авторизацию по API‑ключу;

  • запуск Qdrant в Docker;

  • сохранение данных при обновлении;

  • резервное копирование;

  • доступ только через локальный интерфейс сервера.

В результате Qdrant не будет доступен всему интернету. Подключиться к нему смогут только устройства, добавленные в ваш Tailscale‑сегмент.

Ваше мнение обратите, что Tailscale работает нестабильно в России, поэтому не рекомендую полностью закрывать SSH через Tailscale, хотя статья не об этом.

Зачем нужен Tailscale

Tailscale создаёт защищённую виртуальную сеть между вашими устройствами и серверами. Каждое устройство получает внутренний IP‑адрес, обычно вида:

100.x.x.x

Этот адрес не является обычным публичным IP‑адресом VPS. Он доступен только авторизованным устройствам внутри вашей сети Tailscale.

Это удобнее и безопаснее, чем открывать порт Qdrant напрямую через интернет.

Например, вместо такого небезопасного варианта:

http://публичный\_IP\_сервера:6333

мы будем использовать адрес Tailscale:

https://имя-сервера.ваш-tailnet.ts.net

Дополнительно Qdrant будет защищён API‑ключом. Таким образом, для доступа клиенту потребуется:

  1. находиться в вашей сети Tailscale;

  2. передать правильный API‑ключ Qdrant.

Шаг 1. Установка Tailscale

Обновим систему:

sudo apt update
sudo apt upgrade -y

Установим Tailscale:

curl -fsSL https://tailscale.com/install.sh | sh

Подключим сервер к Tailnet:

sudo tailscale up --ssh --hostname=qdrant-server

После выполнения команды Tailscale может показать ссылку для авторизации. Откройте её в браузере и подтвердите подключение сервера.

Проверьте статус:

sudo tailscale status

Узнайте Tailscale IP сервера:

tailscale ip -4

Например:

100.101.102.103

Это пример. Используйте тот IP‑адрес, который покажет ваша система.

Если Tailscale сообщает, что ранее был включён параметр --advertise-exit-node, а Exit Node вам не нужен, выполните:

sudo tailscale up --reset

Затем подключите сервер заново:

sudo tailscale up --ssh --hostname=qdrant-server

Шаг 2. Установка Docker

Установим Docker и Docker Compose:

sudo apt install -y docker.io docker-compose-plugin

Запустим Docker автоматически при загрузке сервера:

sudo systemctl enable --now docker

Проверим установку:

docker --version
docker compose version

В дальнейшем Docker Compose будем запускать через sudo, потому что секретный файл .env будет доступен только пользователю root.

Шаг 3. Создание каталогов Qdrant

Создадим отдельную директорию для Qdrant:

sudo mkdir -p /opt/qdrant/{storage,snapshots,backup}

Сделаем текущего пользователя владельцем каталогов:

sudo chown -R "$USER:$USER" /opt/qdrant

Перейдём в каталог:

cd /opt/qdrant

Здесь будут находиться:

  • storage — основные данные Qdrant;

  • snapshots — снимки коллекций;

  • backup — резервные копии;

  • .env — API‑ключ;

  • docker-compose.yml — конфигурация запуска.

Главный каталог — это:

/opt/qdrant/storage

Именно он позволит сохранить коллекции при пересоздании или обновлении Docker‑контейнера.

Шаг 4. Создание API‑ключа

Сгенерируем случайный ключ:

openssl rand -hex 32

Команда выведет длинную строку. Скопируйте её и создайте файл .env:

sudo nano /opt/qdrant/.env

Добавьте:

QDRANT_API_KEY=ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ

Например:

QDRANT_API_KEY=8c4b0bd2a90f0a3d71b6e5f0f3f0d8f93f4a8e5b3a7d1c2e6f9a0b4c8d2e1f7a

Сохраним файл и ограничим права:

sudo chown root:root /opt/qdrant/.env
sudo chmod 600 /opt/qdrant/.env

Теперь прочитать API‑ключ сможет только root.

Шаг 5. Создание Docker Compose

Создадим конфигурацию:

sudo nano /opt/qdrant/docker-compose.yml

Вставьте:

services:  qdrant:    image: qdrant/qdrant:latest    container_name: qdrant    restart: unless-stopped    environment:      QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}    ports:      - "127.0.0.1:6333:6333"      - "127.0.0.1:6334:6334"    volumes:      - /opt/qdrant/storage:/qdrant/storage      - /opt/qdrant/snapshots:/qdrant/snapshots    healthcheck:      test:        - CMD-SHELL        - wget --no-verbose --tries=1 --spider http://127.0.0.1:6333/readyz || exit 1      interval: 30s      timeout: 5s      retries: 5      start_period: 20s

Ограничим права на файл:

sudo chown root:root /opt/qdrant/docker-compose.yml
sudo chmod 600 /opt/qdrant/docker-compose.yml

Обратите внимание на строки:

- "127.0.0.1:6333:6333"
- "127.0.0.1:6334:6334"

Qdrant будет слушать только локальный интерфейс сервера. Он не будет напрямую открыт через публичный IP‑адрес.

Шаг 6. Запуск Qdrant

Поскольку .env принадлежит root, запускайте Docker Compose через sudo:

cd /opt/qdrant
sudo docker compose up -d

Проверьте состояние контейнера:

sudo docker compose ps

Посмотрите логи:

sudo docker compose logs --tail=100 qdrant

Проверим готовность Qdrant:

curl http://127.0.0.1:6333/readyz

Ожидаемый ответ:

healthz check passed

Проверим API с ключом:

sudo bash -c '
set -a
source /opt/qdrant/.env
set +a
curl -H "api-key: ${QDRANT_API_KEY}" \
http://127.0.0.1:6333/collections
'

Если установка выполнена правильно, Qdrant вернёт список коллекций. Пока он может быть пустым:

{  "result": {    "collections": []  },  "status": "ok"
}

Шаг 7. Публикация Qdrant через Tailscale

Теперь направим Tailscale к локальному Qdrant:

sudo tailscale serve --bg http://127.0.0.1:6333

Проверим настройки:

sudo tailscale serve status

Tailscale покажет HTTPS‑адрес, например:

https://qdrant-server.example-tailnet.ts.net

Откройте этот адрес в браузере. Если вы видите ответ примерно такого вида:

{  "title": "qdrant - vector search engine",  "version": "1.18.3"
}

значит Qdrant успешно работает и доступен через Tailscale.

Чтобы войти в дашборд, то надо добавить dashboard к нашему адресу, например:

https://qdrant-server.example-tailnet.ts.net/dashboard

Проверить список коллекций можно командой:

curl \  -H "api-key: ВАШ_QDRANT_API_KEY" \  https://ВАШ_TAILSCALE_АДРЕС/collections

Без API‑ключа запрос должен завершаться ошибкой авторизации. Это подтверждает, что защита включена.

Шаг 8. Проверка открытых портов

Проверим, где слушает Qdrant:

sudo ss -ltnp | grep -E '6333|6334'

Безопасный результат должен содержать:

127.0.0.1:6333
127.0.0.1:6334

Если вы видите:

0.0.0.0:6333

это означает, что Qdrant доступен на всех сетевых интерфейсах. Для защищённой схемы лучше использовать именно 127.0.0.1.

Шаг 9. Как сохранить данные при обновлении

Данные Qdrant хранятся на сервере в каталоге:

/opt/qdrant/storage

Он подключён к контейнеру через bind mount:

- /opt/qdrant/storage:/qdrant/storage

Поэтому при обновлении контейнера данные не должны исчезнуть.

Перед обновлением рекомендуется:

sudo docker compose pull
sudo docker compose up -d

Но перед этим желательно создать резервную копию.

Никогда не используйте без необходимости:

sudo docker compose down -v

и не удаляйте каталог:

/opt/qdrant/storage

Шаг 10. Резервное копирование

Постоянный каталог защищает от обычного обновления контейнера, но не спасает от поломки диска, удаления коллекции или ошибки администратора.

Поэтому резервные копии нужно хранить отдельно — например, на другом сервере, NAS или в S3-хранилище.

Минимальный вариант — регулярно копировать каталог:

sudo tar -czf \  /opt/qdrant/backup/qdrant-$(date +%F-%H-%M-%S).tar.gz \  -C /opt/qdrant storage

Проверить архивы:

sudo ls -lh /opt/qdrant/backup

Для надёжности резервные копии нужно периодически переносить на другой сервер. Например:

rsync -av /opt/qdrant/backup/ \  backup-user@100.111.112.113:/srv/backups/qdrant/

Адрес 100.111.112.113 в этом примере — Tailscale IP другого сервера.

Обновление Qdrant

Безопасная последовательность обновления:

cd /opt/qdrant

Сначала создайте резервную копию:

sudo tar -czf \  /opt/qdrant/backup/qdrant-before-update-$(date +%F-%H-%M-%S).tar.gz \  -C /opt/qdrant storage

Затем скачайте новый образ:

sudo docker compose pull

Перезапустите контейнер:

sudo docker compose up -d

Проверьте состояние:

sudo docker compose ps

И доступность API:

curl http://127.0.0.1:6333/readyz

Итог

В результате мы получили защищённую схему:

Клиент  ↓
Tailscale  ↓
Tailscale Serve  ↓
127.0.0.1:6333  ↓
Qdrant в Docker  ↓
/opt/qdrant/storage

Основные преимущества такой настройки:

  • Qdrant не открыт всему интернету;

  • доступ возможен только из вашей Tailscale‑сети;

  • API дополнительно защищён ключом;

  • данные хранятся вне контейнера;

  • обновление Docker‑контейнера не должно удалять коллекции;

  • резервные копии можно переносить на другой сервер.

Для подключения приложения используйте адрес Tailscale и API‑ключ:

from qdrant_client import QdrantClient
client = QdrantClient(    url="https://ВАШ\_TAILSCALE\_АДРЕС",    api_key="ВАШ_QDRANT_API_KEY",
)
print(client.get_collections())

Теперь мы защитили нашу векторную базу Qdrant и по аналогии можем защитить другие наши программы на сервере и сам вход на сервер по SSH.

Комментарии (0)