Mengetik psql -h localhost -p 5432 -U postgres -d latihan sekali dua kali masih wajar; mengetiknya puluhan kali sehari, atau menuliskannya di sepuluh file konfigurasi aplikasi, adalah cara pasti untuk salah ketik. PostgreSQL menyediakan beberapa mekanisme penyimpanan parameter koneksi: environment variable, connection string, connection service file, dan file kata sandi .pgpass. Chapter ini membedah keempatnya satu per satu, lengkap dengan contoh yang bisa dijalankan.

Environment Variable PG* #

Seluruh client berbasis pustaka libpq — psql, pg_dump, pg_restore, hingga driver banyak bahasa pemrograman — membaca sekumpulan environment variable berprefiks PG:

VariableMenetapkanKeterangan
PGHOSTHost atau direktori socket
PGPORTPort
PGUSERUser untuk masuk
PGDATABASEDatabase tujuan
PGPASSWORDKata sandiBerlaku untuk satu perintah saja bila di-prefix di depan perintah
PGSERVICENama service di file serviceLihat subbab Connection Service File
PGSERVICEFILELokasi file serviceBawaannya ~/.pg_service.conf
PGPASSFILELokasi file kata sandiBawaannya ~/.pgpass

Variable ini biasanya diekspor sekali di file profil shell sehingga setiap psql berikutnya memakainya secara diam-diam. Skrip berikut mendemonstrasikan yang paling sering dipakai, PGPASSWORD, sebagai prefix untuk satu perintah:

bash sandi-env.sh
# PGPASSWORD menyuplai kata sandi tanpa prompt
PGPASSWORD='YOUR_PASSWORD' psql -X -c "SELECT current_user, current_database();"

Output yang Dihasilkan:

text
 current_user |  current_database  
--------------+--------------------
 postgres     | pgtutor_98f3f38402
(1 row)

Kalau perintah itu berhasil, kata sandi memang tersalurkan. Ada satu kehalusan dari lingkungan pengujian materi ini: server latihannya memakai metode autentikasi trust, sehingga kata sandi tidak benar-benar diverifikasi — yang didemonstrasikan di sini adalah mekanisme suplai nilainya. Di server dengan scram-sha-256, nilai dari PGPASSWORD dipakai tepat di tempat yang sama: menggantikan prompt kata sandi interaktif. Nama database pgtutor_... pada output adalah database sementara tempat contoh course ini dijalankan; di komputer Anda tampil nama database aktif Anda sendiri.

Connection String: URI dan Keyword/Value #

Sebagai ganti flag terpisah, seluruh parameter koneksi bisa dipadatkan menjadi satu connection string yang diberikan sebagai argumen database. Dua bentuknya dikenal luas. Bentuk URI:

text
postgresql://postgres@localhost:5432/latihan
postgresql://postgres:YOUR_PASSWORD@localhost:5432/latihan
postgresql://localhost/latihan

Bagian-bagiannya mengikuti pola postgresql://user:password@host:port/database. Semua bagian kecuali host boleh ditinggalkan: URI pertama menyebut user dan port tanpa kata sandi, sedangkan URI ketiga cukup menyebut host dan database karena port jatuh ke bawaan 5432 dan user ke nilai environment atau user sistem operasi. Bentuk kedua adalah keyword/value:

text
host=localhost port=5432 user=postgres dbname=latihan

Kedua bentuk diterima oleh psql maupun driver aplikasi. Contoh pemakaiannya di psql:

bash
psql "postgresql://postgres@localhost:5432/latihan"
psql "host=localhost port=5432 user=postgres dbname=latihan"

Connection string inilah sumber parameter dengan prioritas tertinggi — menimpa environment variable maupun entri file service untuk parameter yang sama. Kata sandi memang bisa disisipkan ke URI seperti contoh kedua, tetapi kebiasaan itu berisiko: connection string kerap tercatat di riwayat shell, file konfigurasi, atau log aplikasi. Menaruh kata sandi di .pgpass hampir selalu lebih aman.

Perlu juga dikenali bahwa kata sandi berisi karakter khusus seperti @ atau : harus di-percent-encode bila ditulis dalam URI (misalnya @ menjadi %40) — salah satu alasan lagi mengapa URI berpassword rawan kesalahan.

Connection Service File #

Connection service file menyimpan kumpulan parameter koneksi bernama — satu blok [nama] berisi host, port, user, dan lainnya — lalu client menyebut namanya saja. Formatnya seperti file INI:

text
[latihan]
host=localhost
port=5432
user=postgres
dbname=latihan

File ini dicari bawaannya di ~/.pg_service.conf, atau di lokasi yang ditunjuk variable PGSERVICEFILE. Untuk terhubung, cukup sebutkan nama service-nya lewat variable PGSERVICE atau sebagai connection string service=latihan. Skrip berikut menulis file service dari nilai lingkungan, terhubung hanya dengan nama service, lalu membersihkan kembali filenya:

