Menginstall Wakapi, Sebuah Self-Hosted Koding Statistik yang Kompatible Dengan WakaTime Client API

Tutorial cara install Wakapi, sebuah self-hosted koding statistik yang kompatible dengan WakaTime Client API

Wakapi adalah sebuah self-Hosted koding statistik yang kompatible dengan WakaTime client. Dapat diinstall di Windows, MacOS, maupun Linux. Karena Anda yang memegang server, maka data benar-benar milik Anda. Artikel ini berisi cara untuk menjalankan Wakapi di sistem operasi Linux.


Pengantar

Saya yang sehari-harinya banyak berinteraksi dengan komputer, terutama melakukan maintenance server dan koding selalu ingin tahu apa saja yang sudah saya kerjakan, projek mana yang paling banyak menyita waktu, dan bahasa program apa yang paling banyak saya gunakan. Ada beberapa jasa yang pernah saya cobaselama setahun terakhir, dari Activity Watch, CodeStats, hingga WakaTime.

Untuk Activity Watch, memang backend bisa diinstall di lokal / remote server, tetapi saya rasa cukup berat dijalankan. Untuk CodeStats dan WakaTime cukup memuaskan, tetapi ada yang kurang, yaitu data statistik koding dikirimkan ke server mereka. Tentu saja hal tersebut cukup mengganggu pikiran saya.

Beruntungnya, beberapa hari yang lalu ketika saya melakukan “window shopping” ke GitHub menemukan solusi dari yang selama ini saya inginkan yaitu Wakapi; sebuah endpoint API yang kompatibel dengan WakaTime client yang bisa di-self-hosted.

Wakapi server dibuat dengan bahasa program Go, dan dapat dijalankan di sistem operasi Windows, MacOS (baik ARM maupun x86_64), maupun Linux (baik ARM maupun x86_64). Di artikel kali ini saya ingin berbagi pengalaman menginstall dan menjalankan Wakapi di Linux server.

Installasi Server

Sebelum memulai, ada beberapa prasyarat yang harus dipenuhi untuk mengikuti artikel ini:

  • Nyaman menggunakan Linux terminal
  • Salah satu WakaTime client sudah terinstall dan berjalan dengan baik
  • Sebuah Linux server / Laptop / PC
  • Sebuah Web Server (pada artikel ini saya menggunakan Nginx. Optional, tapi recommended jika Wakapi dapat diakses dari publik)

Ada beberapa cara menjalankan Wakapi server sendiri:

  1. Menggunakan precompiled binary
  2. menggunakan Docker
  3. Compile dari source-code

Karena di server saya sudah terinstall Go, maka pada artikel ini saya akan menggunakan opsi ketiga, yaitu melakukan compile langsung dari source-code-nya.

Mempersiapkan Sistem & Compile Executable Binary

Pertama, persiapkan sistem dengan membuat sistem user baru:

1sudo useradd -r -m --system -d /opt/wakapi -s /bin/bash wakapi

Clone repositori mutey/wakapi dan lakukan compile executable binary-nya:

1# clone repo
2git clone https://github.com/muety/wakapi.git
3
4# build executable binary
5cd wakapi
6go build -o wakapi

Setting Konfigurasi Wakapi

Setelah proses compile selesai, pindahkan executable binary ke $HOME milik user wakapi yang sudah kita buat sebelumnya.

1sudo mv wakapi /opt/wakapi/

Download contoh konfigurasi

1sudo curl -o /opt/wakapi/wakapi.yml https://raw.githubusercontent.com/muety/wakapi/master/config.default.yml
2# ubah kepemilikan file ke user wakapi
3sudo chown wakapi:wakapi /opt/wakapi/wakapi.yml /opt/wakapi/wakapi

Kemudian edit file konfigurasi /opt/wakapi/wakapi.yml sesuai dengan yang dibutuhkan. Misalnya, saya akan menggunakan subdomain wakapi.example.com dengan Nginx sebagai reverse proxy untuk Wakapi, maka saya set listen_ipv4 nya ke 127.0.0.1 dan public_url nya ke https://wakapi.example.com. Sesuaikan konfigurasi yang lain seperti koneksi database, SMTP email, dan lain-lain.

Membuat Systemd Service

