🐘
Hosting

PostgreSQL bazani hostingda yaratish va saytga ulash

07.11.2026
← Barcha maqolalar

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

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.

O'xshash maqolalar

💽 Disk to'ldi: 500 xato, buzilgan .htaccess va bazani tiklash 🍃 MongoDB: Atlas bulut xizmati yoki o'z serveringiz — qaysi birini tanlash kerak 🗄️ Nginx'da statik fayllarni keshlash: Cache-Control, expires va versiyalash 📦 Backup plaginlari diskni to'ldiradi: UpdraftPlus va boshqalarni to'g'ri sozlash
🌐 Til
🇺🇿 O'zbek ✓ 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English