Привет, Хабр.
Наверняка многие об этом задумывались, возможно у кого то эта идея лежит в TODO. У меня она пролежала примерно год, но таки удалось ее реализовать в виде работающего прототипа.
Подробности реализации и ссылка на репозиторий под катом.
Идея создать VFS на базе Telegram появилась во время работы над AudioTubeBot и VideoTubeBot — после того как был найден способ обойти ограничение в 50мб на загрузку файлов для ботов — я изучил исходники Telegram — открыл много интересного. Например скорость загрузки ограничивается большей частью на самом клиенте, а не сервером.
В результате — увеличил скорость загрузки в облако Telegram до ~240мбит/с на сессию (стабильно работает больше года), что в 15 раз превышает скорость официального клиента.
Логичным шагом было использовать неограниченное файловое хранилище с высокой скоростью загрузки в качестве сетевого диска — наверняка многие так и делают, но проблема в том, что клиентами telegram достаточно неудобно пользоваться для поиска и систематизации файлов. Кроме того — существует лимит в 1.5ГБ на размер одного файла.
Для решения этих проблем я сперва решил сделать патч ядра Linux и сделать свою виртуальную файловую систему, которая позволяла бы удобным образом группировать файлы загруженные в Telegram, при этом используя только метаданные.
В процессе изучения вопроса выяснилось что патчить ядро совсем не обязательно т.к. в Linux существует специальный модуль ядра FUSE, который позволяет разработчикам создавать новые типы файловых систем, доступные для монтирования пользователями без привилегий. Для модуля есть обертки почти под все популярные языки.
Для доступа к Telegram я использую библиотеку Telethon версии 0.19.1 с модифицированной мной многопоточной загрузкой файлов(TelegramClientX).
Чтобы не писать с нуля файловую систему — за основу взята dedupfs на python, использующая fuse и sqlite для хранения метаданных, которая разбивает файлы на блоки, считает sha1 хэш и переиспользует одинаковые блоки — нужно всего лишь заменить методы загрузки данных в хранилище на свои.
Объединив это все — получился рабочий прототип tgcloud, пока что без космических скоростей, но все же рабочий, надеюсь привлечь сообщество к разработке. Загружаемые файлы разбиваются на блоки по 10МБ, рассчитывается sha1 и загружаются в SavedMessages, хеш сохраняется в локальной базе данных и при чтении блока по нему находится файл. Блоки склеиваются в нужном порядке и выдается поток байт — будто вы читаете их с диска.
Благодарю за внимание.
как вариант — резать скорость на серверной стороне, ограничивать количество потоков загрузки и т.д. — способов ограничить расход диска достаточно и без «прикрытия лавочки», но даже с порезанной скоростью — наличие дополнительного уровня абстракции над загруженными данными — это тупо удобно, когда можно систематизировать файлы не только в рамках чатов и каналов, а так как удобно пользователю — при этом наоборот — данных загружаться будет меньше за счет переиспользования блоков. Если в текущей системе мне нужно отредактировать текстовый документ загруженный — я его скачиваю, редактирую и загружаю заново, при этом 90% данных дублируют уже загруженные, при использовании же VFS — загружены заново будут только изменившиеся блоки.
То есть для обычных пользователей это в целом — благо, если этим кто то решит воспользоваться чтобы хостить порно — ну с ними как то пусть борются, это ведь философия Telegram — что «даже если этим будут пользоваться небольшое количество людей для плохих дел — это не значит что нужно это все запретить и т.д. и т.п.»
На DEDIC.SH доступны новейшие двухпроцессорные конфигурации выделенных серверов с процессорами Intel Scalable 2019 года:
Стоимость сервера с двумя Xeon Silver 4214 — от 15210 руб/мес
Так же мы готовы собрать для Вас любую конфигурацию — напишите нам!
Если большие мощности выделенного сервера не требуются — VDS от 150 руб/мес — то, что вам нужно!
Наверняка многие об этом задумывались, возможно у кого то эта идея лежит в TODO. У меня она пролежала примерно год, но таки удалось ее реализовать в виде работающего прототипа.
TgCloud:
- Виртуальная файловая система с открытым исходным г****кодом.
- На локальном диске — только метаданные: имена, размер, структура папок и т.д.
- Данные хранятся в Telegram и загружаются только при работе с файлом
- Размер и тип файлов не ограничен, можно использовать с любой ОС
Подробности реализации и ссылка на репозиторий под катом.
Идея
Идея создать VFS на базе Telegram появилась во время работы над AudioTubeBot и VideoTubeBot — после того как был найден способ обойти ограничение в 50мб на загрузку файлов для ботов — я изучил исходники Telegram — открыл много интересного. Например скорость загрузки ограничивается большей частью на самом клиенте, а не сервером.
В результате — увеличил скорость загрузки в облако Telegram до ~240мбит/с на сессию (стабильно работает больше года), что в 15 раз превышает скорость официального клиента.
Логичным шагом было использовать неограниченное файловое хранилище с высокой скоростью загрузки в качестве сетевого диска — наверняка многие так и делают, но проблема в том, что клиентами telegram достаточно неудобно пользоваться для поиска и систематизации файлов. Кроме того — существует лимит в 1.5ГБ на размер одного файла.
FUSE
Для решения этих проблем я сперва решил сделать патч ядра Linux и сделать свою виртуальную файловую систему, которая позволяла бы удобным образом группировать файлы загруженные в Telegram, при этом используя только метаданные.
В процессе изучения вопроса выяснилось что патчить ядро совсем не обязательно т.к. в Linux существует специальный модуль ядра FUSE, который позволяет разработчикам создавать новые типы файловых систем, доступные для монтирования пользователями без привилегий. Для модуля есть обертки почти под все популярные языки.
Telethon
Для доступа к Telegram я использую библиотеку Telethon версии 0.19.1 с модифицированной мной многопоточной загрузкой файлов(TelegramClientX).
VFS
Чтобы не писать с нуля файловую систему — за основу взята dedupfs на python, использующая fuse и sqlite для хранения метаданных, которая разбивает файлы на блоки, считает sha1 хэш и переиспользует одинаковые блоки — нужно всего лишь заменить методы загрузки данных в хранилище на свои.
TgCloud
Объединив это все — получился рабочий прототип tgcloud, пока что без космических скоростей, но все же рабочий, надеюсь привлечь сообщество к разработке. Загружаемые файлы разбиваются на блоки по 10МБ, рассчитывается sha1 и загружаются в SavedMessages, хеш сохраняется в локальной базе данных и при чтении блока по нему находится файл. Блоки склеиваются в нужном порядке и выдается поток байт — будто вы читаете их с диска.
Для запуска кода
- Необходимо получить api_hash и api_id на my.telegram.org и вставить эти данные вместе с номером телефона вашего аккаунта в tg_access.py
- Создать сессию запустив из папки с проектом
python3.6 download_service.py
и введя код подтверждения - Установить
sudo yum install python-fuse
- Создать папку для монтирования
mkdir storage
- Запустить VFS:
с отладкой
python dedupfs/dedupfs.py -df --block-size 10240000 storage/
в фоне
python dedupfs/dedupfs.py --block-size 10240000 storage/
- Можно, например указать эту папку как источник для filebrowser
Благодарю за внимание.
P.S. Про этическую сторону (из комментариев)
как вариант — резать скорость на серверной стороне, ограничивать количество потоков загрузки и т.д. — способов ограничить расход диска достаточно и без «прикрытия лавочки», но даже с порезанной скоростью — наличие дополнительного уровня абстракции над загруженными данными — это тупо удобно, когда можно систематизировать файлы не только в рамках чатов и каналов, а так как удобно пользователю — при этом наоборот — данных загружаться будет меньше за счет переиспользования блоков. Если в текущей системе мне нужно отредактировать текстовый документ загруженный — я его скачиваю, редактирую и загружаю заново, при этом 90% данных дублируют уже загруженные, при использовании же VFS — загружены заново будут только изменившиеся блоки.
То есть для обычных пользователей это в целом — благо, если этим кто то решит воспользоваться чтобы хостить порно — ну с ними как то пусть борются, это ведь философия Telegram — что «даже если этим будут пользоваться небольшое количество людей для плохих дел — это не значит что нужно это все запретить и т.д. и т.п.»
Мой канал в Telegram
Чат для вопросов
Исходники на GitHub
На DEDIC.SH доступны новейшие двухпроцессорные конфигурации выделенных серверов с процессорами Intel Scalable 2019 года:
- 2x Xeon Silver 4214 — суммарно 24 ядра
- 2x Xeon Gold 5218 — суммарно 32 ядра
- 2x Xeon Gold 6240 — конфигурация с 36 ядрами.
Стоимость сервера с двумя Xeon Silver 4214 — от 15210 руб/мес
Так же мы готовы собрать для Вас любую конфигурацию — напишите нам!
Если большие мощности выделенного сервера не требуются — VDS от 150 руб/мес — то, что вам нужно!