Asosiy qismga o‘tish
← Barcha ishlar

Tong Yulduzi

Respublika bolalar va o‘smirlar gazetasi bosma nashrini onlaynga chiqardi. Men uni bo‘sh bazadan ishlab turgan mahsulotgacha olib bordim, so‘ng o‘zi mustaqil yuritayotgan tahririyatga topshirdim.

Vaziyat

«Tong Yulduzi» — O‘zbekistondagi bolalar va o‘smirlar uchun respublika gazetasi. Gazetaning o‘zi qog‘ozda chiqaveradi. Yo‘q bo‘lgan narsa — onlayn yarmi: o‘quvchi maqolani topadigan joy, chop etilgan sonlar arxivi yashaydigan joy va jurnalistlar haqiqatan ishlaydigan joy.

Ya’ni vazifa — bitta bazani bo‘lishadigan ikkita mahsulot. Tez bo‘lishi va yiqilmasligi shart bo‘lgan ommaviy sayt, va tahririyat yozadigan, tahrirlaydigan, rejaga qo‘yadigan va nashr etadigan muharrirlik vositasi. Ikkalasini ham, ostidagi deployni ham men qildim.

Sxema

Backend — PostgreSQL ustida FastAPI, SQLAlchemy modellari va Alembic migratsiyalari. Sxema yangiliklar, turkumlar, foydalanuvchilar, media, galereyalar, teglar va gazeta sonlarini saqlaydi; bitta maqola ko‘p rasm va ko‘p tegga ega bo‘lishiga imkon beradigan bog‘lovchi jadvallar bilan.

Qolganidan ko‘ra muhimroq bo‘lgan bir necha qaror:

  • Maqola matni HTML emas, JSONB sifatida saqlanadi. Tuzilmali kontent
  • Son — to‘laqonli obyekt. Bosma gazetaning nashrlari bor, shuning uchun arxiv
  • Rollar kam. Muallif, muharrir va administrator — chunki tahririyatda aynan

Arxiv bo‘ylab qidiruv

O‘quvchi yarim eslagan maqolasini qidiradi. Bu to‘liq matnli qidiruv masalasi, va men uni PostgreSQL ichida qoldirdim — mijoz pul to‘lab, keyin xizmat ko‘rsatishi kerak bo‘ladigan qidiruv serverini qo‘shmadim.

GIN indeksli tsvector ustunlari, ts_rank bilan reyting. Asl ish sozlashda edi: muharrirlar va o‘quvchilar nima yozayotganini kuzatib, kerakli maqola eng yangisi emas, birinchi chiqadigan bo‘lguncha vaznlarni to‘g‘riladim.

Tezlashtirish, raqamlar bilan

Sahifalar bo‘lishi kerak bo‘lganidan sekinroq ochilardi. Ikki sabab, alohida-alohida hal qilindi:

  • Eng ko‘p o‘qiladigan sahifalar har tashrifchi uchun bir xil natijani qaytadan
  • Bir necha so‘rovda indeks yetishmasdi va ular ketma-ket skanerlash qilardi.

Ikkalasini birdan chiqarib «yaxshi bo‘ldi» deb taxmin qilmasdan, har o‘zgarishdan oldin va keyin vaqtni o‘lchadim. Ikkita narsani o‘zgartirib tezlashsa, qaysi biri yordam berganini bilmaysiz.

Frontend

Ikkala yuza ham Next.js va TypeScript’da, kelishilgan dizaynlar asosida qurilgan va bo‘shliq, shrift hamda rang bo‘yicha ularga yaqin moslangan.

Ishning ko‘p qismini belgilagan narsa: o‘quvchilarning deyarli hammasi telefondan keladi. Shuning uchun o‘quvchi sayti avval kichik ekran uchun qurildi, muharrirlik vositasi ham unda ishlatib bo‘ladigan bo‘lishi kerak edi — jurnalist material topshirganda qayerda bo‘lsa, o‘sha yerdan topshiradi.

Deploy va muhim bo‘lgan zerikarli qismlar

CI bir martalik bazaga qarshi pytest’ni ishga tushiradi, Docker obrazlarini yig‘adi va deploy qiladi. Deploydan keyin health check o‘tmasa, avtomatik ravishda oldingi obrazga qaytadi — o‘quvchilar yiqilgan saytni ko‘rmaydi.

Zaxira nusxalar har kecha, shifrlangan holda, serverdan tashqarida saqlanadi. Muhimrog‘i: men toza muhitga to‘liq tiklash mashqini o‘tkazdim. Hech qachon tiklanmagan zaxira — zaxira emas, faraz; bu yerda esa gap gazetaning arxivi, ya’ni tarixi ustida bormoqda.

Hammasi bitta kichik VPS’da, Nginx ortida, yagona Docker Compose steki sifatida ishlaydi. Gazetaning byudjeti startap byudjeti emas, va arxitektura buni ataylab aks ettiradi.

Repozitoriy yopiq — u mijozga tegishli. Sayt esa ochiq.

Tong Yulduzi — Salohiddin Yo'ldoshev