Перейти к содержанию
Публикация AiManual

Гибридная RAG-система на AnythingLLM: VPS, домашняя GPU и проверка защищённого доступа

Гибридная RAG на AnythingLLM: VPS для документов, домашняя GPU для инференса, защищённый доступ через SSH и IPsec, проверки перед загрузкой рабочих данных.

Коротко

Что будет в материале

  1. 01

    Бизнес хочет RAG, но боится облаков. И правильно делает.

  2. 02

    Что вам понадобится

  3. 03

    Шаг 1: Поднимаем IPsec-туннель между VPS и домашним сервером

  4. 04

    Шаг 2: Запускаем Ollama на домашнем сервере

Бизнес хочет RAG, но боится облаков. И правильно делает.

Вы когда-нибудь пробовали подключить свою конфиденциальную базу знаний к ChatGPT? У меня после первого такого опыта дёргался глаз. Данные улетают в неизвестность, счёт за API растёт, а скорость ответа – как повезёт. Малый бизнес не может платить $500-1000 в месяц за API и спать спокойно.

RAG (Retrieval-Augmented Generation) – штука крутая: модель отвечает на основе ваших документов, а не на основе мутного интернета. Но где это хостить? Полностью локальный сервер – дорого, сложно в поддержке. Облако – опять зависимость.

Гибридная схема: VPS для интерфейса и базы знаний, домашняя GPU для инференса через защищённый туннель. Это не полностью локальная обработка: документы и индексы хранятся на VPS. Ни VPN, ни локальная модель сами по себе не гарантируют отсутствия утечек. Ниже — порядок подготовки и проверки; параметры VPN зависят от вашей сети, готовой универсальной конфигурации здесь нет.

Если вы ещё не собрали домашнюю станцию, сначала прочитайте гайд по железу за $15 000 – там всё про выбор видеокарт и RAM. А если сомневаетесь между облаком и локальным хостингом, у меня есть системная статья про стратегию развёртывания.

Ключевая идея: защищать нужно оба участка: браузер → VPS и VPS → домашний Ollama. Для первого здесь используется SSH-туннель, для второго требуется заранее настроенный и проверенный IPsec. VPS, электричество и сопровождение остаются платными.

Что вам понадобится

VPS в этой схеме хранит документы и интерфейс, а GPU остаётся дома. Сравните RAM и диск для базы знаний, резервное копирование и условия обработки данных; Timeweb Cloud можно включить в сравнение провайдеров. Это партнёрская ссылка; конфигурацию и текущую стоимость нужно проверять под свою нагрузку, минимальный тариф не является гарантией достаточности ресурсов.

Не пугайтесь списка – всё стандартное. Из необычного разве что VPN-туннель.

Компонент Требования Примечание
VPS Ubuntu 22.04/24.04, 2 CPU, 4 ГБ RAM, 20 ГБ SSD Начальный ориентир для теста; размер базы, загрузка документов и резервные копии требуют отдельного расчёта
Домашний сервер NVIDIA GPU (RTX 3060+), 16+ ГБ RAM, Linux (Ubuntu/Pop!_OS) Установите драйверы и CUDA Toolkit 12.x
ПО на VPS Docker + Docker Compose, strongSwan, curl Последние версии на июнь 2026
ПО на домашнем сервере Ollama 0.5.x, strongSwan, Docker (опционально) Ollama проще всего ставить через скрипт установки
Модели llama3, mistral, qwen2.5 – любые из библиотеки Ollama Выбирайте под свою видеопамять

Я не буду разжёвывать установку драйверов NVIDIA – это миллион раз описано. Если что, загляните в статью про «бетонную стену» – там есть секция железа.

Шаг 1: Поднимаем IPsec-туннель между VPS и домашним сервером