Setelah konfigurasi sudah disesuaikan dengan kebutuhan, buat Systemd service Wakapi untuk mempermudah manajemen dalam menjalankan atau merestart Wakapi service.

Buat file /etc/systemd/system/wakapi.service dengan isi kurang lebih seperti berikut:

 1[Unit]
 2Description=Wakatime Wakapi
 3StartLimitIntervalSec=400
 4StartLimitBurst=3
 5
 6# Optional, dan jika menggunakan SQL / PostgreSQL dengan Systemd
 7Requires=mysql.service
 8After=mysql.service
 9
10[Service]
11Type=simple
12
13WorkingDirectory=/opt/wakapi
14ExecStart=/opt/wakapi/wakapi -config /opt/wakapi/wakapi.yml
15
16User=wakapi
17Group=wakapi
18RuntimeDirectory=wakapi # creates /run/wakapi, useful to place your socket file there
19
20Restart=on-failure
21RestartSec=90
22
23# Security hardening
24PrivateTmp=true
25PrivateUsers=true
26NoNewPrivileges=true
27ProtectSystem=full
28ProtectHome=true
29ProtectKernelTunables=true
30ProtectKernelModules=true
31ProtectKernelLogs=true
32ProtectControlGroups=true
33PrivateDevices=true
34CapabilityBoundingSet=CAP_NET_BIND_SERVICE
35ProtectClock=true
36RestrictSUIDSGID=true
37ProtectHostname=true
38ProtectProc=invisible
39
40[Install]
41WantedBy=multi-user.target

Kemudian reload dan jalankan wakapi service:

1sudo systemctl daemon-reload
2sudo systemctl enable wakapi.service --now
3
4# cek apakah service berjalan dengan baik
5systemctl status wakapi.service

Jika semua berjalan dengan baik, masuk ke langkah selanjutnya untuk Nginx reverse proxy.

Nginx Reverse Proxy

Untuk konfigurasi Nginx, tidak memerlukan konfigurasi khusus. Cukup gunakan konfigurasi reverse proxy pada umumnya. Contoh:

 1server {
 2    listen 80;
 3    server_name wakapi.example.com;
 4    root /opt/wakapi;
 5    access_log  off;
 6    location /.well-known/acme-challenge/ { allow all; }
 7    location / { return 301 https://$host$request_uri; }
 8}
 9
10server {
11    listen 443 ssl http2;
12    server_name wakapi.example.com;
13    access_log  off;
14
15    ssl_certificate     /path/to/fullchain.pem;
16    ssl_certificate_key /path/to/privkey.pem;
17    
18    # bla bla bla
19
20    location / {
21        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22        proxy_set_header X-Forwarded-Proto $scheme;
23        proxy_set_header X-Real-IP $remote_addr;
24        proxy_set_header Host $http_host;
25        proxy_pass http://127.0.0.1:3000;
26    }
27}

Sesuaikan proxy_pass dengan konfigurasi listen_ipv4 dan port dari /opt/wakapi/wakapi.yml milik Anda.

Kemudian coba akses dari Wakapi server Anda dan lakukan registrasi. Setelah berhasil melakukan registrasi, Anda akan mendapatkan API key yang nantinya Anda perlukan untuk setting WakaTime client.

Konfigurasi WakaTime Client

Server sudah siap dan siap menerima “heartbeat”_ Anda. Selanjutnya sesuaikan konfigurasi WakaTime client Anda ke self-hosted Wakapi Anda. Ubah konfigurasi api_url dan api_key di .wakatime.cfg Anda ke server milik Anda. Misalnya:

1[settings]
2
3api_url = https://wakapi.example.com/api
4api_key = API-Key-Anda-Dari-Wakapi-Server-Anda

Coba lakukan aktifitas koding dan cek aktifitas koding Anda dari Dashboard Wakapi.

Jika Anda kurang puas dengan tampilan dashboard pada Wakapi web UI, anda bisa mengekspose metrics ke format Prometheus kemudian memvisualisasikannya menggunakan Grafana.

Contoh Wakapi Grafana Dashboard

Anda juga bisa mengintegrasikannya dengan GitHub Readme Stats sehingga aktifitas koding Anda dapat tampil di halaman Profile gitHub Anda.

Sekian pengalaman saya menginstall Wakapi server, semoga dapat menjadi inspirasi.