Перейти к содержанию

ragserver — офисный хаб знаний и RAG-платформа

Центральный узел для сбора и выдачи знаний: держит локальную RAG-платформу (Open WebUI + Postgres + Qdrant) и выступает источником данных для внешних АИ-агентов (Perplexity Computer, Claude, собственных ботов). Живёт в офисной сети 192.168.1.0/24, публично доступен через nginx (80/443) под rag.alatyr-service.ru.

Железо — временное (мини-ПК на i3-7100U, 8 GB RAM). Запланирована замена на более мощную машину для локального LLM-inference и больших embedding-моделей.


Быстрая справка

Параметр Значение
Hostname ragserver
LAN IP 192.168.1.200/24 по DHCP-резервации ASUS (38:49:06:3A:82:0F)
Публичный домен rag.alatyr-service.ru → 176.99.153.164 (роутер) → 200:443
ОС Ubuntu 22.04.5 LTS
Kernel 5.15.0-186-generic (проверено 05.08.2026)
CPU Intel Core i3-7100U @ 2.40 GHz (2C/4T, VT-x)
RAM (физически) 16 GB DDR3-1600 (1 модуль)
RAM (доступно системе) 8 GB ⚠ (см. раздел «Железо»)
Swap 4 GB (на LVM)
Диск SSD 2 TB (/dev/sda)
SSH порт 22, oswold@, sudo с паролем
VPN AmneziaWG клиент awg-rag (10.8.1.1246.17.99.183:8443, GUI-managed)
Ollama (embeddings + локальный code assistant) ollama.service на хосте (не в docker), слушает 192.168.1.200:11434
RAG-sync /opt/rag-sync/sync-to-openwebui.sh (см. rag-sync.md)
Проверено 25.08.2026

Роль в инфраструктуре

Ragserver играет две взаимосвязанные роли:

1️⃣ Локальная RAG-платформа (Open WebUI)

Пользователь                Роутер                   ragserver
браузер   ──HTTPS──►  176.99.153.164:443  ──►  192.168.1.200:443
                                              nginx (host)
                                            rag-openwebui:8080
                                            (127.0.0.1:3000)

Для обхода блокировки OpenRouter в РФ используется AmneziaWG-туннель через VPS (46.17.99.183). Split-tunnel с FWMARK 0x1234 — только контейнер rag-openwebui (172.19.0.10) идёт в OpenRouter через AmneziaWG, остальной трафик — напрямую. Подробнее — в amneziawg-tunnels.md.

Синхронизация knowledge base из GitHub-репо alatyr-infra-kb в OpenWebUI knowledge collection выполняется скриптом /opt/rag-sync/sync-to-openwebui.sh. Подробнее — в rag-sync.md.

2️⃣ Центральный источник знаний для внешних АИ-агентов

╔═══════════════════════╗       ╔═══════════════╗       ╔═════════════════╗
║  ragserver          ║       ║   GitHub    ║       ║ Perplexity     ║
║  /opt/knowledge/    ║ push  ║ alatyr-     ║ read  ║ Computer       ║
║  ├─ infra-kb       ║──────►║ infra-kb    ║◄──────║ (я)            ║
║  ├─ personal-notes ║       ║ (private)   ║       ║ Claude, боты   ║
║  ├─ business/      ║       ║             ║       ║ API-агенты     ║
║  └─ perplexity/    ║       ║             ║       ║                ║
║                     ║       ║             ║       ║                ║
║  Qdrant (вектора)  ║◄──sync──║             ║       ║                ║
║  Postgres (meta)    ║       ║             ║       ║                ║
║  Open WebUI (UI)    ║       ║             ║       ║                ║
╚═══════════════════════╝       ╚═══════════════╝       ╚═════════════════╝

Ключевая идея: вместо того чтобы каждый раз объяснять агенту контекст (кто я, что за проекты, какая инфраструктура) — агент сам подтягивает актуальные данные из центрального источника. Это:

  • Повышает точность ответов — агент видит реальные IP, конфиги, решения, а не выдумывает
  • Сокращает повторные объяснения в каждом новом чате
  • Сохраняет контекст между сессиями и между разными агентами
  • Даёт версионный источник правды (через git в GitHub)

Сбор знаний — что хранится на ragserver

Целевая структура (часть уже есть, часть в планах):

