← План
v0.1 · быстрая загрузка контекста

Новая сессия начинается здесь

Эта страница — единый индекс для любой новой AI-сессии над rodnoy.site. Здесь: SSH-доступ, пути к коду, готовые скрипты, текущий статус, worklog, backlog. Не нужно заново изучать структуру проекта, писать SSH-обёртки или искать .env — всё уже собрано.

Quickstart (3 команды) status.json worklog backlog

0 · Quickstart для новой сессии

3 команды, чтобы начать работу за <30 секунд вместо 5–10 минут рутинной настройки. Первая — забрать SSH-ключ и обёртку.

Шаг 1 — установить paramiko и забрать SSH-обёртку

# Один раз в сессии: paramiko (openssh-client в окружении обычно не установлен)
python3 -m pip install paramiko

# Скачать обёртку и ключ (если ещё нет)
cp /home/z/my-project/upload/deploy_key /home/z/my-project/scripts/deploy_key
chmod 600 /home/z/my-project/scripts/deploy_key
curl -fsSL https://opt.rodnoy.site/admin/scripts/rodnoy-ssh.py \
  -o /home/z/my-project/scripts/rodnoy-ssh.py

Шаг 2 — получить снапшот состояния

# Свежий status.json (генерируется автоматически на сервере)
curl -fsSL https://opt.rodnoy.site/admin/data/status.json | python3 -m json.tool

# Или запустить живой health-check прямо сейчас
python3 /home/z/my-project/scripts/rodnoy-ssh.py \
  'bash /var/www/opt.rodnoy.site/admin/scripts/health-check.sh'

Шаг 3 — прочитать контекст и backlog

# Что уже сделано (worklog) и что в очереди (backlog)
curl -fsSL https://opt.rodnoy.site/admin/data/WORKLOG.md
curl -fsSL https://opt.rodnoy.site/admin/BACKLOG.md

# Полный контекст проекта (этот файл, но в Markdown)
curl -fsSL https://opt.rodnoy.site/admin/CONTEXT.md

Что НЕ нужно делать в новой сессии

  1. Искать .env файлы заново — пароль БД rodnoy лежит в /home/deploy/GroupBy/.env (эталон). Меняется одновременно во всех .env.
  2. Писать SSH-обёртку — уже готова: scripts/rodnoy-ssh.py (paramiko, умеет exec / --file / --get / --put / --sudo).
  3. Писать restart-скрипт — готов: scripts/restart-marketing.sh (использует точный match, не убивает собственный SSH).
  4. Писать E2E тест комментариев — готов: scripts/test-comments.sh (полный цикл, использует aiReply а не reply).
  5. Искать структуру проекта — вся карта в разделе Пути ниже.
  6. Грепать эндпоинты — все в разделе Эндпоинты.

1 · Доступ к серверу

IP / Port93.183.81.233 : 22
Userdeploy (sudo без пароля)
Rootssh -i deploy_key root@93.183.81.233 (тоже по ключу)
Keydeploy_key (RSA, без passphrase)
Локальный путь/home/z/my-project/scripts/deploy_key (chmod 600)
Обёртка (если нет ssh)python3 /home/z/my-project/scripts/rodnoy-ssh.py 'cmd'

Шаблон SSH-подключения

# Если openssh-client установлен:
ssh -i /home/z/my-project/scripts/deploy_key \
    -o IdentitiesOnly=yes -o StrictHostKeyChecking=no \
    deploy@93.183.81.233

# Если НЕТ ssh (часто в новых сессиях) — используем paramiko-обёртку:
python3 -m pip install paramiko  # один раз в сессии
python3 /home/z/my-project/scripts/rodnoy-ssh.py 'whoami; hostname; date'
python3 /home/z/my-project/scripts/rodnoy-ssh.py --file /path/to/local-script.sh
python3 /home/z/my-project/scripts/rodnoy-ssh.py --get /remote/path /local/path
python3 /home/z/my-project/scripts/rodnoy-ssh.py --put /local/path /remote/path --sudo --owner www-data

2 · Ключевые пути и сервисы

Сайты /var/www/

opt.rodnoy.site/var/www/opt.rodnoy.site/ — план + дизайн-система + admin
gb.rodnoy.site/var/www/gb.rodnoy.site/ — анализ проекта GroupBy
app.rodnoy.site/var/www/app.rodnoy.site/ — GroupBy production (Next.js)
rodnoy.site/var/www/rodnoy.site/ — subtracker bot + tracker
art.rodnoy.site/var/www/art.rodnoy.site/ — Art Next.js app
mesto.rodnoyart.ru/var/www/mesto.rodnoyart.ru/ — Next.js app
nerosbd-sbd/var/www/nerosbd-sbd/ — Nerosbd Next.js app

Код приложений /home/deploy/

GroupBy (главное)/home/deploy/GroupBy/ — Next.js, app.rodnoy.site
Marketing service/home/deploy/rodnoy-marketing-service/ — порт 3040, комментарии

Маркетинг-сервис · эндпоинты

GET /api/comments/all?page=PAGE — список по странице
POST /api/comments{page, section, author, body} — создать
PUT /api/comments/:id/status{status} — new|read|addressed|archived
PUT /api/comments/:id/reply{aiReply: "текст"} — ⚠️ НЕ "reply"!
DELETE /api/comments/:id— удалить по id

