Продакшн-готовый Telegram-бот для управления объектным хранилищем Cloudflare R2
Загружайте, организовывайте и управляйте файлами прямо из Telegram без веб-интерфейса.
Radian безопасный, полнофункциональный Telegram-бот, предоставляющий полные возможности управления объектным хранилищем через интуитивный чат-интерфейс. Создан для продакшн-окружений с комплексными средствами безопасности, поддержкой нескольких бакетов и корпоративной надёжностью.
- Загрузка Отправляйте любые файлы, фото, видео, аудио или документы в ваш R2-бакет
- Произвольные имена Переименовывайте файлы перед загрузкой (расширения сохраняются автоматически)
- Ссылки для копирования Автоматически генерируемые markdown-ссылки после каждой загрузки
- Просмотр Список всех файлов с размером и датой изменения
- Просмотр Генерация подписанных или кастомных URL для любого файла
- Метаданные Просмотр полной информации о файле (размер, MIME-тип, ETag, временные метки)
- Переименование Переименование файла на месте (атомарная операция копирования-удаления)
- Перемещение Бесшовный перенос файлов между бакетами
- Поиск Поиск по подстроке без учёта регистра
- Удаление одного Удаление файла с подтверждением
- Массовое удаление Интерфейс множественного выбора для удаления с параллельной обработкой
- Очистка бакета Полная очистка бакета с пагинацией (работает с большими бакетами)
- Статистика по бакетам Количество файлов, общий размер, средний размер, топ-5 largest файлов
- Глобальный обзор Агрегированная статистика по всем настроенным бакетам
- Бакет по умолчанию Пропуск экрана выбора для часто используемых бакетов
- Несколько бакетов Неограниченная конфигурация бакетов с inline-выбором
- Управление сессиями Отмена любой операции и мгновенная очистка состояния
- Меню команд Все команды зарегистрированы в нативном меню Telegram
- Контроль доступа Аутентификация на основе белого списка
- Санитизация путей Защита от атак обхода директорий
- Ограничения размера Принудительные ограничения загрузки
- TTL сессии Автоматическая очистка устаревших сессий (10 минут)
- Валидация бакетов Проверка белого списка при каждом callback
- Валидация при запуске Бот отказывается запускаться с неполной конфигурацией
- Постоянные сессии Сессии сохраняются на диск и переживают перезапуск процесса
- Ограничение частоты Ограничение запросов на пользователя предотвращает злоупотребление API
- Аудит логирование Полный журнал аудита всех действий пользователей с ежедневной ротацией
- Параллельная обработка Массовые операции выполняются параллельно для оптимальной производительности
- Bun runtime
- Аккаунт Cloudflare с включённым R2
- Токен Telegram-бота от @BotFather
git clone https://github.com/pimatis/radian.git
cd radian
bun installcp .env.example .envОтредактируйте .env с вашими данными:
TELEGRAM_BOT_TOKEN=ваш_токен_бота
CF_ACCOUNT_ID=ваш_id_аккаунта_cloudflare
CF_ACCESS_KEY_ID=ваш_r2_access_key
CF_SECRET_ACCESS_KEY=ваш_r2_secret_key
CF_BUCKET_NAMES=мой-бакет,другой-бакет
ALLOWED_TELEGRAM_USER_IDS=123456789Как найти ваш Telegram ID: Напишите @userinfobot
Создание R2 API-ключей: Cloudflare Dashboard → R2 → Manage R2 API Tokens → Create API Token (требуются права Object Read & Write)
bun startРежим разработки с автоперезагрузкой:
bun devНастройка публичных доменов для URL бакетов:
CF_BUCKET_DOMAINS=мой-бакет=https://files.example.com,другой-бакет=https://media.example.comПри настройке все сгенерированные ссылки используют публичные URL вместо временных подписанных URL.
Сессии по умолчанию сохраняются в ./data/sessions/. Вы можете настроить расположение хранилища:
SESSIONS_DIR=/path/to/custom/sessionsСессии переживают перезапуск процесса и автоматически очищаются после истечения 10-минутного TTL.
Предотвратите злоупотребление API с помощью ограничения запросов на пользователя:
RATE_LIMIT_WINDOW_MS=60000 # Временное окно в миллисекундах (по умолчанию: 1 минута)
RATE_LIMIT_MAX_REQUESTS=30 # Максимум запросов за окно (по умолчанию: 30)Все действия пользователей логируются для соответствия требованиям и мониторинга безопасности:
AUDIT_ENABLED=true # Включить/отключить аудит логирование (по умолчанию: true)
AUDIT_LOGS_DIR=./data/audit # Директория для аудит логовЛоги ротируются ежедневно в формате: audit-ГГГГ-ММ-ДД.log. Каждая запись включает:
- ID пользователя и имя пользователя
- Выполненное действие (загрузка, удаление, переименование и т.д.)
- Целевой бакет и ключ файла
- Метку времени и статус
MAX_FILE_SIZE_BYTES=52428800 # Максимальный размер загрузки (по умолчанию: 50MB)
PRESIGNED_URL_EXPIRY=3600 # Срок действия подписанного URL в секундах (по умолчанию: 1 час)Используйте PM2 или аналогичный менеджер процессов для продакшна:
# Установите PM2 глобально
npm install -g pm2
# Запустите с PM2
pm2 start index.ts --name radian --interpreter bun
# Включите автоматический перезапуск при сбое
pm2 startup
pm2 saveFROM oven/bun:latest
WORKDIR /app
COPY . .
RUN bun install
CMD ["bun", "start"]Соберите и запустите:
docker build -t radian .
docker run -d --env-file .env -v ./data:/app/data radianБот хранит три типа данных в директории ./data/:
sessions/- Активные сессии пользователей (переживают перезапуски)ratelimits/- Отслеживание ограничений частотыaudit/- Ежедневные аудит логи
Важно: Смонтируйте постоянный том для директории ./data при использовании Docker или облачных развёртываний, чтобы сохранить сессии и логи между перезапусками.
MIT License. См. файл LICENSE.
