Як користуватися Claude Code із телефона через VPS
Claude Code працює в tmux на VPS, а телефон лише підключається через SSH. Налаштуйте ключі SSH, mosh для нестабільної мережі, tmux attach і клавіатуру.
Claude Code із телефона: як це працює насправді
Claude Code із телефона — не мобільний застосунок. Claude Code працює на VPS (віртуальному приватному сервері) у відкритій сесії tmux, а телефон підтримує SSH (захищене shell-з’єднання) із цією сесією, поки ви переглядаєте її. Якщо закрити застосунок, агент продовжить працювати, оскільки процес запущений не на телефоні.
На цьому поділі побудована вся схема. Мобільна операційна система призупиняє застосунок через кілька секунд після перемикання на інший застосунок, тому будь-яке тривале завдання, запущене на телефоні, зупиняється. Крім того, під час переходу з Wi-Fi на мобільні дані телефон щоразу отримує нову мережеву адресу. Якщо процес працює на сервері, а телефон лише відображає екран, обидві проблеми зникають.
На сервері потрібні чотири компоненти: tmux для збереження сесії, ключі SSH для підключення, mosh для роботи зі змінами мережі та сам Claude Code. На телефоні потрібен один термінальний застосунок із доступним рядом клавіш.
Що потрібно на VPS
Для частин про SSH і tmux достатньо невеликого сервера Ubuntu 24.04. Claude Code потребує більше ресурсів. Станом на July 2026 офіційні вимоги — Ubuntu 20.04 або новіша версія на процесорі x64 або ARM64 і щонайменше 4 GB RAM. На тарифі з 1 GB RAM програма встановлюється, але під навантаженням kernel завершує її процес. Claude Code також потребує платного облікового запису Claude (Pro, Max, Team або Enterprise) або облікового запису Console з доступом до API, оскільки безкоштовний тариф Claude.ai цього не передбачає.
Налаштуйте сервер для звичайного користувача із sudo, а не для root. Якщо сервер новий, спочатку виконайте перші десять хвилин на новому VPS, оскільки зміни SSH далі в цьому посібнику простіше виконувати після створення користувача та налаштування firewall.
sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --versionІнсталятор розміщує binary у ~/.local/bin/claude, а claude --version виводить рядок на кшталт 2.1.211 (Claude Code). Якщо виведено command not found, цей каталог ще не входить до вашого PATH: вийдіть із системи, увійдіть знову, а потім перевірте за допомогою command -v claude. claude doctor виводить діагностику встановлення та налаштувань, не запускаючи сесію.
Увійдіть на сервер один раз зараз із ноутбука, перш ніж покладатися на телефон. Виконайте claude у каталозі проєкту та дотримуйтеся підказок входу. Під час цього процесу потрібно відкрити URL у браузері та перенести код назад у terminal, а перемикатися між двома застосунками на екрані телефона незручно. Виконайте це один раз на звичайній клавіатурі, після чого облікові дані залишаться на сервері.
Запускайте Claude Code у tmux, щоб розрив з’єднання не зупинив процес
tmux new -s claude
cd ~/projects/api
claudeВід’єднайтеся за допомогою Ctrl-b, а потім d. tmux виведе [detached (from session claude)] і поверне вас до оболонки. Тепер можна закрити застосунок, втратити сигнал або покласти телефон у кишеню. Панель продовжить працювати.
tmux ls
tmux attach -t claudetmux ls виводить по одному рядку для кожного сеансу, наприклад claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude повертає вас саме туди, де ви зупинилися, зокрема до незавершеного редагування.
Це працює, тому що tmux запускає власний серверний процес, а ваша оболонка та Claude Code є дочірніми процесами цього сервера, а не sshd. Коли SSH-з’єднання завершується, ядро надсилає сигнал завершення, SIGHUP, процесам, підключеним до цього з’єднання. Сервер tmux не належить до них. Без tmux те саме блокування екрана, яке розриває з’єднання, зупиняє Claude Code посеред виклику інструмента. У матеріалі Запуск Claude Code на VPS у tmux докладніше описано структуру сеансу.
Запускайте tmux на сервері, а не на телефоні. Якщо ввести tmux у сеансі, до якого ви вже підключені, tmux виведе sessions should be nested with care, unset $TMUX to force. Примусове виконання цієї команди створить два конфліктні префіксні клавіші.
Автоматичне підключення під час кожного входу
Вводити команду підключення на сенсорній клавіатурі швидко набридає. Додайте це в кінець ~/.profile на сервері:
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
finew-session -A -s claude підключається до сесії з назвою claude, якщо вона існує, і створює її, якщо її немає. Одна команда охоплює обидва випадки. exec замінює оболонку входу на tmux, тому вихід із tmux закриває з’єднання, а не повертає вас до звичайного запрошення. Якщо потрібна звичайна оболонка, пропустіть цей файл: ssh you@server -t "bash --noprofile".
Додайте це в ~/.profile, а не в ~/.bashrc. ~/.bashrc також виконується для неінтерактивних сесій, тому передавання файлів перестає працювати: scp і sftp сприймають неочікуваний вивід як дані протоколу та завершуються з помилкою Received message too long. ~/.profile виконується лише для оболонок входу, що відповідає інтерактивній SSH-сесії.
~/.profile — це також місце, де Ubuntu додає ~/.local/bin до PATH. Якщо claude працює одразу після входу, але оболонка всередині tmux повідомляє command not found, причина саме в такому порядку. У такому разі запускайте tmux з оболонки входу, як описано вище, а не зі скрипту, який пропускає профіль.
iOS: Termius або Blink Shell
Обидва застосунки підтримують SSH і mosh та зберігають ключі всередині застосунку. Відмінність полягає в інтерфейсі.
Blink Shell керується командами. У його запрошенні можна вводити ssh you@server або mosh you@server — той самий синтаксис, що й у терміналі на настільній системі. Налаштування відкриваються командою config, а в розділі Keys можна створити пару ключів.
Termius працює через форми. Спочатку потрібно заповнити запис хоста, а потім у його параметрах змінити протокол з SSH на Mosh. Termius містить власну реалізацію mosh і підтримує mosh 1.3.0 та новіші версії, тому на сервері все одно має бути встановлено пакет mosh.
В обох випадках створюйте ключ у самому застосунку й ніколи не копіюйте на телефон наявний приватний ключ. Застосунок показує відкриту частину ключа. Це один рядок, який потрібно додати до ~/.ssh/authorized_keys на сервері. У розділі SSH-ключі для кожного пристрою та їх відкликання описано правила іменування та процедуру відкликання. Для телефона це важливіше, ніж для ноутбука.
Увімкніть власне блокування термінального застосунку за допомогою біометрії або коду доступу. Без цього розблокований телефон залишає відкриту shell-сесію на сервері, доки екран залишається активним.
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubTermux надає OpenSSH і mosh у власному репозиторії пакетів, тому ssh, ssh-keygen і mosh працюють так само, як на настільній системі. Додайте надрукований рядок відкритого ключа до ~/.ssh/authorized_keys на сервері, а потім підключіться за допомогою mosh you@server.
Екранна клавіатура Android не має клавіш Esc і Ctrl, а Claude Code потребує обох. Termux може додати власний рядок клавіш. Додайте один рядок у ~/.termux/termux.properties:
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]Потім виконайте termux-reload-settings, і над клавіатурою з’явиться цей рядок. Після такого самого перезавантаження Termux також підхопить моноширинний шрифт TrueType, скопійований у ~/.termux/font.ttf.
Android може зупинити Termux, коли той працює у фоновому режимі, але в цьому випадку ви лише повторно підключитеся. Сесія та агент працюють на сервері.
Чому термінал зависає, коли я виходжу із зони дії Wi-Fi, і що виправляє mosh?
SSH-з’єднання є TCP-з’єднанням (протоколом керування передаванням), а TCP-з’єднання визначається обома адресами та обома портами. Коли ви виходите із зони дії Wi-Fi, телефон отримує нову адресу від мобільної мережі, тому старе з’єднання більше не відповідає жодному з кінцевих вузлів. Ніщо не повідомляє про це одразу. Термінал просто перестає відповідати, доки TCP не припинить спроби, після чого ssh виводить client_loop: send disconnect: Broken pipe. Щоб одразу завершити завислий сеанс, натисніть Enter, потім ~, потім ..
mosh (mobile shell) усуває цю проблему. Він один раз використовує SSH, щоб увійти в систему та запустити процес mosh-server, отримує порт UDP (протоколу дейтаграм користувача), який вибрав сервер, і закриває SSH-з’єднання. Після цього обидві сторони обмінюються дейтаграмами UDP, автентифікованими спільним ключем сеансу, тому сеанс визначається цим ключем, а не вашою адресою. Нова адреса просто продовжує роботу сеансу. mosh також локально відображає введені символи та перемальовує екран, коли сервер надсилає інший стан. Саме тому він залишається придатним для роботи через повільне мобільне з’єднання.
mosh використовує порт UDP у діапазоні від 60000 до 61000, тому відкрийте цей діапазон:
sudo ufw allow 60000:61000/udp
sudo ufw statusВідкриття портів за допомогою ufw містить решту відомостей про налаштування брандмауера. Якщо ваш провайдер надає окремий мережевий брандмауер у панелі керування, додайте там той самий діапазон, оскільки правило ufw не може впливати на фільтр, розташований перед сервером.
Поширені дві проблеми з mosh. Якщо вхід виконується успішно, а потім сеанс зависає з повідомленням Nothing received from server on UDP port 60001., це означає, що діапазон UDP заблокований десь між телефоном і сервером. Якщо з’єднання повідомляє, що mosh-server не знайдено, пакет відсутній на сервері або його немає в PATH входу в систему. Установіть пакет або безпосередньо вкажіть шлях до нього за допомогою mosh --server=/usr/bin/mosh-server you@server.
mosh також відмовляється запускатися, якщо локаль системи під час входу не використовує UTF-8, і виводить повідомлення: mosh-server needs a UTF-8 native locale to run. Виправте локаль на сервері, а не на телефоні.
locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8mosh не виконує дві функції. У README зазначено, що mosh не підтримує перенаправлення X і неінтерактивні способи використання SSH, зокрема перенаправлення портів. Тому для попереднього перегляду вебзастосунку, який щойно запустив Claude Code, усе одно потрібен звичайний ssh -L 8080:127.0.0.1:8080 you@server. Крім того, mosh синхронізує лише видиму частину екрана, тому власного буфера прокручування не має. У цьому випадку це обмеження не створює проблем, оскільки буфер прокручування зберігає tmux: Ctrl-b, потім [ вмикає режим копіювання, перетягування або клавіші зі стрілками прокручують текст, а q виходить із цього режиму.
Зробіть роботу з телефона зручною
Чотири рядки в ~/.tmux.conf на сервері виконують більшу частину роботи:
set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000mouse on перетворює жест перетягування пальцем на прокручування, а дотик — на вибір панелі або вікна. Це усуває потребу в більшості префіксних клавіш, які незручно вводити. status-position top переміщує рядок стану tmux із нижнього краю екрана, де його закривають екранна клавіатура та панель підказок. default-terminal важливий, оскільки інакше tmux повідомляє Claude Code про термінал screen, через що кольори та псевдографіка відображаються гірше. Якщо після цього tmux відмовляється запускатися з missing or unsuitable terminal: tmux-256color, відсутній запис terminfo: sudo apt install ncurses-term.
Вивчіть чотири клавіші — і решта стане зручною.
Escперериває Claude під час відповіді та зберігає вже виконану роботу. Саме цю клавішу варто розмістити найближче до великого пальця.Ctrl+Cтакож перериває запущену операцію. У стані очікування перше натискання очищає введений текст, а друге завершує Claude Code. Це грубіший інструмент.- Подвійне натискання
Escочищає чернетку запиту, а в порожньому запиті натомість відкриває меню перемотування. - Для багаторядкового запиту введіть
\, а потім натисніть Enter. Ця форма працює в кожному терміналі. Shift+Enter є нативною комбінацією лише в короткому списку настільних терміналів, до якого мобільні клієнти не входять.
Не використовуйте розділені панелі. Телефон у портретній орієнтації має приблизно 40 стовпців, тому вертикальний поділ залишає по 20 стовпців на панель, і кожен diff перетворюється на важкочитний текст із перенесеннями. Натомість використовуйте вікна tmux: Ctrl-b c створює нове вікно, а Ctrl-b n переходить до наступного. Якщо у другому вікні запущено окремий сеанс Claude Code, два сеанси можуть безпосередньо передавати роботу один одному, і вам не доведеться копіювати текст між вікнами на сенсорному екрані. Поверніть телефон у горизонтальну орієнтацію, коли потрібно нормально прочитати diff.
Обсяг тексту на цьому екрані варто визначити заздалегідь, оскільки стиль виводу змінює системний prompt перед кожною відповіддю, а лаконічніший стиль означає менше екранів, які потрібно прокручувати на телефоні.
Тривалий сеанс на маленькому екрані здебільшого створює проблему з контекстом, тому перед спробою виконувати цілий робочий день у поїзді варто прочитати про керування контекстним вікном Claude Code.
Посилення захисту: лише ключі, без паролів
Тепер телефон зберігає ключ до машини, яка редагує ваш код і виконує команди. Вимкніть автентифікацію за паролем. Окремий drop-in-файл безпечніший за безпосереднє редагування sshd_config, оскільки Ubuntu у sshd_config на початку підключає /etc/ssh/sshd_config.d/*.conf, а для параметра використовується перше знайдене значення.
sudo tee /etc/ssh/sshd_config.d/99-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload sshsshd -t аналізує конфігурацію й нічого не виводить, якщо вона коректна. Якщо пропустити цю перевірку, одна помилка призведе до збою sshd під час повторного завантаження конфігурації. Не закривайте поточний сеанс і перевірте підключення з другого сеансу, перш ніж щось завершувати, оскільки неправильний ключ спричинить Permission denied (publickey)., а після вимкнення паролів резервного способу входу не буде. У такому разі відновити доступ можна через консоль вашого провайдера.
Для кожного пристрою використовуйте окремий ключ. Якщо телефон буде втрачено, достатньо видалити один рядок із ~/.ssh/authorized_keys, а ноутбук продовжить працювати. Якщо використовувати один спільний ключ, його доведеться змінювати на кожному вашому пристрої.
Якщо в Ubuntu 24.04 ви переносите SSH на інший порт, врахуйте, що прослуховування порту належить ssh.socket, тому окремий рядок Port нічого не змінює. Виконайте sudo systemctl edit ssh.socket, скиньте значення за замовчуванням за допомогою порожнього ListenStream=, а потім у наступному рядку задайте свій порт. У матеріалі Посилення захисту SSH на VPS описано це та інші аспекти захисту.
fail2ban для SSH майже не підвищує безпеку після вимкнення паролів, оскільки неправильний пароль у будь-якому разі не може бути прийнятий. Натомість він робить журнали менш зашумленими, тому справжню спробу входу легше помітити.
Надійніший варіант — не виставляти SSH у публічний інтернет. Розмістіть сервер за WireGuard VPN, який ви адмініструєте самостійно, за потреби вмикайте тунель на телефоні та дозвольте sshd прослуховувати ListenAddress лише в тунелі. mosh працює через тунель, оскільки обидві сторони використовують UDP. Є один нюанс: тунель додає накладні витрати до пакетів, тому якщо великі передавання зависають, зменште MTU (maximum transmission unit) у конфігурації WireGuard на телефоні.
Насамкінець — про такий спосіб роботи. На телефоні ви підтверджуєте запити на надання дозволів на екрані, де одночасно видно лише кілька рядків diff. Це причина зберігати обмеження, а не вимикати їх. У матеріалі Безпечний запуск Claude Code на VPS описано обмеження для користувача й каталогів, які варто налаштувати, перш ніж основним способом доступу стане сенсорний екран.
Коли ви повторно під’єднуєтеся, але щось не працює
tmux attach у виведенні no server running on /tmp/tmux-1000/default означає, що tmux server більше не працює. Майже завжди це означає, що машину перезавантажено. Перевірте це командою uptime. Оновлення ядра через автоматичні оновлення безпеки перезавантажують систему. Після перезавантаження в системі немає tmux session, тому будь-який запущений процес Claude Code слід розглядати як такий, що його можна запустити повторно.
can't find session: claude означає інше. tmux server працює, але сесії з такою назвою немає. Команда tmux ls покаже наявні сесії.
Якщо після під’єднання ви бачите звичайний shell prompt замість Claude Code, це означає, що процес завершився, а сесія залишилася активною. Перевірте dmesg -T | tail і знайдіть рядок на кшталт Out of memory: Killed process 4821 (claude). Саме так система поводиться під час великого редагування, якщо машина має менше ніж 4 GB пам’яті. Якщо такого рядка немає, Claude Code завершився самостійно. Причину можна знайти в попередніх рядках scrollback shell над prompt.
Якщо вікно після повторного під’єднання стало дуже вузьким, а навколо нього залишилося вільне місце, це означає, що два клієнти під’єднані з різними розмірами. tmux підганяє розмір вікна під найменший під’єднаний клієнт. Ноутбук усе ще утримує сесію шириною 200 колонок, а телефон запитує ширину 40. Від’єднайте інші клієнти під час під’єднання: tmux attach -d -t claude.
FAQ
Чи можна запускати Claude Code безпосередньо на телефоні, а не на VPS?
Ні. Станом на July 2026 підтримуються macOS, Windows, Ubuntu 20.04 або новіші версії, Debian 10 або новіші версії та Alpine 3.19 або новіші версії, із 4 GB або більше RAM. Android та iOS до цього списку не входять. Телефон також переводить застосунки в режим сну та постійно змінює мережеву адресу, чого тривалий запуск агента не витримує. Запускайте його на сервері, а телефон використовуйте як екран.
Чи зберігається сеанс, якщо закрити застосунок або втратити сигнал?
Так. Це забезпечують два окремі компоненти. tmux підтримує процес на сервері, тому після розриву з’єднання нічого не завершується. mosh підтримує саме з’єднання під час зміни адреси, тому перехід із wifi на мобільні дані навіть не потребує повторного підключення. За використання звичайного SSH без tmux розірване з’єднання надсилає SIGHUP, і Claude Code зупиняється посеред завдання.
Чому mosh підключається, а потім нічого не показує?
Якщо вхід успішний, а потім з’єднання зависає з повідомленням Nothing received from server on UDP port 60001., це означає, що UDP-порти від 60000 до 61000 закриті. Додайте цей діапазон в ufw, а потім додайте його також у мережевий firewall вашого провайдера. У більшості панелей це окремий механізм керування. Якщо mosh натомість повідомляє, що mosh-server не знайдено, на сервері відсутній пакет: sudo apt install mosh.
Як перервати роботу Claude Code з клавіатури без клавіші Esc?
Додайте рядок клавіш. Termux налаштовує його за допомогою extra-keys у ~/.termux/termux.properties, а Termius і Blink постачають рядок, який можна редагувати в налаштуваннях. Esc перериває поточну відповідь і зберігає вже виконану роботу. Ctrl+C також перериває виконання, але подвійне натискання під час очікування запиту завершує Claude Code, тому спочатку використовуйте Esc.
Чи достатньо безпечно відкривати SSH в інтернет?
Якщо автентифікацію за паролем вимкнено, єдиним обліковим даним, який може пройти автентифікацію, залишається ключ, що ніколи не залишає ваші пристрої. Для сервера, який можна відновити або перебудувати, це прийнятний ризик. Створіть окремий ключ для кожного пристрою, щоб у разі втрати телефона потрібно було видалити лише один рядок із authorized_keys. Якщо ви не хочете взагалі відповідати на підключення через публічний порт, розмістіть сервер за WireGuard і налаштуйте sshd на прослуховування адреси тунелю.