Boshlash
storagedb nima ekanini, loyiha qanday yaratilishini, API bilan qanday ishlanishini o'rganib oling. Self-hosted Supabase muqobili — Postgres, REST API, Auth, Storage, Realtime va Dashboard.
storagedb nima?
storagedb — noldan yozilgan, self-hosted Supabase muqobili. Bitta serverda ko'p loyihaga xizmat qiladi: har loyiha alohida Postgres bazasida joylashadi. Siz faqat VPS puli to'lasiz, bulutga obuna puli yo'q.
Asosiy xususiyatlar:
- Multi-tenancy: har loyiha = kuchli izolyatsiya bilan alohida proj_<ref> bazasi
- REST API: avtomatik CRUD, filtrlar, RLS (Row Level Security)
- Auth: signup/login/JWT/password reset
- Storage: fayl saqlash, public/private access, signed URL
- Realtime: WebSocket orqali jadval o'zgarishlarini tinglash
- Dashboard (Studio): Next.js'da yozilgan, loyihalar, jadvallar, foydalanuvchilar boshqarish
Loyiha yaratish
storagedb'da loyiha yaratishning ikki yo'li bor: Dashboard orqali yoki API orqali.
API orqali loyiha yaratganda, server sizga anon_key (ommaviy, RLS qo'llaniladi) va service_key (maxfiy, RLS chetlab o'tadi) qaytaradi. Bu kalitlarni xavfsiz saqlang — ularni yo'qotib qo'ysangiz, x-admin-token yoki login bilan API'ga murojaat qilib yangi kalitlarni oling.
Loyiha yaratilgandan so'ng, uning API URL'i https://storage.identify.uz/v1/<REF> bo'ladi (BASE = https://storage.identify.uz).
curl -X POST https://storage.identify.uz/admin/projects \
-H 'Content-Type: application/json' \
-H 'x-admin-token: <ADMIN_TOKEN>' \
-d '{"name":"Mening app'm"}'
# Javob:
{
"ref": "proj_abc123xyz",
"name": "Mening app'm",
"anon_key": "eyJhbGc...",
"service_key": "eyJhbGc...",
"api_url": "/v1/proj_abc123xyz"
}API URL va kalitlar
Har loyihaning API URL'i: https://storage.identify.uz/v1/<REF>
Bu URL'ni API sarlavhalarida amal qilish uchun:
- apikey sarlavhasida kalit yuboring (curl: -H "apikey: <KEY>")
- SDK'da client yaratganda URL va kalit bilan initialize qiling
anon_key va service_key farqi:
- anon_key: ommaviy kalit, client-side ishlatiladi, RLS siyosatlari qo'llaniladi (faqat o'zining ma'lumotlarini ko'radi)
- service_key: maxfiy kalit, backend'da ishlatiladi, RLS chetlab o'tadi (admin operatsiyalari uchun)
Birinchi so'rov: curl bilan REST API
Loyihada jadval yaratganingizdan so'ng, REST API orqali ma'lumot olish oson:
REST so'rovlari PostgREST uslubida: GET/POST/PATCH/DELETE.
Filtrlar: ?column=eq.value (teng), gt (katta), lt (kichik), like (mos), in.(a,b) (ro'yxatda) va boshqalar.
RLS avtomatik qo'llaniladi — anon_key bilan so'rov qilsangiz, faqat o'zining ma'lumotlarini olasiz.
curl "https://storage.identify.uz/v1/proj_abc123xyz/rest/v1/todos?select=id,title,done" \
-H "apikey: <ANON_KEY>"
# Javob:
[
{"id": 1, "title": "Dars o'qish", "done": false},
{"id": 2, "title": "Kod yozish", "done": true}
]curl -X POST "https://storage.identify.uz/v1/proj_abc123xyz/rest/v1/todos" \
-H "apikey: <SERVICE_KEY>" \
-H 'Content-Type: application/json' \
-d '{"title":"Shoppingga borish","done":false}'
# Javob: yoyilgan qator
{"id": 3, "title": "Shoppingga borish", "done": false}curl -X PATCH "https://storage.identify.uz/v1/proj_abc123xyz/rest/v1/todos?id=eq.1" \
-H "apikey: <ANON_KEY>" \
-H 'Content-Type: application/json' \
-d '{"done":true}'curl -X DELETE "https://storage.identify.uz/v1/proj_abc123xyz/rest/v1/todos?id=eq.1" \ -H "apikey: <ANON_KEY>"
SDK o'rnatish va ishlatish
Node.js, React, Vue yoki har qanday JavaScript muhitida, @storagedb/client SDK'ni o'rnatib ishlatishingiz mumkin.
SDK supabase-js'ga o'xshaydi — createClient(apiUrl, apiKey) bilan client yaratib, from(), insert(), select() va h.k. metodlardan foydalanasiz.
SDK shuningdek authentication, storage, realtime va RPC (Postgres funksiyalari) imkoniyatlarini taqdim etadi.
npm install @storagedb/client
import { createClient } from "@storagedb/client";
const db = createClient(
"https://storage.identify.uz/v1/proj_abc123xyz",
"<ANON_KEY>"
);
// Jadvaldagi barcha qatorlarni olish
const { data, error } = await db.from("todos").select("*");
if (error) console.error(error);
else console.log(data); // [{ id: 1, ... }, ...]const { data, error } = await db.from("todos").insert({
title: "Yangi vazifa",
done: false
});
if (!error) console.log("Qo'shildi:", data);// Faqat bajarilmagan vazifalarni, keyin ID bo'yicha tartiblash
const { data } = await db
.from("todos")
.select("*")
.eq("done", false)
.order("id", { ascending: false })
.limit(10);// Yangilash
await db.from("todos")
.update({ done: true })
.eq("id", 1);
// O'chirish
await db.from("todos")
.delete()
.eq("id", 1);Auth, Storage, Realtime — qisqa namunalar
storagedb faqat REST API bilan cheklanmaydi. Shuningdek authentication, fayl saqlash va real-time o'zgarish notifikatsiyalarini ta'minlaydi.
AUTH: foydalanuvchilar ro'yxatdan o'tadi, login qiladi, JWT token oladi. RLS qaidalar auth.uid() yordamida aniqlanadi.
STORAGE: fayllar saqlash, public/private access, signed URL (vaqtli havola).
REALTIME: WebSocket orqali jadval o'zgarishlarini real vaqtda tinglash.
// Ro'yxatdan o'tish
const { data, error } = await db.auth.signUp({
email: "user@example.com",
password: "secure123"
});
// Login
const { data: session } = await db.auth.signInWithPassword({
email: "user@example.com",
password: "secure123"
});
// session.access_token — keyingi so'rovlarda ishlating# Avval bucket yarating
curl -X POST "https://storage.identify.uz/v1/proj_abc123xyz/storage/v1/bucket" \
-H "apikey: <SERVICE_KEY>" \
-H 'Content-Type: application/json' \
-d '{"id":"rasmlar","public":true}'
# Keyin fayl yuboring
curl -X POST "https://storage.identify.uz/v1/proj_abc123xyz/storage/v1/object/rasmlar/mening-rasm.jpg" \
-H "apikey: <SERVICE_KEY>" \
--data-binary @mening-rasm.jpg
# Public URL: https://storage.identify.uz/v1/proj_abc123xyz/storage/v1/public/rasmlar/mening-rasm.jpg// Kanal yaratib, INSERT hodisalarini obuna qiling
const channel = db.channel("todos")
.on("INSERT", (payload) => {
console.log("Yangi vazifa:", payload.record);
})
.on("UPDATE", (payload) => {
console.log("Yangilandi:", payload.record);
})
.subscribe();
// So'rovning oxiridagi olib tashlash uchun
await channel.unsubscribe();