Mundarija (38)
- Bu darsda
- 1. Nega bu kerak?
- 2. O'rnatish yo'llari
- 2.1 Uchta yo'l
- 2.2 Native va bulut haqida qisqacha
- 3. Docker'da PostgreSQL 18
- 3.1 Konteynerni ishga tushirish
- 3.2 Nega 127.0.0.1: muhim
- 3.3 Parolli variant
- 3.4 Tayyorligini tekshirish va baza yaratish
- 4. Connection string anatomiyasi
- 4.1 Qismlari
- 4.2 Haqiqiy ulanish
- 4.3 Sozlamalar: application_name va connect_timeout
- 4.4 sslmode
- 4.5 Kalit=qiymat shakli
- 5. Parollar: URL-kodlash va .pgpass
- 5.1 Parolda @ bo'lsa
- 5.2 Parolsiz ulanishga urinish
- 5.3 .pgpass fayli
- 5.4 Muhit o'zgaruvchilari
- 5.5 Server parolni qanday saqlaydi
- 6. GUI klientlar
- 7. SQL qadami: vazifalar bazasini ko'tarish
- 8. Ko'p uchraydigan xatolar
- 8.1 Connection refused
- 8.2 database "…" does not exist
- 8.3 Paroldagi maxsus belgi
- 8.4 Eski qo'llanmadagi volume yo'li
- 8.5 Parolni kodga yozish
- 9. Mashqlar
- 1-mashq (oson): satrni to'ldiring
- 2-mashq (o'rta): xatoni tashxislang
- 3-mashq (qiyin): connection string tahlilchisi
- 4-mashq: SQL qadami
- 10. Real ishda
- Xulosa
- Manbalar
PostgreSQL o'rnatish va ulanish: Docker, connection string va parollar
Qisqacha: O'quv va ishlab chiqish uchun PostgreSQL'ni eng qulay ko'tarish yo'li — Docker:
docker run … -p 127.0.0.1:5499:5432 -v nom:/var/lib/postgresql postgres:18. Bazaga ulanish uchun bitta satr kerak — connection string:postgres://foydalanuvchi:parol@host:port/baza?sozlama=qiymat. Parolda@kabi belgilar bo'lsa, ular URL-kodlanadi (%40), parolni esa kodga emas,.pgpassfaylga yoki muhit o'zgaruvchisiga qo'yasiz.
Bu darsda
- PostgreSQL 18'ni Docker'da ma'lumoti saqlanadigan qilib ishga tushirasiz va bazani yaratasiz.
- Connection string'ning har qismini o'qiy olasiz va o'zingiz yozasiz.
- Ulanishdagi to'rtta keng tarqalgan xatoni matnidan tanib, tuzatasiz.
- Parolni xavfsiz saqlash yo'llarini (
.pgpass, muhit o'zgaruvchilari) bilasiz. - Docker, native o'rnatish va bulutli bazalar orasida tanlay olasiz.
Oldin bilishingiz kerak: Image, container va registry: asosiy buyruqlar, Volume va bind mount: ma'lumotni saqlash, Relatsion model.
1. Nega bu kerak?
Oldingi uch darsda SQL natijalarini "kanon bazasida ishga tushirdik" deb o'qib keldingiz. Endi o'z kompyuteringizda shunday baza bo'lishi kerak. Busiz bundan keyingi darslar — faqat o'qish bo'lib qoladi.
Muammo shundaki, PostgreSQL bitta fayl emas. U fonda doim ishlab turadigan server dasturi: ma'lumot papkasi, sozlamalar, port, foydalanuvchilar, parollar. Ilovangiz unga tarmoq orqali ulanadi. Ulanishning birorta qismi noto'g'ri bo'lsa — Connection refused, password authentication failed kabi xatolar chiqadi va yangi boshlovchi shu yerda soatlab qolib ketadi.
Hayotiy o'xshatish: bank filiali. Filial (server) bitta binoda ishlaydi, mijozlar (ilovalar) unga keladi. Kirish uchun manzil (host), qavat va xona raqami (port), kassir oynasi (baza nomi), shaxsingiz (foydalanuvchi) va pasport (parol) kerak. Connection string — shularning hammasi bitta qatorda yozilgan yo'llanma.
2. O'rnatish yo'llari
2.1 Uchta yo'l
| Yo'l | Qanday | Qachon |
|---|---|---|
| Docker | postgres:18 image'idan konteyner |
o'quv, ishlab chiqish (asosiy) |
| Native | o'rnatuvchi, apt, brew |
Docker yo'q yoki o'chirilgan |
| Bulut | boshqariladigan xizmat | production, jamoa bazasi |
Bu kursda asosiy yo'l — Docker. Sabablari:
- Har loyiha o'z versiyasini oladi: bir loyihada Postgres 16, boshqasida 18 — ular to'qnashmaydi.
- O'chirish oson: konteyner va volume o'chdi — kompyuterda iz qolmaydi.
- Production serverlarda ham ko'pincha aynan shu image ishlatiladi.
Docker'ni Konteyner nima va Docker'ni o'rnatish darsida o'rnatgansiz, docker run va volume'larni Volume va bind mount: ma'lumotni saqlash darsida o'rgangansiz.
2.2 Native va bulut haqida qisqacha
Native o'rnatish — Postgres bevosita operatsion tizimga o'rnatiladi. Windows uchun EDB (EnterpriseDB) o'rnatuvchisi, macOS uchun Postgres.app yoki Homebrew, Linux'da tizim paket menejeri (apt install postgresql). Native Postgres odatda 5432-portni egallaydi va kompyuter yonganda o'zi ishga tushadi. Kanon mashinasida native PostgreSQL 17 bor edi, lekin 18-versiyani native o'rnatish sinalmagan — bu bo'limdagi gaplar postgresql.org/download hujjatiga tayanadi.
Bulutli baza — kimdir server, zaxira va yangilashni siz uchun boshqaradi: Neon, Supabase, AWS RDS, Google Cloud SQL va boshqalar. Ularning ko'pida bepul kichik tarif bor. Siz faqat connection string olasiz. Kanon ularni sinamadi (hisob ochilmadi) — deploy qismida qaytamiz.
3. Docker'da PostgreSQL 18
3.1 Konteynerni ishga tushirish
Kanon vazifalar bazasi uchun shu buyruqni ishlatdi (Docker Desktop 4.94.0, Windows 11):
docker run -d --name kanon26-pg \
-e POSTGRES_HOST_AUTH_METHOD=trust \
-e TZ=UTC \
-p 127.0.0.1:5499:5432 \
-v kanon26-data:/var/lib/postgresql \
postgres:18Har qatorni ko'ramiz:
| Qism | Ma'nosi |
|---|---|
-d --name kanon26-pg |
fonda, shu nom bilan |
-e POSTGRES_HOST_AUTH_METHOD=trust |
parolsiz kirish (faqat lokal o'quv uchun!) |
-e TZ=UTC |
konteyner soati UTC'da |
-p 127.0.0.1:5499:5432 |
kompyuteringizning 5499-porti → konteynerning 5432-porti |
-v kanon26-data:/var/lib/postgresql |
ma'lumot nomli volume'da saqlanadi |
Kanon konteyneriga yana bir nechta sozlama berilgan (--shm-size, sekin so'rovlarni kuzatish kengaytmasi). Ular keyingi darslar uchun — o'z nusxangizga ular hozir shart emas.
Ikki muhim tafsilot:
- Port 5499. Postgres'ning standart porti — 5432. Lekin kompyuterda native Postgres ham bo'lsa, u 5432 ni band qilgan bo'ladi. Shuning uchun konteynerga boshqa port beramiz.
- Volume yo'li
/var/lib/postgresql. Postgres 17 va undan eski qo'llanmalarda/var/lib/postgresql/datayoziladi. 18-image'da bu yo'l bilan konteyner ishga tushmaydi — kanon buni Volume va bind mount: ma'lumotni saqlash darsida topgan.
3.2 Nega 127.0.0.1: muhim
-p 5499:5432 deb yozsangiz ham ishlaydi. Lekin unda port kompyuterning hamma tarmoq manzillarida ochiladi — kafe Wi-Fi'idagi qo'shningiz ham ulanishga urinib ko'rishi mumkin. trust bilan bu degani: parolsiz, to'liq huquqli kirish.
127.0.0.1:5499:5432 — port faqat sizning kompyuteringiz ichidan ochiq. Docker hujjatiga ko'ra, Linux'da Docker ochgan portlar ufw kabi firewall qoidalarini chetlab o'tishi mumkin — shuning uchun manzilni aniq yozish odat bo'lsin.
3.3 Parolli variant
trust — faqat o'z kompyuteringizdagi o'quv bazasi uchun. Boshqa hamma joyda parol kerak:
docker run -d --name dokon-pg \
-e POSTGRES_PASSWORD='namuna@parol' \
-p 127.0.0.1:5497:5432 \
-v dokon-data:/var/lib/postgresql \
postgres:18namuna@parol — o'ylab topilgan namunaviy parol, o'zingiznikini qo'ying. Parolsiz ham, trust siz ham konteyner ishga tushmaydi. Kanon tekshirgan xabar:
Error: Database is uninitialized and superuser password is not specified.Tarjimasi: "baza hali yaratilmagan va superuser (bosh foydalanuvchi) paroli berilmagan". Image sizni ataylab parolsiz qoldirmaydi.
Bir narsani yodda tuting: POSTGRES_PASSWORD konteyner muhitida ochiq turadi — docker inspect qilgan har kim uni ko'radi (Image, container va registry: asosiy buyruqlar darsida ko'rgansiz). Production'da sirlarni boshqacha uzatiladi — buni deploy qismida o'rganamiz.
3.4 Tayyorligini tekshirish va baza yaratish
Konteyner yonishi bir-ikki soniya oladi. Tayyorligini pg_isready bilan tekshirasiz:
docker exec kanon26-pg pg_isready -U postgresJavob … - accepting connections ("ulanishlarni qabul qilmoqda") ko'rinishida bo'ladi. Biz o'z nusxamizda (PostgreSQL 17.6) -h 127.0.0.1 -p 5511 bilan sinadik:
127.0.0.1:5511 - accepting connectionsKonteyner ichida host berilmasa, manzil o'rnida soket fayli yo'li chiqadi. Endi server versiyasini so'raymiz:
docker exec kanon26-pg psql -U postgres -c "select version();"Kanon chiqishi:
version
--------------------------------------------------------------------
PostgreSQL 18.6 (Debian 18.6-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
(1 row)Konteyner ichida Debian Linux ishlayapti. Endi loyiha uchun alohida baza yaratamiz. Bitta server ichida ko'p baza bo'lishi mumkin — postgres bazasi sukut bo'yicha bor, vazifalar ni o'zimiz yaratamiz:
docker exec kanon26-pg createdb -U postgres vazifalarcreatedb — Postgres bilan birga keladigan kichik dastur, ichida CREATE DATABASE vazifalar buyrug'ini yuboradi. Muvaffaqiyatli bo'lsa, hech narsa chiqarmaydi.
flowchart LR
K[Kompyuteringiz<br/>psql, Node] -->|127.0.0.1:5499| D[Docker<br/>port]
D -->|5432| P[Postgres 18<br/>konteyner]
P --> V[(volume<br/>kanon26-data)]
P --> B1[baza: postgres]
P --> B2[baza: vazifalar]Nimaga qarang: siz 5499 ga ulanasiz, Docker uni konteynerning 5432 iga uzatadi. Bitta server ichida bir nechta baza, hammasining fayllari bitta volume'da.
Tekshirib ko'ring: Konteynerni
docker rm -f kanon26-pgbilan o'chirib, xuddi shudocker runni qayta ishga tushirdingiz.vazifalarbazasi bormi?
Javob
Bor. Ma'lumot konteynerda emas, kanon26-data volume'ida. Yangi konteyner o'sha volume'ga ulanadi va eski fayllarni ko'radi — kanon buni Volume va bind mount: ma'lumotni saqlash darsida sinab ko'rgan. Bazani butunlay o'chirish uchun volume'ni ham o'chirish kerak (docker volume rm) — bu qaytarib bo'lmaydigan amal.
4. Connection string anatomiyasi
4.1 Qismlari
Ilova, psql yoki GUI dastur Postgres'ga ulanish uchun bitta satrdan foydalanadi:
postgres://postgres:namuna%40parol@127.0.0.1:5499/vazifalar?sslmode=disableUni bo'laklarga ajratamiz:
| Qism | Namunada | Ma'nosi |
|---|---|---|
| protokol (scheme) | postgres:// |
qaysi turdagi ulanish (postgresql:// ham bo'ladi) |
| foydalanuvchi | postgres |
kim bo'lib kiramiz |
| parol | namuna%40parol |
URL-kodlangan parol |
| host | 127.0.0.1 |
server manzili |
| port | 5499 |
server porti (sukut 5432) |
| baza | vazifalar |
qaysi bazaga |
| sozlamalar | ?sslmode=disable |
qo'shimcha parametrlar |
Bu — oddiy URL. URL anatomiyasi darsida ko'rgan https:// manzillari bilan bir xil qoidalar: : foydalanuvchi va parolni ajratadi, @ — ularni hostdan, ? — sozlamalarni boshlaydi.
4.2 Haqiqiy ulanish
Kanon kompyuterdagi psql 17.6 bilan konteynerdagi 18.6 serverga ulandi va server o'zi haqida nima deyishini so'radi:
psql "postgres://postgres@127.0.0.1:5499/vazifalar" \
-c "select current_user, current_database(), inet_server_port()"Kanon so'rovida yana ikki ustun bor edi (server manzili va versiyasi), bu yerda uchtasini ko'rsatamiz:
current_user | current_database | inet_server_port
--------------+------------------+------------------
postgres | vazifalar | 5432
(1 row)E'tibor bering: biz 5499 ga ulandik, server esa o'zini 5432 deb biladi. Port almashtirishni Docker qildi. Kanon chiqishida server manzili ham bor edi: 172.17.0.2 — konteynerning Docker ichki tarmog'idagi manzili.
Eski psql (17) yangi serverga (18) -c rejimida ogohlantirishsiz ulandi. Interaktiv rejimda psql versiyalar farqi haqida ogohlantirish chiqarishi mumkin (kanon buni sinamagan). Asosiy SQL buyruqlari uchun bu farq muhim emas.
4.3 Sozlamalar: application_name va connect_timeout
? dan keyin libpq (Postgres'ning ulanish kutubxonasi) parametrlari yoziladi. Ikkitasi foydali:
U='postgres://postgres@127.0.0.1:5499/vazifalar'
U+='?application_name=kanon26-dars&connect_timeout=3'
psql "$U" -c "select application_name, client_addr
from pg_stat_activity where pid = pg_backend_pid()"Kanon chiqishi (backend_type ustuni olib tashlandi):
application_name | client_addr
------------------+-------------
kanon26-dars | 172.17.0.1
(1 row)application_name— ulanishga nom. Serverda "kim ulangan?" deb ko'rganda ilovangizni darhol tanib olasiz.connect_timeout=3— server 3 soniyada javob bermasa, kutmasdan xato berish.client_addr 172.17.0.1— server sizni Docker ko'prigining manzilidan ko'radi.
4.4 sslmode
Tarmoqda ma'lumot shifrlanishi kerakmi — buni sslmode belgilaydi:
| Qiymat | Ma'nosi |
|---|---|
disable |
shifrlashsiz |
prefer |
iloji bo'lsa shifrlash (libpq sukuti) |
require |
shifrlash majburiy, sertifikat tekshirilmaydi |
verify-full |
shifrlash + server sertifikati va nomi tekshiriladi |
Lokal Docker'dagi Postgres'da SSL sozlanmagan. require bilan kanon shu xatoni oldi:
psql: error: connection to server at "127.0.0.1", port 5499 failed: server does not support SSL, but SSL was requiredTarjimasi: "server SSL'ni qo'llab-quvvatlamaydi, lekin SSL talab qilingan edi". Lokalda sslmode ni yozmang yoki disable qiling. Bulutli bazalar esa odatda sslmode=require yoki verify-full talab qiladi — ular bergan connection string'da bu allaqachon yozilgan bo'ladi.
4.5 Kalit=qiymat shakli
URL o'rniga libpq'ning eski shakli ham bor — bo'shliq bilan ajratilgan kalit=qiymat juftlari:
psql "host=127.0.0.1 port=5499 dbname=vazifalar user=postgres" \
-Atc "select 'keyword/value shakli ishladi'"Kanon chiqishi:
keyword/value shakli ishladiIkkala shakl teng kuchli. Node kutubxonalari va bulut xizmatlari ko'pincha URL shaklini beradi.
Tekshirib ko'ring:
postgres://ali@db.example.com/dokonsatrida port va parol qayerda?
Javob
Ikkalasi ham yozilmagan. Port — sukut 5432. Parol yo'q: u boshqa joydan olinadi (.pgpass fayli yoki PGPASSWORD muhit o'zgaruvchisi — keyingi bo'limda) yoki server parol so'ramaydi. Satrda yo'q narsa xato emas — libpq sukut qiymatlarini va muhit o'zgaruvchilarini ishlatadi.
5. Parollar: URL-kodlash va .pgpass
5.1 Parolda @ bo'lsa
Kanon parolli konteyner yaratdi: parol — namuna@parol. Uni URL'ga to'g'ridan-to'g'ri yozib ko'rdi:
psql "postgres://postgres:namuna@parol@127.0.0.1:5497/postgres" \
-c "select 1"Kanon chiqishi:
psql: error: could not translate host name "parol@127.0.0.1" to address: Non-recoverable failure in name resolutionTarjimasi: "parol@127.0.0.1 host nomini manzilga aylantirib bo'lmadi". libpq birinchi @ ni "parol shu yerda tugadi" deb tushundi: parol namuna, host esa parol@127.0.0.1. Xato hostni ko'rsatyapti, lekin aybdor — paroldagi @.
Yechim — maxsus belgilarni URL-kodlash: @ → %40, : → %3A, / → %2F, # → %23:
parol URL-kodlangan (@ -> %40): postgresKanon postgres:namuna%40parol@… bilan ulandi. JavaScript'da kodlashni encodeURIComponent("namuna@parol") qiladi.
Qiziq farq: Node'dagi new URL() xuddi shu buzilgan satrni boshqacha o'qiydi — u oxirgi @ ni ajratuvchi deb oladi. Biz Node 24.21.0 da ishga tushirdik: username → postgres, password → namuna%40parol, hostname → 127.0.0.1. Ya'ni bir xil satrni ikki dastur ikki xil tushunadi. Xulosa bitta: parolni doim o'zingiz kodlang.
5.2 Parolsiz ulanishga urinish
Parol so'raydigan serverga parolsiz ulanish:
psql: error: connection to server at "127.0.0.1", port 5497 failed: fe_sendauth: no password suppliedTarjimasi: "klient tomonidagi autentifikatsiya: parol berilmagan". fe — frontend, ya'ni klient (psql). Server parol so'radi, psql'da esa berish uchun parol yo'q edi (-w bayrog'i psql'ga "parolni klaviaturadan so'rama" deydi).
5.3 .pgpass fayli
Parolni har buyruqda yozmaslik va skriptlarda ochiq qoldirmaslik uchun libpq maxsus faylni o'qiydi. Har qator formati:
host:port:baza:foydalanuvchi:parolKanon fayli (* — "istalgan baza"):
127.0.0.1:5497:*:postgres:namuna@parolFaylda parol kodlanmaydi — @ shundayligicha yoziladi. Shu fayl bilan URL'da parol yozilmagan ulanish ishladi:
pgpass orqali: postgresFayl qayerda turadi:
| Tizim | Yo'l |
|---|---|
| Linux, macOS | ~/.pgpass (ruxsat 0600 bo'lishi shart) |
| Windows | %APPDATA%\postgresql\pgpass.conf |
| har qayerda | PGPASSFILE muhit o'zgaruvchisi ko'rsatgan fayl |
Linux'da faylni boshqalar o'qiy olsa (chmod 0600 qilinmagan bo'lsa), libpq uni e'tiborsiz qoldiradi (hujjat bo'yicha). Kanon Windows'da vaqtinchalik faylni PGPASSFILE bilan sinab, keyin o'chirdi.
5.4 Muhit o'zgaruvchilari
libpq ulanish qismlarini muhit o'zgaruvchilaridan ham oladi: PGHOST, PGPORT, PGUSER, PGDATABASE, PGPASSWORD. Biz o'z nusxamizda (PostgreSQL 17.6, Git Bash) sinab ko'rdik:
PGHOST=127.0.0.1 PGPORT=5511 PGUSER=postgres PGDATABASE=v15 \
psql -X -Atc "select current_database(), current_user"Natija:
v15|postgresHech qanday argument bermadik — hammasi muhitdan olindi. Node ilovalarida esa odatda bitta DATABASE_URL o'zgaruvchisi ishlatiladi. Uni .env faylga yozishni Environment o'zgaruvchilar va .env darsida o'rgangansiz. PGPASSWORD ni esa ehtiyot bilan ishlating — hujjat uni tavsiya qilmaydi, chunki ba'zi tizimlarda boshqa jarayonlar muhit o'zgaruvchilarini ko'ra oladi.
5.5 Server parolni qanday saqlaydi
Kanon parolli serverda parol jadvalining boshini ko'rdi:
postgres|SCRAM-SHA-256$…Postgres parolni ochiq holda emas, SCRAM-SHA-256 hash ko'rinishida saqlaydi. Hash'ni crypto 2: parolni hash'lash, shifrlash va imzo darsida o'rgangansiz — bu yerda xuddi shu g'oya.
Kanon image'ning kirish qoidalarini ham ko'rdi. Ular pg_hba.conf faylida yoziladi va pg_hba_file_rules ko'rinishidan o'qiladi (replication qatorlari olib tashlandi). Har qatorni yuqoridan pastga o'qing — birinchi mos kelgan qoida ishlaydi:
type | database | user_name | address | auth_method
-------+----------+-----------+-----------+---------------
local | {all} | {all} | | trust
host | {all} | {all} | 127.0.0.1 | trust
host | {all} | {all} | ::1 | trust
host | {all} | {all} | all | scram-sha-256Nima bo'ldi? local — konteyner ichidagi Unix soket orqali ulanish, 127.0.0.1 — konteynerning o'z ichki manzili: ikkalasi trust. Tashqaridan kelgan har qanday manzil (all) — scram-sha-256, ya'ni parol. Shuning uchun docker exec … psql parol so'ramaydi, kompyuterdagi psql esa so'raydi.
6. GUI klientlar
Terminal hamma narsani qiladi, lekin jadvallarni ko'rib chiqish va diagramma uchun grafik dastur qulay. Mashhurlari:
| Dastur | Narxi | Xususiyati |
|---|---|---|
| DBeaver Community | bepul | ko'p bazani qo'llaydi, ER diagramma |
| pgAdmin 4 | bepul | Postgres'ning rasmiy admin vositasi |
| TablePlus | bepul cheklangan | yengil, tez |
Hammasida ulanish oynasi bir xil maydonlardan iborat: Host, Port, Database, Username, Password, SSL. Ba'zilari to'g'ridan-to'g'ri connection string'ni qabul qiladi. Bu dasturlarni kanon o'rnatmagan va sinamagan — jadval ularning rasmiy saytlariga tayanadi (2026-10).
Maslahat: GUI'da ham terminalda ham bir xil ma'lumotlarni kiritasiz. Terminalda ulanish ishlasa-yu, GUI'da ishlamasa — farqni maydonlardan qidiring: ko'pincha port (5432 o'rniga 5499) yoki SSL sozlamasi.
7. SQL qadami: vazifalar bazasini ko'tarish
Endi kanon bilan bir xil muhit yaratasiz. Qadamlar:
- «Konteynerni ishga tushirish» bo'limidagi
docker runni bajaring (nomnivazifalar-pgkabi o'zingiznikiga almashtirsangiz ham bo'ladi). pg_isreadybilan tayyorligini tekshiring.createdb -U postgres vazifalarbilan bazani yarating.- Kompyuteringizdagi psql bilan ulaning (psql o'rnatilmagan bo'lsa —
docker exec -it kanon26-pg psql -U postgres -d vazifalar).
Loyiha papkasida .env.example fayli bo'ladi — unda haqiqiy sir yo'q, faqat namuna:
# .env.example — faqat lokal o'quv bazasi (trust, parolsiz)
DATABASE_URL=postgres://postgres@127.0.0.1:5499/vazifalarBu satrni Node.js'dagi pg kutubxonasi node-postgres (pg) asoslari darsida o'qiydi. Parolli bazada haqiqiy .env faylga parol bilan yoziladi va u git'ga tushmaydi. Bu darsda commit yo'q — bazada hali jadval ham yo'q. Birinchi jadvallar CREATE TABLE va cheklovlar darsida.
8. Ko'p uchraydigan xatolar
8.1 Connection refused
psql: error: connection to server at "127.0.0.1", port 5490 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?Tarjimasi: "ulanish rad etildi. Server shu hostda ishlayaptimi va TCP/IP ulanishlarni qabul qilyaptimi?" Kanon ataylab noto'g'ri port (5490) berdi. Bu portda hech kim tinglamayapti. Tekshiring: konteyner ishlayaptimi (docker ps), port to'g'rimi (5432 emas, 5499), -p qaysi portni ochgan. 10061 — Windows'ning shu xatoga bergan raqami.
8.2 database "…" does not exist
psql: error: connection to server at "127.0.0.1", port 5499 failed: FATAL: database "yoq_baza" does not existServer topildi, kirish ham bor, lekin bunday nomli baza yo'q. Yangi konteynerda faqat postgres bazasi bor — o'zingiznikini createdb bilan yarating. Nomdagi xatoni ham tekshiring: vazifalar va Vazifalar — Postgres uchun har xil.
8.3 Paroldagi maxsus belgi
could not translate host name "parol@127.0.0.1" — paroldagi @ («Parolda @ bo'lsa» bo'limi). %40 bilan kodlang.
8.4 Eski qo'llanmadagi volume yo'li
-v nom:/var/lib/postgresql/data bilan 18-image ishga tushmaydi va Error: in 18+, these Docker images are configured to store database data in a format which is compatible with "pg_ctlcluster" xatosini beradi. To'g'risi — -v nom:/var/lib/postgresql.
8.5 Parolni kodga yozish
const url = "postgres://admin:Juda$ir1i@…" — kod git'ga tushadi va parol hammaga ochiladi. Parol — .env faylda (git'ga kirmaydi), .pgpass da yoki serverning sirlar boshqaruvida. Namunada esa faqat .env.example dagi parolsiz satr.
9. Mashqlar
Mashqlar kurs/mashqlar/26/08-ornatish-ulanish/ da.
1-mashq (oson): satrni to'ldiring
Server: kompyuterda, 5499-port; foydalanuvchi postgres, parolsiz; baza dokon. Connection string:
postgres://@:/
Yechim
postgres://postgres@127.0.0.1:5499/dokon. Parol yo'q — shuning uchun : va parol qismi ham yozilmaydi. 127.0.0.1 o'rniga localhost ham ishlaydi (kanon tekshirgan).
2-mashq (o'rta): xatoni tashxislang
Uchta xato xabari bor. Har biri uchun sababini va tuzatishni yozing:
FATAL: database "Vazifalar" does not existfe_sendauth: no password suppliedserver does not support SSL, but SSL was required
Yechim
- Baza nomi katta harf bilan yozilgan — bazada
vazifalarbor. Nomni kichik harf bilan yozing (yoki\lbilan ro'yxatni ko'ring — keyingi darsda). - Server parol so'radi, psql'da parol yo'q. Parolni
.pgpassga qo'shing yoki URL'ga (kodlangan holda) yozing. - Satrda
sslmode=require, lokal serverda SSL yo'q. Lokaldasslmodeni olib tashlang yokidisableqiling; bulutda esa sozlamani qoldiring.
3-mashq (qiyin): connection string tahlilchisi
ulanishniTahlilQil(satr) funksiyasini yozing. U new URL() bilan satrni o'qib, obyekt qaytarsin: foydalanuvchi, parolBormi (parolning o'zini qaytarmang!), host, port (yo'q bo'lsa 5432, son), baza, sozlamalar (obyekt). Sxema postgres: yoki postgresql: bo'lmasa — xato tashlasin. new URL va searchParams ni URL va URLSearchParams darsida o'rgangansiz; foydalanuvchi va baza nomi URL-kodlangan bo'lishi mumkin — decodeURIComponent.
Yechim
function ulanishniTahlilQil(satr) {
const url = new URL(satr);
if (!["postgres:", "postgresql:"].includes(url.protocol)) {
throw new Error(`Postgres manzili emas: ${url.protocol}`);
}
return {
foydalanuvchi: decodeURIComponent(url.username),
parolBormi: url.password !== "",
host: url.hostname,
port: Number(url.port || 5432),
baza: decodeURIComponent(url.pathname.slice(1)),
sozlamalar: Object.fromEntries(url.searchParams),
};
}
console.log(ulanishniTahlilQil(
"postgres://postgres@127.0.0.1:5499/vazifalar?sslmode=disable"));
console.log(ulanishniTahlilQil(
"postgresql://ali:namuna%40parol@localhost/dokon"));Konsolda:
{
foydalanuvchi: 'postgres',
parolBormi: false,
host: '127.0.0.1',
port: 5499,
baza: 'vazifalar',
sozlamalar: { sslmode: 'disable' }
}
{
foydalanuvchi: 'ali',
parolBormi: true,
host: 'localhost',
port: 5432,
baza: 'dokon',
sozlamalar: {}
}Nega parolning o'zi qaytmaydi? Bunday obyekt ko'pincha logga yoziladi ("qaysi bazaga ulanyapman?"). Logga tushgan parol — oshkor bo'lgan parol. parolBormi tashxis uchun yetadi.
4-mashq: SQL qadami
«SQL qadami» bo'limidagi to'rt qadamni bajaring va o'z bazangizda shu so'rovni ishga tushiring: select current_database(), version();. Natijada vazifalar va PostgreSQL 18 bo'lishi kerak. Keyin konteynerni to'xtatib (docker stop), qayta yoqing (docker start) va vazifalar hali borligini tekshiring.
Yechim
docker exec kanon26-pg psql -U postgres -d vazifalar \
-c "select current_database(), version();"
docker stop kanon26-pg
docker start kanon26-pg
docker exec kanon26-pg psql -U postgres -lBirinchi buyruq vazifalar va PostgreSQL 18.6 (Debian …) ni ko'rsatadi. Oxirgi buyruq (-l — bazalar ro'yxati) qayta yoqilgandan keyin ham vazifalar borligini ko'rsatadi. docker start dan keyin bir-ikki soniya kuting yoki pg_isready bilan tekshiring — server hali tayyor bo'lmasa the database system is starting up xabari chiqishi mumkin.
10. Real ishda
- Jamoada: loyiha README'sida odatda "bazani ko'tarish" bo'limi bor — aynan
docker runyoki Docker Compose fayli va.env.example. Compose'ni deploy qismida o'rganamiz. - Production'da: bazaga ulanish satri sir sifatida saqlanadi (serverdagi
.env, bulutning sirlar xizmati). SSL majburiy, foydalanuvchi — superuser emas, cheklangan huquqli rol (Rollar va huquqlar darsida). - Tez-tez uchraydigan muammo: "lokalda ishlaydi, serverda — yo'q". 90 % holatda sabab ulanish satrida: host (konteyner ichida
localhost— konteynerning o'zi), port, SSL yoki parol. - Intervyu savollari: "Connection string qanday qismlardan iborat?", "Parolni qayerda saqlaysiz?", "
sslmode=requirevaverify-fullfarqi?".
Xulosa
- Asosiy yo'l — Docker:
-p 127.0.0.1:5499:5432(faqat lokal port),-v nom:/var/lib/postgresql(18-image yo'li), parol yoki faqat lokaltrust. - Connection string:
postgres://foydalanuvchi:parol@host:port/baza?sozlamalar; port sukut 5432. - Paroldagi
@,:,/URL-kodlanadi (%40); aks holdacould not translate host namexatosi. - Parol —
.pgpass(host:port:baza:foydalanuvchi:parol), muhit o'zgaruvchisi yoki.envda; kodda emas. - Asosiy xatolar:
Connection refused(port/server),database … does not exist(nom),no password supplied,server does not support SSL.
Keyingi dars: psql chuqur — Postgres'ning terminal klienti: meta-buyruqlar, natijani ko'rish rejimlari va skriptlar.
Manbalar
- PostgreSQL 18 hujjati — Connection Strings (libpq): https://www.postgresql.org/docs/18/libpq-connect.html#LIBPQ-CONNSTRING
- PostgreSQL 18 hujjati — The Password File: https://www.postgresql.org/docs/18/libpq-pgpass.html
- PostgreSQL 18 hujjati — Environment Variables: https://www.postgresql.org/docs/18/libpq-envars.html
- PostgreSQL 18 hujjati — SSL Support (
sslmode): https://www.postgresql.org/docs/18/libpq-ssl.html - Docker Hub — postgres rasmiy image: https://hub.docker.com/_/postgres
- Docker hujjati — Docker with ufw/firewalld: https://docs.docker.com/engine/network/packet-filtering-firewalls/
- PostgreSQL yuklab olish sahifasi: https://www.postgresql.org/download/
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!