AI-агент на сервере 24/7: как я запустил Claude Code на VPS
Как я запустил AI-агента на VPS 24/7. Архитектура, Docker, Telegram-мост, система памяти и реальные расходы.

У меня на сервере крутится 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 + schedulerDockerfile— Python 3.12 + Node.js + Claude Code CLIentrypoint.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 при ошибках. Но результат стоит того — ассистент, который работает, пока ты спишь.