Сначала настройте VPN по официальному руководству strongSwan под вашу топологию. Пример с одинаковыми 0.0.0.0/0 selectors не является готовой настройкой для домашнего NAT. Без проверки маршрутов и firewall переходить к данным нельзя.

  • При взаимной аутентификации сертификатами каждой стороне нужны собственный закрытый ключ и сертификат с корректной identity/SAN; обе стороны доверяют сертификату CA. Закрытый ключ CA остаётся на машине выпуска, на VPS его не копируют. Подпишите запросы сертификатов на CA и передайте соответствующей стороне только её сертификат и публичную цепочку.
  • Определите адреса защищаемых узлов, traffic selectors, маршруты, NAT traversal и обратный путь. Docker bridge может менять адрес источника: проверяйте доступ из контейнера AnythingLLM, а не только с хоста VPS.
  • Разрешите 11434 только для нужного трафика, прошедшего IPsec-политику. Разрешение большой частной подсети само по себе не доказывает шифрование. При падении VPN соединение должно блокироваться, а не уходить в открытый интернет.
  • Проверьте IKE SA и CHILD SA, счётчики зашифрованных пакетов, запрос тестовой модели из контейнера и отказ доступа при отключении VPN. Одного ESTABLISHED или ping недостаточно.

Пошаговый выпуск ключей и сертификатов: strongSwan Certificates Quickstart. Готовую конфигурацию для конкретного роутера, NAT и адресов должен проверить администратор до загрузки рабочих документов.

Шаг 2: Запускаем Ollama на домашнем сервере

Установите Ollama по официальной инструкции. Для первого теста возьмите небольшую модель, а не 70B: веса 70B Q4 сами по себе могут занимать около 40 ГБ, поэтому в 24 ГБ VRAM они полностью не помещаются. Считайте также контекст, runtime и эмбеддинги; частичный offload в RAM меняет скорость.

ollama pull llama3.1:8b-instruct-q4_K_M
ollama pull nomic-embed-text
curl http://localhost:11434/api/tags

Если установщик уже запустил systemd-службу, второй ollama serve не нужен. По умолчанию API слушает loopback. Для IPsec задайте OLLAMA_HOST на выбранный защищаемый адрес домашнего узла и порт 11434 в systemd override; фактический адрес зависит от вашей топологии. Не назначайте 0.0.0.0 до настройки фильтрации. Перезапустите службу и повторите проверку из контейнера на VPS.

Порт 11434 не публикуйте на домашнем роутере. Если приватный адрес недостижим, исправьте VPN и маршруты; публичный port forwarding не заменяет туннель.

Шаг 3: Разворачиваем AnythingLLM на VPS

Вот где начинается магия. AnythingLLM – это open-source платформа для создания чат-ботов с RAG. Она умеет подключаться к любому LLM-провайдеру, включая Ollama по API.

Используйте Docker Engine 28 или новее: у более старых версий есть известное ограничение изоляции localhost-публикаций. Подготовьте постоянное хранилище по инструкции AnythingLLM и закрепите проверенный тег образа перед эксплуатацией. Для первичной настройки достаточно следующего шаблона в отдельном рабочем каталоге:

mkdir -p data
touch data/.env
services:
  anythingllm:
    image: mintplexlabs/anythingllm:latest
    container_name: anythingllm
    ports:
      - "127.0.0.1:3001:3001"
    environment:
      - STORAGE_DIR=/app/server/storage
    volumes:
      - ./data:/app/server/storage
      - ./data/.env:/app/server/.env
    restart: unless-stopped

Проверьте права записи контейнера в data. LLM-провайдер и embedding-провайдер настройте через интерфейс после защищённого подключения: Ollama, адрес домашнего узла внутри проверенной IPsec-схемы, модель llama3.1:8b-instruct-q4_K_M и embedding-модель nomic-embed-text. Не используйте localhost как адрес домашнего Ollama внутри контейнера VPS.

💡
Для эмбеддингов я использую nomic-embed-text – лёгкая, быстрая, 137 MB. Можно взять bge-m3 или mxbai-embed-large – они точнее, но тяжелее. AnythingLLM поддерживает выбор модели эмбеддинга отдельно от LLM.

Запустите:

docker compose up -d