Внешний URL (через nginx): https://app.rodnoy.site/marketing/api/comments
Внутренний URL (на сервере): http://127.0.0.1:3040/api/comments
Страницы комментариев: opt-plan, opt-design, gb-plan

БД · nginx · SSL

PostgreSQLlocalhost:5432, БД rodnoy, user rodnoy
Рабочий пароль (эталон)/home/deploy/GroupBy/.env — DATABASE_URL=postgresql://rodnoy:***@...
Prisma schema/home/deploy/rodnoy-marketing-service/prisma/schema.prisma
nginx конфиги/etc/nginx/sites-available/{domain} + symlink sites-enabled/
SSL сертификаты/etc/letsencrypt/live/{domain}/ (до 2026-11-15)
SSL auto-renewвключён (certbot.timer)

3 · Готовые скрипты

Все скрипты лежат на сервере в /var/www/opt.rodnoy.site/admin/scripts/ и доступны по HTTPS. Не нужно писать их заново в каждой новой сессии.

rodnoy-ssh.py

Скачать локально у AI

SSH-обёртка на paramiko. Команды: exec, --file, --get, --put, --put --sudo --owner www-data. Ключ ищет в нескольких путях (env → /home/z/my-project/scripts/deploy_key → ./deploy_key).

health-check.sh

Скачать на сервере

Снимок состояния: маркетинг-сервис (PID/uptime/БД), nginx + SSL (дни до истечения), страницы opt, gb.rodnoy.site, CORS preflight, DNS, диск, load. В конце выводит JSON.

python3 /home/z/my-project/scripts/rodnoy-ssh.py \
  'bash /var/www/opt.rodnoy.site/admin/scripts/health-check.sh'

restart-marketing.sh

Скачать на сервере

Безопасный перезапуск маркетинг-сервиса через setsid+nohup. Использует точный match для pkill, чтобы не убить собственный SSH. Бэкапит лог, проверяет health после старта.

python3 /home/z/my-project/scripts/rodnoy-ssh.py \
  'bash /var/www/opt.rodnoy.site/admin/scripts/restart-marketing.sh'

test-comments.sh

Скачать на сервере

E2E цикл: POST → GET → PUT status → PUT reply (с правильным полем aiReply) → DELETE → финальный GET. Аргумент $1 — страница (по умолчанию opt-plan).

python3 /home/z/my-project/scripts/rodnoy-ssh.py \
  'bash /var/www/opt.rodnoy.site/admin/scripts/test-comments.sh opt-design'

update-status.py

Скачать на сервере

Генерирует свежий data/status.json — машиночитаемый снапшот (запускает внутри себя health-check.sh, парсит JSON, добавляет мета + список страниц + скриптов).

python3 /home/z/my-project/scripts/rodnoy-ssh.py \
  'python3 /var/www/opt.rodnoy.site/admin/scripts/update-status.py'

4 · Текущий статус

Ниже — последний сохранённый снапшот. Свежий статус генерируется командой update-status.py (см. раздел Скрипты).

Marketing service

загрузка...

Database

загрузка...

SSL expires

загрузка...

Pages

загрузка...

CORS preflight

загрузка...

Generated

UTC

Открыть status.json →   Открыть worklog →

5 · Что делать дальше

Подробный список — в BACKLOG.md. Здесь — топ-3 приоритета.

B-1 · Перевести маркетинг-сервис на systemd 🔴 High

Сейчас запущен через nohup. При ребуте сервера не поднимется → упадут комментарии на opt И gb.rodnoy.site. Нужно создать /etc/systemd/system/rodnoy-marketing.service, остановить текущий PID и включить сервис.

B-2 · Проверить поле aiReply в comments.js 🔴 High

Эндпоинт PUT /api/comments/:id/reply ждёт в body aiReply (camelCase). Если фронт assets/comments.js отправляет reply — всегда 400. Прочитать файл, поправить если надо.

B-3 · DC-19 — виджет комментариев в дизайн-системе 🟡 Medium

Виджет комментариев работает (полный цикл проверен), но не проиндексирован в дизайн-системе. Добавить карточку DC-19 в design.html с живым демо, зарегистрировать в design-index.json.

6 · Грабли и частые ошибки

⚠️ pkill -f "src/index.ts" убивает собственный SSH

Используйте точный match: pgrep -f "/home/deploy/.bun/bin/bun run src/index.ts". См. restart-marketing.sh.

⚠️ Поле aiReply, не reply

В эндпоинте PUT /api/comments/:id/reply тело должно быть {"aiReply": "текст"} (camelCase). Любой другой ключ → 400.

⚠️ Пароль БД rodnoy меняется в нескольких .env одновременно

Эталон — /home/deploy/GroupBy/.env. Также править: app.rodnoy.site/.env, app.rodnoy.site/.next/standalone/.env, rodnoy-marketing-service/.env.

⚠️ DNS opt.rodnoy.site → 93.183.81.233 — НЕ трогать

Уже прописан у регистратора. Cache-Control: no-cache на сервере — изменения видны сразу, без кэш-инвалидации.

⚠️ Файлы в /var/www/ принадлежат www-data

Загрузка через deploy требует sudo: sudo install -m 644 src dest && sudo chown www-data:www-data dest. Скрипт rodnoy-ssh.py --put --sudo --owner www-data делает это автоматически.