# Backend документация ## Стек технологий | Компонент | Технология | Примечание | |-----------|------------|------------| | Язык | Python 3.11+ | | | Фреймворк | FastAPI | Асинхронный, автодокументация | | База данных | PostgreSQL 15+ | Основная БД | | Кэш | PostgreSQL + pg_redis | Или Redis через extension | | Очереди | PostgreSQL + pgqueue | Или Celery + Redis | | ORM | SQLAlchemy 2.0 + Async | Асинхронная работа | --- ## Архитектура сервера ``` ┌─────────────────────────────────────────────────────────┐ │ FastAPI App │ ├─────────────┬─────────────┬─────────────┬───────────────┤ │ REST API │ ActivityPub │ Auth API │ Export API │ │ (лента, │ (inbox, │ (OAuth2, │ (markdown, │ │ профили) │ outbox) │ JWT) │ медиа) │ └─────────────┴─────────────┴─────────────┴───────────────┘ │ ┌─────────▼──────────┐ │ PostgreSQL │ │ ───────────────── │ │ • pg_redis (кэш) │ │ • pgqueue (очереди)│ │ • pg_trgm (поиск) │ └────────────────────┘ ``` --- ## Требования к бэкенду ### 1. ActivityPub реализация - [ ] **Inbox** — приём активностей от других серверов - [ ] **Outbox** — отправка активностей подписчикам - [ ] **WebFinger** — обнаружение пользователей по @username@domain - [ ] **Actor** — профиль пользователя в формате ActivityPub - [ ] **Follow/Unfollow** — подписки между серверами - [ ] **Create/Update/Delete** — посты и их редактирование - [ ] **Like/Announce** — лайки и репосты - [ ] **Mastodon совместимость** — тестирование с mastodon.social ### 2. REST API - [ ] `/api/v1/accounts` — управление профилем - [ ] `/api/v1/statuses` — создание/чтение постов - [ ] `/api/v1/timelines/home` — домашняя лента - [ ] `/api/v1/timelines/public` — публичная лента - [ ] `/api/v1/follows` — подписки - [ ] `/api/v1/karma` — карма пользователя ### 3. База данных (PostgreSQL) #### Основные таблицы: - `users` — пользователи (id, username, domain, display_name, bio, karma) - `posts` — посты (id, user_id, content, content_type, created_at) - `follows` — подписки (follower_id, following_id, created_at) - `likes` — лайки (user_id, post_id, created_at) - `media` — медиафайлы (id, user_id, filename, mime_type, size) - `activities` — ActivityPub активности (id, type, actor, object, timestamp) #### PostgreSQL расширения: - `pg_trgm` — полнотекстовый поиск по постам - `pg_redis` — кэширование лент - `pgqueue` — фоновые задачи (отправка активностей) ### 4. Экспорт контента **Требование**: Пользователь может экспортировать весь свой контент в виде: ``` export_username_2026-03-01/ ├── profile.md # Информация о профиле ├── posts/ │ ├── 2026-03-01_post-123.md │ ├── 2026-03-02_post-124.md │ └── ... ├── media/ │ ├── image-001.png │ ├── image-002.jpg │ └── ... └── manifest.json # Структура экспорта ``` - [ ] Формат постов — Markdown с frontmatter (дата, теги, карма) - [ ] Медиа — оригинальные файлы с переименованием - [ ] Manifest — JSON со списком всех файлов и метаданными - [ ] API endpoint: `GET /api/v1/export/@username` ### 5. Аутентификация - [ ] OAuth2 + JWT токены - [ ] Поддержка Application Passwords для клиентов - [ ] Сессии с возможностью отзыва ### 6. Карма - [ ] Механизм начисления/списания кармы - [ ] Защита от накрутки (лимиты, анти-спам) - [ ] История изменений кармы --- ## План разработки бэкенда 1. [ ] Настройка проекта FastAPI + SQLAlchemy 2. [ ] Модели базы данных (users, posts, follows, likes) 3. [ ] REST API (CRUD для постов, профили) 4. [ ] ActivityPub базовая реализация (Actor, Outbox) 5. [ ] ActivityPub полная реализация (Inbox, Federation) 6. [ ] Экспорт контента (Markdown + медиа) 7. [ ] Система кармы 8. [ ] Тестирование совместимости с Mastodon --- ## Вопросы для обсуждения - [ ] Нужно ли поддерживать совместимость с другими Fediverse-серверами (Pleroma, Pixelfed)? - [ ] Требуется ли rate limiting на API? Какие лимиты? - [ ] Как хранить медиа: локально, S3, или оба варианта? - [ ] Нужна ли модерация контента (админ-панель)?