Да будет Хабр снова торт! Да придут на него статьи о программировании! И да пребудут на нем всегда технические обсуждения. А теперь к делу... Каждый самостоятельно развивающийся программист, рано или поздно сталкивается с тем, что ему нужна облачная база данных для своего проекта. Между тем, ваш проект может быть не денег ради, а души для, друзей, знакомых, небольшой аудитории, и посему платить деньги за настоящее взрослое облачное хранилище данных жалко. Предлагаю вам очень простое в подключении, многократно проверенное мной лично, стабильное и весьма изящное решение этого вопроса. Подойдет, если вы программируете на Kotlin. 

Идея между тем хакерски проста. Опишу ее, лишь для того чтобы объяснить, самостоятельно воспроизводить все эти шаги вам не придется, благодаря разработанной светлыми умами коммьюнити библиотеке. Если вам хочется поскорее попробовать ее, то пропустите следующие объяснения, и сразу переходите в раздел "Как подключить". Итак, концепт

  1. Создаем словарь в куче, с мапингом из произвольного ключа в идентификатор telegram-файла, Map<K, FileId>

  2. Для сохранения произвольной сущности по ключу, сохраняем в словарь ее ключ, а вместо значения кладем идентификатор сериализованного в CBOR файла, сохраненного в telegram-канал.

  3. Для получения любой сущности по ключу, проделываем обратное, получаем ее идентификатор, и десериализуем CBOR из telegram.

  4. Все это можно обернуть в красивый generic, по образцу стандартного Map<K, V>, что и делает разработанная умными людьми библиотека.

  5. У внимательного читателя ранее уже возник вопрос, а где хранится само состояние мапинга из ключей, в идентификаторы? В... telegram-файле в CBOR. Идентификатор нашего keystore в свою очередь пишется прямо в описание канала. При перезапусках, библиотека читает один единственный идентификатор из канала, и загружает в память мапинг. 

  6. Таким образом, вы можете хранить десятки гигабайт в вашем облачном хранилище, с доступом по ключу совершенно не нагружая кучу.

Как подключить?

Вы можете использовать Maven или Gradle. Библиотека залита в репозиторий jitpack. Разберем как это будет выглядеть для Gradle в build.gradle.kts

repositories {
  // ...
  // ...
  // Добавляем репозиторий jitpack
  maven("https://jitpack.io")
}
plugins { 
  // ...
  // ...
  // Добавляем плагин компилятора для сериализации
  kotlin("plugin.serialization") version "2.1.20-Beta2"
}
dependencies {
  // ...
  // ...
  // Добавляем библиотеку
  implementation("com.github.demidko:telegram-storage:2025.02.15)
}

Пример использования в коде (Kotlin)

import com.github.demidko.telegram.TelegramStorage.Constructors.TelegramStorage

// Делаем вашу сущность сериализуемой, 
// именно для этого и нужен был плагин компилятора
@Serializable
data class Person(val name: String, val address: String)

fun main() {
    val token = "Ваш токен бота Telegram"
    val channel = "Ваше @название канала в телеграм" // или ID (long)
    val storage = TelegramStorage<String, Person>(token, channel)

    // Сохраняем сущность в канал
    storage["Special Government Employee"] = Person("Elon Musk", "Texas")

    // Восстановленная Person("Elon Musk", "Texas") из канала
    val p = storage["Special Government Employee"]!!
}

Важные предупреждения

Как видите, все очень просто. Само собой разумеется, но не забывайте, что ваш бот также должен быть администратором в вашем канале, чтобы проделывать подобное. Библиотека строго типизирована. Если вы выбрали типы данных, то при следующем запуске поменять ключ/значение не получится без обнуления всего хранилища. Не меняйте описание канала сгенерированное ботом — это приведет к обнулению облачного хранилища. Разумно использовать отдельный закрытый канал, получая доступ по ID. Так никто извне не сможет посмотреть данные вашего хранилища. Telegram накладывает некоторые ограничения на ботов. В связи с этим не рекомендуется чтобы размер одного отдельного значения превышал 20 мб.

Исходный код

Оригинальный репозиторий библиотеки находится на GitHub: demidko/telegram-storage
Автор позиционирует библиотеку как 

A free NoSQL cloud database in your Telegram channel 

Не ленитесь, поставьте звездочку доброму человеку, он для всех старался бесплатно.

Комментарии (8)


  1. emerald_isle
    17.02.2025 09:44

    Между тем, ваш проект может быть не денег ради, а души для, друзей, знакомых, небольшой аудитории, и посему платить деньги за настоящее взрослое облачное хранилище данных жалко.

    Но зачем, если у многих облачных хостингов есть free tier, которого на это как раз хватает? Главное, бюджет правильно настроить, чтобы не попасть на бабки из-за ошибки в коде или уязвимости...


    1. Manul Автор
      17.02.2025 09:44

      Затем, что в данном решении не нужно указывать данные своей карты, и вообще какие-бы то ни было личные данные, никакого риска. И 1M записей в облаке бесплатно...


  1. ManBitXe
    17.02.2025 09:44

    Очень интересно, благодарю за статью.


  1. Spyman
    17.02.2025 09:44

    Самая большая проблема данного подхода - вероятность остаться полностью без данных в один момент


    1. trap_papa
      17.02.2025 09:44

      Да меня вот тоже это интересует, можно ли как-то эффективно делать резервное копирование? Как вообще это будет сказываться на эффективности, да и получается нет смысла делать бэкап, тогда хранилище уже занимает место) Это не осуждающий комментарий мне интересно, я бы хотел попробовать это, круто очень


    1. Manul Автор
      17.02.2025 09:44

      Как и с любым облаком, впрочем)


  1. qeeveex
    17.02.2025 09:44

    Опять телегу насилуют. Видел уже облачное хранилище на основе телеги.


  1. knight_of_light_1
    17.02.2025 09:44

    Отличное решение, уже использую в своем проекте, автору спасибо