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, запускает daemonSafety 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