Классические поисковые системы стремительно теряют эффективность в решении прикладных инженерных и бизнес-задач. Первые страницы выдачи 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-диск и безлимитный трафик в дата-центрах РФ.
Selectel — Премиум инфраструктура Tier III
Корпоративная надежность с гарантированным аптаймом 99.98%, защитой от DDoS-атак и возможностью добавления vGPU для мгновенного инференса.
Beget — Легкий старт с почасовой оплатой
Удобная панель управления, моментальное масштабирование ресурсов и включенные бэкапы для быстрого тестирования стека поиска на внешних API.
6. Подключение локальной Ollama, выбор фокус-режимов и внешних API
Откройте созданный поисковик в браузере по адресу https://search.yourdomain.ru. Перейдите в раздел Настройки (Settings) в левом нижнем углу интерфейса для привязки провайдеров искусственного интеллекта.
Вариант 1: Полностью автономная локальная связка с Ollama
Для запуска поиска без интернета для нейросети и без затрат на токены подключите сервер Ollama, работающий на том же сервере:
- В выпадающем списке Chat Model Provider выберите
Ollama. - В поле Ollama Base URL укажите:
http://host.docker.internal:11434(или внутренний IP сетевого моста Dockerhttp://172.17.0.1:11434). - В поле Chat Model введите имя предварительно загруженной модели:
qwen2.5:7b— выбор редакции SysKit: превосходное понимание русского языка, логики и точное следование ссылкам первоисточников;llama3.1:8b— универсальная модель с хорошей общей эрудицией;qwen2.5:3b— скоростной вариант для серверов с ограниченным объемом памяти (от 8 ГБ RAM).
- В разделе 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 -