/opt/knowledge/
├── infra-kb/          # ✅ git repo alatyr-infra-kb (GitHub private)
│   ├── 00_INDEX.md
│   ├── vps-hostkey-vm-mini.md
│   ├── ragserver-workstation.md  ← этот файл
│   └── ...
├── personal-notes/    # 🔄 Личные заметки (git-репо, VS Code, RAG)
│   ├── daily/         # ежедневные заметки
│   ├── projects/      # персональные проекты
│   └── references/    # материалы, выписки
├── business/          # 🔄 Бизнес-данные
│   ├── objects/       # объекты (из alatyr-service CRM)
│   ├── clients/       # клиенты (выгрузки)
│   └── financial/     # итоги по деньгам, Зен-Мни
└── perplexity/        # 🔄 Архив важных чатов
    ├── sessions/      # export важных тредов
    └── knowledge/     # скомпилированные выводы из чатов

Статус каждого блока

Блок Статус Где сейчас Как агент читает
infra-kb/ ✅ Активно ведётся в workspace + GitHub oswold1979/alatyr-infra-kb + локально /opt/rag-kb/ GitHub API (gh CLI, MCP-коннектор) + локальный RAG в OpenWebUI (коллекция alatyr-infra-kb)
personal-notes/ 🔄 План git-репо (аналогично infra-kb), правки в VS Code GitHub API + локальный RAG (коллекция personal)
business/ 🔄 Частично в alatyr-service (МоёДело, МойСклад API) выгрузка через CRM API + push в KB
perplexity/ 🔄 План вручную через export тредов через GitHub или pplx SDK

Сценарии использования

A. Perplexity Computer (сейчас активно): - Читает alatyr-infra-kb через GitHub connector — видит всю инфраструктуру, TODO, СП - Перед ответом смотрит 00_INDEX.md — не выдумывает IP-адреса, а читает таблицу - Пишет обновления в KB и коммитит в GitHub от вашего имени

B. Собственные боты в CRM (план): - Telegram-бот берёт факты об объекте из business/objects/ - LLM-вызов из alatyr-service (Node.js) с RAG-контекстом из Qdrant - Автоматические ответы клиентам на базе корпоративной базы знаний

C. Claude / ChatGPT / другие (позже): - Отдают публичный уровень через GitHub raw URL (если есть коннектор) - Или через web-интерфейс Open WebUI на rag.alatyr-service.ru (если вы входите сами)

Принципы безопасности KB

  • Секреты (ключи, пароли, API-токены) в KB НЕ хранятся — только в Vaultwarden и .env файлах
  • Персональные данные клиентов — только в business/ с анонимизацией при пуше
  • Репо alatyr-infra-kbприватный на GitHub
  • Агенты с меньшим доверием — только read-only агрегаты без чувствительных деталей

Железо

Сегодняшнее железо — временное. Мини-ПК на i3-7100U/8GB. Цель — обкатать архитектуру и заменить на более мощную машину (целево: 32-64 GB RAM, GPU с видеопамятью ≥ 12 GB для локальных LLM и больших embedding-моделей). Факты по железу ниже — на 05.08.2026.

CPU

  • Модель: Intel Core i3-7100U @ 2.40 GHz (Kaby Lake, mobile)
  • Ядра/потоки: 2 ядра / 4 потока (Hyper-Threading)
  • Частота: зафиксирована на 2.4 GHz (min 400 MHz, турбобуста нет у -U серии)
  • VT-x: включён — Docker работает нативно, KVM возможен
  • Тепловой пакет: 15W TDP — типично для мини-ПК / NUC-класса
  • Ограничение: для CPU-inference LLM не подходит, но для оркестрации Open WebUI + Postgres + Qdrant + выдачи текстовых файлов в GitHub — хватает

RAM ⚠

  • Физически установлен: 1 модуль 16 GB DDR3-1600 (двухсторонний)
  • Доступно системе: только ~8 GB (MemTotal: 8042608 kB)
  • BIOS-e820 показывает верхнюю границу 0xBFFFFFFF = 3 GiB, дальше нет
  • Причина: чипсет мобильного i3-7100U на этой материнке (Vendor/Model = «Default string» — самосборный/безымянный мини-ПК) вероятно не поддерживает 16 GB модули — распознаётся только половина
  • Что делать при апгрейде:
  • НЕ ставить один 16GB модуль — работает как 8GB
  • Купить два модуля по 8 GB DDR3-1600 SODIMM (двойной ранк, если 2 слота) — суммарно 16 GB рабочих
  • Проверить в мануале материнки максимум per-slot (может быть 8 GB)

