Telegram Mini App для автоматического кросспостинга из Telegram-каналов в Threads.
- Автоматический кросспостинг — посты из Telegram каналов публикуются в Threads
- AI-трансформации — перевод, добавление хуков, суммаризация через OpenAI
- Гибкие фильтры — пропуск репостов, рекламы, фильтрация по ключевым словам
- Отложенная публикация — настраиваемая задержка перед публикацией
- Медиа поддержка — фото, видео, карусели
- Статистика — история постов и детальная аналитика
- Аватарки — автоматическая загрузка и обновление аватарок каналов и пользователей
Mini App работает прямо в Telegram — доступен как на мобильных устройствах, так и на ПК.
- FastAPI — REST API
- aiogram 3 — Telegram Bot API
- PostgreSQL — основная БД
- SQLAlchemy 2.0 — ORM с async поддержкой
- Alembic — миграции БД
- Redis — кэширование и брокер задач
- Celery — асинхронные задачи (публикация, обновление токенов)
- S3/MinIO — хранение медиафайлов
- OpenAI API — AI-трансформации текста
- React 18 — UI библиотека
- TypeScript — типизация
- Vite — сборка
- shadcn/ui — компоненты
- Tailwind CSS — стили
- TanStack Query — управление состоянием
- Telegram WebApp SDK — интеграция с Telegram
- Docker Compose — оркестрация
- Prometheus — метрики
- Grafana — дашборды
- Sentry — мониторинг ошибок
- GitHub Actions — CI/CD
- Docker + Docker Compose v2
- Node.js 20+ (для локальной разработки frontend)
- Python 3.12+ (для локальной разработки backend)
# Клонируем репозиторий
git clone https://github.com/fozzepe/cross.git
cd cross
# Копируем конфиг окружения
cp env.example .envОтредактируйте .env файл:
# Telegram Bot (получить у @BotFather)
TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_WEBAPP_URL=https://your-domain.com
# Threads/Meta App (https://developers.facebook.com)
THREADS_APP_ID=your_app_id
THREADS_APP_SECRET=your_app_secret
THREADS_REDIRECT_URI=https://your-domain.com/api/v1/oauth/threads/callback
# Ключ шифрования (сгенерировать ниже)
ENCRYPTION_KEY=your_fernet_key
# OpenAI (опционально, для AI-трансформаций)
OPENAI_API_KEY=sk-your-keypython -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"# Запускаем все сервисы
docker compose up -d
# Проверяем статус
docker compose ps
# Смотрим логи
docker compose logs -f backend- Откройте @BotFather в Telegram
- Выберите вашего бота → Bot Settings → Menu Button
- Установите URL вашего Mini App:
https://your-domain.com
- Создайте приложение на Meta for Developers
- Добавьте продукт "Threads API"
- В настройках OAuth добавьте redirect URI:
https://your-domain.com/api/v1/oauth/threads/callback - Скопируйте App ID и App Secret в
.env
Необходимые разрешения:
threads_basicthreads_content_publishthreads_manage_insights
cd backend
# Создаём виртуальное окружение
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# или .venv\Scripts\activate # Windows
# Устанавливаем зависимости
pip install -r requirements.txt -r requirements-dev.txt
# Запускаем миграции
alembic upgrade head
# Запускаем сервер
uvicorn app.main:app --reload --port 8000cd frontend
# Устанавливаем зависимости
npm install
# Запускаем dev сервер
npm run devcd backend
celery -A app.tasks.celery_app worker --loglevel=infocd backend
celery -A app.tasks.celery_app beat --loglevel=info| Метод | Путь | Описание |
|---|---|---|
| GET | /health |
Базовый health check |
| GET | /health/ready |
Readiness check (БД, Redis) |
| GET | /health/live |
Liveness check |
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/profile/me |
Профиль текущего пользователя |
| GET | /api/v1/profile/me/photo |
Аватарка пользователя |
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/channels |
Список каналов пользователя |
| GET | /api/v1/channels/{id} |
Канал по ID |
| GET | /api/v1/channels/{id}/photo |
Аватарка канала |
| PATCH | /api/v1/channels/{id} |
Обновление канала |
| DELETE | /api/v1/channels/{id} |
Удаление канала |
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/accounts |
Список Threads аккаунтов |
| GET | /api/v1/accounts/{id} |
Аккаунт по ID |
| PATCH | /api/v1/accounts/{id} |
Обновление аккаунта |
| DELETE | /api/v1/accounts/{id} |
Удаление аккаунта |
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/flows |
Список потоков кросспостинга |
| POST | /api/v1/flows |
Создание потока |
| GET | /api/v1/flows/{id} |
Поток по ID |
| PATCH | /api/v1/flows/{id} |
Обновление потока |
| DELETE | /api/v1/flows/{id} |
Удаление потока |
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/posts |
История постов |
| GET | /api/v1/posts/stats |
Статистика |
| GET | /api/v1/posts/{id} |
Детали поста |
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/oauth/threads/authorize |
Начало OAuth flow |
| GET | /api/v1/oauth/threads/callback |
Callback после авторизации |
crossposta/
├── backend/
│ ├── app/
│ │ ├── api/ # FastAPI роуты
│ │ │ ├── channels.py # Управление каналами
│ │ │ ├── accounts.py # Threads аккаунты
│ │ │ ├── flows.py # Потоки кросспостинга
│ │ │ ├── posts.py # История постов
│ │ │ ├── profile.py # Профиль пользователя
│ │ │ ├── oauth.py # OAuth Threads
│ │ │ └── deps.py # Зависимости (auth)
│ │ ├── bot/ # Telegram бот
│ │ │ ├── handlers.py # Обработчики команд
│ │ │ └── middlewares.py
│ │ ├── core/ # Ядро приложения
│ │ │ ├── config.py # Настройки
│ │ │ ├── database.py # Подключение к БД
│ │ │ └── security.py # Шифрование
│ │ ├── integrations/ # Внешние сервисы
│ │ │ ├── threads/ # Threads API
│ │ │ └── openai/ # OpenAI API
│ │ ├── models/ # SQLAlchemy модели
│ │ ├── services/ # Бизнес-логика
│ │ │ ├── media_service.py # Работа с медиа
│ │ │ └── post_service.py # Публикация постов
│ │ └── tasks/ # Celery задачи
│ │ ├── publish_task.py # Публикация в Threads
│ │ ├── refresh_tokens.py # Обновление токенов
│ │ └── update_channel_photos.py
│ ├── alembic/ # Миграции БД
│ └── tests/
├── frontend/
│ ├── src/
│ │ ├── components/ # React компоненты
│ │ │ ├── ui/ # shadcn/ui компоненты
│ │ │ ├── common/ # Layout, ErrorBoundary
│ │ │ └── flows/ # Компоненты потоков
│ │ ├── hooks/ # Custom hooks
│ │ │ ├── useChannels.ts
│ │ │ ├── useAccounts.ts
│ │ │ ├── useFlows.ts
│ │ │ └── useTelegram.ts
│ │ ├── pages/ # Страницы приложения
│ │ └── types/ # TypeScript типы
│ └── index.html
├── docker/
│ ├── grafana/ # Grafana дашборды
│ └── prometheus/ # Prometheus конфиг
├── .github/workflows/ # CI/CD
├── docker-compose.yml
└── env.example
Доступны на /metrics:
http_requests_total— количество HTTP запросовhttp_request_duration_seconds— время ответаposts_published_total— опубликованные постыposts_failed_total— ошибки публикации
Дашборд доступен на http://localhost:3000 (admin/admin).
Включает:
- Статус сервисов
- Количество постов
- Время ответа API
- Ошибки
# Backend
cd backend
ruff check .
ruff format .
mypy app/
# Frontend
cd frontend
npm run lint
npm run type-check# Backend
cd backend
pytest
# С покрытием
pytest --cov=app --cov-report=htmlcd backend
# Создать миграцию
alembic revision --autogenerate -m "description"
# Применить миграции
alembic upgrade head
# Откатить последнюю
alembic downgrade -1# Используйте production compose файл
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d# Обязательно установите
DEBUG=false
SECRET_KEY=strong-random-key
SENTRY_DSN=your-sentry-dsn
# CORS и домены
CORS_ORIGINS=https://your-domain.com
TELEGRAM_WEBAPP_URL=https://your-domain.com- Убедитесь что бот добавлен как администратор канала
- Бот должен иметь право "Post Messages"
- Проверьте логи:
docker compose logs -f backend
- Проверьте что redirect URI совпадает с настройками в Meta
- Приложение должно быть в режиме "Live" для production
- Проверьте что добавлены все необходимые разрешения
- Проверьте настройки S3/MinIO в
.env - Убедитесь что bucket создан и доступен
- Проверьте CORS настройки MinIO
MIT