Клуб, вход через Яндекс ID, адаптер бота и полировка → main #1

Merged
german merged 4 commits from feat/nika-polish into main 2026-08-06 20:28:02 +00:00
Owner

Вливает в main всю работу от 5–6 августа: закрытый клуб, вход через Яндекс ID, адаптер единого бота флота и полировку оформления.

Зачем это нужно сейчас

main отстал на 4 коммита, а .gitea/workflows/deploy.yml разворачивает именно main. То есть при запуске автодеплоя на прод уехал бы каркас без клуба и без авторизации — вся вечерняя работа осталась бы за бортом, причём молча.

Ветка feat/nika-polish содержит всё из feat/bot-adapter плюс один свой коммит, поэтому вливается одна, а не три подряд.

Что входит

Коммит Что
8291d0f backend закрытого клуба + вход через Яндекс ID
a355188 frontend закрытого клуба + страница входа
3f1c5db адаптер единого бота флота, смена домена на 1nika.ru
c6b26a9 design-tokens, SEO-метаданные, favicon

Проверено перед PR

Домен 1nika.ru сейчас не обслуживает приложение: резолвится в 45.130.41.48 и отдаёт заглушку хостинга «Домен не прилинкован ни к одной из директорий на сервере!» (nginx-reuseport). То есть слияние ничего не ломает на проде — прода пока нет.

Что остаётся после слияния

Слияние не разворачивает сайт. По docs/DEPLOY.md живой пролив — решение владельца, и для него нужно:

  1. выбрать ноду под бэкенд (Docker + PostgreSQL, порты 80/443);
  2. перенастроить DNS 1nika.ru и www с общего хостинга на эту ноду;
  3. прописать в .env: пароль БД, ключи JWT, YANDEX_CLIENT_ID/SECRET (на Я.Диске), BOT_API_TOKEN;
  4. выпустить сертификат certbot и применить миграции club_access.sql и bot_adapter.sql;
  5. назначить Нике роль owner;
  6. перевести сайт в реестре бота из soon в live;
  7. завести секреты раннера DEPLOY_HOST и DEPLOY_KEY, иначе CI не отработает.

Осторожно с автодеплоем: после слияния push в main попытается запустить workflow. Если раннер и секреты не настроены, он просто не выполнится — но стоит убедиться, что он не раскатает что-то на неподготовленную ноду.

Отдельно

Задачи #1–#15 из README и заметок vault не заведены в трекере — открытых issues в репозитории ноль. По плану без задач работать неудобно; если нужно, заведу их отдельно.

