Привет, Хабр.
Наверняка многие об этом задумывались, возможно у кого то эта идея лежит в TODO. У меня она пролежала примерно год, но таки удалось ее реализовать в виде работающего прототипа.
Подробности реализации и ссылка на репозиторий под катом.
![](https://habrastorage.org/webt/nr/0-/mp/nr0-mpe-hiysnb52h67gxnlsbe0.gif)
Идея создать VFS на базе Telegram появилась во время работы над AudioTubeBot и VideoTubeBot — после того как был найден способ обойти ограничение в 50мб на загрузку файлов для ботов — я изучил исходники Telegram — открыл много интересного. Например скорость загрузки ограничивается большей частью на самом клиенте, а не сервером.
В результате — увеличил скорость загрузки в облако Telegram до ~240мбит/с на сессию (стабильно работает больше года), что в 15 раз превышает скорость официального клиента.
Логичным шагом было использовать неограниченное файловое хранилище с высокой скоростью загрузки в качестве сетевого диска — наверняка многие так и делают, но проблема в том, что клиентами telegram достаточно неудобно пользоваться для поиска и систематизации файлов. Кроме того — существует лимит в 1.5ГБ на размер одного файла.
Для решения этих проблем я сперва решил сделать патч ядра Linux и сделать свою виртуальную файловую систему, которая позволяла бы удобным образом группировать файлы загруженные в Telegram, при этом используя только метаданные.
В процессе изучения вопроса выяснилось что патчить ядро совсем не обязательно т.к. в Linux существует специальный модуль ядра FUSE, который позволяет разработчикам создавать новые типы файловых систем, доступные для монтирования пользователями без привилегий. Для модуля есть обертки почти под все популярные языки.
![](https://habrastorage.org/r/w1560/webt/ug/tx/8v/ugtx8vbaf65so_lja5cqvwguh7k.png)
Для доступа к 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 и загружаются только при работе с файлом
- Размер и тип файлов не ограничен, можно использовать с любой ОС
Подробности реализации и ссылка на репозиторий под катом.
![](https://habrastorage.org/webt/nr/0-/mp/nr0-mpe-hiysnb52h67gxnlsbe0.gif)
Идея
Идея создать VFS на базе Telegram появилась во время работы над AudioTubeBot и VideoTubeBot — после того как был найден способ обойти ограничение в 50мб на загрузку файлов для ботов — я изучил исходники Telegram — открыл много интересного. Например скорость загрузки ограничивается большей частью на самом клиенте, а не сервером.
В результате — увеличил скорость загрузки в облако Telegram до ~240мбит/с на сессию (стабильно работает больше года), что в 15 раз превышает скорость официального клиента.
Логичным шагом было использовать неограниченное файловое хранилище с высокой скоростью загрузки в качестве сетевого диска — наверняка многие так и делают, но проблема в том, что клиентами telegram достаточно неудобно пользоваться для поиска и систематизации файлов. Кроме того — существует лимит в 1.5ГБ на размер одного файла.
FUSE
Для решения этих проблем я сперва решил сделать патч ядра Linux и сделать свою виртуальную файловую систему, которая позволяла бы удобным образом группировать файлы загруженные в Telegram, при этом используя только метаданные.
В процессе изучения вопроса выяснилось что патчить ядро совсем не обязательно т.к. в Linux существует специальный модуль ядра FUSE, который позволяет разработчикам создавать новые типы файловых систем, доступные для монтирования пользователями без привилегий. Для модуля есть обертки почти под все популярные языки.
![](https://habrastorage.org/webt/ug/tx/8v/ugtx8vbaf65so_lja5cqvwguh7k.png)
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 руб/мес — то, что вам нужно!