
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 updatesudo 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 --versiondocker 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/.envsudo 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.ymlsudo 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/qdrantsudo 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 -asource /opt/qdrant/.envset +acurl -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:6333127.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 pullsudo 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 QdrantClientclient = QdrantClient( url="https://ВАШ\_TAILSCALE\_АДРЕС", api_key="ВАШ_QDRANT_API_KEY",)print(client.get_collections())
Теперь мы защитили нашу векторную базу Qdrant и по аналогии можем защитить другие наши программы на сервере и сам вход на сервер по SSH.
ссылка на оригинал статьи https://habr.com/ru/articles/1061724/