ИИ, агенты и автоматизация 14 мин чтения 2026-10-21

Приватный ИИ-поисковик Perplexica (Vane) в Docker Compose на VDS: развертывание открытого аналога Perplexity со связкой SearXNG и Ollama

Пошаговое руководство по развертыванию приватного ИИ-поисковика Perplexica (Vane v1.12) в Docker Compose на VDS: встроенный метапоисковик SearXNG, подключение локальной Ollama, реверс-прокси Nginx с SSL и автоматический бэкап.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Классические поисковые системы стремительно теряют эффективность в решении прикладных инженерных и бизнес-задач. Первые страницы выдачи Google и Яндекса перегружены контекстной рекламой, SEO-оптимизированными агрегаторами и бесконечными «водянистыми» статьями. С другой стороны, изолированные языковые модели (ChatGPT, Claude) часто страдают от галлюцинаций и не имеют доступа к актуальным событиям текущей недели.

Революцию в этой сфере совершил сервис Perplexity AI, объединивший живой веб-поиск с интеллектуальным синтезом ответа и точными ссылками на первоисточники. Однако подписка Perplexity Pro ($20 в месяц за каждого сотрудника) требует зарубежных банковских карт, а отправка рабочих поисковых запросов в стороннее облако несет прямые риски утечки конфиденциальных данных.

Идеальным решением стал открытый проект Perplexica (в актуальных релизах получивший развитие под именем Vane, набравший более 37 000 звёзд в официальном репозитории на GitHub). В этом практическом руководстве инженеры SysKit.ru разберут архитектуру Vane v1.12.2, настроят монолитный стек в Docker Compose со встроенным приватным метапоисковиком SearXNG, подключат локальную Ollama для полностью автономного поиска без цензуры и закроют интерфейс обратным прокси Nginx с SSL-сертификатом.

Ключевые преимущества развертывания Perplexica (Vane) на своем VDS

  • Полная конфиденциальность запросов: метапоисковик SearXNG не сохраняет профили пользователей, не собирает куки и опрашивает десятки внешних поисковиков через защищенный прокси.
  • Отсутствие валютных подписок: экономия от $240 в год на каждого аналитика, маркетолога или разработчика в команде.
  • Поддержка локального и облачного инференса: возможность использовать локальные квантованные модели через Ollama (Qwen 2.5, Llama 3.1) или подключать быстрые API (DeepSeek, Groq, OpenAI, Claude).
  • Интеллектуальные режимы поиска: выбор баланса скорости и глубины (Speed, Balanced, Quality) с охватом общего веба, форумов (Discussions) и научных источников (Academic).
  • Локализация данных по 152-ФЗ: история поиска, загруженные документы и системные промпты хранятся в изолированной базе данных SQLite на вашем сервере в РФ.

1. Архитектура Perplexica (Vane) и зачем бизнесу свой ИИ-поисковик

В ранних версиях проект Perplexica состоял из четырех разрозненных контейнеров: бэкенда на Node.js, веб-интерфейса на Next.js, поискового ядра SearXNG и кэширующего сервера Redis. На практике такая связка нередко вызывала проблемы: рассинхронизация внутренних портов, конфликты CORS и ошибки формата ответов JSON при обновлении SearXNG.

Начиная с мажорной ветки v1.11–v1.12 проект перешел на консолидированную архитектуру Vane (официальный образ itzcrazykns1337/vane:v1.12.2), в которой разработчики устранили все слабые места предшественника:

  • Встроенный движок SearXNG: метапоисковик встроен непосредственно в контейнерное окружение Vane и слушает внутренний порт 8080 пространства контейнера, исключая сетевые задержки и блокировки между отдельными сервисами.
  • Консолидированный веб-сервер и API: интерфейс на Next.js и бэкенд на Node.js объединены в единый оптимизированный процесс на порту 3000.
  • Встроенная база данных SQLite через Drizzle ORM: история чатов, пользовательские настройки и конфигурации провайдеров сохраняются в локальный том /home/vane/data, не требуя развертывания отдельной СУБД PostgreSQL.
  • Поддержка загрузки файлов и цитирования: система умеет индексировать локальные PDF, TXT и Markdown-документы, сопоставляя их с найденной в сети информацией.