Диск

  • SSD 2 TB (/dev/sda), non-rotational
  • Разметка (GPT + LVM):
    sda1 → 1 GB    /boot/efi (EFI System)
    sda2 → 2 GB    /boot
    sda3 → 1.86 TB LVM PV (ubuntu-vg)
        └─ ubuntu-lv → 100 GB → /
    
  • Занято: 21 GB / 98 GB (23%), свободно 73 GB
  • ⚠ В VG свободно 1.76 TB — Ubuntu-установщик по умолчанию создал LV только на 100 GB
  • План на расширение (когда понадобится):
    sudo lvextend -L +500G ubuntu-vg/ubuntu-lv
    sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
    
    Или отдельным LV вынести /var/lib/docker — тогда переполнение Docker не убъёт корень

GPU

  • Отдельного GPU нет — только интегрированная Intel HD Graphics 620
  • Локальный LLM-inference работает только на CPU. Для Continue используются qwen2.5-coder:3b и qwen2.5-coder:1.5b; крупные модели 7B+ на текущих 8 GB RAM не устанавливаются. Open WebUI продолжает использовать OpenRouter для основных облачных чат-моделей.
  • Embeddings — на CPU через Ollama + nomic-embed-text (137M параметров, 768-dim). Работает, но медленно: ~0.5-1 сек на чанк

Сетевые интерфейсы

Интерфейс Состояние Адрес Назначение
enp2s0 UP 192.168.1.200/24 (DHCP reservation) Основной Ethernet
wlp1s0 DOWN Wi-Fi (не используется)
awg-rag UP 10.8.1.12/32 AmneziaWG клиент → VPS
br-83ca6e4bba84 UP 172.19.0.1/16 Docker сеть rag-net
docker0 DOWN 172.17.0.1/16 Default Docker bridge (не используется)
br-25ca11524b48 DOWN 172.18.0.1/16 Устаревшая Docker-сеть (можно удалить)

Шлюз по умолчанию: 192.168.1.1 (роутер ASUS RT-N12E).

Адрес закреплён на ASUS RT-N12E: 38:49:06:3A:82:0F → 192.168.1.200. Активный /etc/netplan/01-netcfg.yaml использует DHCPv4, запрещает DNS от DHCP и сохраняет DNS Инетком 194.187.205.226, 194.187.204.254. 50-cloud-init.yaml отключён как 50-cloud-init.yaml.disabled-2026-08-25. Резервная копия предыдущих YAML: /root/netplan-pre-9c-2026-08-25_092353/.

Перезапуск systemd-networkd удаляет вручную созданное правило fwmark 0x1234 → vpnroute. Поэтому для awg-rag-split-tunnel.service установлен drop-in /etc/systemd/system/awg-rag-split-tunnel.service.d/10-networkd.conf с After=systemd-networkd.service и PartOf=systemd-networkd.service. Контрольный restart networkd и полная перезагрузка подтвердили автоматическое восстановление правила и выход rag-openwebui через 46.17.99.183.


Публичные порты (0.0.0.0)

Порт Сервис Комментарий
22/tcp SSH (стандартный) Проверено 05.08.2026: UFW inactive, iptables INPUT ACCEPT
80/tcp nginx Редирект → HTTPS
443/tcp nginx Основной HTTPS для rag.alatyr-service.ru

Проброс на роутере (ASUS RT-N12E): только 80/tcp и 443/tcp из внешнего интернета на 192.168.1.200. Проверено 05.08.2026.

Loopback-порты (127.0.0.1)

Порт Сервис Контейнер
3000 Open WebUI (HTTP) rag-openwebui → :8080
5432 PostgreSQL 16 rag-postgres
6333 Qdrant HTTP API rag-qdrant (защищён API-ключом)
6334 Qdrant gRPC rag-qdrant

LAN-порты (192.168.1.200)

Порт Сервис Где живёт
11434 Ollama API Host systemd (ollama.service, не в docker)

Важно: Ollama слушает НЕ на 127.0.0.1, а на 192.168.1.200:11434 — поэтому из хоста доступ только через LAN IP. Контейнер rag-openwebui обращается к ней через host.docker.internal или через LAN IP 192.168.1.200:11434.

Никакие из loopback-портов снаружи не торчат — доступ только через nginx-reverse-proxy на rag.alatyr-service.ru.


RAG-платформа (Docker Compose + host Ollama)

Расположение docker-compose: /opt/rag-platform/

Стек: четыре компонента — три контейнера в сети rag-net (172.19.0.0/16) плюс Ollama на хосте.

Сервис Контейнер / Служба Образ / Пакет Хост-порт Статус
Open WebUI rag-openwebui (docker) ghcr.io/open-webui/open-webui:main 127.0.0.1:3000:8080 healthy
PostgreSQL rag-postgres (docker) postgres:16-alpine 127.0.0.1:5432:5432 healthy
Qdrant rag-qdrant (docker) qdrant/qdrant:v1.12.4 127.0.0.1:6333-6334:6333-6334 up (без healthcheck)
Ollama ollama.service (host systemd) /usr/local/bin/ollama 192.168.1.200:11434 active (running)