# Tulis file service untuk latihan
cat > service-latihan.conf <<EOF
[latihan]
host=$PGHOST
port=$PGPORT
user=$PGUSER
dbname=$PGDATABASE
EOF

# Hubungkan hanya dengan menyebut nama service
PGSERVICEFILE=service-latihan.conf PGSERVICE=latihan \
  psql -X -c "SELECT current_user, current_database();"

# Hapus kembali file service latihan
rm service-latihan.conf

Output yang Dihasilkan:

text
 current_user |  current_database  
--------------+--------------------
 postgres     | pgtutor_98f3f38402
(1 row)

Mari kita bedah skrip tersebut:

  1. cat > service-latihan.conf <<EOF ... EOF: heredoc bash menulis beberapa baris ke satu file. Nilai $PGHOST, $PGPORT, $PGUSER, dan $PGDATABASE diambil dari lingkungan tempat skrip berjalan — di lingkungan pengujian materi ini berupa socket, port khusus, dan database sementara chapter. Di komputer Anda, tulis nilai literal seperti contoh blok [latihan] di atas.
  2. PGSERVICEFILE=... PGSERVICE=latihan psql ...: dua prefix menetapkan lokasi file service dan nama service untuk perintah psql itu saja. Satu-satunya parameter koneksi yang kita sebut adalah nama service — host, port, user, dan database semuanya dibaca dari file.
  3. rm service-latihan.conf: menghapus file latihan supaya direktori kembali bersih.

File service sangat berguna ketika kita bekerja dengan beberapa server sekaligus — latihan, staging, produksi — karena nama service lebih sulit salah ketik daripada kombinasi host dan port, dan dipakai ulang oleh psql, pg_dump, maupun aplikasi lain yang berbasis libpq.

File Kata Sandi .pgpass #

File .pgpass menyimpan kata sandi agar client tidak lagi menampilkannya sebagai prompt. Format tiap barisnya:

text
hostname:port:database:username:password

Contoh isinya:

text
localhost:5432:latihan:postgres:YOUR_PASSWORD
localhost:5432:*:postgres:YOUR_PASSWORD

Kolom pertama sampai keempat adalah matcher: koneksi ke localhost port 5432, database latihan, sebagai user postgres, akan memakai baris pertama. Tanda * berarti “cocok dengan nilai apa pun”, jadi baris kedua berlaku untuk semua database di host dan port itu. Saat psql hendak menyambung, ia mencocokkan parameter koneksinya dengan baris-baris .pgpass dan memakai kata sandi dari baris yang pertama cocok.

File ini dicari bawaannya di ~/.pgpass, atau di lokasi yang ditunjuk PGPASSFILE. Satu syarat wajib yang sering menjebak:

Kombinasi .pgpass plus connection service file menghasilkan pengalaman paling nyaman: menyebut service=latihan saja sudah cukup untuk terhubung lengkap dengan kata sandi, tanpa satu pun rahasia yang tercecer di baris perintah.

Rekap: Mana yang Dipakai Kapan #

KebutuhanMekanisme yang cocok
Konfigurasi sekali untuk semua sesi di satu mesinEnvironment variable di file profil shell
Satu perintah dengan parameter lengkapConnection string URI atau keyword/value
Banyak server dengan nama mudah diingatConnection service file
Kata sandi tanpa prompt dan tanpa tercecer.pgpass dengan permission 0600

Keempat mekanisme ini bekerja pada lapisan yang sama — menyuplai lima parameter koneksi — sehingga bisa dikombinasikan bebas sesuai prioritasnya. Dengan koneksi yang kini rapi, satu pekerjaan terakhir membatasi kenyamanan kita: kebiasaan bekerja sebagai superuser postgres di database yang sama untuk semua proyek. Chapter penutup section ini, Lingkungan Pengembangan, menyusun tata kerja yang lebih sehat.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

layanan-koneksi.sh

Unduh berkas
bash
# Tulis file service untuk latihan
cat > service-latihan.conf <<EOF
[latihan]
host=$PGHOST
port=$PGPORT
user=$PGUSER
dbname=$PGDATABASE
EOF

# Hubungkan hanya dengan menyebut nama service
PGSERVICEFILE=service-latihan.conf PGSERVICE=latihan \
  psql -X -c "SELECT current_user, current_database();"

# Hapus kembali file service latihan
rm service-latihan.conf

sandi-env.sh

Unduh berkas
bash
# PGPASSWORD menyuplai kata sandi tanpa prompt
PGPASSWORD='YOUR_PASSWORD' psql -X -c "SELECT current_user, current_database();"