12k
All articles

Настройка удалённого сервера для агентного программирования

Настройте Claude Code на удалённой машине с Tailscale, tmux, mosh и systemd, а также SSH-ключи, секреты и приватный доступ.

OpenReplay Team
OpenReplay Team
Настройка удалённого сервера для агентного программирования

Минимальный стек для запуска 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>
СекретыПеременные окружения оболочки или подключаемый .envEnvironmentFile= / LoadCredential=
Доступ с мобильногоmosh + tmux attachcurl / браузер через обратный прокси

Используйте tmux, когда хотите наблюдать за агентом и управлять им — вводить промпты, подтверждать действия, читать вывод. Используйте systemd, когда агент — это сервис, принимающий запросы и работающий без присутствия человека. Большинству людей, запускающих Claude Code интерактивно, нужен tmux. Большинству людей, открывающих агента через API, нужен systemd. Некоторые сценарии используют оба подхода.

Запуск Claude Code удалённо: канонический бесплатный стек

Канонический бесплатный стек для удалённого запуска Claude Code — это Linux-сервер, Tailscale для приватного сетевого уровня, OpenSSH плюс mosh для подключения и tmux для постоянных сессий. Этот раздел содержит последовательность настройки, готовую к копированию и выполнению. Запустите меры по укреплению безопасности из следующего раздела, прежде чем считать сервер готовым к работе.

Установка 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 для настоящих секретов.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.