# Nextcloud Talk Bot — Максимка 🤖 ## Обзор AI-бот в Nextcloud Talk с доступом к базе знаний. Отвечает на вопросы об инфраструктуре, серверах, настройках и проектах. Использует Claude через cliproxy (Clawdbot). ## Архитектура ``` Пользователь → Nextcloud Talk (чат "Максимка") ↓ (long polling API каждые 30с) Talk Bot (Python скрипт на LXC 129) ↓ cliproxy (localhost:8317) → Claude Sonnet ↑ База знаний из Gitea (knowledge-base repo) ↓ Ответ → Talk API → Чат (от пользователя "maximka") ``` ## Быстрый старт ### Запуск бота (systemd) ```bash # На LXC 129 (clawdbot, 10.0.0.206) systemctl start nextcloud-talk-bot ``` ### Проверка ```bash systemctl status nextcloud-talk-bot tail -20 /tmp/talk-bot.log ``` ### Остановка ```bash systemctl stop nextcloud-talk-bot ``` ### Ручной запуск (без systemd) ```bash nohup python3 -u /root/clawd/scripts/nextcloud-talk-bot.py > /tmp/talk-bot.log 2>&1 & ``` ### Обновить базу знаний (из чата Talk) Написать `/reload` в чат — бот сделает git pull и перезагрузит KB. --- ## Установка с нуля ### Предварительные требования - Nextcloud с приложением Talk (протестировано на Nextcloud AIO) - Python 3.x на машине где будет бот - Clawdbot с cliproxy (для Claude API) - Git репозиторий с базой знаний ### Шаг 1: Создать пользователя для бота в Nextcloud ```bash # На VM с Nextcloud (10.0.0.230) # Через OCC в Docker контейнере sudo docker exec -i -e OC_PASS='MaximkaBot2026' -u www-data \ nextcloud-aio-nextcloud php occ user:add \ --password-from-env \ --display-name="Максимка 🤖" \ maximka # Если пользователь уже есть — сбросить пароль: sudo docker exec -i -e OC_PASS='MaximkaBot2026' -u www-data \ nextcloud-aio-nextcloud php occ user:resetpassword --password-from-env maximka ``` ### Шаг 2: Создать чат в Nextcloud Talk Через веб-интерфейс Nextcloud Talk: 1. Нажать "+" → Создать групповую беседу 2. Назвать "Максимка" (или любое имя) 3. Добавить участников: admin, maximka, и других пользователей Через API: ```bash # Создать групповой чат curl -s -u "admin:1qaz!QAZ" \ -X POST "http://10.0.0.230:11001/ocs/v2.php/apps/spreed/api/v4/room" \ -H "OCS-APIRequest: true" \ -d "roomType=2&roomName=Максимка" # Добавить бота в чат curl -s -u "admin:1qaz!QAZ" \ -X POST "http://10.0.0.230:11001/ocs/v2.php/apps/spreed/api/v4/room/{TOKEN}/participants" \ -H "OCS-APIRequest: true" \ -d "newParticipant=maximka&source=users" ``` Где `{TOKEN}` — токен чата из предыдущего ответа (у нас: `aecax6yg`). ### Шаг 3: Получить токен чата ```bash # Список всех чатов curl -s -u "admin:1qaz!QAZ" \ "http://10.0.0.230:11001/ocs/v2.php/apps/spreed/api/v4/room" \ -H "OCS-APIRequest: true" \ -H "Accept: application/json" | python3 -c " import sys, json data = json.load(sys.stdin) for r in data['ocs']['data']: print(f\"Token: {r['token']} | Name: {r.get('displayName','')} | Type: {r['type']}\") " ``` ### Шаг 4: Скопировать скрипт бота Скрипт: `/root/clawd/scripts/nextcloud-talk-bot.py` Отредактировать конфигурацию в начале файла: ```python NC_URL = "http://10.0.0.230:11001" # URL Nextcloud NC_USER = "admin" # Пользователь для чтения (polling) NC_PASS = "1qaz!QAZ" # Пароль BOT_USER = "maximka" # Пользователь для отправки ответов BOT_PASS = "MaximkaBot2026" # Пароль бота CONVERSATION_TOKEN = "aecax6yg" # Токен чата CLIPROXY_URL = "http://localhost:8317/v1/messages" # Claude API CLIPROXY_KEY = "sk-clawdbot-proxy" # API ключ KB_PATH = "/root/clawd/knowledge-base" # Путь к базе знаний MAX_KB_SIZE = 80000 # Макс размер KB в промпте ``` ### Шаг 5: Запустить бота ```bash nohup python3 -u /root/clawd/scripts/nextcloud-talk-bot.py > /tmp/talk-bot.log 2>&1 & ``` --- ## Конфигурация ### Учётные данные | Что | Логин | Пароль | Назначение | |-----|-------|--------|-----------| | NC Polling | admin | 1qaz!QAZ | Чтение сообщений | | NC Bot | maximka | MaximkaBot2026 | Отправка ответов | | cliproxy | - | sk-clawdbot-proxy | Claude API | ### Nextcloud - **URL:** http://10.0.0.230:11001 - **Тип:** Nextcloud AIO (Docker) - **VM:** 250 на Proxmox (10.0.0.230) - **SSH:** cloud@10.0.0.230 ### Чат - **Имя:** Максимка - **Token:** aecax6yg - **Участники:** admin, maximka ### Файлы - **Скрипт:** `/root/clawd/scripts/nextcloud-talk-bot.py` - **Лог:** `/tmp/talk-bot.log` - **База знаний:** `/root/clawd/knowledge-base/` - **Gitea repo:** http://10.0.0.189:3000/oleg/knowledge-base --- ## Как работает ### Polling Бот использует Talk API с long polling (`lookIntoFuture=1&timeout=30`). Nextcloud держит HTTP соединение открытым до 30 секунд и отвечает сразу когда появляется новое сообщение. ### Join Room Перед каждой отправкой бот делает `POST .../room/{token}/participants/active` — это "join" в разговор. Без этого Nextcloud возвращает 401. ### База знаний При старте бот: 1. Делает `git pull` в `/root/clawd/knowledge-base` 2. Загружает все `.md` файлы (до 80KB) 3. Передаёт как первое user/assistant сообщение в контекст Claude **Важно:** KB передаётся через user message, а не system prompt — cliproxy не передаёт system field. ### Фильтрация Бот пропускает: - Свои сообщения (`actorId == "maximka"`) - Сообщения от ботов (`actorType == "bots"`) - Системные (`messageType == "system"`) ### Команды - `/reload` — обновить базу знаний (git pull + перезагрузка) ### История Бот помнит последние 10 пар сообщений (user/assistant) в текущей сессии. При перезапуске история сбрасывается. --- ## Проблемы и решения ### Webhook не работает Nextcloud Talk Bot API поддерживает webhooks, но в AIO (Docker) setup они не триггерятся надёжно. Решение: polling. ### 401 при отправке Причина: бот не "вошёл" в чат. Решение: `join_room()` перед каждой отправкой. ### Бот зацикливается Причина: бот отвечает на свои же сообщения. Решение: фильтр по `actorId`. ### Бот не использует базу знаний Причина: cliproxy не передаёт system prompt. Решение: KB как первое user/assistant сообщение. ### Бот не запускается после перезагрузки **Решено:** Создан systemd сервис `nextcloud-talk-bot.service` с `Restart=always`. ```bash systemctl enable nextcloud-talk-bot # автозапуск при старте systemctl start nextcloud-talk-bot # запуск systemctl status nextcloud-talk-bot # проверка ``` Файл сервиса: `/etc/systemd/system/nextcloud-talk-bot.service` --- ## OCC команды (управление Talk ботами) ```bash # SSH на VM ssh cloud@10.0.0.230 # Все команды через docker EXEC="sudo docker exec -u www-data nextcloud-aio-nextcloud" # Установить бота (webhook-based, необязательно для polling) $EXEC php occ talk:bot:install \ -f webhook -f response -f event \ 'Максимка' 'secret-key' 'http://webhook-url/endpoint' 'Описание' # Список ботов в чате $EXEC php occ talk:bot:list {TOKEN} # Добавить бота в чат $EXEC php occ talk:bot:setup {BOT_ID} {CHAT_TOKEN} # Удалить бота из чата $EXEC php occ talk:bot:remove {BOT_ID} {CHAT_TOKEN} # Удалить бота полностью $EXEC php occ talk:bot:uninstall {BOT_ID} ``` --- ## Changelog ### 2026-02-27 - ✅ Создан systemd сервис `nextcloud-talk-bot.service` — автозапуск, restart при падении - ✅ Бот работает стабильно через polling ### 2026-02-26 / 2026-02-27 (ночь) - ✅ Первоначальная разработка и запуск - ✅ Зарегистрирован бот "Максимка" в Nextcloud Talk - ✅ Webhook не работает в AIO Docker → переход на polling - ✅ Создан пользователь `maximka` для отправки ответов - ✅ Подключена база знаний (knowledge-base) через git - ✅ Claude Sonnet через cliproxy (localhost:8317) - ✅ Команда `/reload` для обновления KB - ✅ История контекста (10 пар сообщений) - ✅ Фильтрация своих сообщений и ботов ## TODO - [ ] Поддержка нескольких чатов - [ ] Аватар для пользователя maximka - [ ] Интеграция с основным Clawdbot (через hooks или sessions) - [ ] Возможность выполнять команды (не только отвечать) - [ ] Persistent history (сохранение истории между перезапусками)