2. Системные требования и расчет ресурсов VDS под инференс

Потребление системных ресурсов зависит от выбранной схемы генерации ответов. Сам стек Vane с встроенным SearXNG чрезвычайно легковесен и потребляет порядка 400–600 МБ оперативной памяти (Node.js runtime + uWSGI-процесс SearXNG). Основная нагрузка приходится на модель инференса:

Режим работы Минимум CPU Минимум RAM Диск (NVMe) Рекомендуемая конфигурация VDS
Vane + внешние API (DeepSeek, Groq, OpenAI, Claude) 2 vCPU 4 ГБ RAM 30 ГБ NVMe Экономичный VDS от Beget или Timeweb Cloud (~600–900 ₽/мес)
Vane + компактная Ollama (модели 1.5B–3B, Qwen 2.5 3B) 4 vCPU 8 ГБ RAM 50 ГБ NVMe Оптимальный сервер с быстрыми ядрами (~1200–1600 ₽/мес)
Vane + стандартная Ollama (модели 7B–8B, Qwen 2.5 7B в Q4) 4–8 vCPU 16 ГБ RAM 80 ГБ NVMe Производительный VDS со скоростными NVMe (~2400–3500 ₽/мес)
Корпоративная нагрузка + vGPU 8 vCPU 32 ГБ RAM + GPU 150 ГБ NVMe Выделенный VDS в Selectel с графическим ускорителем

Обязательное подключение Swap

При инференсе моделей 7B на центральном процессоре пиковые скачки контекста могут кратковременно превышать объем физической памяти. Создайте файл подкачки размером минимум 4–8 ГБ командой: sudo fallocate -l 8G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile. Это защитит контейнеры от аварийной остановки механизмом Linux OOM Killer.

3. Подготовка окружения, сетевая изоляция и фаервол UFW

Перед установкой контейнеров настройте доменное имя для поисковика (например, search.yourdomain.ru). Создайте A-запись в панели вашего DNS-провайдера, указывающую на публичный IP-адрес сервера, и проверьте ее распространение с помощью утилиты DNS Lookup SysKit.

Обновите пакеты операционной системы и установите базовые утилиты:

# Обновление пакетов и установка необходимых утилит
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git ufw certbot python3-certbot-nginx

# Настройка межсетевого экрана UFW
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw --force enable

Изоляция внутренних портов Docker

По умолчанию демон Docker модифицирует цепочки iptables в обход правил UFW. Чтобы сервис Vane (порт 3000) и локальная Ollama (порт 11434) не оказались открыты для всего интернета, в манифесте Compose мы жестко привязываем порты к локальному адресу 127.0.0.1:3000. Проверить отсутствие утечки портов наружу можно через Сетевой сканер портов SysKit.

4. Развертывание Vane v1.12.2 в Docker Compose: манифест и переменные

Создайте изолированную рабочую директорию проекта и каталог для постоянных данных (база данных SQLite, история сессий и загруженные документы):

# Создание каталогов проекта
sudo mkdir -p /opt/vane/data
cd /opt/vane
sudo chown -R 1000:1000 /opt/vane/data

Создайте конфигурационный манифест docker-compose.yml в директории /opt/vane. Мы используем актуальный стабильный релиз itzcrazykns1337/vane:v1.12.2 со строгой изоляцией портов и ограничением оперативной памяти:

