Kemarin seharian saya ngulik chatbot telegram yang dikembangkan menggunakan lita.io dan Ruby. Bot ini saya buat untuk keperluan alumni peserta course Ruby dan Ruby on Rails bareng saya. Awalnya bot jalan di lokal, lama-lama kelihatan tidak reliable karena koneksi internet saya yang lagi sering gangguan. Dari situ terpicu untuk menjalankannya di vps digital ocean.
Awam dunia ops tapi sedikit-sedikit ngerti, saya terpikir untuk ngulik systemd atau semacamnya yang intinya program yang kita buat running di background. Niat ini diurungkan dulu karena butuhnya saat itu juga dan saya tahu cara yang lebih cepet, menggunakan tmux. Jadilah saya buat session tmux baru tmux new -s idrailsbot
kemudian jalankan bundle exec lita
dan yang terakhir detach session-nya. Terdengar bukan best practice memang tapi untuk kebutuhan yang sesederhana itu solusi ini cukup.
Siang sampai malam lancar jaya bot-nya. Ketika makan malam, sambil ngobrol dengan teman lewat telegram, saya arahkan topik seputar systemd. Selesai makan langsung saya buka laptop lagi dan mulai ngulik. Setelah beberapa trial dan error dan panduan dari dia, akhirnya berhasil. Sekarang chatbot-nya running lewat systemd hehe, terdengar lebih “benar” dan fancy dibanding yang sebelumnya.
Berikut ini konfigurasi yang saya buat.
File /lib/systemd/system/idrailsbot.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Unit] Description=IDRailsBotservice Requires=network.target [Service] Type=simple User=deploy WorkingDirectory=/home/deploy/idrailsbot/ ExecStart=/home/deploy/.rbenv/shims/bundle exec lita TimeoutSec=60s RestartSec=30s Restart=always [Install] WantedBy=multi-user.target |
User
berperan penting untuk menge-set user mana yang dipakai ketika menjalankan perintah yang ada di ExecStart
. Di dalam ExecStart
perintah yang dijalankan menggunakan bundle
yang mana di mesin saya hanya user deploy
yang punya akses, makanya penting banget pengesetan user ini.
WorkingDirectory
penting juga, biar systemd tahu perintah di dalam ExecStart
ini dijalankan di mana.
Potongan selanjutnya adalah ExecStart
. Bolah dibilang dia yang jadi aktor utama. Oh ya perintah yang dijalankan mesti full path, jadi ga bisa cuma menjalankan bundle exec
, harus lengkap /home/deploy/.rbenv/shims/bundle exec
. Buat tahu path lengkap gunakan perintah which
, contohnya which bundle
Setelah cukup otak-atik file service, saatnya menjalankannya. Perintah di bawah ini yang digunakan
1 |
sudo systemctl start idrailsbot |
Perintah di atas cuma menjalankan service. Ketika kita butuh service otomatis dijalankan saat mesin nyala (reboot/restart), perintah berikut perlu juga dieksekusi
1 |
sudo systemctl enable idrailsbot |
Biar yakin service sudah jalan atau jangan-jangan gagal jalan, cek status service dengan perintah ini
1 |
sudo systemctl status idrailsbot |
Kode terbaru ketika mau di-deploy perlu restart service dulu
1 |
sudo systemctl restart idrailsbot |
Di awal sering banget kena error, buat ngecek log-nya, pakai perintah ini
1 |
sudo journalctl -u idrailsbot |
Titik penting ngoprek semalam ketika nemu link ini https://stackoverflow.com/questions/49816931/running-ruby-project-with-systemd-service-cannot-find-gemfile