From 258367d22d14e9e3c6123a96a50a65e728db7575 Mon Sep 17 00:00:00 2001 From: "Astra (rpi)" Date: Sun, 11 Oct 2026 18:23:33 +0300 Subject: [PATCH] =?UTF-8?q?rpi:=20=D1=83=D1=81=D0=B8=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B7=D0=B3=D0=BE=D0=B2=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=20=D0=9C=D0=B0=D1=80=D1=83=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/rpi.md | 1 + stacks/astra-marusia/README.md | 6 ++++-- stacks/astra-marusia/astra-marusia.service | 3 +++ stacks/astra-marusia/env.example | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/servers/rpi.md b/servers/rpi.md index e733574..16398f1 100644 --- a/servers/rpi.md +++ b/servers/rpi.md @@ -154,6 +154,7 @@ Docker CE 29.9 + Compose v5.6 из репо download.docker.com (в Debian ст - Индикатор работы добавлен 2026-10-11: [astra-bot `20a8ffc`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/20a8ffc). Раньше typing отправлялся один раз и пропадал через несколько секунд; теперь при распознавании голосовых и выполнении задачи отдельное тихое сообщение с машинкой 🚗 редактируется каждые 4 с, typing обновляется. Один индикатор на чат, перекрывающиеся задачи учитываются; после окончания сообщение удаляется. Проверки: 46 тестов, включая перекрытие задач, редактирование/удаление и неудачную отправку. Резервная копия `/opt/astra-bot/bot.py.bak-20261011-waiting-car`; установка выполнена, перезапуск через `restart-check.py` после ответа. ## Разговорный навык Маруси (подготовлен 2026-10-11) +- Ограничения Маруси усилены 2026-10-11 по решению владельца: только обычная беседа, действия подключать отдельно. [astra-bot `b39c9d5`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/b39c9d5), проверки [ `52b07b8`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/52b07b8). В `/etc/astra-marusia.env` добавлен пустой `MARUSIA_ALLOWED_USER_IDS`: до явного добавления проверенных идентификаторов Маруси все запросы запрещены; Telegram ID не подходит, первого неизвестного пользователя автоматически не принимать. Секрет URL и skill_id сохранены, но не доказывают происхождение от VK. Schema/Content-Type проверяются, тело до 16 KiB (было 64), вопрос до 1000 символов, TTS-разметка экранируется. Один запрос к модели одновременно (было два), 10 вопросов/мин и 60/час; приём POST ограничен 30/мин. ⚠️ Бюджеты в памяти и сбрасываются после рестарта. systemd: MemoryMax=512M, CPUQuota=100%, TasksMax=64; служба active и `/health`=200 после установки. 57 тестов прошли, в том числе отказ чужому/пустому списку до модели. Предыдущий сервер `/opt/astra-marusia/server.py.bak-before-limits`. Агент fr1 параллельно подготовил публичный vhost astra.ruzzy.dev и ограниченного пользователя туннеля (infra e2bd908); его изменения сохранены при rebase. Локальные ограничения действуют; дополнительное ужесточение nginx на fr1 до 16 KiB и 30 запросов/мин ещё не выполнено. - Установлен и включён `astra-marusia.service`, код — [astra-bot `27e39ea`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/27e39ea), `/opt/astra-marusia/server.py`; юнит и инструкция — `stacks/astra-marusia/`. Это отдельная беседа без инструментов управления сервером; семейные ответы для 10 лет. История до 16 реплик на user_id в памяти, очищается после перезапуска/суток простоя; тексты не пишутся в access log. - Слушает только `127.0.0.1:8788`, `/health` проверен. Секрет пути webhook — `/etc/astra-marusia.env` (root 600), `MARUSIA_SKILL_ID` пока пуст: POST закрыты до регистрации навыка. Публичного HTTPS URL, туннеля и привязки колонки ещё нет. ⚠️ Это готовая локальная часть, не подключённая колонка. - Используется существующая авторизация Codex/ChatGPT через read-only bind `~astra/.codex/auth.json` в отдельный CODEX_HOME `/var/lib/astra-marusia`; пользовательские config/rules, shell/apps/browser и проектные инструкции отключены. systemd `ProtectHome=tmpfs`, `ProtectSystem=strict`, `NoNewPrivileges=yes`; рабочий StateDirectory 700. ⚠️ Read-only привязка auth может потребовать повторной проверки после обновления/refresh авторизации; не выдавать колонке административный тред Telegram. diff --git a/stacks/astra-marusia/README.md b/stacks/astra-marusia/README.md index d47b84c..4f714dd 100644 --- a/stacks/astra-marusia/README.md +++ b/stacks/astra-marusia/README.md @@ -1,7 +1,7 @@ # Разговор с Астрой через Марусю Код: `ruzzy/astra-bot`, `marusia/server.py`, тесты `test_marusia.py`. -Сервис на rpi слушает только `127.0.0.1:8788`; наружу пока не опубликован. +Сервис на rpi слушает только `127.0.0.1:8788`; доступ через fr1 подготовлен; SSH-туннель на rpi ещё нужно запустить. Webhook: `POST /webhook/<секрет из /etc/astra-marusia.env>`. Проверка: `GET /health`. @@ -20,7 +20,7 @@ StateDirectory. Не подключать этот сервис к админи Быстрый ответ ожидается до 2 секунд. Если ответ ещё готовится, колонка просит сказать «готово?»; новая реплика во время ожидания не запускает вторую задачу. Повтор webhook с теми же session_id/message_id получает кешированный ответ. -Не более двух обращений к модели одновременно, не более 50 разговоров. +Одно обращение к модели одновременно, не более 50 разговоров. Глобальный бюджет модели: 10 новых вопросов/мин и 60/час; webhook: 30 POST/мин, в том числе отклонённые. Счётчики в памяти, при рестарте сбрасываются. ## Публичный вход на fr1 (с 2026-10-11) @@ -57,3 +57,5 @@ https://skill-tester.marusia.mail.ru/ (актуальность интерфей До заполнения skill_id все POST закрыты (403), знание случайного пути обязательно. skill_id не является криптографическим доказательством отправителя; секрет URL и приватный доступ навыка обеспечивают первичное ограничение доступа. + +С 2026-10-11 обязателен `MARUSIA_ALLOWED_USER_IDS`: список точных идентификаторов пользователя Маруси из проверенного запроса отладчика VK. Пустой список закрывает доступ всем; автоматически первого пришедшего пользователя не добавлять. Это не Telegram ID. Schema: version 1.0, SimpleUtterance, ограниченные session_id/message_id, вопрос до 1000 символов, Content-Type application/json, без chunked transfer. TTS экранирует разметку. Только разговор, любые действия подключаются отдельно по решению владельца. systemd: MemoryMax 512M, CPUQuota 100%, TasksMax 64. На fr1 агент уже установил nginx 1 r/s с burst 5; дополнительное ужесточение до 30 r/m и тела 16 KiB рекомендовано, но ещё не установлено на fr1. Локальный сервис уже применяет 30 POST/мин и 16 KiB. diff --git a/stacks/astra-marusia/astra-marusia.service b/stacks/astra-marusia/astra-marusia.service index 56ad704..346c6e1 100644 --- a/stacks/astra-marusia/astra-marusia.service +++ b/stacks/astra-marusia/astra-marusia.service @@ -25,6 +25,9 @@ ProtectKernelTunables=yes ProtectKernelModules=yes ProtectControlGroups=yes RestrictSUIDSGID=yes +MemoryMax=512M +CPUQuota=100% +TasksMax=64 [Install] WantedBy=multi-user.target diff --git a/stacks/astra-marusia/env.example b/stacks/astra-marusia/env.example index 33a2772..5cfa103 100644 --- a/stacks/astra-marusia/env.example +++ b/stacks/astra-marusia/env.example @@ -1,3 +1,5 @@ # 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= +# Marusia user IDs from trusted debugger requests; these are NOT Telegram IDs. +MARUSIA_ALLOWED_USER_IDS=