На своём компьютере откройте SSH-туннель: ssh -N -L 3001:127.0.0.1:3001 USER@VPS_IP. Затем зайдите на http://127.0.0.1:3001: между компьютером и VPS данные идут внутри SSH. Сразу включите пароль для одного пользователя либо multi-user mode с администратором и ролями. До настройки доступа и проверки обоих туннелей используйте только искусственные тестовые файлы. Рабочие документы загружайте после проверки прав, резервного копирования и допустимости хранения данных на VPS. Для доступа команды через домен отдельно настройте HTTPS reverse proxy с валидным сертификатом и аутентификацией; публичный 3001 остаётся закрыт.

Проверьте тестовый запрос и эмбеддинги из AnythingLLM, а затем повторите тест при отключённом VPN: доступа к домашнему API быть не должно. Задержку измеряйте на своей сети и модели; гарантировать 5–20 мс нельзя.

Шаг 4: Тюним RAG под бизнес-задачи

Мало просто запустить – надо, чтобы модель реально помогала. Вот три вещи, которые я меняю почти в каждом проекте:

1 Настройка prompt’а в AnythingLLM

Зайдите в Settings → Chat Settings → System Prompt. Пишите чётко: «Ты – ассистент отдела продаж компании X. Отвечай на основе предоставленных документов. Если ответа нет в документах – честно скажи, что не знаешь, не выдумывай.»

Без такого промпта модель начнёт галлюцинировать – проверено.

2 Выбор chunk size и overlap

По умолчанию AnythingLLM режет документы на куски по 1000 символов с пересечением 200. Для юридических договоров лучше уменьшить до 500 символов – контекст точнее. Для технической документации можно 1500. Настройка в Settings → Embedding → Chunk size.

3 Включаем гибридный поиск

Наличие гибридного поиска и его настройку проверяйте для используемой версии и векторного хранилища. Не считайте BM25 автоматически включённым SQLite-индексом. Сравните выдачу на собственном наборе вопросов; фиксированный прирост релевантности не гарантирован.

Типичные ошибки и как их избежать

Собрал грабли, на которые наступил сам и мои клиенты:

  • VPN упал – модель недоступна. Решение: добавьте auto=start и dpdaction=restart в конфиг IPsec, а ещё лучше – cron скрипт, проверяющий туннель каждую минуту.
  • Ollama падает из-за перегрузки GPU. При параллельных запросах от нескольких пользователей видеопамять переполняется. Ограничьте число одновременных сессий в AnythingLLM (Settings → Multi-User) или используйте модель меньшего размера.
  • Медленная загрузка больших документов. Для PDF с сотнями страниц настройте параллельную обработку. В AnythingLLM этого нет из коробки, но можно предварительно разбить файл на части.
  • Домашний IP меняется. Если у провайдера динамический IP, используйте DDNS (например duckdns.org) и в конфиге IPsec пропишите DNS-имя вместо IP.

А что дальше?

После успешных проверок доступа, восстановления из резервной копии и качества ответов можно расширять тестовый стенд:

  • Проверить роли пользователей и права рабочих пространств; аутентификация должна быть включена ещё до загрузки данных.
  • Подключить несколько моделей для разных задач (например, для аналитики – более мощную, для чата – легковесную).
  • Интегрировать через API с CRM или телеграм-ботом.

При локальном инференсе нет оплаты API за токены, но остаются затраты на VPS, электричество, трафик по тарифу и обслуживание. Если захотите расшириться – см. мой гайд «Корпоративный LLM за бетонной стеной», там про кластеризацию.

Не советую так делать, но одну вещь скажу: я видел компании, которые просто проксировали Ollama через VPS без шифрования. Через месяц у них украли модель и базу знаний. Не будьте такими. IPsec – это больно настраивать, но оно того стоит.

В следующей статье разберу, как заменить IPsec на WireGuard (проще, но чуть медленнее) и добавить балансировку на несколько домашних GPU. Подпишитесь, чтобы не пропустить.

Подписаться на канал