Ollama (embeddings и локальные code-модели)

  • Установленные модели на 26.08.2026:
  • nomic-embed-text:latest (embeddings)
  • llama3.2:3b
  • qwen2.5-coder:3b (Continue chat/edit/apply)
  • qwen2.5-coder:1.5b (Continue autocomplete)
  • Запуск: systemd ollama.service на хосте (unit: /etc/systemd/system/ollama.service, override в .d/override.conf)
  • Слушает: 192.168.1.200:11434 — доступна из docker-контейнеров через LAN IP
  • CLI на хосте: использовать OLLAMA_HOST=192.168.1.200:11434 ollama <команда>, потому что localhost не слушается
  • Ограничение: inference идёт на CPU; для автодополнения Continue установлен timeout 30 секунд
  • Runbook: ai-editor-tools.md

Qdrant (векторное хранилище)

  • Одна общая коллекция: open-webui_knowledge — все векторы от всех knowledge collections OpenWebUI (не отдельные Qdrant-коллекции!)
  • Размерность: 768 (соответствует nomic-embed-text)
  • Метрика: Cosine, on_disk: false (в RAM для скорости)
  • API-ключ: QDRANT_API_KEY в env docker-compose. ⚠ Утёк в чат 05.08.2026 — требует ротации

Volumes (все bind mounts на хост)

/opt/rag-platform/
├── data/
│   ├── openwebui/   → rag-openwebui:/app/backend/data
│   ├── postgres/    → rag-postgres:/var/lib/postgresql/data
│   └── qdrant/      → rag-qdrant:/qdrant/storage
├── scripts/
│   └── init-db.sql  → rag-postgres:/docker-entrypoint-initdb.d/init.sql (ro)
├── docker-compose.yml
└── .env             (POSTGRES_PASSWORD, WEBUI_SECRET_KEY, OPENAI_API_KEY, QDRANT_API_KEY)

Ollama хранит модели отдельно — обычно в /usr/share/ollama/.ollama/models/ или /var/lib/ollama/. Проверить: sudo ls /var/lib/ollama/.

Bind mount = легко бэкапить

cd /opt/rag-platform
sudo docker compose stop
sudo tar -czf ~/backups/rag-data-$(date +%F).tar.gz data/
sudo docker compose start

⚠ TODO: бэкап пока не настроен — добавить cron с ротацией (см. TODO).

Восстановление

cd /opt/rag-platform
sudo docker compose down
sudo tar -xzf ~/backups/rag-data-YYYY-MM-DD.tar.gz
sudo docker compose up -d

SSH-доступ

  • Порт: 22/tcp (стандартный)
  • Пользователь: oswold (обычный пользователь, sudo без пароля)
  • PermitRootLogin: проверить (sudo grep PermitRootLogin /etc/ssh/sshd_config)
  • Ключевая аутентификация: пароль тоже работает (см. TODO про hardening)
  • fail2ban: статус проверить (sudo systemctl status fail2ban)

AmneziaWG клиент

  • Интерфейс: awg-rag
  • Локальный IP: 10.8.1.12/32
  • Endpoint: 46.17.99.183:8443 (VPS vm-mini)
  • Конфиг: /etc/amnezia/amneziawg/awg-rag.conf
  • Режим: Table = off, peer AllowedIPs = 0.0.0.0/0, ::/0
  • Назначение: только маркированный FWMARK 0x1234 трафик из контейнера rag-openwebui (172.19.0.10) идёт через туннель — для доступа к OpenRouter
  • Всё остальное — напрямую через enp2s0 → 192.168.1.1
  • Open WebUI и storage-api дополнительно публикуются на 10.8.1.12:3000 и 10.8.1.12:3100 для входящих запросов через VPN.
  • Подробнее — amneziawg-tunnels.md

Пути к важному

Путь Что там
/opt/rag-platform/ Docker Compose проект RAG-платформы
/opt/rag-platform/data/ Все bind-volumes (Postgres, Qdrant, Open WebUI)
/opt/rag-platform/.env Секреты RAG-стека — не пушить в git!
/opt/rag-kb/ Git-клон alatyr-infra-kb (deploy key SSH, read-only), владелец oswold:oswold
/opt/rag-sync/ Sync-скрипт и state для RAG-синхронизации (700, oswold). См. rag-sync.md
/opt/rag-sync/.env OPENWEBUI_API_TOKENне пушить в git!
/etc/systemd/system/ollama.service Ollama unit (host, не docker)
/etc/nginx/sites-enabled/rag.alatyr-service.ru Nginx reverse proxy (см. nginx-vps-configs.md, аналогично)
/etc/letsencrypt/live/rag.alatyr-service.ru/ TLS-сертификат (см. certbot.md)
/etc/amnezia/amneziawg/awg-rag.conf AmneziaWG клиентский конфиг (см. amneziawg-tunnels.md)
/home/oswold/.ssh/id_ed25519_alatyr_kb SSH deploy key для GitHub (read-only)
/home/oswold/ Домашняя директория пользователя

