---
name: kodoceh-news-and-account-linking
description: "Как устроены новости на сайтах КодоЦех (зеркало CebersPost) и связывание/слияние учёток (email/OAuth↔Telegram), чтобы переиспользовать на других продуктах"
metadata: 
  node_type: memory
  type: project
  originSessionId: b11e39bd-4f6f-47c9-ba7b-680ccf041a5b
---

Два сквозных механизма веб-продуктов КодоЦех (введены 2026-06-25, batch ВакХантера). Все пути — на **mac mini**.

**Новости («вкладка Новости» на сайте).** Источник — **зеркало CebersPost**, НЕ скрап канала. При одобрении поста `cebers_post/news_mirror.py:mirror()` пишет project/title/body/msg_link в общий **`~/Services/shared/news.db`** (таблица `news`), хук в approve-хендлере `cebers_post/bot.py` (best-effort, не роняет публикацию). Сайт читает `GET /api/news WHERE project='<Name>'` (env `NEWS_DB_PATH`, дефолт тот же). Подключить новый продукт = читать news.db по своему `project` + добавить вкладку. См. [[ceberspost_connect_product_channel]].

**Связывание учёток + слияние (канон = Telegram).** Решение D21: один юзер — один аккаунт; любой вход (TG/email/Яндекс/Mail) ведёт в общий кабинет. У **ВакХантера** плоская модель (~30 таблиц на `user_id`, TG-id положительные, web-email/oauth отрицательные) → привязка = **слияние** `_merge_users(secondary, canonical)` в `web/webapp.py`: дженерик-репоинт всех таблиц с `user_id` (+`referrals.referrer_id/referred_id`) `UPDATE OR IGNORE`+`DELETE`, тариф = **max остаток (НЕ сумма, анти-абуз)**, secondary удаляется, транзакция, **бэкап БД перед прод-merge**. Привязка TG из веб-сессии: `/api/me/telegram/link/{start,poll}` (переиспользует login-flow через бота), затем merge + перевыпуск сессии на TG-id. `/api/me/identities` — список способов входа; карточка «Способы входа» в Кабинете. OAuth теперь полноценный сигнап (создаёт аккаунт + `web_oauth_identity`).
- **Автеро** уже на `account`+`identity` (`app/accounts.py`, `account_id_for(provider,uid,link_to_account_id)`) — привязка нового способа уже работает; не хватает `merge_accounts` для коллизии двух готовых аккаунтов + UI «Способы входа». **ОСТАЛОСЬ.**
- **Гаечкин** — `email_identity` на `tg_id` (`api/cab_email.py`); tenant/owner-модель → слияние владельцев рискованно, делать с подтверждением. **ОСТАЛОСЬ.**

**Анти-DDoS (D23):** app-level rate-limit middleware на всех 3 бэкендах (ВакХантер aiohttp, Автеро/Гаечкин FastAPI) — IP по `X-Forwarded-For`, глобально 300/мин + жёстче на auth/ai/feedback/promo/referral/admin → 429. Edge Caddy rate-limit (плагин через xcaddy) — только codoceh-VPS, опц. (zbrcheck не трогать). См. [[vakhunter_overview]], [[kodoceh_auth_multiidentity]].
