Ko'pchilik saytlar MySQL yoki MariaDB bilan ishlaydi, lekin Django, ba'zi Laravel loyihalari, geoma'lumotlar bilan ishlaydigan tizimlar va murakkab hisobotlar tuzadigan ilovalar ko'pincha PostgreSQL'ni talab qiladi. PostgreSQL tranzaksiyalar, JSON maydonlar, to'liq matnli qidiruv va murakkab so'rovlarda kuchli hisoblanadi. Bu maqolada bazani qayerda yaratish mumkinligi, uni qanday xavfsiz sozlash, ilovadan ulanish va zaxira olish tartibini bosqichma-bosqich ko'rib chiqamiz.
Oddiy hosting yoki VPS: avval nimani aniqlash kerak
Oddiy (virtual) hostingda standart baza odatda MySQL bo'ladi. PostgreSQL esa server ma'muri uni alohida o'rnatib, panelga ulagan bo'lsagina mavjud. Agar boshqaruv panelida baza yaratayotganda server turini tanlash imkoni bo'lsa va ro'yxatda PostgreSQL ko'rinsa, bazani shu yerdan yaratib, panel bergan host, port va login bilan ulanasiz. Ro'yxatda yo'q bo'lsa, tarifingizda PostgreSQL bormi, sayt.uz kabinetidan yoki texnik yordam orqali aniqlang.
Shuningdek, PHP'da pdo_pgsql kengaytmasi yoqilganini tekshiring. U bo'lmasa, baza mavjud bo'lsa ham PHP ilova could not find driver xatosini beradi. PostgreSQL versiyasini, kengaytmalarni (masalan, PostGIS) va sozlamalarni to'liq nazorat qilish kerak bo'lsa, VPS ancha qulay. Quyidagi buyruqlar VPS yoki o'z serveringiz uchun mo'ljallangan.
Misol: klinika uchun bemorlar ro'yxati tizimi
Samarqanddagi xususiy klinika qabulga yozilish va bemorlar tarixini yurituvchi ichki tizim buyurtma qildi. Dasturchi Django tanladi, Django esa PostgreSQL bilan eng yaxshi ishlaydi. Bemor ma'lumotlari maxfiy bo'lgani uchun baza tashqi tarmoqdan butunlay yopiq bo'lishi, ilova esa faqat o'z foydalanuvchisi bilan, cheklangan huquqlar asosida ulanishi kerak. Quyidagi sozlamalar aynan shu talablarga mos.
Bazani va foydalanuvchini yaratish
Ubuntu yoki Debian'da PostgreSQL standart paketdan o'rnatiladi va tizimda postgres nomli ma'mur foydalanuvchi paydo bo'ladi. Ilova hech qachon shu ma'mur nomidan ulanmasligi kerak: har bir loyiha uchun alohida rol va unga tegishli baza yarating. Shunda bir ilovadagi zaiflik boshqa bazalarga ta'sir qilmaydi.
sudo apt install postgresql
sudo -u postgres psql
CREATE ROLE klinika_user WITH LOGIN PASSWORD 'Uzun_Murakkab_Parol_2026';
CREATE DATABASE klinika_db OWNER klinika_user ENCODING 'UTF8';
\q
OWNER parametri bazani yangi rolga biriktiradi, shuning uchun ilova o'z jadvallarini yarata va o'zgartira oladi, lekin boshqa bazalarga kira olmaydi. Parolni ilova kodiga emas, muhit o'zgaruvchisi yoki .env faylga yozing.
Tarmoqdan kirish va autentifikatsiya sozlamasi
PostgreSQL kim, qayerdan va qanday usul bilan ulanishini pg_hba.conf faylida belgilaydi. Ilova bilan baza bitta serverda bo'lsa, PostgreSQL faqat localhost'ni tinglashi kifoya, 5432-portni internetga ochishga hojat yo'q. Parol tekshiruvi uchun zamonaviy scram-sha-256 usulidan foydalaning. Fayl yo'lidagi versiya raqami serveringizdagi versiyaga qarab farq qiladi.
# /etc/postgresql/16/main/postgresql.conf
listen_addresses = 'localhost'
# /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host klinika_db klinika_user 127.0.0.1/32 scram-sha-256
sudo systemctl reload postgresql
Ulanishni ilovadan oldin psql bilan tekshirib ko'ring. Agar versiya qatori chiqsa, foydalanuvchi, parol va ruxsatlar to'g'ri ishlayapti.
psql -h 127.0.0.1 -U klinika_user -d klinika_db -c "SELECT version();"
PHP, Django va Laravel'dan ulanish
PHP'da PostgreSQL bilan PDO orqali ishlash eng qulay. Tayyorlangan so'rovlar (prepare) SQL in'eksiyadan himoya qiladi va MySQL'dan o'tgan dasturchi uchun deyarli bir xil ko'rinadi.
<?php
$pdo = new PDO(
'pgsql:host=127.0.0.1;port=5432;dbname=klinika_db',
'klinika_user',
getenv('DB_PASSWORD'),
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$stmt = $pdo->prepare('SELECT id, full_name FROM patients WHERE phone = :p');
$stmt->execute(['p' => '+998901234567']);
Django va Laravel'da esa ulanish sozlamalarda bir necha qator bilan beriladi. Django uchun psycopg paketi o'rnatilgan bo'lishi kerak, Laravel uchun esa PHP'ning pdo_pgsql kengaytmasi.
# settings.py (Django)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'klinika_db',
'USER': 'klinika_user',
'PASSWORD': os.environ['DB_PASSWORD'],
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
# .env (Laravel)
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=klinika_db
DB_USERNAME=klinika_user
Bazani kompyuterdan boshqarish: SSH tunnel
Ba'zan bazani grafik dastur (masalan, DBeaver yoki pgAdmin) orqali ko'rish kerak bo'ladi. Buning uchun 5432-portni ochish o'rniga SSH tunnel ishlating: kompyuteringizdagi 5433-port shifrlangan kanal orqali serverdagi 5432-portga ulanadi. Tunnel ochiq turgan paytda dastur 127.0.0.1:5433 manziliga ulanadi.
ssh -L 5433:127.0.0.1:5432 user@misol.uz
# boshqa oynada:
psql -h 127.0.0.1 -p 5433 -U klinika_user -d klinika_db
Zaxira olish va tiklash
Bemorlar ma'lumoti kabi muhim bazada zaxira har kuni avtomatik olinishi shart. pg_dump bazani ishlayotgan holatida, uni to'xtatmasdan nusxalaydi, -Fc formati esa siqilgan va pg_restore bilan qisman tiklash imkonini beradi. Parolni har safar so'ramasligi uchun ~/.pgpass faylidan foydalaning va unga faqat egasi o'qiy oladigan ruxsat bering.
# ~/.pgpass (chmod 600 ~/.pgpass)
127.0.0.1:5432:klinika_db:klinika_user:Uzun_Murakkab_Parol_2026
# zaxira (siqilgan maxsus format)
pg_dump -Fc -h 127.0.0.1 -U klinika_user klinika_db > klinika_$(date +%F).dump
# tiklash
pg_restore --clean -h 127.0.0.1 -U klinika_user -d klinika_db klinika_2026-11-04.dump
Kunlik zaxira uchun cron vazifasi qo'shing. Cron ichida % belgisi maxsus ma'noga ega, shuning uchun uni teskari chiziq bilan yozish kerak. Zaxiralarni boshqa serverga yoki tashqi omborga ham nusxalang va vaqti-vaqti bilan sinov bazasiga tiklab ko'ring.
30 2 * * * pg_dump -Fc -h 127.0.0.1 -U klinika_user klinika_db > /backup/klinika_$(date +\%F).dump
Tez-tez uchraydigan xatolar
FATAL: password authentication failed for user— parol noto'g'ri yokipg_hba.conf'dagi usul parolga mos emas.FATAL: Peer authentication failed for user—-hko'rsatilmagan, ulanish unix-soket orqali ketgan vapeerusuli tizim foydalanuvchisi nomini talab qilgan.-h 127.0.0.1qo'shing.Connection refused— PostgreSQL ishlamayapti yoki boshqa port ishlatilmoqda,systemctl status postgresqlbilan tekshiring.permission denied for table— jadval boshqa rolga tegishli, egasiniALTER TABLE ... OWNER TObilan o'zgartiring yoki kerakli huquq bering.
MySQL'dan ko'chayotgan bo'lsangiz, sintaksisdagi farqlarga tayyor turing: nomlar uchun teskari tirnoq (`) o'rniga qo'sh tirnoq (") ishlatiladi, AUTO_INCREMENT o'rniga GENERATED ... AS IDENTITY yoki SERIAL keladi. Katta bazalarni ko'chirishda pgloader kabi vositalar ishni sezilarli osonlashtiradi, lekin natijani sinov muhitida albatta tekshiring.