Своими силами

tmux, mosh и Tailscale: самодельный стек для агентов для кода на телефоне

Классический способ запускать Claude Code или Codex с телефона — терминальное приложение, частная сеть, подключение, которое переживает роуминг, и сессия, которая переживает всё остальное. Каждая часть бесплатна и хорошо изучена. Вот настройка с точными командами — и честный взгляд на то, где становится больно.

tmux, mosh и Tailscale: самодельный стек для агентов для кода на телефоне

Короткий ответ

Установите 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 ShelliPhone, iPadДаПостроен вокруг mosh; хорошая поддержка аппаратной клавиатуры на iPad. $19.99 в год после двухнедельного пробного периода, по данным blink.sh.
TermiusiOS, Android, компьютерДаБесплатный уровень Starter включает SSH и mosh; синхронизация между устройствами — в Pro ($10 в месяц при оплате за год, по данным termius.com/pricing)
TermuxAndroidДа (pkg install openssh mosh)Полноценное пользовательское окружение Linux на телефоне; бесплатно и с открытым кодом
JuiceSSHAndroidДаУказан на 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?
Сессию сохраняют оба, но tmux — лучший выбор: Anthropic документирует настройки tmux, нужные Claude Code (allow-passthrough и extended-keys), его проще разделять и автоматизировать, и большинство руководств по терминалам на телефоне исходят из него.
Нужен ли mosh, если есть Tailscale?
Они решают разные задачи. Tailscale даёт стабильный частный адрес и отсутствие открытых портов; SSH-подключение поверх него всё равно рвётся, когда телефон меняет сеть или надолго засыпает. mosh это переживает. Если вы в основном подключаетесь из стабильного Wi-Fi, хватит SSH через Tailscale плюс tmux.
Какой терминал для iOS лучше всего подходит для Claude Code?
Blink Shell — самый ориентированный на mosh вариант для iPhone и iPad, а с Termius проще всего начать (бесплатный уровень, кроссплатформенность). Оба работают с Tailscale. Что бы вы ни выбрали, настройте дополнительный ряд клавиш для Esc, Ctrl и Shift+Tab.
Нужно ли открывать порты для mosh?
На публичном IP — да: UDP 60000–61000. Через tailnet Tailscale — нет: трафик идёт внутри tailnet, и ничего не нужно открывать в интернет.
Работает ли Tailscale SSH на сервере Mac mini?
Согласно документации Tailscale, только с открытой сборкой CLI tailscale/tailscaled на macOS. Со стандартным приложением используйте вместо этого обычный SSH-сервер Mac через tailnet.

Обойдитесь без TUI на телефоне

Оставьте свой сервер и tailnet, а терминал замените приложением, созданным для агентов. iOS и Android.

Download Maude on the App Store Get Maude on Google Play