mirror of
https://gitverse.ru/kpa39l/yaru.nixg.ru.git
synced 2026-09-29 18:05:05 +00:00
Initial commit: проект документации YARU
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
# Документация проекта YARU
|
||||
|
||||
**Yet Another Russian Uncompleted...** — федеративная социальная сеть на базе ActivityPub
|
||||
|
||||
---
|
||||
|
||||
## 📁 Разделы документации
|
||||
|
||||
| Раздел | Описание | Статус |
|
||||
|--------|----------|--------|
|
||||
| [Backend](backend/README.md) | FastAPI, PostgreSQL, ActivityPub, экспорт данных | ✅ Заполнен |
|
||||
| [Frontend](frontend/README.md) | Svelte, компоненты, редактор, real-time | ✅ Заполнен |
|
||||
| [Marketing](marketing/README.md) | Позиционирование, аудитория, конкуренты, брендинг | ✅ Заполнен |
|
||||
| [Design](design/README.md) | Логотип, цвета, типографика, компоненты | 📝 Требует утверждения |
|
||||
| [API](api/README.md) | REST + ActivityPub спецификации | ✅ Заполнен |
|
||||
| [Deployment](deployment/README.md) | Docker, CI/CD, мониторинг, бэкапы | ✅ Заполнен |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 О проекте
|
||||
|
||||
YARU — это попытка создать альтернативу Mastodon со следующими особенностями:
|
||||
|
||||
- ✅ **Без ограничений на длину поста** — пишите статьи, а не твиты
|
||||
- ✅ **Экспорт данных** — ваш контент всегда принадлежит вам (Markdown + медиа)
|
||||
- ✅ **Fediverse совместимость** — полная совместимость с Mastodon
|
||||
- ✅ **Карма** — качественная оценка контента вместо лайков
|
||||
- ✅ **Сменяемая концепция** — название адаптируется под контекст
|
||||
|
||||
### Стек технологий
|
||||
|
||||
| Компонент | Технология |
|
||||
|-----------|------------|
|
||||
| Бэкенд | Python 3.11+ + FastAPI |
|
||||
| Фронтенд | Svelte 4+ + TypeScript |
|
||||
| База данных | PostgreSQL 15+ (основная + кэш + очереди) |
|
||||
| Протокол | ActivityPub (Fediverse) |
|
||||
| Редактор | Временное решение (Chronicle в разработке) |
|
||||
|
||||
---
|
||||
|
||||
## 📋 MVP функционал
|
||||
|
||||
1. **Лента** — домашняя и публичная
|
||||
2. **Профили** — создание, редактирование, аватар
|
||||
3. **Посты** — создание, редактирование, удаление (без ограничения длины)
|
||||
4. **Подписки** — follow/unfollow, список подписчиков
|
||||
5. **Карма** — начисление/списание, защита от накрутки
|
||||
6. **Экспорт** — выгрузка всего контента в Markdown + медиа
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Вопросы для обсуждения
|
||||
|
||||
### Критичные для начала разработки
|
||||
|
||||
1. **ActivityPub совместимость** — обсуждение полной совместимости с Mastodon (обратная связь?)
|
||||
2. **Дизайн** — кто делает макеты, есть ли предпочтения по цветам/стилю?
|
||||
3. **Хостинг** — где размещать (Timeweb, Selectel, Hetzner, свой сервер)?
|
||||
4. **Домен** — использовать yaru.nixg.ru или купить отдельный (yaru.ru, yaru.social)?
|
||||
5. **Редактор** — какой WYSIWYG выбрать для MVP (TipTap, Quill, Markdown textarea)?
|
||||
|
||||
### Технические детали
|
||||
|
||||
- Нужен ли SSR (SvelteKit) или достаточно SPA?
|
||||
- Как хранить медиа: локально, S3, или оба варианта?
|
||||
- Требуется ли модерация контента (админ-панель)?
|
||||
- Нужна ли программа раннего доступа?
|
||||
|
||||
---
|
||||
|
||||
## 📞 Контакты и ресурсы
|
||||
|
||||
- **Репозиторий**: `yaru.nixg.ru`
|
||||
- **Редактор**: [chronicle.nixg.ru](https://chronicle.nixg.ru)
|
||||
- **Документация для разработчиков**: см. разделы выше
|
||||
|
||||
---
|
||||
|
||||
*Последнее обновление: 2026-03-01*
|
||||
@@ -0,0 +1,188 @@
|
||||
# API документация
|
||||
|
||||
## REST API
|
||||
|
||||
### Базовый URL
|
||||
```
|
||||
GET/POST /api/v1/...
|
||||
```
|
||||
|
||||
### Endpoints
|
||||
|
||||
#### Аутентификация
|
||||
| Метод | Endpoint | Описание |
|
||||
|-------|----------|----------|
|
||||
| POST | `/oauth/token` | Получение JWT токена |
|
||||
| POST | `/api/v1/accounts` | Регистрация |
|
||||
| GET | `/api/v1/accounts/verify_credentials` | Текущий пользователь |
|
||||
|
||||
#### Посты
|
||||
| Метод | Endpoint | Описание |
|
||||
|-------|----------|----------|
|
||||
| GET | `/api/v1/statuses/:id` | Получить пост |
|
||||
| POST | `/api/v1/statuses` | Создать пост |
|
||||
| DELETE | `/api/v1/statuses/:id` | Удалить пост |
|
||||
| POST | `/api/v1/statuses/:id/like` | Лайк |
|
||||
| POST | `/api/v1/statuses/:id/reblog` | Репост |
|
||||
|
||||
#### Ленты
|
||||
| Метод | Endpoint | Описание |
|
||||
|-------|----------|----------|
|
||||
| GET | `/api/v1/timelines/home` | Домашняя лента |
|
||||
| GET | `/api/v1/timelines/public` | Публичная лента |
|
||||
| GET | `/api/v1/accounts/:id/statuses` | Посты пользователя |
|
||||
|
||||
#### Подписки
|
||||
| Метод | Endpoint | Описание |
|
||||
|-------|----------|----------|
|
||||
| GET | `/api/v1/accounts/:id/followers` | Подписчики |
|
||||
| GET | `/api/v1/accounts/:id/following` | Подписки |
|
||||
| POST | `/api/v1/accounts/:id/follow` | Подписаться |
|
||||
| POST | `/api/v1/accounts/:id/unfollow` | Отписаться |
|
||||
|
||||
#### Карма
|
||||
| Метод | Endpoint | Описание |
|
||||
|-------|----------|----------|
|
||||
| GET | `/api/v1/accounts/:id/karma` | Карма пользователя |
|
||||
| GET | `/api/v1/karma/history` | История кармы (текущий пользователь) |
|
||||
|
||||
#### Экспорт
|
||||
| Метод | Endpoint | Описание |
|
||||
|-------|----------|----------|
|
||||
| POST | `/api/v1/export` | Запрос экспорта данных |
|
||||
| GET | `/api/v1/export/:job_id` | Статус экспорта |
|
||||
| GET | `/api/v1/export/:job_id/download` | Скачивание архива |
|
||||
|
||||
---
|
||||
|
||||
## ActivityPub API
|
||||
|
||||
### WebFinger
|
||||
```
|
||||
GET /.well-known/webfinger?resource=acct:{username}@{domain}
|
||||
```
|
||||
|
||||
**Ответ**:
|
||||
```json
|
||||
{
|
||||
"subject": "acct:username@yaru.nixg.ru",
|
||||
"links": [
|
||||
{
|
||||
"rel": "self",
|
||||
"type": "application/activity+json",
|
||||
"href": "https://yaru.nixg.ru/users/username"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Actor (Профиль пользователя)
|
||||
```
|
||||
GET /users/{username}
|
||||
```
|
||||
|
||||
**Ответ** (ActivityPub Actor):
|
||||
```json
|
||||
{
|
||||
"@context": [
|
||||
"https://www.w3.org/ns/activitystreams",
|
||||
"https://w3id.org/security/v1"
|
||||
],
|
||||
"id": "https://yaru.nixg.ru/users/username",
|
||||
"type": "Person",
|
||||
"preferredUsername": "username",
|
||||
"name": "Display Name",
|
||||
"summary": "<p>Bio text</p>",
|
||||
"inbox": "https://yaru.nixg.ru/users/username/inbox",
|
||||
"outbox": "https://yaru.nixg.ru/users/username/outbox",
|
||||
"followers": "https://yaru.nixg.ru/users/username/followers",
|
||||
"following": "https://yaru.nixg.ru/users/username/following",
|
||||
"publicKey": {
|
||||
"id": "https://yaru.nixg.ru/users/username#main-key",
|
||||
"owner": "https://yaru.nixg.ru/users/username",
|
||||
"publicKeyPem": "-----BEGIN PUBLIC KEY-----..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Inbox (Входящие активности)
|
||||
```
|
||||
POST /users/{username}/inbox
|
||||
```
|
||||
|
||||
**Принимаемые активности**:
|
||||
- `Follow` — запрос подписки
|
||||
- `Undo` — отмена подписки/лайка
|
||||
- `Create` — новый пост (от подписчиков)
|
||||
- `Like` — лайк поста
|
||||
- `Announce` — репост
|
||||
|
||||
### Outbox (Исходящие активности)
|
||||
```
|
||||
GET /users/{username}/outbox
|
||||
```
|
||||
|
||||
**Ответ**:
|
||||
```json
|
||||
{
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"id": "https://yaru.nixg.ru/users/username/outbox",
|
||||
"type": "OrderedCollection",
|
||||
"totalItems": 42,
|
||||
"orderedItems": [
|
||||
{
|
||||
"id": "https://yaru.nixg.ru/statuses/123/activity",
|
||||
"type": "Create",
|
||||
"actor": "https://yaru.nixg.ru/users/username",
|
||||
"object": { ... }
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Формат ошибок
|
||||
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"code": "VALIDATION_ERROR",
|
||||
"message": "Поле 'content' не может быть пустым",
|
||||
"details": {
|
||||
"field": "content",
|
||||
"reason": "required"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Коды ошибок
|
||||
| Код | HTTP статус | Описание |
|
||||
|-----|-------------|----------|
|
||||
| `VALIDATION_ERROR` | 400 | Ошибка валидации |
|
||||
| `UNAUTHORIZED` | 401 | Не авторизован |
|
||||
| `FORBIDDEN` | 403 | Нет доступа |
|
||||
| `NOT_FOUND` | 404 | Ресурс не найден |
|
||||
| `RATE_LIMITED` | 429 | Превышен лимит |
|
||||
| `INTERNAL_ERROR` | 500 | Внутренняя ошибка |
|
||||
|
||||
---
|
||||
|
||||
## Rate Limiting
|
||||
|
||||
| Endpoint | Лимит | Окно |
|
||||
|----------|-------|------|
|
||||
| `/api/v1/statuses` | 10 запросов | 1 минута |
|
||||
| `/api/v1/timelines/*` | 60 запросов | 1 минута |
|
||||
| `/oauth/token` | 5 запросов | 1 минута |
|
||||
| `/api/v1/export` | 1 запрос | 1 час |
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для обсуждения
|
||||
|
||||
- [ ] Нужна ли пагинация через cursor или offset?
|
||||
- [ ] Требуется ли версионирование API (`/api/v2/...`)?
|
||||
- [ ] Какие поля включать в ответ при ошибке?
|
||||
- [ ] Нужна ли поддержка GraphQL для сложных запросов?
|
||||
@@ -0,0 +1,130 @@
|
||||
# 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, или оба варианта?
|
||||
- [ ] Нужна ли модерация контента (админ-панель)?
|
||||
@@ -0,0 +1,205 @@
|
||||
# Деплой и инфраструктура
|
||||
|
||||
## Архитектура развёртывания
|
||||
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ Nginx/Traefik │
|
||||
│ (reverse proxy)│
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌──────────────┼──────────────┐
|
||||
│ │ │
|
||||
┌────────▼───────┐ ┌───▼────────┐ ┌───▼────────┐
|
||||
│ FastAPI App │ │ FastAPI │ │ PostgreSQL│
|
||||
│ (instance 1) │ │ (instance 2)│ │ + pgqueue │
|
||||
└────────────────┘ └────────────┘ └────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Docker контейнеризация
|
||||
|
||||
### Структура проекта
|
||||
```
|
||||
yaru.nixg.ru/
|
||||
├── docker-compose.yml # Основной compose для разработки
|
||||
├── docker-compose.prod.yml # Production конфигурация
|
||||
├── Dockerfile # Образ приложения
|
||||
└── docker/
|
||||
├── nginx/
|
||||
└── postgres/
|
||||
```
|
||||
|
||||
### docker-compose.yml (разработка)
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
db:
|
||||
image: postgres:15
|
||||
environment:
|
||||
POSTGRES_DB: yaru
|
||||
POSTGRES_USER: yaru
|
||||
POSTGRES_PASSWORD: yaru_dev
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
|
||||
app:
|
||||
build: .
|
||||
command: uvicorn main:app --reload --host 0.0.0.0
|
||||
volumes:
|
||||
- .:/app
|
||||
environment:
|
||||
DATABASE_URL: postgresql://yaru:yaru_dev@db/yaru
|
||||
depends_on:
|
||||
- db
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "8000:80"
|
||||
volumes:
|
||||
- ./docker/nginx/dev.conf:/etc/nginx/nginx.conf
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Production развёртывание
|
||||
|
||||
### Требования
|
||||
- [ ] VPS с Ubuntu 22.04+ (минимум 2GB RAM, 2 CPU)
|
||||
- [ ] Домен с настроенным DNS
|
||||
- [ ] SSL сертификат (Let's Encrypt)
|
||||
|
||||
### Переменные окружения (production)
|
||||
```bash
|
||||
# База данных
|
||||
DATABASE_URL=postgresql://yaru:***@localhost/yaru_prod
|
||||
DATABASE_POOL_SIZE=20
|
||||
|
||||
# Безопасность
|
||||
SECRET_KEY=***
|
||||
JWT_EXPIRE_HOURS=24
|
||||
|
||||
# Файлы
|
||||
MEDIA_ROOT=/var/yaru/media
|
||||
MAX_UPLOAD_SIZE=50MB
|
||||
|
||||
# Fediverse
|
||||
SERVER_DOMAIN=yaru.nixg.ru
|
||||
SERVER_NAME=YARU
|
||||
|
||||
# Логирование
|
||||
LOG_LEVEL=INFO
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## CI/CD пайплайн
|
||||
|
||||
### GitHub Actions (пример)
|
||||
```yaml
|
||||
name: Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Run tests
|
||||
run: pytest
|
||||
|
||||
deploy:
|
||||
needs: test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy to VPS
|
||||
run: |
|
||||
ssh user@server "cd /var/yaru && docker-compose pull && docker-compose up -d"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Логи
|
||||
- [ ] Access logs (Nginx)
|
||||
- [ ] Application logs (FastAPI → JSON format)
|
||||
- [ ] Database logs (PostgreSQL slow queries)
|
||||
|
||||
### Метрики для мониторинга
|
||||
- [ ] Response time (p50, p95, p99)
|
||||
- [ ] Error rate
|
||||
- [ ] Active users
|
||||
- [ ] Posts per hour
|
||||
- [ ] Federation activities
|
||||
|
||||
### Инструменты
|
||||
- [ ] Prometheus + Grafana (метрики)
|
||||
- [ ] Loki (логи)
|
||||
- [ ] Uptime Kuma (доступность)
|
||||
|
||||
---
|
||||
|
||||
## Резервное копирование
|
||||
|
||||
### Что备份ровать
|
||||
- [ ] PostgreSQL дамп (ежедневно)
|
||||
- [ ] Медиафайлы (ежедневно)
|
||||
- [ ] Конфигурационные файлы
|
||||
|
||||
### Стратегия
|
||||
```bash
|
||||
# Ежедневный бэкап БД
|
||||
pg_dump -U yaru yaru > /backups/yaru_$(date +%Y%m%d).sql
|
||||
|
||||
# Синхронизация медиа
|
||||
rsync -av /var/yaru/media /backups/media/
|
||||
|
||||
# Хранение: 7 дней локально, 30 дней в облаке
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Масштабирование
|
||||
|
||||
### Горизонтальное
|
||||
- [ ] Несколько инстансов FastAPI за load balancer
|
||||
- [ ] PostgreSQL репликация (read replicas)
|
||||
- [ ] CDN для статики и медиа
|
||||
|
||||
### Оптимизация
|
||||
- [ ] Кэширование лент в Redis
|
||||
- [ ] Индексы PostgreSQL для частых запросов
|
||||
- [ ] Фоновая отправка ActivityPub через очереди
|
||||
|
||||
---
|
||||
|
||||
## Чеклист деплоя
|
||||
|
||||
- [ ] Купить домен, настроить DNS
|
||||
- [ ] Подготовить VPS (Ubuntu, firewall, SSH keys)
|
||||
- [ ] Установить Docker + Docker Compose
|
||||
- [ ] Настроить Nginx + SSL (Let's Encrypt)
|
||||
- [ ] Развернуть PostgreSQL
|
||||
- [ ] Запустить FastAPI приложение
|
||||
- [ ] Настроить бэкапы
|
||||
- [ ] Настроить мониторинг
|
||||
- [ ] Протестировать ActivityPub federation
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для обсуждения
|
||||
|
||||
- [ ] Какой хостинг выбрать (Timeweb, Selectel, Hetzner, DigitalOcean)?
|
||||
- [ ] Нужен ли отдельный сервер для БД или всё на одном VPS?
|
||||
- [ ] Использовать ли managed PostgreSQL или свой инстанс?
|
||||
- [ ] Требуется ли CDN для медиа (Cloudflare, BunnyCDN)?
|
||||
@@ -0,0 +1,129 @@
|
||||
# Дизайн документация
|
||||
|
||||
## План раздела
|
||||
|
||||
- [ ] Логотип и фирменный стиль
|
||||
- [ ] Цветовая палитра
|
||||
- [ ] Типографика
|
||||
- [ ] Дизайн-система компонентов
|
||||
- [ ] Макеты основных страниц
|
||||
- [ ] Анимации и переходы
|
||||
|
||||
---
|
||||
|
||||
## Логотип
|
||||
|
||||
### Концепция
|
||||
- **Минимализм** — простой запоминающийся символ
|
||||
- **Адаптивность** — работает с разными подзаголовками
|
||||
- **Fediverse связь** — визуальная ассоциация с федеративными сетями
|
||||
|
||||
### Варианты
|
||||
- [ ] Основной логотип (цветной)
|
||||
- [ ] Монохромная версия
|
||||
- [ ] Иконка для favicon/app
|
||||
- [ ] Версия с подзаголовком (YARU Service/Revolution/Blog/Fediverse)
|
||||
|
||||
---
|
||||
|
||||
## Цветовая палитра
|
||||
|
||||
### Основная (требует утверждения)
|
||||
|
||||
| Цвет | HEX | Использование |
|
||||
|------|-----|---------------|
|
||||
| Primary | `# TBD` | Кнопки, ссылки, акценты |
|
||||
| Secondary | `# TBD` | Вторичные элементы |
|
||||
| Background | `# TBD` | Фон приложения |
|
||||
| Surface | `# TBD` | Карточки, панели |
|
||||
| Text Primary | `# TBD` | Основной текст |
|
||||
| Text Secondary | `# TBD` | Вторичный текст |
|
||||
| Success | `# TBD` | Положительные действия |
|
||||
| Error | `# TBD` | Ошибки |
|
||||
| Warning | `# TBD` | Предупреждения |
|
||||
|
||||
### Тёмная тема
|
||||
- [ ] Определить цвета для тёмной темы
|
||||
- [ ] Автоматическое переключение по системным настройкам
|
||||
|
||||
---
|
||||
|
||||
## Типографика
|
||||
|
||||
### Шрифты (требует выбора)
|
||||
- [ ] Основной шрифт: **TBD** (Inter, Roboto, Open Sans?)
|
||||
- [ ] Моноширинный: **TBD** (Fira Code, JetBrains Mono?)
|
||||
- [ ] Поддержка кириллицы
|
||||
|
||||
### Иерархия
|
||||
```
|
||||
H1 — Заголовки страниц (32px)
|
||||
H2 — Разделы (24px)
|
||||
H3 — Подразделы (20px)
|
||||
Body — Основной текст (16px)
|
||||
Small — Вторичный текст (14px)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Компоненты дизайн-системы
|
||||
|
||||
### Базовые компоненты
|
||||
- [ ] Button (primary, secondary, outline, ghost)
|
||||
- [ ] Input (text, textarea, password)
|
||||
- [ ] Card (пост, профиль)
|
||||
- [ ] Avatar (пользователь)
|
||||
- [ ] Badge (теги, статусы)
|
||||
- [ ] Modal (диалоги)
|
||||
- [ ] Toast (уведомления)
|
||||
- [ ] Spinner (загрузка)
|
||||
- [ ] Dropdown (меню)
|
||||
|
||||
### Специфичные компоненты
|
||||
- [ ] PostCard (пост с контентом, медиа, кармой)
|
||||
- [ ] KarmaCounter (отображение кармы)
|
||||
- [ ] FollowButton (подписка/отписка)
|
||||
- [ ] Timeline (лента постов)
|
||||
- [ ] Composer (создание поста)
|
||||
|
||||
---
|
||||
|
||||
## Макеты страниц
|
||||
|
||||
### Требуемые макеты
|
||||
- [ ] Главная страница (лента)
|
||||
- [ ] Профиль пользователя
|
||||
- [ ] Создание поста
|
||||
- [ ] Настройки
|
||||
- [ ] Страница поста (детальный просмотр)
|
||||
- [ ] Подписки/подписчики
|
||||
- [ ] Поиск
|
||||
- [ ] Landing page (для неавторизованных)
|
||||
|
||||
### Формат макетов
|
||||
- [ ] Figma (предпочтительно)
|
||||
- [ ] Или экспорты в PNG/SVG
|
||||
- [ ] Mobile + Desktop версии
|
||||
|
||||
---
|
||||
|
||||
## Анимации и переходы
|
||||
|
||||
### Микроанимации
|
||||
- [ ] Hover эффекты на кнопках
|
||||
- [ ] Плавное появление постов в ленте
|
||||
- [ ] Анимация лайка/репоста
|
||||
- [ ] Индикатор загрузки
|
||||
|
||||
### Переходы между страницами
|
||||
- [ ] Fade-in/fade-out
|
||||
- [ ] Slide переходы для mobile
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для обсуждения
|
||||
|
||||
- [ ] Есть ли предпочтения по цветовой схеме (тёплая/холодная)?
|
||||
- [ ] Нужен ли готовый UI kit (Material, Chakra) или кастомный дизайн?
|
||||
- [ ] Кто будет делать макеты (самостоятельно или заказывать)?
|
||||
- [ ] Требуется ли brandbook документ?
|
||||
@@ -0,0 +1,94 @@
|
||||
# Frontend документация
|
||||
|
||||
## Стек технологий
|
||||
|
||||
| Компонент | Технология | Примечание |
|
||||
|-----------|------------|------------|
|
||||
| Фреймворк | Svelte 4+ | Проверка достаточности возможностей |
|
||||
| Язык | TypeScript | Строгая типизация |
|
||||
| Сборщик | Vite | Быстрая разработка |
|
||||
| Стили | SCSS + CSS Modules | Или Tailwind CSS |
|
||||
| Состояние | Svelte Stores | Или Zustand-like решение |
|
||||
| Роутинг | SvelteKit | Если нужен SSR |
|
||||
|
||||
---
|
||||
|
||||
## Требования к фронтенду
|
||||
|
||||
### 1. Основные страницы
|
||||
|
||||
- [ ] **Лента (Home)** — посты подписок, бесконечный скролл
|
||||
- [ ] **Публичная лента** — все посты сервера
|
||||
- [ ] **Профиль пользователя** — аватар, био, карма, посты
|
||||
- [ ] **Создание поста** — текстовый редактор + загрузка медиа
|
||||
- [ ] **Пост (детальный просмотр)** — комментарии, лайки, репосты
|
||||
- [ ] **Подписки/Подписчики** — списки пользователей
|
||||
- [ ] **Настройки** — профиль, безопасность, экспорт данных
|
||||
|
||||
### 2. Компоненты интерфейса
|
||||
|
||||
- [ ] `PostCard` — отображение поста (текст, медиа, карма)
|
||||
- [ ] `UserProfile` — карточка пользователя
|
||||
- [ ] `Composer` — форма создания поста
|
||||
- [ ] `Timeline` — лента постов с пагинацией
|
||||
- [ ] `MediaGallery` — галерея изображений/видео
|
||||
- [ ] `KarmaDisplay` — отображение кармы
|
||||
- [ ] `FollowButton` — кнопка подписки/отписки
|
||||
|
||||
### 3. Интеграция с редактором
|
||||
|
||||
**Временно**: Используем готовые решения:
|
||||
- [ ] TipTap — расширяемый WYSIWYG редактор
|
||||
- [ ] Quill — простой редактор с Markdown поддержкой
|
||||
- [ ] Markdown textarea — резервный вариант
|
||||
|
||||
**В будущем**: Интеграция с Chronicle.nixg.ru
|
||||
|
||||
### 4. Управление состоянием
|
||||
|
||||
- [ ] Глобальное состояние: текущий пользователь, настройки
|
||||
- [ ] Кэш постов: оптимистичное обновление UI
|
||||
- [ ] Real-time обновления: WebSocket для новых постов
|
||||
|
||||
### 5. Адаптивный дизайн
|
||||
|
||||
- [ ] Mobile first подход
|
||||
- [ ] Поддержка тёмной темы
|
||||
- [ ] PWA возможности (оффлайн режим, push уведомления)
|
||||
|
||||
### 6. Экспорт данных (UI)
|
||||
|
||||
- [ ] Кнопка "Экспортировать мои данные" в настройках
|
||||
- [ ] Прогресс-бар экспорта
|
||||
- [ ] Скачивание ZIP архива с контентом
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для проверки Svelte
|
||||
|
||||
- [ ] Хватит ли Svelte Stores для сложного состояния (лента + real-time)?
|
||||
- [ ] Нужен ли SSR через SvelteKit для SEO?
|
||||
- [ ] Поддержка WebSocket в Svelte (для live обновлений)?
|
||||
- [ ] Производительность при большом количестве постов в ленте?
|
||||
|
||||
---
|
||||
|
||||
## План разработки фронтенда
|
||||
|
||||
1. [ ] Настройка Svelte + Vite + TypeScript
|
||||
2. [ ] Базовая структура проекта (роуты, layout)
|
||||
3. [ ] Компоненты: PostCard, UserProfile, Timeline
|
||||
4. [ ] Интеграция с REST API бэкенда
|
||||
5. [ ] Страница создания поста (редактор + медиа)
|
||||
6. [ ] Real-time обновления (WebSocket)
|
||||
7. [ ] Экспорт данных (UI + download)
|
||||
8. [ ] Адаптивность + тёмная тема
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для обсуждения
|
||||
|
||||
- [ ] Нужен ли SSR (SvelteKit) или достаточно SPA?
|
||||
- [ ] Какой редактор выбрать для MVP (TipTap/Quill/Markdown)?
|
||||
- [ ] Требуется ли поддержка PWA (оффлайн, push)?
|
||||
- [ ] Нужна ли локализация интерфейса (только русский или мультиязычность)?
|
||||
@@ -0,0 +1,110 @@
|
||||
# Маркетинговая документация
|
||||
|
||||
## Позиционирование проекта
|
||||
|
||||
**YARU** — Yet Another Russian Uncompleted...
|
||||
*Федеративная социальная сеть для тех, кому есть что сказать*
|
||||
|
||||
### УТП (Уникальное Торговое Предложение)
|
||||
|
||||
1. **Без ограничений на длину** — пишите статьи, а не твиты
|
||||
2. **Экспорт данных** — ваш контент всегда принадлежит вам
|
||||
3. **Fediverse совместимость** — общайтесь с пользователями Mastodon
|
||||
4. **Карма вместо лайков** — качественная оценка контента
|
||||
5. **Русскоязычное сообщество** — локальная аудитория
|
||||
|
||||
---
|
||||
|
||||
## Целевая аудитория
|
||||
|
||||
| Сегмент | Описание | Потребности |
|
||||
|---------|----------|-------------|
|
||||
| Блогеры | Авторы длинных постов | Удобный редактор, форматирование |
|
||||
| Мигранты из Twitter | Ищут альтернативу | Fediverse совместимость |
|
||||
| Технические писатели | Документация, статьи | Markdown, экспорт |
|
||||
| Приватные пользователи | Закрытые сообщества | Контроль аудитории |
|
||||
|
||||
---
|
||||
|
||||
## Анализ конкурентов
|
||||
|
||||
### Mastodon
|
||||
| Плюсы | Минусы |
|
||||
|-------|--------|
|
||||
| Большая аудитория | Ограничение 500 символов |
|
||||
| Fediverse совместимость | Нет экспорта данных |
|
||||
| Открытый код | Сложный интерфейс для новичков |
|
||||
|
||||
### Threads (Meta)
|
||||
| Плюсы | Минусы |
|
||||
|-------|--------|
|
||||
| Простота | Закрытая экосистема |
|
||||
| Интеграция с Instagram | Нет федерации |
|
||||
| | Проблемы с приватностью |
|
||||
|
||||
### Bluesky
|
||||
| Плюсы | Минусы |
|
||||
|-------|--------|
|
||||
| AT Protocol | Только английский язык |
|
||||
| Без ограничений | Закрытый доступ (invite) |
|
||||
| | Нет Fediverse совместимости |
|
||||
|
||||
---
|
||||
|
||||
## Сменяемая концепция названия
|
||||
|
||||
**YARU** — базовое название с динамическим подзаголовком:
|
||||
|
||||
- **YARU Service** — акцент на сервис для пользователей
|
||||
- **YARU Revolution** — революция в социальных сетях
|
||||
- **YARU Blog** — платформа для блогинга
|
||||
- **YARU Fediverse** — часть федеративной сети
|
||||
|
||||
*Реализация*: Подзаголовок меняется в заголовке сайта и мета-тегах.
|
||||
|
||||
---
|
||||
|
||||
## Стратегия продвижения
|
||||
|
||||
### Этап 1: Pre-launch
|
||||
- [ ] Создать landing page с описанием проекта
|
||||
- [ ] Собрать email ранних пользователей
|
||||
- [ ] Публикация в тематических Telegram-каналах
|
||||
|
||||
### Этап 2: Launch
|
||||
- [ ] Открыть регистрацию для первых 1000 пользователей
|
||||
- [ ] Публикация на Habr, VC.ru
|
||||
- [ ] Участие в Fediverse сообществах
|
||||
|
||||
### Этап 3: Growth
|
||||
- [ ] Реферальная программа
|
||||
- [ ] Интеграции с другими сервисами
|
||||
- [ ] Партнёрства с блогерами
|
||||
|
||||
---
|
||||
|
||||
## Брендинг
|
||||
|
||||
### Название
|
||||
- **Основное**: YARU
|
||||
- **Расшифровка**: Yet Another Russian Uncompleted...
|
||||
- **Домен**: yaru.nixg.ru (рабочий)
|
||||
|
||||
### Логотип
|
||||
- [ ] Простой, запоминающийся символ
|
||||
- [ ] Адаптация под сменяемые подзаголовки
|
||||
- [ ] Версии: светлая/тёмная, цветная/монохром
|
||||
|
||||
### Цветовая схема
|
||||
- [ ] Основной цвет: ( TBD )
|
||||
- [ ] Акцентные цвета: ( TBD )
|
||||
- [ ] Тёмная тема: ( TBD )
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для обсуждения
|
||||
|
||||
- [ ] Нужно ли регистрировать отдельный домен (yaru.ru, yaru.social)?
|
||||
- [ ] Какой подзаголовок использовать для запуска?
|
||||
- [ ] Требуется ли программа раннего доступа?
|
||||
- [ ] Как работать с модерацией контента (правила сообщества)?
|
||||
Reference in New Issue
Block a user