Известные проблемы / TODO

Краткосрочно (текущая машина)

  • Структура /opt/knowledge/ — создать каталоги personal-notes/, business/, perplexity/ как git submodules или отдельные репозитории
  • RAG-sync — клон rag-kb в /opt/rag-kb/, крон-скрипт, embedding в QdrantСделано 05.08.2026 (см. rag-sync.md). Осталось: установить systemd timer или cron
  • RAG-sync — установить cron/timer — сейчас скрипт запускается только вручную
  • Ротировать QDRANT_API_KEY — утёк в чат 05.08.2026 при отладке эмбеддингов
  • Личные заметки → ragserver sync — решено 08.08.2026: отдельный git-репо personal-notes (аналогично infra-kb), правки в VS Code, автосинк через sync-to-openwebui.sh. См. knowledge-base-decision.md. Obsidian больше не используется.
  • Business-выгрузка — cron который тянет из alatyr-service PostgreSQL объекты/клиентов в business/ MD-файлы
  • Perplexity архив — выбрать метод export (pplx SDK, вручную, browser task)
  • RAM: разобраться с 16 GB → 8 GB — либо купить два по 8 GB, либо оставить до замены железа
  • Расширить / — сейчас 100 GB из 1.86 TB VG. План: lvextend +500G когда df -h / покажет > 60% использования. Или отдельный LV под /var/lib/docker
  • Удалить брошенную Docker-сеть br-25ca11524b48 (172.18.0.0/16)docker network prune
  • SSH hardening:
  • Отключить PasswordAuthentication (только ключи)
  • Проверить PermitRootLogin no
  • Ограничить AllowUsers oswold
  • Возможно, сменить порт на нестандартный
  • Настроить бэкап /opt/rag-platform/data/ — cron, ротация, offsite-копия
  • Добавить healthcheck для Qdrant в docker-compose.yml
  • Ротировать POSTGRES_PASSWORD — засветился в чате Perplexity
  • Ускорить RAG-эмбеддингиRAG_EMBEDDING_BATCH_SIZE 4→32, RAG_CHUNK_SIZE 1000→2000. См. rag-sync.md
  • Мониторинг — сейчас нет метрик, только docker compose ps. Возможно добавить простой Prometheus + node_exporter или облачный health-ping

Долгосрочно (новое железо)

  • Замена железа — целевая конфигурация: 32-64 GB RAM, GPU ≥ 12 GB VRAM, SSD NVMe 2+ TB
  • Локальные LLM крупнее 3B — после апгрейда железа: Ollama/vLLM с моделями Qwen, Llama и Mistral 7B+; текущие Qwen 1.5B/3B уже используются Continue на CPU
  • Локальные embedding-модели покрупнее — сравнить nomic-embed-text vs mxbai-embed-large vs multilingual-e5. После GPU можно поднять до bge-m3 (568M)
  • MCP-сервер на ragserver — чтобы внешние агенты (Claude Desktop через туннель) могли читать базу напрямую, а не через GitHub

История изменений

Дата Что
2026-08-05 Первая версия документа. Проверено железо, сеть, стек, порты. Добавлена вторая роль — центральный источник знаний для внешних агентов.
2026-08-05 (вечер) Дополнено: (1) Ollama работает на хосте как systemd, не в docker, слушает 192.168.1.200:11434. (2) Qdrant использует одну общую коллекцию open-webui_knowledge (768-dim, cosine). (3) Добавлены /opt/rag-kb/ (git clone) и /opt/rag-sync/ (sync script) — см. rag-sync.md. (4) Первый синк 10 файлов = 9m36s. (5) Обнаружена утечка QDRANT_API_KEY в чат — нужна ротация.
2026-08-25 Задача 9c: enp2s0 переведён со смешанной схемы static .200 + DHCP .43 на DHCP-only с резервацией .200 в ASUS. Добавлен systemd drop-in для восстановления split-tunnel после рестарта networkd. Проверено полной перезагрузкой.
2026-08-26 Задача 34: Ollama дополнен моделями qwen2.5-coder:3b и qwen2.5-coder:1.5b для Continue. Проверены chat, autocomplete и inline edit на CPU.