Wanzul Blog

Nota, pendapat, dan pengajaran yang aku bayar sendiri.

Windows About with Postgres

Buat PostgreSQL Hidup Sendiri Bila Terminal WSL 2 Dibuka

Rutin harian aku melibatkan kerja dengan Ruby on Rails, dan PostgreSQL jadi relational database service utama. Jadi, aku akan bincang macam mana nak automate start servis PostgreSQL dalam Windows Subsystem Linux (WSL) 2.

Ceritanya

Aku memang teruja dengan release Windows 11 yang keluar di channel Insider Preview. Aku dah daftar program tu pada laptop Dell XPS aku dan guna sebagai daily driver selama seminggu. Pengalaman yang bagus sepanjang minggu tu — tak ada isu, tak ada bug bodoh yang selalu datang sekali dengan release Windows yang tak stabil. Jadi artikel ni aku tulis berdasarkan pengalaman aku set up pada build Windows Preview terbaru, 22000.5.

Latar belakang

Aku ikut tutorial GoRails pasal Install Ruby On Rails on Windows 10. Tutorial tu cadang kita install PostgreSQL pada Windows dan guna dari WSL. Aku dah cuba cara tu, tapi ia tak jalan out of the box dan aku rasa masih perlu beberapa tweak yang aku sendiri belum tahu macam mana nak buat. Sejak tu, aku install PostgreSQL dalam WSL — maksudnya aku kena start servis Postgres setiap kali pertama WSL dibuka.

Macam mana nak start servis Postgres?

Dua-dua cara ni jalan pada WSL aku untuk start servis postgres:

  • sudo pg_ctlcluster 12 main start atau;
  • sudo service postgresql start

Masalahnya

Dulu aku kerja dengan Ubuntu, di mana servis postgres start automatik bila OS boot. Mungkin sebab systemd?

Aku memang terkejut setiap kali terlupa start servis postgres, dan masa aku run command Active Record, ia pulangkan ralat:

PG::ConnectionBad: could not connect to server: No such file or directory

Sebab servis postgres ni wajib bagi aku setiap kali buka terminal WSL, aku mula fikir macam mana nak automate start servis tu pada setiap kali pertama terminal dibuka. Takkan nak taip command yang sama setiap pagi. p/s servis postgres tak start automatik pada WSL.

Tulis shell script yang ringkas

Setiap kali kita buka terminal, OS akan execute fail .bashrc dan kita akan ubah fail tu untuk check sama ada servis postgres tengah jalan atau tak. Kenapa perlu check? Sebab terminal boleh dibuka banyak kali, jadi servis tak perlu start banyak kali. Sekali je cukup. Jadi kita perlu satu mekanisme untuk check status servis tu.

*Nota: .bashrc ada dalam home directory kau, biasanya di /home/<username>/.bashrc

if ! pgrep -x "postgres" >/dev/null; then
  sudo pg_ctlcluster 12 main start
  echo "postgres service started using: sudo pg_ctlcluster 12 main start"
fi

Ini rupa .bashrc penuh aku.

Satu lagi masalah

Kalau kau terus buka terminal lepas set up fail .bashrc, kau akan nampak ia minta password sebab start servis perlukan kau jadi superuser. Jadi kita akan betulkan isu ni dengan whitelist command tu supaya tak perlu taip password.

Kita akan buat satu fail dalam sudoers.d sebab kita tak nak ubah fail OS tu sendiri. Ini elak masalah kalau OS perlu update fail sudoers sebenar masa upgrade. Mula-mula, kita buat fail dengan nama skip_sudo_pg.

$ sudo visudo -f /etc/sudoers.d/skip_sudo_pg

Kemudian, kandungan fail tu:

%sudo  ALL=(ALL) NOPASSWD:/usr/bin/pg_ctlcluster

Siap! Sekarang kau dah set servis postgres start automatik pada kali pertama terminal dijalankan. Ia sangat masuk akal bagi aku sebab aku selalu kerja dengan Rails console dan Active Record query setiap kali buka terminal WSL. Servis tu memang kena ada dari saat pertama.

Kalau kau di tempat aku, macam mana kau set environment kau selain cara ni? Kongsi dengan aku ?.

Rujukan

https://www.cyberciti.biz/faq/bash-check-if-process-is-running-or-notonlinuxunix/

https://superuser.com/questions/1343558/how-to-make-wsl-run-services-at-startup

https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file

Wan Zulkarnain Avatar

Written by 


Comments

Leave a Reply