Как Мила сделала: разборы и новости
Ставите Милу себе или клиенту? Один скрипт готовит чистый сервер Ubuntu или Debian: отдельный пользователь со входом без пароля, токен и журнал с правами 600, служба приёма сообщений. Чего он не делает — не входит в Claude, не пишет токен бота, не открывает порт, — написано в его первых строках. У каждой строки ниже — ссылка на код.
Тому, кто ставит Милу себе или клиенту и хочет понимать, что где лежит.
deploy/bootstrap.sh запускается от root на чистом сервере и оставляет отдельного пользователя, среды, набор Милы, службу приёма и закрытые файлы. Установку репозиторий оценивает в день: к вечеру сообщения приходят и не теряются при перезапуске. REFERENCE.md:495-499
Учётная запись без прав root. Вход по паролю выключен: зайти можно только по ключу или от root. Ключ передаётся флагом --ssh-key.
Службы пользователя работают и после того, как SSH-сессия закрыта. Приёмник сообщений — служба systemd с Restart=always.
Bun, Node и Claude Code для этого пользователя, затем набор и его установщик: умения, команда запуска, хуки.
bootstrap.sh:104-133 bootstrap.sh:135-160 deploy/README.md:45~/.claude/channels/telegram/ и подпапки: зайти в них может только этот пользователь.
Скрипт ставит права 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
Рекурсивное удаление, снос базы или таблицы, mkfs, запись на диск через dd, chmod -R 777 /. Никого не будят: решено заранее.
git status, ls, cat, grep и похожие; чтение, поиск и правка файлов. Идёт без карточки и пишется в журнал.
Свои скрипты, остальная оболочка и запись в собственную обвязку: хуки, настройки, access.json, .env. Карточка ждёт 15 минут; нет ответа — отказ.
Битый файл политики переводит всё в «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 backup run есть, но расписание и место для архива решают под каждого клиента. На том же диске бэкап защищает от ошибок, а не от потери машины. deploy/README.md:112-115--kit с готовой копией или MILA_CORE_REPO с адресом репозитория; иначе — заметка, и установщик не запускается. bootstrap.sh:137-160| Файл | Что делает |
|---|---|
| deploy/bootstrap.sh | скрипт сервера: пользователь, среды, набор, папки, служба, права |
| deploy/README.md | путь целиком: сухой прогон, три шага руками, передача клиенту (на английском) |
| install/install.sh | установщик набора: умения, хуки, политика инструментов |
| permissions.example.json | пример политики: ask по умолчанию, deny и allow поимённо |
| permission_policy.ts | как читается политика: три исхода, битый файл, лимит карточек |
| install/doctor.py | mila doctor: проверка канала и лишних битов прав |
| docs/REFERENCE.md | установка — день; что остаётся после (на английском) |
Набор открыт: умения, хуки, инструменты и шаблоны. Запустите bootstrap.sh --dry-run на своём сервере: он ничего не меняет и покажет каждый шаг.
Факты на странице: github.com/shakhruz/mila (main, 8a6b97d, v1.5.2), проверено 25.10.2026. Строки в телефоне — часть вывода самого скрипта при сухом прогоне. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.