Dashboard SAKTI
Pipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN

- satker disinkronkan setiap malam
- 6
- jenis data SAKTI diambil per job
- 6
- WIB sinkronisasi malam, tanpa unduh manual
- 02.00
- dari repositori kosong sampai pipeline berjalan
- 2 hari
Di halaman ini
Masalahnya
Otorita IKN punya enam satuan kerja (satker), dan data anggaran serta realisasi setiap satker tersimpan di SAKTI, sistem milik Kementerian Keuangan. Setiap kali biro perencanaan butuh angka untuk laporan, rapat pimpinan, atau Power BI, seseorang harus login ke SAKTI, mengunduh file Excel per satker, lalu menggabungkannya secara manual.
Akibatnya tidak ada riwayat dan tidak ada tampilan tunggal. Tidak ada yang bisa melihat pergerakan belanja dari waktu ke waktu. Setiap alat lain yang butuh angkanya mendapatkannya lewat salin-tempel. Tim data ingin angka-angka itu terkumpul otomatis, tersimpan dari waktu ke waktu, dan tampil di satu tempat.
Yang saya bangun
Pipeline malam yang mengambil data setiap satker
Sebuah job terjadwal berjalan setiap malam pukul 02.00 WIB. Job ini menarik enam jenis data SAKTI untuk setiap satker aktif secara paralel, lalu menyimpannya ke database. Daftar satker dibaca dari database saat job dimulai. Administrator cukup menambah atau menonaktifkan satker di panel admin, dan job berikutnya langsung mengikuti. Tidak ada satker yang di-hardcode. Setiap job aman diulang, karena menyimpan data yang sama dua kali akan memperbaruinya, bukan menggandakannya.
Saya mensimulasikan SAKTI supaya pekerjaan tidak menunggu akses
Kredensial SAKTI yang asli belum tersedia. Cara login SAKTI juga tidak biasa: setiap respons memberikan kunci sekali pakai yang baru, dan kunci sebelumnya langsung tidak berlaku. Saya membangun server tiruan kecil yang berperilaku sama, termasuk respons kunci kedaluwarsa, dan menyajikan data contoh untuk keenam jenis data. Seluruh pipeline berjalan di atasnya. Pindah ke sistem asli cukup dengan mengubah dua pengaturan, tanpa mengubah kode.
Satu tempat untuk logika penyimpanan
Job terjadwal menulis ke database lewat model data yang sama dengan aplikasi web. Saya memilih cara ini ketimbang menaruh API web di antara keduanya, supaya aturan penyimpanan data hanya ada di satu tempat. Konsekuensinya, penjadwal bergantung pada kode aplikasi web. Untuk enam satker, itu pertukaran yang wajar.
Dashboard dengan penanda sinkronisasi dan ekspor Excel
Dashboard-nya punya tiga halaman. Halaman ringkasan menampilkan total anggaran, total realisasi, dan persentase serapan, lengkap dengan grafik tren dan gauge. Halaman detail merinci satu satker per program dan kegiatan, dengan filter tanggal. Halaman pengelolaan menampilkan daftar satker. Setiap job malam mencatat status, jumlah baris, durasi, dan pesan error, lalu dashboard menampilkan kapan data terakhir disinkronkan. Tampilan apa pun bisa diekspor ke file Excel yang sudah diformat.
Hasilnya
Saya membangun platform ini dalam dua hari di bulan Juni 2026, dari repositori kosong. Semuanya berjalan dari ujung ke ujung: job malam, client SAKTI, database, API, dashboard, dan ekspor Excel. Saat ini platform berjalan di atas server SAKTI tiruan dengan data contoh. Setup produksinya sudah siap dan teruji bisa menyala dengan bersih. Data asli menunggu Kementerian Keuangan memberikan kredensial. Di versi pertama ini dashboard belum punya login sendiri, dan ditujukan untuk jaringan internal OIKN.
Di balik layarDetail teknis untuk engineer
- DAG Airflow
sakti_daily_syncmembaca tabelSatkersaat runtime dan memakai.expand()untuk dynamic task mapping. Task-nya:fetch_ref_sts,fetch_ref_admin_uraian, lalufetch_data_ang,fetch_spp_header, danfetch_capaian_roper satker, lalunormalize_and_loaddanlog_sync_result. - Task DAG mengimpor model Django langsung: source backend di-mount ke container Airflow dengan
DJANGO_SETTINGS_MODULEterpasang. Upsert memakaiupdate_or_create. - Django app
mock_saktimenyimpan token di memori dengan rotasi UUID, meniru Bearer token sekali pakai milik SAKTI dan endpoint bootstrapresetToken, serta menyajikan fixture JSON yang deterministik. SaktiClientmemisahkan state token (auth.py) dari alur request (client.py) dan mencoba ulang dengan exponential backoff lewattenacity.SyncLogmenyimpan status, jumlah baris, durasi, dan error per task. Hooknotify_failure_placeholdersudah terpasang di DAG.- Ekspor Excel memakai
openpyxl: header tebal, lebar kolom otomatis, format mata uang, dan baris header yang dibekukan. - Baris
Anggarantidak punya kolom tanggal, jadi toggle granularitas di grafik membagi total anggaran secara merata. RiwayatrefStsyang bertanggal akan menggantikannya. - Data aplikasi dan metadata Airflow berbagi satu container MySQL 8, sebagai database terpisah dengan user terpisah.
- Lima service Docker dengan multi-stage build dan healthcheck;
docker-compose.prod.ymlmemakairestart: unless-stopped. - 8 Django app, 9 endpoint REST termasuk health dan status sinkronisasi, 10 komponen React, sekitar 5.000 baris Python dan JSX, 10 commit dalam sembilan fase.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.