Вливает в `main` всю работу от 5–6 августа: закрытый клуб, вход через Яндекс ID, адаптер единого бота флота и полировку оформления. ## Зачем это нужно сейчас `main` отстал на 4 коммита, а `.gitea/workflows/deploy.yml` разворачивает именно `main`. То есть при запуске автодеплоя на прод уехал бы **каркас без клуба и без авторизации** — вся вечерняя работа осталась бы за бортом, причём молча. Ветка `feat/nika-polish` содержит всё из `feat/bot-adapter` плюс один свой коммит, поэтому вливается одна, а не три подряд. ## Что входит | Коммит | Что | |---|---| | `8291d0f` | backend закрытого клуба + вход через Яндекс ID | | `a355188` | frontend закрытого клуба + страница входа | | `3f1c5db` | адаптер единого бота флота, смена домена на `1nika.ru` | | `c6b26a9` | design-tokens, SEO-метаданные, favicon | ## Проверено перед PR Домен **`1nika.ru` сейчас не обслуживает приложение**: резолвится в `45.130.41.48` и отдаёт заглушку хостинга «Домен не прилинкован ни к одной из директорий на сервере!» (nginx-reuseport). То есть слияние ничего не ломает на проде — прода пока нет. ## Что остаётся после слияния Слияние **не разворачивает сайт**. По `docs/DEPLOY.md` живой пролив — решение владельца, и для него нужно: 1. выбрать ноду под бэкенд (Docker + PostgreSQL, порты 80/443); 2. перенастроить DNS `1nika.ru` и `www` с общего хостинга на эту ноду; 3. прописать в `.env`: пароль БД, ключи JWT, `YANDEX_CLIENT_ID`/`SECRET` (на Я.Диске), `BOT_API_TOKEN`; 4. выпустить сертификат certbot и применить миграции `club_access.sql` и `bot_adapter.sql`; 5. назначить Нике роль `owner`; 6. перевести сайт в реестре бота из `soon` в `live`; 7. завести секреты раннера `DEPLOY_HOST` и `DEPLOY_KEY`, иначе CI не отработает. **Осторожно с автодеплоем:** после слияния push в `main` попытается запустить workflow. Если раннер и секреты не настроены, он просто не выполнится — но стоит убедиться, что он не раскатает что-то на неподготовленную ноду. ## Отдельно Задачи #1–#15 из README и заметок vault **не заведены в трекере** — открытых issues в репозитории ноль. По плану без задач работать неудобно; если нужно, заведу их отдельно.
german added 4 commits 2026-08-06 20:23:43 +00:00
Миграция club_access.sql (access_requests, users.club_tier/yandex_id/
avatar_url, password NULLable, works.club_only). OAuth-роуты Яндекса
(/api/auth/yandex[/callback]) с CSRF-state и мягкой 503 без ключей.
Клуб: /api/club/tiers|request|my-request|gallery + админ requests/
approve/decline. Rate-limit на /api/auth сохранён.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Страница /club (уровни, форма заявки, статус, админ-модерация),
/club/gallery (закрытая галерея), /login (кнопка «Войти через
Яндекс» + email-вход, разбор #token). Хелперы lib/auth.ts,
lib/club.ts, компонент AdminRequests. Ссылки «Клуб»/«Войти» в Nav.
Эстетика по существующим токенам (paper/ink/accent, Cormorant/Inter).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Реализован контракт /api/bot/* из servaki-webhub-bot/SPEC.md:
- GET  /api/bot/health (публичный) -> {ok, site}
- GET  /api/bot/publications?status=&limit= -> список works
- POST /api/bot/publications {title,body,media[]} -> черновик works -> {id}
- POST /api/bot/publications/:id/publish -> published -> {id,url}
- DELETE /api/bot/publications/:id -> удаление (media cascade)
- POST /api/bot/materials (multipart file) -> media -> {id,url}

Аутентификация Authorization: Bearer <BOT_API_TOKEN> (middleware/botAuth,
сравнение постоянного времени; 503 без токена в env, 401 при несовпадении).
Маппинг: публикация<->works, материал<->media. Миграция bot_adapter.sql
разрешает media.type='file'. multer 2.x.

Фикс Яндекс-redirect и домена: nika-gallery.ru -> 1nika.ru в .env.example
(YANDEX_REDIRECT_URI, FRONTEND_URL, SITE_URL, NEXT_PUBLIC_*, SMTP_USER) и
nginx server_name. Секреты не в git (client_id/secret - на Я.Диске).

Добавлен docs/DEPLOY.md (VPS runbook: DNS, .env, SSL, миграции, бот).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- tailwind: восстановлены токены paper/accent/muted (их используют
  все компоненты — незакоммиченный оверхол их удалял → ломало палитру);
  serif/display указывают на реально загруженные next/font (Cormorant/Inter),
  а не на несуществующий --font-serif/Space Grotesk/Manrope;
  muted возвращён к #6b6b6b (WCAG-AA на белом). Новые токены gold/bg/graphite/
  радиусы/тени оставлены аддитивно.
- layout: metadataBase + canonical + OG url/siteName + twitter card (SEO/OG).
- 404: metadata title + robots noindex.
- app/icon.png: favicon (Next app-icon).

Сборка/типы: next build + tsc --noEmit — зелёные.
Бот-адаптер /api/bot/* и Яндекс-redirect не трогались (соответствуют SPEC).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
german merged commit 4534ecfd0a into main 2026-08-06 20:28:02 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: german/nika-gallery#1