295 lines
12 KiB
Markdown
295 lines
12 KiB
Markdown
# iiEasy AI-платформа
|
||
|
||
Корпоративная AI-платформа на базе Open WebUI с интеграцией Ollama, Qdrant, SearXNG и синхронизацией Nextcloud.
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Reverse Proxy (Nginx) │
|
||
│ *.iieasy.ru (odo.iieasy.ru) │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌───────────────────┼───────────────────┐
|
||
│ │ │
|
||
┌───────▼────────┐ ┌───────▼────────┐ ┌───────▼────────┐
|
||
│ Open WebUI │ │ Authentik │ │ Nextcloud │
|
||
│ odo.iieasy.ru │ │ auth.iieasy.ru │ │next.iieasy.ru │
|
||
└───────┬────────┘ └─────────────────┘ └───────┬────────┘
|
||
│ │
|
||
│ ┌──────────────────────────────────────┘
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Docker Network (iieasy-ai) │
|
||
│ │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ Ollama │ │ Qdrant │ │ SearXNG │ │
|
||
│ │ (GPU) │ │ (Vector) │ │ (Search) │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌───────────────┐
|
||
│ Python Worker │
|
||
│ (Nextcloud → │
|
||
│ Qdrant Sync) │
|
||
└───────────────┘
|
||
```
|
||
|
||
## Компоненты
|
||
|
||
- **Open WebUI** - Веб-интерфейс для работы с AI моделями
|
||
- **Ollama** - Локальный запуск LLM моделей (Gemma 3)
|
||
- **Qdrant** - Векторная база данных для RAG
|
||
- **SearXNG** - Метапоисковая система для веб-поиска
|
||
- **Authentik** - Централизованный SSO (OIDC)
|
||
- **Nextcloud Sync Worker** - Автоматическая синхронизация документов из Nextcloud
|
||
|
||
## Быстрый старт
|
||
|
||
### Предварительные требования
|
||
|
||
- Docker и Docker Compose
|
||
- NVIDIA GPU с драйверами (для Ollama)
|
||
- Reverse proxy (Nginx) настроенный для доменов *.iieasy.ru
|
||
- Authentik настроенный и доступный на auth.iieasy.ru
|
||
|
||
### 1. Клонирование и настройка
|
||
|
||
```bash
|
||
cd /home/its/iiEasyWeb
|
||
cp .env.example .env
|
||
# Отредактируйте .env и заполните все необходимые переменные
|
||
```
|
||
|
||
### 2. Генерация API ключей
|
||
|
||
```bash
|
||
# Генерация QDRANT_API_KEY
|
||
openssl rand -hex 32
|
||
# Добавьте результат в .env
|
||
```
|
||
|
||
### 3. Запуск инфраструктуры
|
||
|
||
```bash
|
||
# Запуск всех сервисов
|
||
docker-compose up -d
|
||
|
||
# Проверка статуса
|
||
docker-compose ps
|
||
|
||
# Просмотр логов
|
||
docker-compose logs -f
|
||
```
|
||
|
||
### 4. Загрузка модели Ollama
|
||
|
||
```bash
|
||
# Загрузка модели Gemma 3
|
||
docker exec ollama ollama pull gemma3n:e4b-it-fp16
|
||
|
||
# Проверка загруженных моделей
|
||
docker exec ollama ollama list
|
||
```
|
||
|
||
### 5. Настройка Authentik
|
||
|
||
1. Войдите в Authentik (https://auth.iieasy.ru)
|
||
2. Создайте OIDC Provider:
|
||
- Redirect URI: `https://odo.iieasy.ru/oauth/oidc/callback`
|
||
- Client ID и Client Secret скопируйте в `.env`
|
||
3. Обновите `OPENID_CONNECT_ISSUER` в `.env`
|
||
|
||
### 6. Ребрендинг Open WebUI
|
||
|
||
После первого запуска Open WebUI выполните:
|
||
|
||
```bash
|
||
./scripts/rebrand.sh
|
||
```
|
||
|
||
Скрипт заменит:
|
||
- Логотипы и favicon
|
||
- Текстовые упоминания "Open WebUI" → "iiEasyWeb"
|
||
- Отключит проверку обновлений
|
||
- Удалит аналитику и телеметрию
|
||
|
||
### 7. Настройка API ключа Open WebUI
|
||
|
||
1. Откройте https://odo.iieasy.ru
|
||
2. Войдите через Authentik SSO
|
||
3. Перейдите в Settings → Account → API Keys
|
||
4. Создайте новый API ключ
|
||
5. Добавьте ключ в `.env` как `OPENWEBUI_API_KEY`
|
||
|
||
### 8. Запуск воркера синхронизации Nextcloud
|
||
|
||
```bash
|
||
cd worker
|
||
|
||
# Установка зависимостей
|
||
pip install -r requirements.txt
|
||
|
||
# Настройка переменных окружения
|
||
cp .env.example .env
|
||
# Отредактируйте .env
|
||
|
||
# Запуск однократной синхронизации
|
||
python nextcloud_sync.py --once
|
||
|
||
# Или запуск в режиме daemon
|
||
python nextcloud_sync.py --daemon
|
||
```
|
||
|
||
Для production рекомендуется использовать systemd:
|
||
|
||
```bash
|
||
# Создайте /etc/systemd/system/iieasy-sync.service
|
||
sudo nano /etc/systemd/system/iieasy-sync.service
|
||
```
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=iiEasy Nextcloud Sync Worker
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=its
|
||
WorkingDirectory=/home/its/iiEasyWeb/worker
|
||
ExecStart=/usr/bin/python3 /home/its/iiEasyWeb/worker/nextcloud_sync.py --daemon
|
||
Restart=always
|
||
RestartSec=10
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable iieasy-sync
|
||
sudo systemctl start iieasy-sync
|
||
```
|
||
|
||
## Переменные окружения
|
||
|
||
### Основной .env
|
||
|
||
См. `.env.example` для полного списка переменных. Основные:
|
||
|
||
- `DOMAIN_OPENWEBUI` - URL Open WebUI
|
||
- `DOMAIN_NEXTCLOUD` - URL Nextcloud
|
||
- `DOMAIN_AUTHENTIK` - URL Authentik
|
||
- `OAUTH_CLIENT_ID` - Client ID из Authentik
|
||
- `OAUTH_CLIENT_SECRET` - Client Secret из Authentik
|
||
- `OPENID_CONNECT_ISSUER` - Issuer URL Authentik
|
||
- `QDRANT_API_KEY` - API ключ Qdrant (сгенерировать)
|
||
- `OPENWEBUI_API_KEY` - API ключ Open WebUI (создать после первого запуска)
|
||
|
||
### worker/.env
|
||
|
||
- `NC_USER` - Пользователь Nextcloud
|
||
- `NC_APP_PASSWORD` - App Password (не основной пароль!)
|
||
- `NC_SCAN_PATHS` - Пути для сканирования
|
||
- `OPENWEBUI_API_KEY` - API ключ Open WebUI
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
iiEasyWeb/
|
||
├── docker-compose.yml # Основной compose файл
|
||
├── .env # Переменные окружения
|
||
├── .env.example # Шаблон переменных
|
||
├── .gitignore # Игнорируемые файлы
|
||
│
|
||
├── scripts/
|
||
│ └── rebrand_safe_final.sh # ✅ Рекомендуемый скрипт ребрендинга (безопасный)
|
||
│ ├── rebrand.sh # ⚠️ Старый скрипт (может ломать OAuth)
|
||
│ └── rebrand_fast.sh # ⚠️ Быстрый скрипт (может ломать функциональность)
|
||
│
|
||
├── media/
|
||
│ ├── logo-light.svg # Логотип светлая тема
|
||
│ ├── logo-dark.svg # Логотип темная тема
|
||
│ └── favicon.svg # Favicon
|
||
│
|
||
├── worker/
|
||
│ ├── nextcloud_sync.py # Главный скрипт воркера
|
||
│ ├── config.py # Конфигурация
|
||
│ ├── nextcloud_client.py # WebDAV клиент
|
||
│ ├── openwebui_client.py # Open WebUI API клиент
|
||
│ ├── document_processor.py # Обработка документов
|
||
│ ├── requirements.txt # Python зависимости
|
||
│ └── .env.example # Шаблон для воркера
|
||
│
|
||
└── README.md # Эта документация
|
||
```
|
||
|
||
## Сетевая архитектура
|
||
|
||
Все сервисы работают в Docker сети `iieasy-ai` и доступны только внутри сети, кроме Open WebUI, который доступен через reverse proxy.
|
||
|
||
### Порты
|
||
|
||
- **Open WebUI**: 3001 (внутренний) → Nginx → 443 (HTTPS)
|
||
- **Qdrant**: 6333 (gRPC), 6334 (HTTP) - только внутри сети
|
||
- **SearXNG**: 8080 - только внутри сети
|
||
- **Ollama**: 11434 - только внутри сети
|
||
|
||
### Безопасность
|
||
|
||
- Все сервисы изолированы в Docker сети
|
||
- Доступ к Qdrant только через API ключ
|
||
- Open WebUI использует Authentik SSO для аутентификации
|
||
- Воркер использует App Password для Nextcloud (не основной пароль)
|
||
- CrowdSec и OPNsense фильтруют трафик на уровне reverse proxy
|
||
|
||
## Поддерживаемые форматы файлов
|
||
|
||
Воркер синхронизации поддерживает:
|
||
|
||
- **PDF** (.pdf) - извлечение текста через pypdf
|
||
- **DOCX** (.docx, .doc) - извлечение текста через python-docx
|
||
- **Текстовые** (.txt, .md, .markdown) - прямое чтение
|
||
- **CSV** (.csv) - конвертация в текстовый формат
|
||
|
||
Файлы больше 100MB обрабатываются потоково с ограничением количества страниц.
|
||
|
||
## Устранение неполадок
|
||
|
||
### Open WebUI не подключается к Qdrant
|
||
|
||
1. Проверьте, что Qdrant запущен: `docker-compose ps qdrant`
|
||
2. Проверьте логи: `docker-compose logs qdrant`
|
||
3. Убедитесь, что `QDRANT_API_KEY` установлен в `.env`
|
||
4. Проверьте переменную `QDRANT_URI=http://qdrant:6333`
|
||
|
||
### Ошибки аутентификации через Authentik
|
||
|
||
1. Проверьте redirect URI в Authentik: `https://odo.iieasy.ru/oauth/oidc/callback`
|
||
2. Убедитесь, что `OPENID_CONNECT_ISSUER` правильный
|
||
3. Проверьте логи Open WebUI: `docker-compose logs open-webui`
|
||
|
||
### Воркер не синхронизирует файлы
|
||
|
||
1. Проверьте логи: `tail -f worker/sync.log`
|
||
2. Убедитесь, что `OPENWEBUI_API_KEY` правильный
|
||
3. Проверьте доступность Nextcloud: `curl https://next.iieasy.ru`
|
||
4. Проверьте права доступа к путям в `NC_SCAN_PATHS`
|
||
|
||
### Ollama не использует GPU
|
||
|
||
1. Проверьте драйверы NVIDIA: `nvidia-smi`
|
||
2. Установите nvidia-container-toolkit
|
||
3. Перезапустите Docker: `sudo systemctl restart docker`
|
||
4. Проверьте переменную `NVIDIA_VISIBLE_DEVICES` в `.env`
|
||
|
||
## Лицензия
|
||
|
||
Внутренний проект iiEasy Research Center.
|
||
|
||
## Поддержка
|
||
|
||
Для вопросов и проблем обращайтесь к команде разработки iiEasy.
|