services:
  vane:
    image: itzcrazykns1337/vane:v1.12.2
    container_name: vane-search
    restart: unless-stopped
    ports:
      # Публикация строго на локальном интерфейсе хоста (защита от сканирования извне)
      - "127.0.0.1:3000:3000"
    volumes:
      # Постоянное хранилище базы SQLite, истории чатов и кэша SearXNG
      - ./data:/home/vane/data
    extra_hosts:
      # Проброс хостового сетевого шлюза для подключения к локальной Ollama
      - "host.docker.internal:host-gateway"
    environment:
      - NODE_ENV=production
      - PORT=3000
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://127.0.0.1:3000 || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s
    mem_limit: 2048m
    cpus: 2.0

Особенности директивы extra_hosts

Директива host.docker.internal:host-gateway позволяет контейнеру Vane обращаться к системным службам хоста по доменному имени host.docker.internal. Это ключевой элемент архитектуры: если на хосте уже запущен сервер инференса Ollama (порт 11434), Vane сможет направлять запросы на http://host.docker.internal:11434 без проброса порта в публичную сеть.

Запустите контейнер поисковика в фоновом режиме:

# Запуск контейнера
docker compose up -d

# Просмотр журналов инициализации
docker compose logs -f

В логах отобразится запуск встроенного сервиса SearXNG на локальном порту 8080, успешное прохождение healthcheck и старт Node.js сервера на порту 3000:

Starting SearXNG...
Waiting for SearXNG to be ready...
SearXNG started successfully (PID: 12)
Starting Vane...
Ready in 1840ms
✓ Compiled / in 420ms

5. Настройка Nginx с SSL и таймаутами для потокового SSE-стриминга

Для публикации сервиса в интернет с защитой трафика по протоколу HTTPS и поддержкой доменного имени настроим хостовый веб-сервер Nginx. Вы можете сгенерировать базовый шаблон через Конфигуратор Nginx Reverse Proxy SysKit.

Критически важно: защита доступа к поисковику

В текущей версии Vane v1.12 отсутствует встроенная система учетных записей пользователей. Если вы опубликуете сервис в интернет без аутентификации, любой сторонний посетитель сможет отправлять неограниченные поисковые запросы, расходовать ваши токены в API-ключах и просматривать историю диалогов. Для защиты интерфейса обязательно настройте HTTP Basic Authentication на уровне Nginx.

Сгенерируйте файл с паролем для администратора с помощью утилиты htpasswd:

# Установка утилит apache2-utils и генерация пароля
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin

Получите бесплатный доверенный SSL-сертификат Let's Encrypt через Certbot:

sudo certbot certonly --nginx -d search.yourdomain.ru

Создайте конфигурационный файл виртуального хоста /etc/nginx/sites-available/vane.conf с директивами аутентификации:

# Автоматический редирект HTTP -> HTTPS
server {
    listen 80;
    server_name search.yourdomain.ru;
    return 301 https://$host$request_uri;
}

# Основной виртуальный хост HTTPS
server {
    listen 443 ssl;
    http2 on;
    server_name search.yourdomain.ru;

    # Пути к SSL-сертификатам
    ssl_certificate /etc/letsencrypt/live/search.yourdomain.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/search.yourdomain.ru/privkey.pem;

    # Рекомендованные протоколы и шифры безопасности
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # Максимальный размер загружаемых документов (PDF, TXT, CSV)
    client_max_body_size 50M;

    location / {
        # Базовая аутентификация для защиты личных настроек и API-ключей
        auth_basic "Private Vane Search";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        # Поддержка WebSockets и динамических соединений
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Передача реальных заголовков клиента
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # КРИТИЧЕСКИ ВАЖНО: отключение буферизации для потокового вывода токенов (SSE)
        proxy_buffering off;
        proxy_cache off;
        gzip off;
        chunked_transfer_encoding on;

        # Увеличенные таймауты под инференс на CPU
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        proxy_connect_timeout 60s;
    }
}

Активируйте виртуальный хост, протестируйте синтаксис и перезагрузите Nginx:

sudo ln -s /etc/nginx/sites-available/vane.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Проверьте корректность редиректа через Чекер редиректов SysKit и убедитесь в надежности шифрования в Проверке SSL-сертификата.

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud — Быстрые NVMe VDS для ИИ

