Service-nya mati. Log-nya merah.
Begitu kondisi yang saya hadapi waktu pertama kali mencoba menjalankan carbonio-tasks di server demo. Bukan satu masalah, ternyata dua. Dan keduanya harus diselesaikan berurutan sebelum service itu mau hidup normal.
Ini ceritanya.
Masalah Pertama: CPU yang Tidak Cukup Canggih
Error pertama yang muncul langsung bikin saya berhenti sebentar:
The current machine does not support all of the following CPU features that are required by the image:
[CX8, CMOV, FXSR, MMX, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, POPCNT, LZCNT, AVX, AVX2, BMI1, BMI2, FMA].
Please rebuild the executable with an appropriate setting of the -march option.
Terjemahan bebasnya: executable Carbonio Tasks dikompilasi dengan instruksi CPU modern, tapi VM yang menjalankannya tidak punya fitur-fitur itu.
Saya cek CPU yang terlihat dari dalam VM:
lscpu | grep -iE 'model name|flags'
Hasilnya cukup jelas masalahnya dari mana:
Model name: QEMU Virtual CPU version 2.5+
VM ini berjalan di atas Proxmox dengan tipe CPU generik QEMU. CPU generik itu sengaja tidak mengekspos instruction set modern seperti AVX, AVX2, BMI1, BMI2, dan FMA ke guest OS. Aman untuk kompatibilitas lintas host, tapi tidak cocok untuk binary yang dikompilasi dengan flag CPU modern.
Solusinya harus dikerjakan dari sisi hypervisor, bukan dari dalam VM:
qm stop <VMID>
qm set <VMID> --cpu host
qm start <VMID>
Atau kalau lebih nyaman lewat GUI Proxmox: VM → Hardware → Processor → Type → host.
Setelah VM restart, saya verifikasi dulu apakah CPU flags yang dibutuhkan sudah muncul:
grep -m1 flags /proc/cpuinfo | grep -oE 'avx2|avx|fma|bmi1|bmi2|lzcnt|sse4_2|popcnt' | sort -u
Kalau outputnya sudah mencantumkan avx, avx2, fma, dan kawan-kawannya, berarti CPU type sudah berhasil diubah. Baru restart service-nya:
systemctl restart carbonio-tasks
systemctl status carbonio-tasks --no-pager -l
Service mulai bergerak. Tapi belum hidup sepenuhnya. Error berikutnya sudah menunggu.
Masalah Kedua: Consul KV yang Salah Alamat
Setelah masalah CPU beres, carbonio-tasks berhasil masuk ke proses bootstrap tapi langsung berhenti lagi dengan error baru:
Caused by: java.lang.IllegalStateException:
Database module is present for service 'carbonio-tasks'
but database.credentials.db-name, database.credentials.db-username, or database.credentials.db-password
not found in Consul KV under 'carbonio-tasks/database/credentials/'.
Service tidak bisa menemukan kredensial database di Consul. Saya coba jalankan pending setup dulu:
pending-setups -a
Hasilnya:
There are no pending-setups to run. Exiting!
Script setup sudah pernah jalan sebelumnya dan sudah dipindah ke /etc/zextras/pending-setups.d/done/. Jadi bukan soal setup yang belum dijalankan. Masalahnya ada di tempat lain.
Saya langsung periksa isi Consul KV untuk prefix carbonio-tasks/. Pertama export token dulu:
export CONSUL_HTTP_TOKEN=$(gpg -qdo - /etc/zextras/service-discover/cluster-credentials.tar.gpg | tar xOf - consul-acl-secret.json | jq -r .SecretID)
Lalu cek semua key yang ada:
consul kv get -recurse carbonio-tasks/
Hasilnya menarik. Kredensial database memang ada di Consul, tapi tersimpan di path lama:
carbonio-tasks/db-name:carbonio-tasks-db
carbonio-tasks/db-password:<database-password>
carbonio-tasks/db-username:carbonio-tasks-db
Sementara versi carbonio-tasks yang terpasang sekarang mencari kredensial di path baru:
carbonio-tasks/database/credentials/db-name
carbonio-tasks/database/credentials/db-username
carbonio-tasks/database/credentials/db-password
Path mismatch. Setup lama menyimpan di satu tempat, versi baru mencari di tempat yang berbeda.
Solusinya sederhana tapi harus teliti: salin nilai dari path lama ke path baru. Sebelum itu, backup dulu kondisi KV yang ada:
consul kv get -recurse carbonio-tasks/ > /root/backup-carbonio-tasks-consul-kv-$(date +%F-%H%M%S).txt
chmod 600 /root/backup-carbonio-tasks-consul-kv-*.txt
Baru baca nilainya dari path lama dan tulis ke path baru:
DB_NAME="$(consul kv get carbonio-tasks/db-name)"
DB_USER="$(consul kv get carbonio-tasks/db-username)"
DB_PASS="$(consul kv get carbonio-tasks/db-password)"
consul kv put carbonio-tasks/database/credentials/db-name "$DB_NAME"
consul kv put carbonio-tasks/database/credentials/db-username "$DB_USER"
consul kv put carbonio-tasks/database/credentials/db-password "$DB_PASS"
Verifikasi dulu sebelum start service:
consul kv get carbonio-tasks/database/credentials/db-name
consul kv get carbonio-tasks/database/credentials/db-username
consul kv get carbonio-tasks/database/credentials/db-password
Kalau sudah mengembalikan nilai yang benar, start service-nya:
systemctl start carbonio-tasks
systemctl status carbonio-tasks --no-pager -l
Akhirnya Hidup
Log yang muncul setelah kedua masalah diselesaikan:
Database: jdbc:postgresql://127.78.0.16:20000/carbonio-tasks-db (PostgreSQL 16.14)
Successfully validated 2 migrations
Schema "public" is up to date. No migration necessary.
Database connection validated for service 'carbonio-tasks'
carbonio-tasks-app 1.1.0-1 native started
Listening on: http://127.78.0.16:10000
Service jalan. Port listening. Database terkoneksi.
Untuk memastikan semuanya benar-benar beres, saya jalankan tiga pengecekan terakhir:
# Status service
systemctl status carbonio-tasks --no-pager -l
# Cek port listening
ss -tulpn | grep 10000
# Lihat log terbaru
journalctl -u carbonio-tasks -n 80 --no-pager
Yang Bisa Dipelajari dari Ini
Dua masalah ini punya satu kesamaan: keduanya tidak terlihat dari dalam aplikasi itu sendiri. CPU type itu urusan hypervisor, bukan urusan service. Consul KV path itu warisan setup lama yang tidak otomatis dimigrasi waktu versi baru dipasang.
Kalau carbonio-tasks gagal start dan errornya soal CPU features, jangan cari solusinya di dalam VM. Solusinya ada di pengaturan hypervisor.
Kalau errornya soal kredensial tidak ditemukan di Consul padahal setup sudah pernah jalan, jangan langsung panik dan ulang setup dari awal. Cek dulu isi Consul KV secara manual. Mungkin datanya ada, tapi di path yang berbeda dari yang dicari.
Debugging itu soal tahu harus cari di mana. Sisanya tinggal teliti.