
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‑ключом. Таким образом, для доступа клиенту потребуется:
находиться в вашей сети Tailscale;
передать правильный 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.