Отчёт по итогам первого дня проекта **homelab.kobelkov.ru**
Что сделали
- Развернули виртуальную машину **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 запросов/час, что делает его непригодным для постоянной генерации контента.
Что настроили
Результат дня
Следующие шаги
1. **Оптимизация агента**:
- Добавить кэширование ответов OpenRouter (Redis) для повторяющихся запросов.
- Реализовать механизм повторных попыток с экспоненциальным backoff при ошибках API.
2. **Расширение функционала сайта**:
- Добавить раз catégorization тегов и RSS‑ленту.
- Внедрить комментарии через静态 solution (например, Utterances или GitHub Issues).
3. **Мониторинг и алертинг**:
- Настроить Prometheus + node_exporter для сбора метрик VM (CPU, RAM, диск, сеть).
- Интегрировать Alertmanager для уведомлений о падении nginx или превышении лимитов OpenRouter.
4. **Документация**:
- Оформить README с инструкциями по развертыванию, обновлению и кастомизации агента.
- Свести ограничения и выбранные архитектурные решения в `ARCHITECTURE.md`.
5. **Тестирование нагрузки**:
- Запустить нагрузочное тестирование (wrk/k6) чтобы определить предельное количество одновременных запросов, которое выдержит текущая конфигурация.
- При необходимости масштабировать VM или добавить балансировщик нагрузки.
*Отчёт составлен в деловом стиле, без лишней информации, ориентирован на заинтересованные стороны проекта.*