Своими силами
tmux, mosh и Tailscale: самодельный стек для агентов для кода на телефоне
Классический способ запускать Claude Code или Codex с телефона — терминальное приложение, частная сеть, подключение, которое переживает роуминг, и сессия, которая переживает всё остальное. Каждая часть бесплатна и хорошо изучена. Вот настройка с точными командами — и честный взгляд на то, где становится больно.
Короткий ответ
Установите Tailscale на сервер и телефон, затем включите tailscale set --ssh, чтобы сервер был доступен только через вашу частную tailnet. Запускайте агента внутри tmux new -A -s main, чтобы он пережил ваше подключение. Для Claude Code добавьте set -g allow-passthrough on и строки extended-keys в ~/.tmux.conf. Подключайтесь через mosh (mosh dev@server -- tmux new -A -s main) из Blink, Termius или Termux. Это хорошо работает. Слабые места — полноэкранный TUI на маленьком экране и отсутствие push-уведомлений, если не добавить хуки.
Если вы искали, как пользоваться Claude Code с телефона, то наверняка видели этот стек в десятке статей. Потому что он работает. Tailscale даёт телефону частный зашифрованный путь к серверу без открытых портов. mosh сохраняет подключение, когда вы переходите с Wi-Fi на 4G или блокируете телефон. tmux не даёт агенту остановиться, когда подключение всё-таки обрывается. Вот как правильно собрать все три вместе.
Стек
| Уровень | Инструмент | Что решает | Можно пропустить, если… |
|---|---|---|---|
| Сеть | Tailscale (Tailscale SSH) | Частный доступ к серверу даже за NAT; нет публичного SSH-порта; доступ через SSO | На сервере уже настроен защищённый публичный SSH, и вас это устраивает |
| Транспорт | mosh | Переживает роуминг, сон и плохую связь; локальное эхо скрывает задержку | Вы подключаетесь только из стабильной сети |
| Сессия | tmux | Агент продолжает работать, когда вы отключаетесь; несколько окон на проект | Никогда. Это самый важный уровень. |
| Клиент | Blink, Termius, Termux… | Терминал на телефоне | — |
Настройка tmux
Установите его и запустите именованную сессию, к которой можно подключиться откуда угодно:
sudo apt install tmux # Debian/Ubuntu (dnf / apk elsewhere)
tmux new -A -s main # attach to "main", or create it
cd ~/src/my-app && claude # or: codex, agy, opencode…
# detach with Ctrl-b then d — the agent keeps running
Благодаря -A одна и та же команда работает и в первый раз, и во все последующие, так что её удобно сохранить сниппетом в терминальном приложении на телефоне. Затем дайте tmux настройки, которые нужны агентам. Документация Anthropic по настройке терминала говорит, что внутри tmux Shift+Enter отправляет сообщение, а не добавляет перенос строки, и уведомления никогда не доходят до внешнего терминала, если не добавить эти строки:
# ~/.tmux.conf
set -g allow-passthrough on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
# quality of life on a phone
set -g mouse on # scroll and pick panes with your finger
set -g history-limit 50000 # agents print a lot
Примените их командой tmux source-file ~/.tmux.conf. Даже с extended keys многие клавиатуры телефонов вообще не умеют отправлять Shift+Enter. Claude Code также принимает Ctrl+J или \ с последующим Enter для переноса строки, и оба работают в любом терминале.
Используйте одно окно tmux на проект или на агента. Ctrl-b c открывает новое окно, Ctrl-b n переходит к следующему. Для нескольких сессий в одном репозитории дайте каждой свой git worktree. Об этом и о том, что происходит при перезагрузке, рассказывает руководство по работе 24/7. Сессии tmux перезагрузку не переживают.
mosh или ssh
Обычный SSH работает поверх одного TCP-соединения. Когда телефон меняет сеть или iOS на время приостанавливает приложение, это соединение умирает, и вы переподключаетесь и заново цепляетесь к сессии. mosh входит по SSH, запускает mosh-server на сервере, а затем переключается на собственный протокол поверх UDP, который продолжает работать при смене IP и сне. Он также локально отображает то, что вы печатаете, так что даже канал с задержкой 200 мс ощущается отзывчивым.
# on the server
sudo apt install mosh # Fedora: sudo dnf install mosh · Alpine: apk add mosh
# from a client
mosh dev@my-server -- tmux new -A -s main
mosh использует UDP-порты 60000–61000. На публичном IP их пришлось бы открыть в файрволе, например через sudo ufw allow 60000:61000/udp плюс файрвол вашего облачного провайдера. Через Tailscale трафик остаётся внутри tailnet, так что публичный порт не нужен. Одно ограничение: mosh синхронизирует только видимый экран, поэтому прокрутки истории через сам mosh нет. Документация mosh для истории рекомендует tmux или screen — ещё одна причина запускать оба.
Tailscale SSH
Tailscale помещает ваш сервер и телефон в частную сеть WireGuard (tailnet). Tailscale SSH идёт на шаг дальше: аутентификацию SSH берёт на себя Tailscale по вашей идентичности в tailnet, так что SSH-ключи вообще не нужно раздавать.
# on the server (Linux)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up # log in to your tailnet
sudo tailscale set --ssh # enable Tailscale SSH
Согласно документации Tailscale, tailscale set --ssh заставляет tailscaled перехватывать порт 22 для трафика из вашей tailnet. Любой обычный SSH-клиент затем подключается через ssh dev@my-server, используя имя машины в MagicDNS. Некоторые детали:
- Режим check. Политика по умолчанию использует
"action": "check", так что время от времени вас попросят заново пройти аутентификацию в браузере. Появление ссылки для входа в терминале — нормально. - Серверные платформы. Linux поддерживается полностью. На macOS сервером Tailscale SSH может быть только открытая сборка CLI
tailscale+tailscaled, так что Mac mini с приложением из App Store должен использовать обычный SSH через tailnet. - Закройте публичный порт. Убедившись, что до машины можно добраться через tailnet, закройте публичный порт 22 в файрволе провайдера. Делайте это именно в таком порядке и с открытой второй сессией, чтобы не запереть себя снаружи.
На телефоне установите приложение Tailscale, войдите в ту же tailnet и оставьте его подключённым. Тогда ваше терминальное приложение будет добираться до my-server так, будто он в вашей локальной сети.
Клиенты для iOS и Android
| Клиент | Платформы | mosh | Примечания |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Да | Построен вокруг mosh; хорошая поддержка аппаратной клавиатуры на iPad. $19.99 в год после двухнедельного пробного периода, по данным blink.sh. |
| Termius | iOS, Android, компьютер | Да | Бесплатный уровень Starter включает SSH и mosh; синхронизация между устройствами — в Pro ($10 в месяц при оплате за год, по данным termius.com/pricing) |
| Termux | Android | Да (pkg install openssh mosh) | Полноценное пользовательское окружение Linux на телефоне; бесплатно и с открытым кодом |
| JuiceSSH | Android | Да | Указан на mosh.org как клиент mosh |
Какой бы клиент вы ни выбрали, настройте дополнительный ряд клавиш с Esc, Ctrl, Tab и стрелками. Claude Code использует Esc для прерывания и Shift+Tab для переключения режимов разрешений, а ни того ни другого нет на стандартной клавиатуре телефона.
Где всё ломается
Стек надёжен. Трение — во всём, что вокруг надёжности.
- Настольный TUI на 6-дюймовом экране. Claude Code, Codex и agy рассчитаны на 100+ колонок. На телефоне вы читаете перенесённые diff, прокручиваете вывод инструментов большим пальцем и ищете строку ввода.
- Нет push-уведомлений. Когда агент заканчивает или ждёт подтверждения, ничто вам об этом не сообщит, если не добавить хук. Терминал уведомляет только пока приложение на переднем плане. О хуках ntfy, которые люди прикручивают сбоку, — в нашем руководстве о подтверждении запросов с телефона.
- Подтверждения тонут в истории. Запрос разрешения — это несколько строк в загруженной панели. Вернувшись через час, вам придётся найти его, прочитать и ответить стрелками.
- Проблема фона. iOS вскоре приостанавливает терминальные приложения, после того как вы из них выходите. mosh восстанавливается, когда вы возвращаетесь, но пока приложение в фоне, следить за сессией вместо вас оно не может.
- Копирование и вставка. Выделять текст через tmux, mosh и терминал на телефоне мучительно. Длинные URL, например ссылки для входа, — худший случай.
- Несколько серверов, несколько агентов. Каждая новая машина — это ещё один узел Tailscale, ещё одна запись хоста и ещё одна раскладка tmux, которую надо помнить.
Ничто из этого не повод избегать стека. Он бесплатный, работает с любым агентом, и вы контролируете каждую часть. Это повод знать, на что вы подписываетесь. Наше сравнение SSH-терминалов и Maude подробно разбирает этот компромисс.
Или используйте приложение, созданное для этого
Maude заменяет уровни клиента и сессии для работы с агентами. Небольшой демон на сервере владеет сессиями, так что они продолжают работать без tmux, а приложение показывает их как чат — с карточками инструментов, diff, push-уведомлениями с «Разрешить/Отклонить» и входящими. Tailscale можно оставить: Maude работает с серверами в tailnet и локальной сети, потому что сервер сам подключается к ретранслятору Maude, а SSH служит запасным вариантом. А когда нужна оболочка, в каждой сессии есть настоящий терминал. Работает с Claude Code, Codex, OpenCode, Grok Build и Antigravity.
Часто задаваемые вопросы
tmux или screen для Claude Code?
allow-passthrough и extended-keys), его проще разделять и автоматизировать, и большинство руководств по терминалам на телефоне исходят из него.