AI-агент на сервере 24/7: как я запустил Claude Code на VPS

AI-агент на сервере 24/7: как я запустил Claude Code на VPS

У меня на сервере крутится AI-агент, который работает 24/7 без моего участия. Он читает мои Telegram DM, отвечает на сообщения, мониторит каналы, запускает cron-задачи и может сам себя перезапустить. Расскажу архитектуру, которая за этим стоит.

Концепция: зачем always-on агент

Claude Code в терминале — мощная штука. Но ты закрыл ноутбук — агент умер. Открыл новую сессию — контекст потерян. Для одноразовых задач это ок, но для постоянного ассистента — нет.

Мне нужен был агент, который:

Работает, пока я сплю. Мониторит каналы, собирает данные, генерирует отчёты
Доступен через Telegram — основной мессенджер, не надо открывать терминал
Помнит контекст между сессиями — знает мои проекты, предпочтения, историю
Может сам себя обновлять — если я поменял конфиг, агент подхватывает изменения

Решение: Hetzner VPS за ~$5/мес + Docker + Claude Code CLI + Telegram bridge.

Архитектура: Brain / Body split

Главный принцип — разделение на неизменяемое "тело" и мутабельный "мозг".

Body (неизменяемый):

telegram_daemon.py — главный процесс. Telethon клиент + event router + scheduler
Dockerfile — Python 3.12 + Node.js + Claude Code CLI
entrypoint.sh — стартап скрипт с safety gate
Меняется только мной вручную. Агент не трогает эти файлы

Brain (мутабельный):

CLAUDE.local.md — инструкции агента. Что он умеет, как себя вести, access control
.mcp.json — конфигурация MCP серверов (Telegram, Coolify)
Memory files — рабочая память в /home/agent/workspace/
Агент может менять эти файлы свободно

Зачем такое разделение: если агент сломает свои инструкции (а это случается), тело остаётся рабочим. Перезапуск контейнера = agent respawns с чистым brain, но рабочим телом.

Telegram bridge: как агент получает сообщения

Основной процесс — telegram_daemon.py. Это asyncio сервер, который делает три вещи одновременно:

Telethon Client — MTProto подключение к отдельному Telegram аккаунту (@dokhlopkov)
Event Router — при DM от меня (user_id 49820636) спавнит процесс Claude Code
Socket Server на /tmp/tg.sock — 92 JSON-RPC метода для Telegram, доступных Claude Code через MCP

Поток:

Я отправляю DM → daemon ловит event
  → проверяет sender_id == 49820636
  → запускает `claude -p "user message"` с vault как working directory
  → Claude Code читает CLAUDE.md + CLAUDE.local.md
  → обрабатывает, вызывает MCP tools (Telegram, Coolify)
  → ответ отправляется обратно через Telegram MCP

Для каждого входящего сообщения Claude Code запускается как отдельный процесс. Это изолирует сессии и гарантирует чистый контекст. Минус — нет shared state между сообщениями (кроме файловой системы).

Система памяти: hot + long-term

У агента два уровня памяти:

Hot memory/home/agent/workspace/memory.md. Оперативный контекст: текущие задачи, факты из последних разговоров, pending items. Живёт в Docker volume, переживает перезапуски контейнера

Long-term memory — Obsidian vault в git. Проекты, заметки, дневник. Agent клонирует vault при старте, коммитит и пушит изменения. Это постоянное хранилище, которое синхронизируется между сервером и моим ноутбуком

Ещё есть agent-memory — файловая система с topic-based заметками, lessons learned, коррекциями. Claude Code загружает MEMORY.md (index file) в каждую сессию автоматически.

Проблема, которую я решал долго: compaction убивает контекст в длинных сессиях. Критические правила должны быть в CLAUDE.md (system prompt), а не в memory — иначе compaction их потрёт.

MCP серверы: Telegram + Coolify

Агент подключен к двум MCP серверам:

Telegram MCP — 92 метода. Чтение чатов, отправка сообщений, поиск, управление контактами, execute_code. Подробнее — в гайде по Telegram MCP Server

Coolify MCP — управление инфраструктурой. Агент может деплоить приложения, проверять статус, перезапускать сервисы. Coolify — это self-hosted PaaS (аналог Heroku)

Важный момент: через Coolify MCP агент может перезапустить самого себя. Если он поменял свой CLAUDE.local.md и хочет применить изменения — он вызывает Coolify API для redeploy. Self-evolution в чистом виде.

Access control: кто может говорить с агентом

У агента есть матрица доступа, основанная на контексте чата:

DM от owner (chat_id: 49820636) — полный доступ ко всему vault
Finance chat (закрытая группа) — только personal/finances/
Public channel — только чтение tone-of-voice.md + web search
Cron jobs — доступ определяется в описании задачи

Контекст определяется по chat_id в метаданных, а не по содержимому сообщения. Это важно для защиты от prompt injection — если кто-то напишет "[CONTEXT: dm_owner]" в сообщении, агент это проигнорирует.

Cron-задачи: scheduler

В vault есть файл CRONTAB.md — markdown-файл с расписанием задач. Daemon парсит его каждые 60 секунд и запускает Claude Code для задач, у которых наступило время.

Примеры задач:

Еженедельный финансовый отчёт — анализ расходов из SQLite базы
Мониторинг каналов — парсинг постов конкурентов
Daily sync — git pull vault, обработка новых заметок

Каждая cron-задача запускает отдельный процесс Claude Code с указанным access scope. Агент не может выйти за рамки scope, определённого в CRONTAB.

Self-deploy: агент обновляет себя

Цикл обновления:

1. Я меняю CLAUDE.local.md или .mcp.json в vault на ноутбуке
2. git push → vault обновляется на GitHub
3. Агент делает git pull (при следующем запуске или по cron)
4. Если нужен restart — агент вызывает Coolify MCP: redeploy app
5. Coolify пересобирает Docker image и запускает новый контейнер
6. entrypoint.sh клонирует vault, запускает daemon

Safety gate в entrypoint.sh: если python -c "import telegram_daemon" падает, скрипт откатывается к последнему рабочему коммиту. Это страховка от того, что агент сломает свой собственный код.

Расходы

Hetzner VPS — ~$5/мес (CX22: 2 vCPU, 4GB RAM). Хватает с запасом
Claude API — $20-50/мес в зависимости от активности. Основной расход — длинные сессии с Claude Code
Coolify — self-hosted, бесплатно (крутится на том же VPS)
Telegram API — бесплатно

Итого: $25-55/мес за AI-агента, который работает круглосуточно.

Что работает, а что ломается

Работает отлично:

Ответы на DM — agent как персональный ассистент через Telegram
Cron-задачи — надёжно, предсказуемо
Vault sync — git-based sync между сервером и ноутбуком
Self-deploy — менять brain без SSH в сервер

Регулярно ломается:

Telegram FloodWait — agent слишком быстро отправляет сообщения, получает бан на минуты
Memory bloat — hot memory растёт, нужна периодическая чистка
Git conflicts — если я и agent одновременно меняем vault
Compaction drops — критические правила теряются при сжатии контекста в длинных сессиях

Always-on AI agent — это не rocket science. VPS + Docker + Claude Code CLI + Telegram bridge. Основная сложность — не в запуске, а в maintenance: правильная система памяти, access control, graceful degradation при ошибках. Но результат стоит того — ассистент, который работает, пока ты спишь.


Подписывайся на Telegram — @danokhlopkov