MILAGPT
Начните с «Для бизнеса»: три шага до запуска.
Записаться на разборОткроется Telegram
RU·EN
Документация · Свой сервер

Свой сервер: изоляция и установка за день

Ставите Милу себе или клиенту? Один скрипт готовит чистый сервер Ubuntu или Debian: отдельный пользователь со входом без пароля, токен и журнал с правами 600, служба приёма сообщений. Чего он не делает — не входит в Claude, не пишет токен бота, не открывает порт, — написано в его первых строках. У каждой строки ниже — ссылка на код.

Тому, кто ставит Милу себе или клиенту и хочет понимать, что где лежит.

Что делает скрипт

Один прогон — сервер готов к Миле

deploy/bootstrap.sh запускается от root на чистом сервере и оставляет отдельного пользователя, среды, набор Милы, службу приёма и закрытые файлы. Установку репозиторий оценивает в день: к вечеру сообщения приходят и не теряются при перезапуске. REFERENCE.md:495-499

01 · ПОЛЬЗОВАТЕЛЬ

Отдельный, без пароля

Учётная запись без прав root. Вход по паролю выключен: зайти можно только по ключу или от root. Ключ передаётся флагом --ssh-key.

bootstrap.sh:17-19 bootstrap.sh:73-83 bootstrap.sh:85-93
02 · СЛУЖБА

Живёт после выхода

Службы пользователя работают и после того, как SSH-сессия закрыта. Приёмник сообщений — служба systemd с Restart=always.

bootstrap.sh:95-102 bootstrap.sh:195-204 deploy/README.md:47-48
03 · НАБОР

Среды и набор Милы

Bun, Node и Claude Code для этого пользователя, затем набор и его установщик: умения, команда запуска, хуки.

bootstrap.sh:104-133 bootstrap.sh:135-160 deploy/README.md:45
04 · ПАПКИ

Папки сообщений — 0700

~/.claude/channels/telegram/ и подпапки: зайти в них может только этот пользователь.

bootstrap.sh:162-167
Изоляция

Токен и журнал — только для её пользователя

Скрипт ставит права 600 токену бота, журналу входящих и списку доступа: читать и писать их может только владелец файла. bootstrap.sh:217-224 deploy/README.md:49

mila doctor проверяет это и потом. Права он не сравнивает числом: 0444 меньше 0600, но читать токен разрешает всем. Он ищет биты, которых быть не должно, и пишет, какой chmod выполнить. doctor.py:248-271

Политику инструментов установщик кладёт в ту же папку, тоже с правами 600. install/install.sh:239-251

Закрыто для других пользователей
Сухой прогон

Каждый шаг видно до того, как он сделан

С флагом --dry-run скрипт ничего не меняет и печатает каждый шаг, который сделал бы. README советует начать с него и прочитать вывод вслух. deploy/README.md:29-35 bootstrap.sh:40-43

Повторный запуск безопасен: что уже сделано, скрипт пропускает и говорит об этом. deploy/README.md:51 bootstrap.sh:4-6

Сначала он проверяет систему: запуск от root, Ubuntu или Debian. Иначе останавливается и пишет причину. bootstrap.sh:45-52

$ scp deploy/bootstrap.sh root@server:/tmp/
$ ssh root@server \
    'bash /tmp/bootstrap.sh --user mila --dry-run'
# прочитали — настоящий прогон:
$ ssh root@server \
    'bash /tmp/bootstrap.sh --user mila'
Политика инструментов

rm -rf и DROP TABLE отклоняются без карточки

Политика решает, какие команды Милы идут сами, какие отклоняются, а какие ждут человека. Правила читаются сверху вниз, побеждает первое совпавшее; всё, чего нет в списке, — «ask», спросить. permissions.example.json:2-4 permission_policy.ts:8-15

01 · DENY

Отказ сразу

Рекурсивное удаление, снос базы или таблицы, mkfs, запись на диск через dd, chmod -R 777 /. Никого не будят: решено заранее.

permissions.example.json:9-26 permission_policy.ts:12-13
02 · ALLOW

Смотреть и считать

git status, ls, cat, grep и похожие; чтение, поиск и правка файлов. Идёт без карточки и пишется в журнал.

permissions.example.json:27-32 permissions.example.json:44-68 permission_policy.ts:11
03 · ASK

Карточка со сроком

Свои скрипты, остальная оболочка и запись в собственную обвязку: хуки, настройки, access.json, .env. Карточка ждёт 15 минут; нет ответа — отказ.

permissions.example.json:33-43 permissions.example.json:69-74 permissions.example.json:5 permission_policy.ts:14-15 permission_policy.ts:50
04 · СБОЙ

Битый файл закрывает, а не открывает

Битый файл политики переводит всё в «ask», а не в «allow». Больше 25 карточек за минуту — остальные отклоняются сами, чтобы петля не завалила вас.

permissions.example.json:2 permission_policy.ts:19-25 permissions.example.json:6-7
Три шага руками

Аккаунт и подписка остаются вашими

Скрипт не входит в Claude Code ни за кого, не пишет токен бота и не открывает портов наружу. Так задумано: аккаунт и подписка — свои у клиента, и руки на клавиатуре — его. Одна подписка на нескольких людей нарушает условия провайдера и ставит под удар оба аккаунта. bootstrap.sh:11-15 deploy/README.md:11-23

В конце скрипт печатает три шага. mila doctor — приёмочный тест: сервер, который его не прошёл, клиенту не отдают. bootstrap.sh:226-247 deploy/README.md:77-79

Потом — сопряжение с телефона и policy allowlist: до этого код сопряжения получит любой, кто угадал имя бота. deploy/README.md:81-89

1 su - mila; claude
  # вход своим аккаунтом клиента
2 /plugin install mila-telegram@mila
  /mila-telegram:configure <токен>
3 systemctl --user enable --now \
    mila-telegram-receiver
  mila doctor
Честно

Что скрипт не делает за вас

В репозитории

Каждую строку можно прочитать самому

Файлы установки на сервер в репозитории mila
ФайлЧто делает
deploy/bootstrap.shскрипт сервера: пользователь, среды, набор, папки, служба, права
deploy/README.mdпуть целиком: сухой прогон, три шага руками, передача клиенту (на английском)
install/install.shустановщик набора: умения, хуки, политика инструментов
permissions.example.jsonпример политики: ask по умолчанию, deny и allow поимённо
permission_policy.tsкак читается политика: три исхода, битый файл, лимит карточек
install/doctor.pymila doctor: проверка канала и лишних битов прав
docs/REFERENCE.mdустановка — день; что остаётся после (на английском)
Открытый код · Apache-2.0

Форкните, научите, пришлите PR

Набор открыт: умения, хуки, инструменты и шаблоны. Запустите bootstrap.sh --dry-run на своём сервере: он ничего не меняет и покажет каждый шаг.

Факты на странице: github.com/shakhruz/mila (main, 8a6b97d, v1.5.2), проверено 25.10.2026. Строки в телефоне — часть вывода самого скрипта при сухом прогоне. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.