# rodnoy.site — BACKLOG

> Источник правды: `https://opt.rodnoy.site/admin/BACKLOG.md`
> Обновляется после каждой выполненной задачи.

## 🔴 High priority

### B-1 · Перевести маркетинг-сервис на systemd
**Сейчас**: запущен через `setsid`+`nohup` (PID 2659659 на 2026-08-17 10:00 UTC).
При ребуте сервера не поднимется, упадут комментарии на opt.rodnoy.site И gb.rodnoy.site.

**Сделать**:
1. Создать `/etc/systemd/system/rodnoy-marketing.service`:
   ```ini
   [Unit]
   Description=Rodnoy Marketing Service (comments)
   After=network.target postgresql.service

   [Service]
   Type=simple
   User=deploy
   WorkingDirectory=/home/deploy/rodnoy-marketing-service
   ExecStart=/home/deploy/.bun/bin/bun run src/index.ts
   Restart=on-failure
   RestartSec=5
   EnvironmentFile=/home/deploy/rodnoy-marketing-service/.env
   StandardOutput=append:/home/deploy/rodnoy-marketing-service/runtime.log
   StandardError=append:/home/deploy/rodnoy-marketing-service/runtime.log

   [Install]
   WantedBy=multi-user.target
   ```
2. Остановить текущий процесс: `kill 2659659` (или через `restart-marketing.sh` сначала, потом `systemctl enable --now rodnoy-marketing`)
3. `sudo systemctl daemon-reload`
4. `sudo systemctl enable --now rodnoy-marketing.service`
5. Проверить: `systemctl status rodnoy-marketing`, `curl http://127.0.0.1:3040/`

**Блокер**: нужно убить текущий nohup-процесс, иначе порт занят.

---

### B-2 · Проверить поле `aiReply` во фронте comments.js
**Сейчас**: эндпоинт `PUT /api/comments/:id/reply` ждёт в body `aiReply` (camelCase).
Если фронт `assets/comments.js` отправляет `reply` — всегда 400.

**Сделать**:
1. Прочитать `/var/www/opt.rodnoy.site/assets/comments.js`
2. Найти вызов `fetch(API + '/' + id + '/reply', ...)` и проверить `body: JSON.stringify({ ... })`
3. Если поле `reply` — заменить на `aiReply`
4. Если AI-ответ не используется — удалить эндпоинт из UI

**Статус**: не проверено (требует ревью кода)

---

### B-3 · DC-19 — виджет комментариев в дизайн-системе
**Сейчас**: виджет комментариев работает (POST→201, GET→200, PUT, DELETE), но не проиндексирован
в дизайн-системе как компонент DC-19.

**Сделать**:
1. Добавить в `design.html` карточку DC-19 с живым демо виджета
2. Зарегистрировать в `assets/design-index.json`
3. Описать токены, от которых он зависит (цвета, тени, скругления)
4. Гайд по интеграции: как подключить `comments.js` к любой странице через `data-comments-page`

---

## 🟡 Medium priority

### B-4 · nginx access logs: отдельный файл для /admin/
**Сейчас**: все запросы в opt.rodnoy.site_access.log, включая админку.
**Сделать**: `location /admin/ { access_log /var/log/nginx/opt-admin.log; }`

### B-5 · Backup-скрипт для /var/www/opt.rodnoy.site/ и /home/deploy/rodnoy-marketing-service/
**Сделать**: bash скрипт, делает tar.gz, кладёт в `/var/backups/rodnoy/`, ротация 7 дней.
Добавить в cron (ночь, ежедневно).

### B-6 · Мониторинг с уведомлениями
**Сделать**: bash скрипт, раз в 5 минут проверяет `GET http://127.0.0.1:3040/` и
`GET https://app.rodnoy.site/marketing/api/comments/all?page=opt-plan`.
Если 5xx или таймаут — алерт (telegram bot? webhook?).

---

## 🟢 Low priority / Nice to have

### B-7 · Метрики на главной opt.rodnoy.site
Счётчик комментариев по каждой странице (живой, через `GET /api/comments/all`).

### B-8 · Темная тема (токен DS-B-...)
Пример в design.html уже есть — 8 строк в tokens.css. Сделать переключатель.

### B-9 · PWA / офлайн-версия
opt.rodnoy.site должен работать офлайн (план + дизайн-система). Service Worker.

### B-10 · Аналитика
Подключить Plausible или Yandex.Metrika. Цели: клики по кнопкам «💬 Обсуждение»,
просмотры дизайна, конверсия по фазам плана.

---

## История изменений

- **2026-08-17** — initial backlog создан после починки БД-блокера. B-1, B-2, B-3 — рекомендованные следующие задачи.
