Переносите посты из VK в Telegram через современную админку, с шифрованием токенов, историей переносов и простым файловым хранилищем без SQL-базы.
- Мониторинг нескольких сообществ VK из одной админки
- Перенос текста, фото, документов, ссылок, музыки и доступных видео-вложений в Telegram
- Настройка того, что именно переносить, отдельно для каждого источника
- Поддержка открытых стен и постов подписчиков
- Защита от повторной отправки уже обработанных постов
- История переносов со статусами, попытками и подробными ошибками
- Просмотр и очистка кэша вложений из интерфейса
- Автоматическая очистка кэша после успешной отправки
- Настройка proxy через админку
- Ручной запуск проверки, очистка очереди и просмотр логов без доступа к серверу
- Backend: FastAPI
- Frontend: React + Vite + TypeScript
- Хранилище: JSON / JSONL
- Обработка медиа:
ffmpeg - Авторизация: session auth для админки, HTTP Basic для API
- Секреты: локальное шифрование при хранении
В React-админке есть следующие разделы:
- Дашборд
- Источники
- Переносы
- Кэш
- Логи
- Настройки
Типовой сценарий использования:
- Войти в админку
- Добавить источник VK
- Выбрать, что именно переносить из постов
- Указать Telegram-назначение и токены интеграций
- Запустить проверку вручную или оставить polling-воркер работать по расписанию
- При необходимости посмотреть историю, логи и кэш
Для каждого источника можно отдельно выбрать, что именно переносить:
- текст
- картинки
- видео
- музыку
- документы
- ссылки
Дополнительно можно включать и выключать:
- подпись источника
- ссылку на оригинальный пост
- дату оригинальной публикации
- репосты
- посты подписчиков на открытой стене
Это позволяет использовать один сервис сразу для нескольких Telegram-каналов с разными правилами публикации.
git clone https://github.com/lukinism/VK2TG.git
cd VK2TGcp .env.example .envМинимальный пример:
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin
ADMIN_PASSWORD_HASH=
SESSION_SECRET=change-me-please
POLL_INTERVAL_SECONDS=300
RETRY_LIMIT=3
FFMPEG_BINARY=ffmpeg
DATA_DIR=data
CACHE_DIR=data/cache
LOG_LEVEL=INFOpy -3.14 -m venv .venv
.venv\Scripts\activate
python -m pip install --upgrade pip
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000 --reloadУстановите Python 3.14, venv и ffmpeg, затем:
python3.14 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000Если ffmpeg ещё не установлен:
sudo apt-get update
sudo apt-get install -y ffmpegАдминка лежит в каталоге frontend/.
Сначала запустите backend, затем во frontend:
cd frontend
npm install
npm run devОткрывать:
Vite автоматически проксирует /api на FastAPI на порту 8000.
cd frontend
npm install
npm run buildПосле сборки FastAPI сам начнёт отдавать фронтенд по адресу:
После старта приложения:
- Откройте админку
- Войдите с логином и паролем из
.env - Перейдите в
Настройки - Укажите:
VK tokenTelegram bot tokenTelegram proxy, если Telegram в вашей стране недоступен напрямуюFFmpeg binary, если нужен нестандартный путь
После этого можно добавлять источники и запускать перенос.
Маршрут GET /api/health открыт для проверки доступности.
Остальные API-методы требуют:
- активную админскую сессию
- или HTTP Basic авторизацию с логином и паролем администратора
Для запросов из браузерной сессии, которые меняют состояние, также нужен заголовок X-CSRF-Token.
Основные маршруты:
GET /api/auth/sessionPOST /api/auth/loginPOST /api/auth/logoutGET /api/dashboardGET /api/sourcesPOST /api/sourcesPUT /api/sources/{source_id}DELETE /api/sources/{source_id}GET /api/transfersGET /api/transfers/{transfer_id}GET /api/logsGET /api/cachePOST /api/cache/clearGET /api/settings/viewPUT /api/settings/viewPOST /api/worker/runPOST /api/worker/clear-queue
Проект специально не использует SQL-базу в core-MVP.
Это даёт несколько преимуществ:
- состояние легко читать прямо с диска
- резервное копирование и перенос между машинами проще
- деплой не зависит от отдельной БД
Ключевые файлы:
data/settings.jsondata/sources.jsondata/transfers/index.jsonldata/transfers/<id>.jsondata/logs/service.jsonldata/state/runtime.jsondata/state/tokens.keydata/cache/
- Не каждое видео VK можно скачать через доступные ответы API
- Для Telegram в некоторых регионах может потребоваться proxy
- Файловое хранилище выбрано осознанно, но для очень больших инсталляций со временем может понадобиться SQL
- Повторный запуск конкретного неуспешного переноса
- Проверка токенов и proxy прямо из
Настроек - Более умная очередь и управление расписанием
- Улучшенные фильтры и экспорт логов
- Поддержка альтернативных backend-хранилищ
Идеи, баг-репорты и улучшения приветствуются.
Если создаёте issue, очень помогает приложить:
- какой источник использовался
- какой тип вложения не сработал
- был ли включён proxy для Telegram
- статус переноса или фрагмент логов
Проект распространяется под лицензией MIT. Полный текст находится в файле LICENSE.
Проект особенно удобен, если вам нужен:
- self-hosted сервис
VK -> Telegram - внятный интерфейс управления, а не набор скриптов
- развёртывание без PostgreSQL и лишней инфраструктуры
- система, в которой можно быстро понять, почему именно интеграция не сработала
Если это похоже на ваш сценарий, репозиторий как раз про это.