🐘
Хостинг

PostgreSQL базани хостингда яратиш ва сайтга улаш

07.11.2026
← Барча мақолалар

Кўпчилик сайтлар MySQL ёки MariaDB билан ишлайди, лекин Django, баъзи Laravel лойиҳалари, геомаълумотлар билан ишлайдиган тизимлар ва мураккаб ҳисоботлар тузадиган иловалар кўпинча PostgreSQL'ни талаб қилади. PostgreSQL транзакциялар, JSON майдонлар, тўлиқ матнли қидирув ва мураккаб сўровларда кучли ҳисобланади. Бу мақолада базани қаерда яратиш мумкинлиги, уни қандай хавфсиз созлаш, иловадан уланиш ва захира олиш тартибини босқичма-босқич кўриб чиқамиз.

Оддий хостинг ёки VPS: аввал нимани аниқлаш керак

Оддий (виртуал) хостингда стандарт база одатда MySQL бўлади. PostgreSQL эса сервер маъмури уни алоҳида ўрнатиб, панелга улаган бўлсагина мавжуд. Агар бошқарув панелида база яратаётганда сервер турини танлаш имкони бўлса ва рўйхатда PostgreSQL кўринса, базани шу ердан яратиб, панел берган ҳост, порт ва логин билан уланасиз. Рўйхатда йўқ бўлса, тарифингизда PostgreSQL борми, sayt.uz кабинетидан ёки техник ёрдам орқали аниқланг.

Шунингдек, PHP'да pdo_pgsql кенгайтмаси ёқилганини текширинг. У бўлмаса, база мавжуд бўлса ҳам PHP илова could not find driver хатосини беради. PostgreSQL версиясини, кенгайтмаларни (масалан, PostGIS) ва созламаларни тўлиқ назорат қилиш керак бўлса, VPS анча қулай. Қуйидаги буйруқлар VPS ёки ўз серверингиз учун мўлжалланган.

Мисол: клиника учун беморлар рўйхати тизими

Самарқанддаги хусусий клиника қабулга ёзилиш ва беморлар тарихини юритувчи ички тизим буюртма қилди. Дастурчи Django танлади, Django эса PostgreSQL билан энг яхши ишлайди. Бемор маълумотлари махфий бўлгани учун база ташқи тармоқдан бутунлай ёпиқ бўлиши, илова эса фақат ўз фойдаланувчиси билан, чекланган ҳуқуқлар асосида уланиши керак. Қуйидаги созламалар айнан шу талабларга мос.

Базани ва фойдаланувчини яратиш

Ubuntu ёки Debian'да PostgreSQL стандарт пакетдан ўрнатилади ва тизимда postgres номли маъмур фойдаланувчи пайдо бўлади. Илова ҳеч қачон шу маъмур номидан уланмаслиги керак: ҳар бир лойиҳа учун алоҳида рол ва унга тегишли база яратинг. Шунда бир иловадаги заифлик бошқа базаларга таъсир қилмайди.

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 параметри базани янги ролга бириктиради, шунинг учун илова ўз жадвалларини ярата ва ўзгартира олади, лекин бошқа базаларга кира олмайди. Паролни илова кодига эмас, муҳит ўзгарувчиси ёки .env файлга ёзинг.

Тармоқдан кириш ва аутентификация созламаси

PostgreSQL ким, қаердан ва қандай усул билан уланишини pg_hba.conf файлида белгилайди. Илова билан база битта серверда бўлса, PostgreSQL фақат localhost'ни тинглаши кифоя, 5432-портни интернетга очишга ҳожат йўқ. Парол текшируви учун замонавий scram-sha-256 усулидан фойдаланинг. Файл йўлидаги версия рақами серверингиздаги версияга қараб фарқ қилади.

# /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

Уланишни иловадан олдин psql билан текшириб кўринг. Агар версия қатори чиқса, фойдаланувчи, парол ва рухсатлар тўғри ишлаяпти.

psql -h 127.0.0.1 -U klinika_user -d klinika_db -c "SELECT version();"

PHP, Django ва Laravel'дан уланиш

PHP'да PostgreSQL билан PDO орқали ишлаш энг қулай. Тайёрланган сўровлар (prepare) SQL инъекциядан ҳимоя қилади ва MySQL'дан ўтган дастурчи учун деярли бир хил кўринади.

<?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 ва Laravel'да эса уланиш созламаларда бир неча қатор билан берилади. Django учун psycopg пакети ўрнатилган бўлиши керак, Laravel учун эса PHP'нинг pdo_pgsql кенгайтмаси.

# 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

Базани компьютердан бошқариш: SSH туннел

Баъзан базани график дастур (масалан, DBeaver ёки pgAdmin) орқали кўриш керак бўлади. Бунинг учун 5432-портни очиш ўрнига SSH туннел ишлатинг: компьютерингиздаги 5433-порт шифрланган канал орқали сервердаги 5432-портга уланади. Туннел очиқ турган пайтда дастур 127.0.0.1:5433 манзилига уланади.

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

Захира олиш ва тиклаш

Беморлар маълумоти каби муҳим базада захира ҳар куни автоматик олиниши шарт. pg_dump базани ишлаётган ҳолатида, уни тўхтатмасдан нусхалайди, -Fc формати эса сиқилган ва pg_restore билан қисман тиклаш имконини беради. Паролни ҳар сафар сўрамаслиги учун ~/.pgpass файлидан фойдаланинг ва унга фақат эгаси ўқий оладиган рухсат беринг.

# ~/.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

Кунлик захира учун cron вазифаси қўшинг. Cron ичида % белгиси махсус маънога эга, шунинг учун уни тескари чизиқ билан ёзиш керак. Захираларни бошқа серверга ёки ташқи омборга ҳам нусхаланг ва вақти-вақти билан синов базасига тиклаб кўринг.

30 2 * * * pg_dump -Fc -h 127.0.0.1 -U klinika_user klinika_db > /backup/klinika_$(date +\%F).dump

Тез-тез учрайдиган хатолар

MySQL'дан кўчаётган бўлсангиз, синтаксисдаги фарқларга тайёр туринг: номлар учун тескари тирноқ (`) ўрнига қўш тирноқ (") ишлатилади, AUTO_INCREMENT ўрнига GENERATED ... AS IDENTITY ёки SERIAL келади. Катта базаларни кўчиришда pgloader каби воситалар ишни сезиларли осонлаштиради, лекин натижани синов муҳитида албатта текширинг.

Ўхшаш мақолалар

💽 Диск тўлди: 500 хато, бузилган .htaccess ва базани тиклаш 🍃 MongoDB: Atlas булут хизмати ёки ўз серверингиз — қайси бирини танлаш керак 🗄️ Nginx'да статик файлларни кешлаш: Cache-Control, expires ва версиялаш 📦 Backup плагинлари дискни тўлдиради: UpdraftPlus ва бошқаларни тўғри созлаш
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек ✓ 🇷🇺 Русский 🇬🇧 English