Настройка удалённого сервера для агентного программирования
Настройте Claude Code на удалённой машине с Tailscale, tmux, mosh и systemd, а также SSH-ключи, секреты и приватный доступ.
Минимальный стек для запуска Claude Code на удалённом сервере включает Linux VPS или постоянно работающую машину, Tailscale для создания приватной WireGuard-сети без проброса портов и динамического DNS, tmux для постоянных терминальных сессий, переживающих разрывы соединения, и mosh или SSH в качестве транспортного уровня — всё бесплатно, всё компонуемо и всё это переживёт очередную волну обёрточных инструментов. Руководство охватывает этот стек от начала до конца для типичного случая, который обходят стороной большинство существующих материалов: агент для написания кода на облачном VPS или запасной машине, защищённый и управляемый удалённо с ноутбука или телефона.
Проблема, которую стоит решить, — это персистентность. Когда вы запускаете агент локально и закрываете ноутбук, сессия умирает. Удалённый сервер держит агента живым при разрывах соединения, даёт вам полный контроль и предсказуемую стоимость в сравнении с управляемыми платформами, а также позволяет управлять работой из любого места. Загвоздка — о которой почти нигде не говорят — в том, что сервер, на котором работает агент с доступом к оболочке и API-ключами, представляет собой серьёзную поверхность атаки, поэтому данное руководство начинается с безопасности, а не прикручивает её в конце.
Ключевые выводы
- Существуют две принципиально разные задачи, которые читатели регулярно путают: запуск CLI-агента вроде Claude Code в постоянной сессии, к которой можно подключаться и отключаться (паттерн tmux), и хостинг агента как всегда доступного HTTP-сервиса (паттерн systemd) — они требуют разных настроек и разных подходов к безопасности.
- Tailscale строит WireGuard-зашифрованную сеть между вашими устройствами; удалённый сервер получает стабильный адрес
100.x.x.x, доступный с любого авторизованного устройства без открытия портов в брандмауэре или настройки динамического DNS. - Удалённый сервер с запущенным агентом для написания кода хранит доступ к оболочке, API-ключи и учётные данные репозитория — привязка порта агента к
0.0.0.0на публичном VPS, даже ненадолго для проверки работоспособности, ставит под угрозу всё перечисленное. - Никогда не помещайте API-ключи в строку
Environment=файла юнита systemd; используйтеEnvironmentFile=, чтобы они не попадали в выводsystemctl show, а для настоящей защиты секретов используйтеLoadCredential=. - Claude Code теперь поставляется с нативным Remote Control и облачными Remote Sessions, однако оба варианта рассчитаны на одну сессию и привязаны к живому процессу; самостоятельно собранный стек — это то, что нужно для постоянно работающих, headless или многопроектных сценариев.
Зачем нужен удалённый сервер, и самостоятельная сборка против альтернатив
Удалённый сервер выигрывает, когда вам нужен агент для написания кода, который переживает разрывы соединения, работает без присмотра и остаётся доступным с любого устройства — без поминутной оплаты платформе и без принятия её ограничений песочницы. Плата за это — операционная: вы сами отвечаете за безопасность, доступность и установку обновлений. Для разработчиков, уже уверенно работающих с SSH и Git, эта сделка обычно того стоит.
Прежде чем что-либо строить, определитесь, какой из трёх подходов вам подходит. Ситуация изменилась в начале 2026 года, и прежний тезис «для удалённого использования Claude Code нужны tmux и SSH» теперь неполон.
| Подход | Что это такое | Лучше всего для | Ограничения |
|---|---|---|---|
| Нативный Remote Control / Remote Sessions | Встроенные возможности удалённой работы Claude Code — управление только через исходящий HTTPS с телефона или браузера, плюс облачные сессии на стороне Anthropic | Управление одной сессией без какой-либо инфраструктуры | Одна сессия; привязана к живому процессу; работает на чужих условиях |
| Самостоятельно собранный удалённый сервер | Ваш VPS или запасная машина, запускающая агента под tmux или systemd | Постоянно работающие, headless, многопроектные задачи под вашим полным контролем | Вы сами отвечаете за безопасность и доступность |
| Управляемые агентные платформы | Хостинговые продукты для оркестрации параллельных агентов | Команды, которым нужен удобный инструментарий для слияния без операционных задач | Привязка к поставщику; регулярные расходы |
Anthropic выпустил нативный Remote Control в виде исследовательской превью-версии и облачные Remote Sessions в начале 2026 года (CLI v2.1.x по состоянию на середину 2026 года). Remote Control использует только исходящий HTTPS — без входящих портов — позволяя управлять сессией с телефона. Это действительно удобно, но рассчитано на одну сессию и умирает вместе с терминалом, из которого было запущено. Claude Code сам по себе работает как CLI-инструмент без фонового демона для интерактивных сессий; открытый запрос на функцию headless-режима демона подтверждает, что закрытие терминала завершает сессию. Для постоянно работающих, headless или многопроектных сценариев нужно строить на надёжных примитивах и добавлять удобные инструменты поверх.
Категория управляемых платформ существует и хорошо финансируется, но для разработчика, который уже живёт в SSH и Git, самостоятельно размещённый сервер даёт больше контроля при меньших затратах. Это руководство охватывает самостоятельный путь.
Два паттерна: tmux против systemd
Существуют две принципиально разные задачи, которые читатели регулярно путают, и они требуют разных настроек. Запуск CLI-агента вроде Claude Code в сессии, к которой вы подключаетесь и от которой отключаетесь, — это паттерн tmux. Хостинг агента как всегда доступного HTTP-сервиса, доступного через API, — это паттерн systemd. Выбор неправильного варианта — самая распространённая структурная ошибка в настройке удалённых агентов.
| tmux (интерактивный) | systemd (сервис) | |
|---|---|---|
| Сценарий использования | CLI-агенты, которыми вы управляете в реальном времени | HTTP-агенты, работающие без присмотра |
| Перезапуск при сбое | Ручное переподключение | Restart=always |
| Логи | Прокрутка буфера сессии | journalctl -u <service> |
| Секреты | Переменные окружения оболочки или подключаемый .env | EnvironmentFile= / LoadCredential= |
| Доступ с мобильного | mosh + tmux attach | curl / браузер через обратный прокси |
Используйте tmux, когда хотите наблюдать за агентом и управлять им — вводить промпты, подтверждать действия, читать вывод. Используйте systemd, когда агент — это сервис, принимающий запросы и работающий без присутствия человека. Большинству людей, запускающих Claude Code интерактивно, нужен tmux. Большинству людей, открывающих агента через API, нужен systemd. Некоторые сценарии используют оба подхода.
Запуск Claude Code удалённо: канонический бесплатный стек
Канонический бесплатный стек для удалённого запуска Claude Code — это Linux-сервер, Tailscale для приватного сетевого уровня, OpenSSH плюс mosh для подключения и tmux для постоянных сессий. Этот раздел содержит последовательность настройки, готовую к копированию и выполнению. Запустите меры по укреплению безопасности из следующего раздела, прежде чем считать сервер готовым к работе.
Discover how at OpenReplay.com.
Установка Tailscale
Tailscale строит WireGuard-зашифрованную сеть между вашими устройствами: после установки удалённый сервер получает стабильный адрес 100.x.x.x, доступный с любого авторизованного устройства без открытия портов в брандмауэре, настройки динамического DNS или изменения настроек роутера. Базовый протокол Tailscale — WireGuard, а бесплатный тарифный план Personal охватывает до 6 пользователей с неограниченным количеством устройств по состоянию на пересмотр тарифов в апреле 2026 года — проверьте актуальные ограничения перед тем, как полагаться на них.
Установите Tailscale на удалённый сервер согласно официальной документации по установке:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
Команда tailscale up выводит URL для аутентификации. Откройте его, войдите в систему, и сервер присоединится к вашей tailnet-сети. Выполните tailscale ip -4, чтобы получить его адрес 100.x.x.x. Установите Tailscale на ноутбук и телефон таким же образом, авторизуйте их в той же учётной записи, и все три устройства смогут напрямую обращаться друг к другу.
Одна оговорка, которая незаметно ломает настройку — мы сами с ней столкнулись: не включайте встроенный SSH-сервер Tailscale с помощью tailscale up --ssh, если планируете использовать mosh. Tailscale SSH запускает собственный SSH-сервер Tailscale, а не OpenSSH, а mosh должен запускать mosh-server через настоящий OpenSSH и разбирать его вывод для инициализации сессии — что Tailscale SSH не поддерживает. Держите OpenSSH установленным и работающим рядом с Tailscale, чтобы mosh мог подключаться.
Настройка SSH и mosh
SSH предоставляет вам оболочку; mosh делает её удобной при нестабильных мобильных соединениях, переживая смену IP-адресов и роуминг. mosh требует доступности UDP-порта в диапазоне 60000–61000, согласно документации mosh. В Tailscale-сети этот диапазон уже доступен между авторизованными устройствами, поэтому настройка роутера не требуется.
Установите mosh на сервер и на клиент:
sudo apt update && sudo apt install -y mosh tmux
Подключитесь с ноутбука, используя адрес Tailscale:
mosh youruser@100.x.x.x
Если mosh не может подключиться, попробуйте обычный ssh youruser@100.x.x.x, чтобы убедиться в доступности сервера, затем проверьте, что отвечает именно OpenSSH, а не Tailscale SSH.
Создание постоянных сессий tmux
tmux — это то, что держит агента живым после вашего отключения. Запустите сессию, запустите в ней Claude Code, отключитесь, и агент продолжит работу; переподключитесь позже с любого устройства, чтобы проверить результат или дать следующее указание.
Называйте сессии tmux по имени проекта, а не инструмента. Используйте tmux new-session -s myproject, а не tmux new-session -s claude — когда вы запускаете три агента для трёх репозиториев, вывод tmux ls должен показывать, какая сессия за что отвечает:
tmux new-session -s myproject
# внутри сессии:
cd ~/code/myproject
claude
# отключиться: Ctrl-b, затем d
Флаг -s задаёт имя сессии. Переподключитесь из любого места командой tmux attach -t myproject или выведите список всего запущенного командой tmux ls. Этот цикл отключения и переподключения — весь интерактивный цикл работы с удалённым агентом: закройте ноутбук, переподключитесь с телефона через mosh, прочитайте, что сделал агент, дайте следующее указание.
Базовый уровень безопасности
Удалённый сервер с запущенным агентом для написания кода — высокоценная цель для атак: он хранит доступ к оболочке, API-ключи и нередко учётные данные репозитория. Привязка порта агента к 0.0.0.0 на публичном VPS, даже ненадолго для проверки работоспособности, ставит под угрозу всё перечисленное. Укрепите сервер, прежде чем доверять ему что-либо важное. Этот раздел не является опциональным.
Только SSH-ключи
Отключите аутентификацию по паролю, чтобы единственным способом входа был ключ, которым вы владеете. Отредактируйте /etc/ssh/sshd_config и установите:
PasswordAuthentication no
PermitRootLogin no
Директива PasswordAuthentication no отключает вход по паролю, а PermitRootLogin no блокирует прямой SSH-доступ от имени root — оба параметра задокументированы в руководстве по sshd_config. Распространённая ошибка — редактирование не того файла; эти директивы относятся к /etc/ssh/sshd_config, а не к клиентскому конфигу. Примените изменения командой sudo systemctl restart ssh. Убедитесь, что ваш ключ работает в отдельной сессии, прежде чем закрыть текущую, — опечатка не должна заблокировать вам доступ.
Держите приватную сеть приватной
Сеть Tailscale уже аутентифицирована, но вы можете ужесточить контроль над тем, какие устройства имеют доступ к каким портам, с помощью Tailscale ACL. Политика ACL ограничивает трафик между устройствами с определёнными тегами — например, разрешая только вашему ноутбуку и телефону обращаться к серверу с агентом, и ничему другому в tailnet-сети. Для одиночного пользователя стандартный режим «разрешить всё внутри вашей tailnet» вполне разумен; добавляйте ACL, когда сеть разделяют другие люди или ненадёжные устройства.
Никогда не привязывайте агента к 0.0.0.0
При проверке работоспособности локально привязанного сервиса используйте curl http://127.0.0.1:9000/health непосредственно с сервера, а не временно привязывайте к 0.0.0.0. На VPS без правила брандмауэра, блокирующего порт 9000, это однострочное изменение открывает вашего агента публичному интернету на всё время работы процесса. Привязывайте к 127.0.0.1 и обращайтесь к сервису через Tailscale или обратный прокси — никогда напрямую.
Держите секреты подальше от файла юнита
Никогда не помещайте API-ключи в строку Environment= файла юнита systemd — они появятся в выводе systemctl show. Используйте EnvironmentFile=/etc/myagent/secrets.env, чтобы значения не попадали в файл юнита и вывод systemctl show, согласно документации systemd.exec. Установите строгие права доступа на файл:
sudo mkdir -p /etc/myagent
sudo chmod 640 /etc/myagent/secrets.env
sudo chown root:myagent /etc/myagent/secrets.env
Будьте точны в понимании того, что это даёт: EnvironmentFile= держит секреты вне файла юнита и вывода systemctl show, но после загрузки значения остаются читаемыми в окружении запущенного процесса и через D-Bus. Для настоящей защиты секретов используйте LoadCredential= из systemd, задокументированный в руководстве по учётным данным systemd, который передаёт учётные данные через ограниченный каталог, а не через окружение процесса.
Поддержание работы сервисного агента: юнит systemd
Для агента, работающего как постоянно доступный HTTP-сервис, а не как интерактивная сессия, используйте юнит systemd, привязанный к 127.0.0.1, с Restart=always. Это паттерн systemd: сервис запускается при загрузке, перезапускается при сбое, пишет логи в журнал и никогда не обращается к публичному порту напрямую. EnvironmentFile= — давно существующая базовая директива systemd, доступная во всех актуальных выпусках, согласно документации systemd.exec.
Создайте /etc/systemd/system/my-agent.service:
[Unit]
Description=My Agent Service
After=network.target
[Service]
User=myagent
Group=myagent
WorkingDirectory=/home/myagent/app
EnvironmentFile=/etc/myagent/secrets.env
ExecStart=/home/myagent/app/venv/bin/uvicorn main:app --host 127.0.0.1 --port 9000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Каждая директива здесь обоснована. After=network.target ждёт готовности сети. Запуск под выделенным User/Group ограничивает последствия компрометации агента. EnvironmentFile= загружает секреты из защищённого файла. ExecStart запускает сервер напрямую из виртуального окружения проекта — без обёрточных скриптов — привязанным к 127.0.0.1, чтобы порт никогда не был публично доступен. Restart=always с RestartSec=5 поднимает сервис через пять секунд после любого сбоя.
Включите и запустите его:
sudo systemctl daemon-reload
sudo systemctl enable --now my-agent
sudo systemctl status my-agent
Для безопасного открытия сервиса поставьте обратный прокси перед портом, привязанным к localhost. Директива proxy_pass в nginx, указывающая на 127.0.0.1, делает upstream недоступным напрямую снаружи, при этом завершая TLS на границе:
server {
listen 443 ssl;
server_name agent.example.com;
ssl_certificate /etc/letsencrypt/live/agent.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/agent.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Получите сертификат с помощью Certbot, который автоматизирует выпуск и обновление сертификатов Let’s Encrypt. Для одиночного пользователя публичное доменное имя зачастую вообще не нужно — доступ к сервису через Tailscale по адресу 100.x.x.x:9000 с авторизованных устройств полностью исключает публичную поверхность атаки.
Доступ к серверу с мобильного устройства
Вы обращаетесь к удалённому агенту с телефона так же, как с ноутбука — через Tailscale, с терминальным клиентом или браузерным терминалом поверх. Инструментальная экосистема здесь быстро меняется по состоянию на середину 2026 года; воспринимайте перечисленное как опциональные улучшения, а не как несущую инфраструктуру.
Надёжные варианты — мобильный SSH-клиент (многие поддерживают постоянные соединения и аутентификацию по ключу) плюс tmux, или mosh для соединений, переживающих смену сети. Поверх этого располагаются браузерные терминальные инструменты. ttyd открывает терминал через веб. vibetunnel (лицензия MIT, в первую очередь для Mac, с кросс-платформенной сборкой через npm для Linux) проксирует терминал в браузер и был создан для мониторинга агентов Claude Code с удалённым доступом через Tailscale. Если вы запускаете любой браузерный терминал, держите его привязанным к localhost и обращайтесь к нему через Tailscale — открытие веб-терминала публично — это та же ошибка с 0.0.0.0, только в другом обличии.
Нативный Remote Control в Claude Code закрывает лёгкий сценарий: только исходящий HTTPS, управление с телефона, без входящих портов. Это самый быстрый способ подтолкнуть одну живую сессию. Самостоятельно собранный стек остаётся тем, к чему вы обращаетесь, когда работа переживает любой отдельный терминал.
Ежедневный рабочий процесс
Ежедневный цикл обновления на удалённом сервере — это три команды: получить код, перезапустить сервис, отслеживать логи. Для агента под управлением systemd это выглядит так:
cd ~/app && git pull origin main
source venv/bin/activate && pip install -r requirements.txt
sudo systemctl restart my-agent
journalctl -u my-agent -f
git pull получает последний код, установка зависимостей подхватывает новые требования, systemctl restart перезапускает сервис, а journalctl -u my-agent -f в реальном времени отслеживает логи сервиса, позволяя убедиться в чистом запуске — journalctl читает журнал systemd, задокументированный на freedesktop.org. Для интерактивного агента под tmux цикл ещё проще: переподключитесь командой tmux attach -t myproject, выполните git pull и позвольте агенту продолжить работу.
Заключение
Стройте на примитивах, которые переживут обёрточные инструменты: SSH и Tailscale для сети, tmux для сессий, которыми вы управляете, systemd для сервисов, работающих без присмотра, и базовый уровень безопасности, который держит порт агента вне публичного интернета. Осознанно выбирайте паттерн tmux или systemd в зависимости от того, управляете ли вы агентом или хостите его, укрепите сервер, прежде чем доверять ему API-ключи, а затем добавляйте нативный Remote Control или браузерный терминал сверху как удобные дополнения. Начните со свежего Linux-сервера и команды установки Tailscale выше — всё остальное компонуется из этого.
Часто задаваемые вопросы
Почему мой агент продолжает умирать при отключении от SSH?
Обычная SSH-сессия привязывает процесс агента к вашему терминалу, поэтому закрытие соединения отправляет сигнал завершения (hangup), который его убивает. Запускайте агента внутри сессии tmux: запустите её командой tmux new-session -s myproject, запустите агента, затем отключитесь сочетанием Ctrl-b, а затем d. Процесс продолжит работу на сервере, и вы сможете переподключиться позже с любого устройства командой tmux attach -t myproject.
Когда стоит использовать нативный Remote Control в Claude Code вместо самостоятельной настройки tmux и SSH?
Используйте нативный Remote Control, когда вам нужно только управлять одной живой сессией с телефона или браузера без какой-либо инфраструктуры — он использует только исходящий HTTPS и не открывает входящих портов. Он рассчитан на одну сессию и умирает вместе с терминалом, из которого был запущен, поэтому для постоянно работающих, headless или многопроектных задач, которые должны переживать разрывы соединения, собирайте самостоятельный стек на SSH, Tailscale, tmux и systemd.
Работает ли mosh через сеть Tailscale?
Да, mosh работает через Tailscale-сеть, поскольку требуемый им диапазон UDP-портов от 60000 до 61000 уже доступен между авторизованными устройствами, так что настройка роутера не нужна. Единственный сценарий сбоя — включение собственного SSH-сервера Tailscale с помощью tailscale up --ssh, которое заменяет OpenSSH; mosh должен запускать mosh-server через настоящий OpenSSH для инициализации, поэтому держите OpenSSH установленным и работающим рядом с Tailscale.
В чём разница между EnvironmentFile и LoadCredential для хранения секретов в systemd?
EnvironmentFile загружает значения из внешнего файла, чтобы они не попадали в файл юнита и вывод systemctl show, однако после загрузки значения остаются читаемыми в окружении запущенного процесса и через D-Bus. LoadCredential надёжнее, поскольку передаёт секреты через ограниченный каталог, а не через окружение процесса, делая их недоступными для окружения запущенного процесса. Используйте EnvironmentFile для конфигурации и LoadCredential для настоящих секретов.