- Full peer inventory (44 active peers) - Groups mapping - Deleted 12 stale peers (6+ months offline) - Also staged pending NIIKN and video surveillance docs
10 KiB
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)
# На LXC 129 (clawdbot, 10.0.0.206)
systemctl start nextcloud-talk-bot
Проверка
systemctl status nextcloud-talk-bot
tail -20 /tmp/talk-bot.log
Остановка
systemctl stop nextcloud-talk-bot
Ручной запуск (без systemd)
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
# На 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:
- Нажать "+" → Создать групповую беседу
- Назвать "Максимка" (или любое имя)
- Добавить участников: admin, maximka, и других пользователей
Через API:
# Создать групповой чат
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: Получить токен чата
# Список всех чатов
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
Отредактировать конфигурацию в начале файла:
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: Запустить бота
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.
База знаний
При старте бот:
- Делает
git pullв/root/clawd/knowledge-base - Загружает все
.mdфайлы (до 80KB) - Передаёт как первое 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.
systemctl enable nextcloud-talk-bot # автозапуск при старте
systemctl start nextcloud-talk-bot # запуск
systemctl status nextcloud-talk-bot # проверка
Файл сервиса: /etc/systemd/system/nextcloud-talk-bot.service
OCC команды (управление Talk ботами)
# 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 (сохранение истории между перезапусками)