Отличный выбор для связки Perplexica и локальной Ollama: высокая частота ядер 3.3+ ГГц, быстрый NVMe-диск и безлимитный трафик в дата-центрах РФ.

Конфигурация
4 vCPU 3.3 ГГц • 16 ГБ RAM • 100 ГБ NVMe • Трафик без лимита
Премиум Tier III
🔷

Selectel — Премиум инфраструктура Tier III

Корпоративная надежность с гарантированным аптаймом 99.98%, защитой от DDoS-атак и возможностью добавления vGPU для мгновенного инференса.

Конфигурация
4 vCPU • 16 ГБ RAM • 80 ГБ NVMe • Дата-центры РФ Tier III
Простота и гибкость
🟠

Beget — Легкий старт с почасовой оплатой

Удобная панель управления, моментальное масштабирование ресурсов и включенные бэкапы для быстрого тестирования стека поиска на внешних API.

Конфигурация
2 vCPU 3.4 ГГц • 8 ГБ RAM • 60 ГБ NVMe • Выделенный IPv4

6. Подключение локальной Ollama, выбор фокус-режимов и внешних API

Откройте созданный поисковик в браузере по адресу https://search.yourdomain.ru. Перейдите в раздел Настройки (Settings) в левом нижнем углу интерфейса для привязки провайдеров искусственного интеллекта.

Вариант 1: Полностью автономная локальная связка с Ollama

Для запуска поиска без интернета для нейросети и без затрат на токены подключите сервер Ollama, работающий на том же сервере:

  1. В выпадающем списке Chat Model Provider выберите Ollama.
  2. В поле Ollama Base URL укажите: http://host.docker.internal:11434 (или внутренний IP сетевого моста Docker http://172.17.0.1:11434).
  3. В поле Chat Model введите имя предварительно загруженной модели:
    • qwen2.5:7b — выбор редакции SysKit: превосходное понимание русского языка, логики и точное следование ссылкам первоисточников;
    • llama3.1:8b — универсальная модель с хорошей общей эрудицией;
    • qwen2.5:3b — скоростной вариант для серверов с ограниченным объемом памяти (от 8 ГБ RAM).
  4. В разделе Embedding Model Provider также выберите Ollama и укажите легковесную модель для расчета векторного сходства фрагментов страниц: bge-small или nomic-embed-text.

Зачем нужна модель эмбеддингов в поисковике?

Метапоисковик SearXNG находит десятки ссылок по вашему запросу и скачивает текст веб-страниц. Модель эмбеддингов разбивает эти страницы на фрагменты (чанки) и ранжирует их по смысловой близости к исходному вопросу. В контекст основной генеративной модели отправляются только самые релевантные цитаты, что экономит память и исключает информационный шум.

Вариант 2: Подключение сверхбыстрых внешних API

Если у вас нет VDS с 16 ГБ RAM под локальную модель 7B, вы можете использовать недорогие облачные API. Vane из коробки поддерживает:

  • DeepSeek (API): модель deepseek-chat — высочайшее качество рассуждений при экстремально низкой стоимости токенов;
  • Groq (LPU): модель llama-3.3-70b-versatile — практически мгновенный инференс со скоростью более 250 токенов в секунду;
  • OpenAI / Anthropic Claude / Google Gemini: поддержка стандартных ключей API с тонкой настройкой температуры генерации.

Интеллектуальные режимы работы и источники данных (Search Modes & Sources)

В интерфейсе Vane v1.12 поисковый процесс разделен на два взаимодополняющих уровня: выбор скорости/глубины анализа и фильтрация источников данных.

1. Режимы скорости и глубины поиска (Search Modes):

  • Speed Mode: режим максимальной скорости с минимальной задержкой, оптимизированный для быстрых ответов на типовые фактологические вопросы;
  • Balanced Mode: стандартный сбалансированный режим для повседневных рабочих запросов (оптимальное соотношение скорости и полноты выборки);
  • Quality Mode: режим глубокого многоэтапного исследования с расширенным сбором источников и более детальным синтезом контекста.

