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).

POST /admin/projects (API orqali loyiha yaratish)
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.

GET - jadvaldan o'qish
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}
]
POST - yangi qator qo'shish
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}
PATCH - qatorni tahrirlash
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}'
DELETE - qatorni o'chirish
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 o'rnatish
npm install @storagedb/client
Client yaratish va SELECT
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, ... }, ...]
INSERT - ma'lumot qo'shish
const { data, error } = await db.from("todos").insert({
  title: "Yangi vazifa",
  done: false
});

if (!error) console.log("Qo'shildi:", data);
Filtrlar va ordering
// Faqat bajarilmagan vazifalarni, keyin ID bo'yicha tartiblash
const { data } = await db
  .from("todos")
  .select("*")
  .eq("done", false)
  .order("id", { ascending: false })
  .limit(10);
UPDATE va DELETE
// 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.

Auth - signup va login (SDK)
// 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
Storage - fayl yuklash (curl)
# 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
Realtime - jadval o'zgarishlarini tinglash (SDK)
// 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();