Отчёт по итогам первого дня проекта **homelab.kobelkov.ru**
✎Схема: контуры сайта
Content (.md) -> Python render -> HTML
| |
| +--> indexes/feed/sitemap
+--> git commit -> publish.sh
Что сделали
- Развернули виртуальную машину homelab-web в гипервизоре Proxmox.
- Установили и запустили веб-сервер nginx с поддержкой HTTPS.
- Привязали к серверу домен homelab.kobelkov.ru и получили сертификат TLS.
- Сформировали базовый каркас сайта (структура каталогов, шаблоны страниц).
- Инициализировали репозиторий Git и скрипт publish.sh для автоматической публикации контента.
- Установили и выполнили проверку работоспособности Claude Code.
- Выявили ограничения бесплатного тарифа Claude Code (лимит токенов, отсутствие доступа к определённым моделям).
- Приняли решение о переходе на архитектуру OpenRouter с собственным AI‑агентом.
- Реализовали AI‑агент на Node.js, интегрированный с OpenRouter API.
- Настроили генерацию статических страниц агентом и их последующую публикацию через publish.sh.
- Запланировали выполнение задач через cron и организовали централизованное логирование.
Что настроили
- Proxmox: VM с выделением 2 vCPU, 2 ГБ RAM, 20 ГБ SSD, сетевой мост к внешнему интерфейсу.
- nginx: конфигурация с перенаправлением HTTP→HTTPS, SSL‑сертификат Let’s Encrypt, гзип‑сжатие и кэширование статики.
- DNS: A‑запись homelab.kobelkov.ru → IP‑адрес VM, проверка распространения.
- Git: репозиторий
homelab-siteс веткамиmainиdev, хукиpre‑commitдля линтинга Markdown. - publish.sh: скрипт, pulling latest commit, запуск генератора сайта, копирование output в
/var/www/html, перезагрузка nginx при необходимости. - Claude Code: тестовый запрос, оценка времени ответа и точности, запись ограничений в
docs/claude-limits.md. - OpenRouter: получение API‑ключа, выбор модели
mistralai/mistral-7b-instruct, настройка лимита запросов. - AI‑агент (Node.js): сервер Express, endpoint
/generateполучает запрос на страницу, формирует промпт, обращается к OpenRouter, сохраняет результат вpages/. - cron: задача
*/15 * * * * /opt/homelab/publish.sh >> /var/log/homelab/publish.log 2>&1. - Логирование: ротация через
logrotate, уровеньINFOдля publish,DEBUGдля агента, хранение 7 дней.
Результат дня
- Доступен рабочий сайт по адресу https://homelab.kobelkov.ru с главной страницей и базовым набором разделов (О проекте, Блог, Документация).
- HTTPS активен, сертификат валиден, рейтинг безопасности SSL Labs — A.
- Автоматическая pipeline: коммит в репозиторий → запуск publish.sh → генерация контента AI‑агентом → деплой на веб‑сервер → доступность изменений в течение минуты.
- AI‑агент успешно генерирует Markdown‑страницы на основе коротких тем, получая ответы от OpenRouter без превышения бесплатного лимита (текущий расход < 5 000 токенов/день).
- Логи показывают отсутствие ошибок в nginx и publish.sh; агент логирует запрос/ответ и время выполнения (среднее 1,2 с).
- Ограничения бесплатного Claude Code подтверждены: максимум 500 токенов за запрос и блокировка после 50 запросов/час, что делает его непригодным для постоянной генерации контента.
Следующие шаги
- Оптимизация агента:
- Добавить кэширование ответов OpenRouter (Redis) для повторяющихся запросов.
- Реализовать механизм повторных попыток с экспоненциальным backoff при ошибках API.
- Расширение функционала сайта:
- Добавить раз catégorization тегов и RSS‑ленту.
- Внедрить комментарии через静态 solution (например, Utterances или GitHub Issues).
- Мониторинг и алертинг:
- Настроить Prometheus + node_exporter для сбора метрик VM (CPU, RAM, диск, сеть).
- Интегрировать Alertmanager для уведомлений о падении nginx или превышении лимитов OpenRouter.
- Документация:
- Оформить README с инструкциями по развертыванию, обновлению и кастомизации агента.
- Свести ограничения и выбранные архитектурные решения в
ARCHITECTURE.md. - Тестирование нагрузки:
- Запустить нагрузочное тестирование (wrk/k6) чтобы определить предельное количество одновременных запросов, которое выдержит текущая конфигурация.
- При необходимости масштабировать VM или добавить балансировщик нагрузки.
Отчёт составлен в деловом стиле, без лишней информации, ориентирован на заинтересованные стороны проекта.