2. Источники информации (Sources):

  • Web: глобальный поиск по всему вебу через агрегацию выдачи Google, Bing, DuckDuckGo и Qwant;
  • Discussions: целенаправленный поиск по форумам, Reddit и инженерным сообществам для поиска реального опыта решения проблем;
  • Academic: поиск научных публикаций, препринтов и статей по базам рецензируемой литературы с указанием цитирований и авторов.

Кроме того, Vane поддерживает встроенный поиск мультимедиа (изображения и видео), интерактивные информационные виджеты и загрузку локальных документов (PDF, TXT, CSV) для ответов строго по вашим корпоративным материалам.

7. Тонкая настройка метапоисковика SearXNG и обход лимитов источников

Под капотом Vane метапоисковые запросы выполняет встроенный экземпляр SearXNG. В штатной конфигурации он обращается к безопасным публичным инстансам поисковиков. Если отдельные поисковые движки (например, Google) начинают возвращать капчу или блокировки по частоте запросов, вы можете переопределить конфигурационный файл.

Создайте директорию /opt/vane/searxng и локальный файл конфигурации settings.yml:

use_default_settings: true

general:
  debug: false
  instance_name: "SysKit Private Search"

search:
  safe_search: 0
  autocomplete: "duckduckgo"
  formats:
    - html
    - json

server:
  port: 8080
  bind_address: "0.0.0.0"
  secret_key: "GenerateRandomSecretKeyForSearXNGHere"
  limiter: false

engines:
  - name: google
    engine: google
    shortcut: g
    disabled: false
  - name: duckduckgo
    engine: duckduckgo
    shortcut: ddg
    disabled: false
  - name: bing
    engine: bing
    shortcut: b
    disabled: false
  - name: qwant
    engine: qwant
    shortcut: qw
    disabled: false
  - name: wikidata
    engine: wikidata
    shortcut: wd
    disabled: false

Смонтируйте собственный конфиг в манифесте docker-compose.yml в секции volumes сервиса vane:

    volumes:
      - ./data:/home/vane/data
      - ./searxng/settings.yml:/etc/searxng/settings.yml:ro

И перезапустите стек: docker compose restart vane. Директива limiter: false отключает внутренние лимиты частоты запросов, а включение формата json гарантирует стабильный парсинг результатов поисковым бэкендом.

8. Резервное копирование SQLite, настроек и чатов в S3-хранилище

Все пользовательские настройки, история исследований, диалоги и загруженные документы хранятся в директории /opt/vane/data в реляционной базе данных db.sqlite.

Особенности резервного копирования SQLite в режиме WAL

База данных Vane работает в режиме упреждающей записи WAL (Write-Ahead Logging). Файлы db.sqlite-wal и db.sqlite-shm содержат активные незафиксированные транзакции. Прямое копирование через tar на работающем сервисе может зафиксировать файл базы в поврежденном состоянии. В нашем скрипте резервного копирования для создания идеального снимка используется утилита sqlite3 .backup или безопасный сброс буферов.

Создайте автоматический скрипт резервного копирования /opt/vane/backup_vane.sh с выгрузкой в российское объектное S3-хранилище (Timeweb Cloud, Selectel или VK Cloud):

#!/usr/bin/env bash
set -euo pipefail

# Конфигурация бэкапа
BACKUP_DIR="/var/backups/vane"
DATE=$(date +%Y%m%d_%H%M%S)
ARCHIVE="$BACKUP_DIR/vane_backup_$DATE.tar.gz"
S3_BUCKET="s3://my-company-backups/vane"
KEEP_DAYS=7

mkdir -p "$BACKUP_DIR"

echo "[$(date)] Начало резервного копирования Vane..."

