IlmHamroh
JavaScript Full-stack/26-qism. SQL va PostgreSQL8/64-dars17 daqiqa
Mundarija (38)

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, .pgpass faylga 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):

bash
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:18

Har 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/data yoziladi. 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:

bash
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:18

namuna@parol — o'ylab topilgan namunaviy parol, o'zingiznikini qo'ying. Parolsiz ham, trust siz ham konteyner ishga tushmaydi. Kanon tekshirgan xabar:

text
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:

bash
docker exec kanon26-pg pg_isready -U postgres

Javob … - 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:

text
127.0.0.1:5511 - accepting connections

Konteyner ichida host berilmasa, manzil o'rnida soket fayli yo'li chiqadi. Endi server versiyasini so'raymiz:

bash
docker exec kanon26-pg psql -U postgres -c "select version();"

Kanon chiqishi:

text
                               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:

bash
docker exec kanon26-pg createdb -U postgres vazifalar

createdb — 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-pg bilan o'chirib, xuddi shu docker run ni qayta ishga tushirdingiz. vazifalar bazasi 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:

text
postgres://postgres:namuna%40parol@127.0.0.1:5499/vazifalar?sslmode=disable

Uni 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:

bash
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:

text
 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:

bash
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):

text
 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:

text
psql: error: connection to server at "127.0.0.1", port 5499 failed: server does not support SSL, but SSL was required

Tarjimasi: "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:

bash
psql "host=127.0.0.1 port=5499 dbname=vazifalar user=postgres" \
  -Atc "select 'keyword/value shakli ishladi'"

Kanon chiqishi:

text
keyword/value shakli ishladi

Ikkala shakl teng kuchli. Node kutubxonalari va bulut xizmatlari ko'pincha URL shaklini beradi.

Tekshirib ko'ring: postgres://ali@db.example.com/dokon satrida 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:

bash
psql "postgres://postgres:namuna@parol@127.0.0.1:5497/postgres" \
  -c "select 1"

Kanon chiqishi:

text
psql: error: could not translate host name "parol@127.0.0.1" to address: Non-recoverable failure in name resolution

Tarjimasi: "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:

text
parol URL-kodlangan (@ -> %40): postgres

Kanon 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:

text
psql: error: connection to server at "127.0.0.1", port 5497 failed: fe_sendauth: no password supplied

Tarjimasi: "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:

text
host:port:baza:foydalanuvchi:parol

Kanon fayli (* — "istalgan baza"):

text
127.0.0.1:5497:*:postgres:namuna@parol

Faylda parol kodlanmaydi — @ shundayligicha yoziladi. Shu fayl bilan URL'da parol yozilmagan ulanish ishladi:

text
pgpass orqali: postgres

Fayl 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:

bash
PGHOST=127.0.0.1 PGPORT=5511 PGUSER=postgres PGDATABASE=v15 \
  psql -X -Atc "select current_database(), current_user"

Natija:

text
v15|postgres

Hech 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:

text
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:

text
 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-256

Nima 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:

  1. «Konteynerni ishga tushirish» bo'limidagi docker run ni bajaring (nomni vazifalar-pg kabi o'zingiznikiga almashtirsangiz ham bo'ladi).
  2. pg_isready bilan tayyorligini tekshiring.
  3. createdb -U postgres vazifalar bilan bazani yarating.
  4. 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:

bash
# .env.example — faqat lokal o'quv bazasi (trust, parolsiz)
DATABASE_URL=postgres://postgres@127.0.0.1:5499/vazifalar

Bu 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

text
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

text
psql: error: connection to server at "127.0.0.1", port 5499 failed: FATAL:  database "yoq_baza" does not exist

Server 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:

  1. FATAL: database "Vazifalar" does not exist
  2. fe_sendauth: no password supplied
  3. server does not support SSL, but SSL was required
Yechim
  1. Baza nomi katta harf bilan yozilgan — bazada vazifalar bor. Nomni kichik harf bilan yozing (yoki \l bilan ro'yxatni ko'ring — keyingi darsda).
  2. Server parol so'radi, psql'da parol yo'q. Parolni .pgpass ga qo'shing yoki URL'ga (kodlangan holda) yozing.
  3. Satrda sslmode=require, lokal serverda SSL yo'q. Lokalda sslmode ni olib tashlang yoki disable qiling; 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
js
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:

text
{
  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
bash
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 -l

Birinchi 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 run yoki 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=require va verify-full farqi?".

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 lokal trust.
  • Connection string: postgres://foydalanuvchi:parol@host:port/baza?sozlamalar; port sukut 5432.
  • Paroldagi @, :, / URL-kodlanadi (%40); aks holda could not translate host name xatosi.
  • Parol — .pgpass (host:port:baza:foydalanuvchi:parol), muhit o'zgaruvchisi yoki .env da; 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

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
PostgreSQL o'rnatish va ulanish: Docker, connection string va parollar — IlmHamroh