EcoMap — O'zbekiston uchun civic-tech mahsulot: fuqaro xaritaga belgi qo'yadi, ekologik buzilish suratlarini biriktiradi va uni hal bo'lgunicha kuzatadi. Telegram orqali kirish, Telegram-bot, "Hal qilishga yordam" tugmasi, admin panel, uch til (ru/uz/en). Men uni yakka o'zim qildim.
Va uni ikki marta qildim.
Birinchi versiya Next.js + Supabase'da taxminan to'rt oyda chiqdi. Ikkinchisi — o'zimning Bun/Elysia/Drizzle monoreposiga to'liq qayta yozish. Quyida — nega men ishlayotgan mahsulotni tashladim, qayta yozish aslida nimaga tushdi va boshqa hamma narsadan ko'proq vaqtimni yegan bitta vazifa haqida.
v1: Supabase meni mahsulotga tez yetkazdi
Birinchi urinish — 51 kommit, avgustdan dekabrgacha — backend birinchi kuni talab qiladigan hamma narsada Supabase'ga tayandi: Postgres, avtorizatsiya, saqlash, row-level security, SDK ham serverda (SSR), ham klientda. Ustiga: TanStack Query, hisobot matnlari uchun Tiptap muharriri, grammY Telegram-boti bilan fon navbati va kiruvchi hisobotlarni kategoriyalash uchun OpenAI orqali o'tkazish.
Bu BaaS foydasiga halol dalil. Menda haqiqiy, ko'p tilli, xarita asosidagi mahsulot avtorizatsiya va bot bilan choraklar emas, haftalarda tayyor bo'ldi. Agar g'oyani tekshirayotgan bo'lsang — bu to'g'ri kelishuv.
Va u ayni paytda ketishimga sabab bo'ladigan narsalarni jimgina to'plab bordi.
Nega men BaaS'dan ketdim
Ularning hech biri "Supabase yomon" degani emas. Bu backend'ing boshqa birovning platformasi ichida yashaganda qiladigan kelishuvning shakli.
- Eng muhim joylardagi lock-in. Avtorizatsiya, saqlash qoidalari va ma'lumot qatlami Supabase idiomalarida ifodalangan edi. Mahsulot qanchalik o'ssa, mantiqimning shunchalik ko'p qismi aynan o'sha platformaga bog'lanib bordi.
- Choklar chetlarida ko'rinadi. Og'iri CRUD emas edi — cross-cutting concern'lar edi: cross-origin sessiyalar, fon ishlari, native rasm qayta ishlash. Aynan o'sha joylarda BaaS eng kam erkinlik beradi.
- Menga yagona type-safe umurtqa kerak edi. Klient va server bir-biridan uzoqlashib, generatsiya qilingan tiplar va so'rov hook'lari bilan yamalgani — muammo bo'lmaguncha yaxshi.
- Almashtiruvchisi allaqachon bor edi. Men bir nechta mahsulotlarim ishlaydigan Bun/Elysia/Next.js monorepo boilerplate'ini (ShipKit) qo'llab-quvvatlayman. Qayta yozish noldan xavf emas — o'zim boshqaradigan va qayta ishlatadigan stekka ko'chish edi.
Shunday qilib v2 platformadan ongli ketish bo'ldi, qayta yozish uchun qayta yozish emas.
v2: men haqiqatan boshqaradigan stek
Ikkinchi versiya — 94 kommit, fevral–mart — Turborepo monoreposi: apps/web, apps/admin, apps/api, apps/jobs va taxminan o'nta umumiy paket. Qismlar:
- API: Bun'dagi Elysia.js, Eden Treaty orqali Next.js klientiga to'liq tiplashtirilgan — codegen'siz, uzilishsiz.
- Ma'lumot: toza PostgreSQL ustidagi Drizzle ORM.
- Avtorizatsiya: Redis sessiya keshi bilan Better Auth.
- Bot: Telegram tomoni uchun grammY (+conversations).
- Media: buzilish suratlarini qayta ishlash uchun sharp.
- Frontend: Next.js 16, React 19, Tailwind v4, shadcn/ui, ru/uz/en uchun next-intl.
O'sha mahsulot — mening primitivlarimda. Mana qayerda qizib ketdi.
Og'irlashgan qism: vebdagi Telegram-avtorizatsiya
Telegram orqali kirish Telegram ichida juda oddiy. Ochiq vebda esa yo'q, va aynan shu yerda men eng ko'p iteratsiya sarfladim, katta farq bilan.
Bot foydalanuvchini autentifikatsiya qiladi va natijani postMessage orqali sahifaga qaytaradi — { event: 'auth_result', result: {...} } payload. Sahifa buni haqiqiy, doimiy sessiyaga aylantirishi kerak. Har bir qiyin muammo o'sha uzatishda yashadi:
- Cross-origin cookie'lar. Sessiya cookie'sini API sahifadan boshqa origin'da o'rnatadi. Uning haqiqatan "yopishishi" uchun klientda
credentials: 'include', cookie'da to'g'riSameSite/secure atributlari va serverda Better Auth'ningsetSessionCookiekerak bo'ldi — va biror narsa ishlashidan oldin uchalasini to'g'rilash kerak edi. NODE_ENVemas,USE_SECURE_COOKIES. Secure-cookie xatti-harakatiniNODE_ENVga bog'lash — klassik tuzoq: lokal HTTPS, staging va prod "development vs production"ga toza mos kelmaydi. Men buni aniq flag'ga ajratdim, shunda cookie xavfsizligi build rejimining nojo'ya ta'siri emas, ongli konfig bo'ldi.- Dublikat foydalanuvchilar. Bitta Telegram-shaxs bir necha bor kelishi mumkin. Bot yaratgan akkauntlarni men sintetik, tekshirilgan email (
telegram_{id}@ecomap.uz) bo'yicha kalitlanaman, shunda qaytgan foydalanuvchi dublikat yaratish o'rniga bitta profilga resolve bo'ladi, va/meda eng so'nggi Telegram-ma'lumotlarniprofilesga sinxronlayman.
Bularning hech biri jozibali emas. Ammo bu aynan BaaS avtorizatsiya moduli yashiradigan narsa — u boshqacha ishlashini xohlagan kuningizgacha, va o'shanda siz vazifa bilan emas, abstraksiya bilan kurashasiz.
Jim g'alabalar
Platformada og'ir, o'z stekimda toza bo'lgan uchta narsa:
- Yagona type-safe umurtqa. Eden Treaty Elysia-API'ni to'g'ridan-to'g'ri klientga eksport qiladi. So'rov va javob shakllarida yagona haqiqat manbai bor; serverdagi refaktor monorepodagi to'rtta ilovada runtime kutilmagan holat emas, tip xatosi bo'lib chiqadi.
- Native rasm qayta ishlash — o'z shartlarimda. sharp — native bog'liqlik, uni ehtiyotkorlik bilan build va deploy qilish kerak: API'ni
--external sharpbilan build qilaman va Bun ostida ishga tushiraman. Runtime'ga egalik buni platforma cheklovi emas, konfig qatoriga aylantirdi. - Fon ishlari HTTP yo'lidan tashqarida. Surat derivativlari, bildirishnomalar va AI-kategoriyalash — so'rovda emas, navbatda bo'lishi kerak. Alohida
apps/jobsxizmati va umumiy jobs paketi ularni systemd ostida qayta ishlaydi, shunda veb qatlam javobgar bo'lib qoladi.
Qayta yozish aslida qanday ketdi
Men 94 kommit migratsiyani qo'lda urganim yo'q. Qayta yozish plan-driven edi: cheklist va progress jadvali bilan docs/migration-plan/TASKS.md, Claude Code orqali bajarilgan — vazifani belgila, jadvalni yangila, keyingisiga o't. Bu men loyihalarim bo'ylab ishlatadigan o'sha strukturaviy, ko'p agentli vorkflow, va fullstack qayta yozish bir necha hafta kechalarga sig'ganining asosiy sababi shu. (Bu pattern haqida alohida yozganman.)
Agar siz BaaS'da bo'lsangiz va migratsiya qilishni hal qilayotgan bo'lsangiz
Men Supabase'ni yulib tashlashni maslahat bermayman. v1 kelishuvi to'g'ri edi — u haqiqiy mahsulotni haqiqiy foydalanuvchilarga tez yetkazdi. Faqat platforma sizga chetlarida qimmatga tusha boshlaganda migratsiya qiling:
- Siz avtorizatsiya/saqlash abstraksiyalaridan foydalanishdan ko'ra ular bilan ko'proq kurashyapsiz.
- Cross-cutting concern'laringizga — sessiyalar, fon jobs, native bog'liqliklar — platforma bermaydigan nazorat kerak.
- Sizda qayta ishlatadigan stek allaqachon bor (yoki asoslay olasiz) — o'shanda qayta yozish bir martalik bo'lib qolmay, to'planib boradi.
EcoMap uchun uchalasi ham rost edi, va migratsiya ruxsat so'ramay kengaytiradigan, boshqariladigan type-safe kod bazasi bilan o'zini oqladi.
EcoMap ecomap.uzda ishlaydi. Agar build yoki BaaS'dan migratsiya rejalashtirayotgan bo'lsangiz — bu aynan men oladigan ish.