rpi: установить локальный разговорный сервис Маруси
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# Разговор с Астрой через Марусю
|
||||
|
||||
Код: `ruzzy/astra-bot`, `marusia/server.py`, тесты `test_marusia.py`.
|
||||
Сервис на rpi слушает только `127.0.0.1:8788`; наружу пока не опубликован.
|
||||
Webhook: `POST /webhook/<секрет из /etc/astra-marusia.env>`.
|
||||
Проверка: `GET /health`.
|
||||
|
||||
Отдельный разговор на идентификатор пользователя Маруси, до 16 реплик в памяти;
|
||||
при перезапуске история очищается, через сутки простоя удаляется. Беседа семейная,
|
||||
ответы подходят ребёнку 10 лет. Тексты не пишутся в access log. Голос распознаёт
|
||||
Маруся, Астра отвечает текстом, Маруся озвучивает `response.tts`.
|
||||
|
||||
Codex использует существующую авторизацию ChatGPT: файл auth.json привязан
|
||||
только для чтения в отдельный CODEX_HOME. Пользовательская конфигурация, правила,
|
||||
документы проекта и инструменты shell/apps/browser отключены. systemd скрывает
|
||||
домашние каталоги, запрещает повышение привилегий и запись за пределами своего
|
||||
StateDirectory. Не подключать этот сервис к административному треду Telegram.
|
||||
После обновления Codex повторно проверять список отключаемых feature flags.
|
||||
|
||||
Быстрый ответ ожидается до 2 секунд. Если ответ ещё готовится, колонка просит
|
||||
сказать «готово?»; новая реплика во время ожидания не запускает вторую задачу.
|
||||
Повтор webhook с теми же session_id/message_id получает кешированный ответ.
|
||||
Не более двух обращений к модели одновременно, не более 50 разговоров.
|
||||
|
||||
Для завершения нужны: приватный навык в аккаунте VK владельца, его skill_id
|
||||
в env, публичный HTTPS URL с проксированием на rpi (например nginx на fr1
|
||||
и отдельный ограниченный SSH-туннель). Доступа SSH к fr1 у astra на rpi сейчас нет;
|
||||
ключ Gitea — не ключ сервера. Не открывать домашний порт в интернет напрямую.
|
||||
На публичном прокси отключить access log webhook (секрет в URL), ограничить
|
||||
размер тела 64 KiB, POST и частоту запросов; таймаут 5 секунд.
|
||||
Регистрация/проверка: https://platform.vk.com/ и
|
||||
https://skill-tester.marusia.mail.ru/ (актуальность интерфейса проверить при входе).
|
||||
До заполнения skill_id все POST закрыты (403), знание случайного пути обязательно.
|
||||
skill_id не является криптографическим доказательством отправителя; секрет URL
|
||||
и приватный доступ навыка обеспечивают первичное ограничение доступа.
|
||||
@@ -0,0 +1,30 @@
|
||||
[Unit]
|
||||
Description=Astra conversation skill for Marusia
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
User=astra
|
||||
Group=astra
|
||||
WorkingDirectory=/var/lib/astra-marusia
|
||||
EnvironmentFile=/etc/astra-marusia.env
|
||||
Environment=CODEX_HOME=/var/lib/astra-marusia
|
||||
Environment=HOME=/var/lib/astra-marusia
|
||||
ExecStart=/usr/bin/python3 /opt/astra-marusia/server.py
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
StateDirectory=astra-marusia
|
||||
StateDirectoryMode=0700
|
||||
UMask=0077
|
||||
NoNewPrivileges=yes
|
||||
ProtectSystem=strict
|
||||
ProtectHome=tmpfs
|
||||
BindReadOnlyPaths=/home/astra/.codex/auth.json:/var/lib/astra-marusia/auth.json
|
||||
PrivateTmp=yes
|
||||
ProtectKernelTunables=yes
|
||||
ProtectKernelModules=yes
|
||||
ProtectControlGroups=yes
|
||||
RestrictSUIDSGID=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,3 @@
|
||||
# Root-owned /etc/astra-marusia.env, mode 600. Never commit actual secret.
|
||||
MARUSIA_WEBHOOK_SECRET=GENERATE_RANDOM_SECRET_AT_LEAST_32_CHARACTERS
|
||||
MARUSIA_SKILL_ID=
|
||||
@@ -0,0 +1,12 @@
|
||||
# Include inside the existing HTTPS server block on fr1 AFTER creating an SSH tunnel.
|
||||
# Reverse tunnel must bind only to fr1 127.0.0.1:18788 -> rpi 127.0.0.1:8788.
|
||||
# No public port 8788/18788; VK uses the existing HTTPS listener.
|
||||
location ^~ /marusia/webhook/ {
|
||||
access_log off;
|
||||
client_max_body_size 64k;
|
||||
limit_except POST { deny all; }
|
||||
proxy_connect_timeout 1s;
|
||||
proxy_read_timeout 5s;
|
||||
proxy_pass http://127.0.0.1:18788/webhook/;
|
||||
}
|
||||
# Add a limit_req zone in nginx http{} and apply its limit here before exposure.
|
||||
Reference in New Issue
Block a user