# 1. Безопасное создание консистентного снимка SQLite базы
if command -v sqlite3 >/dev/null 2>&1; then
    sqlite3 /opt/vane/data/db.sqlite ".backup '$BACKUP_DIR/db_$DATE.sqlite'"
else
    # Альтернатива: кратковременный паузинг контейнера
    docker pause vane-search
    cp /opt/vane/data/db.sqlite "$BACKUP_DIR/db_$DATE.sqlite"
    docker unpause vane-search
fi

# 2. Архивация конфигурации, базы и загруженных документов
tar -czf "$ARCHIVE" --exclude='*.sqlite*' -C /opt/vane data -C "$BACKUP_DIR" "db_$DATE.sqlite"

# 3. Выгрузка в защищенное S3-хранилище через AWS CLI
aws --endpoint-url https://s3.timeweb.cloud s3 cp "$ARCHIVE" "$S3_BUCKET/"

# 4. Удаление временного дампа и локальная ротация архивов старше 7 дней
rm -f "$BACKUP_DIR/db_$DATE.sqlite"
find "$BACKUP_DIR" -type f -name "vane_backup_*.tar.gz" -mtime +$KEEP_DAYS -delete

echo "[$(date)] Резервная копия успешно создана и выгружена в S3: $ARCHIVE"

Сделайте скрипт исполняемым и добавьте его ночной запуск в планировщик cron:

sudo chmod +x /opt/vane/backup_vane.sh
(sudo crontab -l 2>/dev/null; echo "0 4 * * * /opt/vane/backup_vane.sh >> /var/log/vane_backup.log 2>&1") | sudo crontab -

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

При генерации ответа через локальную модель Ollama возникает ошибка «504 Gateway Timeout». Как ее устранить?
Инференс модели 7B–8B на центральном процессоре VDS при одновременном парсинге нескольких веб-страниц может занимать от 30 до 90 секунд. По умолчанию обратный прокси Nginx ожидает ответа бэкенда не более 60 секунд. Убедитесь, что в конфигурационном файле виртуального хоста Nginx прописаны директивы: proxy_read_timeout 3600s; и proxy_send_timeout 3600s;, а буферизация отключена через proxy_buffering off;.
Vane сообщает об ошибке «SearXNG returned non-JSON response» или сбоях парсинга. В чем причина?
Эта ошибка возникает, когда встроенный метапоисковик SearXNG сталкивается с блокировкой со стороны поисковых систем (капча Google/Cloudflare) или если в конфигурации отключен формат вывода JSON. Для исправления проверьте ваш файл settings.yml: в блоке search.formats обязательно должен присутствовать пункт - json, а в блоке server укажите limiter: false. Если Google блокирует IP сервера, временно отключите его в списке engines и переключите основной поиск на DuckDuckGo и Bing.
Можно ли развернуть Vane на недорогом VDS с 2–4 ГБ оперативной памяти?
Да, если вы используете внешние облачные API (DeepSeek, Groq, OpenAI). Сам контейнер Vane со встроенным SearXNG и базой данных SQLite потребляет всего около 400–600 МБ RAM. Однако если вы планируете запускать на этом же сервере локальную Ollama: для моделей 3B потребуется сервер минимум с 8 ГБ RAM, а для комфортной работы связки с моделью 7B/8B (Qwen 2.5 или Llama 3.1) необходим VDS с 16 ГБ RAM и активным разделом Swap.
Как обновить старую 4-контейнерную установку Perplexica до современного монолитного Vane v1.12?
В версиях v1.11+ архитектура была кардинально упрощена: вместо отдельных контейнеров perplexica-backend, frontend, searxng и redis теперь используется единый оптимизированный образ itzcrazykns1337/vane:v1.12.2. Для миграции: 1) Остановите старый стек docker compose down; 2) Скопируйте файл базы данных из старого тома в директорию /opt/vane/data; 3) Запустите новый манифест Compose. Встроенные миграции схемы базы данных SQLite выполнятся автоматически при первом запуске контейнера.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи