Каждый разработчик хотя бы раз мечтал о том, чтобы быстро и безболезненно запустить небольшой проект, не тратя часы на настройку бэкенда. Firebase, Supabase и Pocketbase — отличные решения, но они могут быть слишком тяжёлыми, если вам нужна простота и минимализм. Именно здесь на сцену выходит Pennybase — новый проект, реализованный на языке Go всего за тысячу строк кода, который предлагает полноценный Backend-as-a-Service (BaaS), доступный буквально каждому.
🚀 Почему Pennybase — это круто?
Преимущества Pennybase в первую очередь заключаются в минимализме и отсутствии внешних зависимостей. Всё реализовано стандартными библиотеками Go, а значит, никакой дополнительной конфигурации и разрастания зависимостей. Это подход, который можно назвать «бедным, но честным Firebase»:
- 🗄️ Хранение данных в CSV: Все данные хранятся в обычных CSV-файлах, при этом каждая новая запись просто добавляется в конец файла. Pennybase поддерживает версионность записей, поэтому вы всегда можете откатиться назад или отслеживать изменения.
- 🔑 Авторизация и контроль доступа: Реализована базовая авторизация через session cookies или HTTP Basic Auth, а для управления правами используется простая и понятная ролевая модель (RBAC). Вы можете легко определить, кто и что может делать в системе, редактируя специальный CSV-файл с правами доступа.
- 🔄 Реалтайм-обновления: Система поддерживает Server-Sent Events (SSE), то есть позволяет клиентам получать обновления данных в режиме реального времени.
- 📋 Валидация данных: Pennybase строго следит за корректностью данных через схему, описанную в отдельном CSV-файле. Поддерживаются текстовые поля, числа и списки.
- 📐 HTML-шаблоны и статические файлы: Реализована возможность отдавать клиентам статические файлы и шаблоны HTML, что делает Pennybase ещё и небольшим веб-сервером для простых проектов.
🎯 Как это работает изнутри?
Главная идея Pennybase — использование CSV-файлов в качестве основного хранилища данных. Для ускорения работы используется встроенный в память индекс с ссылками на последние версии записей.
Весь механизм работы выглядит так:
- 📍 Первая колонка CSV-файла всегда хранит уникальный идентификатор записи.
- 🔢 Вторая колонка — номер версии записи.
- 📑 Последующие колонки содержат поля, описанные заранее в схеме.
Например, схема ресурсов хранится в файле _schemas.csv и выглядит примерно так:
s12,1,todo,_id,text,,,^.+$
s13,1,todo,_v,number,1,,
s14,1,todo,description,text,0,0,".+"
s15,1,todo,completed,number,0,1,""
Эта схема определяет поля для ресурса «todo» с текстовым описанием задачи и её состоянием выполнения.
🔧 Как реализована авторизация и безопасность?
Для управления пользователями используется отдельный файл _users.csv. Пароли хранятся в виде SHA-256-хэшей с использованием соли и кодировкой Base32. Например:
admin,1,salt,5V5R4SO4ZIFMXRZUL2EQMT2CJSREI7EMTK7AH2ND3T7BXIDLMNVQ====,"admin"
alice,1,salt,PXHQWNPTZCBORTO5ASIJYVVAINQLQKJSOAQ4UXIAKTR55BU4HGRQ====,
Таким образом, вам не нужно подключать базы данных и сложные системы хранения.
Контроль доступа реализован через _permissions.csv. Каждый ресурс имеет свои правила доступа, которые явно описываются в файле. Например, задачи (todo) могут читать и создавать все авторизованные пользователи, но изменять и удалять их могут только владельцы и администраторы:
p1,1,todo,read,,*,"Все авторизованные пользователи"
p3,1,todo,update,owner,"admin,editor","Только владелец или администраторы"
📡 REST API и реалтайм
Pennybase реализует REST API с базовыми методами CRUD:
- 📥 POST /api/{resource} — создать новую запись.
- 📤 PUT /api/{resource}/{id} — обновить запись.
- 🗑️ DELETE /api/{resource}/{id} — удалить запись.
- 📄 GET /api/{resource} — получить список записей.
- 📄 GET /api/{resource}/{id} — получить конкретную запись.
- ⚡ GET /api/events/{resource} — подписка на обновления ресурса в режиме реального времени.
⚙️ Расширяемость и хуки
Одна из важных особенностей — возможность подключать собственные хуки, чтобы выполнять дополнительные действия или валидацию данных при каждом запросе. Например, можно автоматически добавлять автора записи и дату её создания:
server.Hook = func(trigger, resource string, user pennybase.Resource, res pennybase.Resource) error {
if trigger == "create" && resource == "messages" {
res["author"] = user["_id"]
res["created_at"] = time.Now().UTC().Format(time.RFC3339)
}
return nil
}
🎨 Для кого это решение?
Pennybase идеально подходит:
- 🚀 Для быстрого прототипирования.
- 🎓 Для небольших учебных проектов.
- 🧑💻 Для хакатонов и быстрых MVP.
- 🌐 Для проектов, которым не нужна громоздкая инфраструктура.
На мой взгляд, главная ценность Pennybase — это минимализм и понятность. Разработчики часто переусложняют свои решения, а иногда достаточно лишь простого и надёжного инструмента, который не требует сложной инфраструктуры и десятков зависимостей.
🔥 Личное мнение автора
Pennybase — это напоминание о том, что хорошее решение может быть простым. Меня особенно привлекает идея использовать легко читаемые CSV-файлы вместо сложных баз данных, что упрощает понимание и отладку. Конечно, это не заменит Firebase в крупных приложениях, но в мире MVP и быстрой разработки такой инструмент бесценен.
💡 Легко представить, как Pennybase станет полезным инструментом в арсенале многих начинающих разработчиков и стартапов, экономящих ресурсы и ценящих простоту.
🔗 Ссылки на оригинальную новость: