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:
| Variable | Menetapkan | Keterangan |
|---|---|---|
PGHOST | Host atau direktori socket | |
PGPORT | Port | |
PGUSER | User untuk masuk | |
PGDATABASE | Database tujuan | |
PGPASSWORD | Kata sandi | Berlaku untuk satu perintah saja bila di-prefix di depan perintah |
PGSERVICE | Nama service di file service | Lihat subbab Connection Service File |
PGSERVICEFILE | Lokasi file service | Bawaannya ~/.pg_service.conf |
PGPASSFILE | Lokasi file kata sandi | Bawaannya ~/.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:
# PGPASSWORD menyuplai kata sandi tanpa prompt
PGPASSWORD='YOUR_PASSWORD' psql -X -c "SELECT current_user, current_database();"Output yang Dihasilkan:
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:
postgresql://postgres@localhost:5432/latihan
postgresql://postgres:YOUR_PASSWORD@localhost:5432/latihan
postgresql://localhost/latihanBagian-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:
host=localhost port=5432 user=postgres dbname=latihanKedua bentuk diterima oleh psql maupun driver aplikasi. Contoh pemakaiannya di psql:
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:
[latihan]
host=localhost
port=5432
user=postgres
dbname=latihanFile 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.confOutput yang Dihasilkan:
current_user | current_database
--------------+--------------------
postgres | pgtutor_98f3f38402
(1 row)Mari kita bedah skrip tersebut:
cat > service-latihan.conf <<EOF ... EOF: heredoc bash menulis beberapa baris ke satu file. Nilai$PGHOST,$PGPORT,$PGUSER, dan$PGDATABASEdiambil 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.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.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:
hostname:port:database:username:passwordContoh isinya:
localhost:5432:latihan:postgres:YOUR_PASSWORD
localhost:5432:*:postgres:YOUR_PASSWORDKolom 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 #
| Kebutuhan | Mekanisme yang cocok |
|---|---|
| Konfigurasi sekali untuk semua sesi di satu mesin | Environment variable di file profil shell |
| Satu perintah dengan parameter lengkap | Connection string URI atau keyword/value |
| Banyak server dengan nama mudah diingat | Connection 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# 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# PGPASSWORD menyuplai kata sandi tanpa prompt
PGPASSWORD='YOUR_PASSWORD' psql -X -c "SELECT current_user, current_database();"