Pantau ketersediaan website, port TCP, sertifikat SSL, hingga kondisi server Linux dari satu dashboard yang berjalan di infrastruktur sendiri.
Kategori: Sysadmin, DevOps, Self-hosted, Monitoring
Estimasi baca: 10–12 menit
Repository: gagaltotal/Uptime-Monitor
Lisensi: MIT
Daftar Isi
- Kenalan dengan Uptime Monitor
- Tampilan Dashboard
- Fitur Utama
- Teknologi yang Digunakan
- Cara Instalasi Menggunakan Docker Compose
- Konfigurasi Domain dan HTTPS
- Mengonfigurasi Notifikasi
- Memasang Agent pada Server Linux
- Menggunakan SSL & Domain Monitoring
- Pengelolaan Insiden dan Retensi Data
- Keamanan Aplikasi
- Migrasi Database dan Seeder Admin
- Menjalankan Mode Pengembangan Tanpa Docker
- Troubleshooting yang Sering Ditemui
- Perintah Operasional Docker
- Penutup
Kenalan dengan Uptime Monitor
Mengetahui apakah website masih bisa diakses merupakan kebutuhan dasar dalam mengelola infrastruktur IT. Namun, pemantauan tidak cukup hanya dengan sesekali membuka website melalui browser. Administrator perlu mengetahui kapan layanan mulai mengalami gangguan, berapa lama gangguan berlangsung, bagaimana waktu responsnya, dan apakah sertifikat SSL akan segera kedaluwarsa.
Uptime Monitor adalah aplikasi pemantauan server dan website berbasis self-hosted. Aplikasi ini dapat dijalankan di infrastruktur milik sendiri dan menjadi alternatif open-source untuk layanan seperti UptimeRobot. Dengan pendekatan ini, administrator dapat mengelola sistem pemantauan tanpa harus mengalirkan data monitoring ke layanan pihak ketiga.
Aplikasi dikemas menggunakan Docker Compose agar proses instalasi dan pengelolaan stack lebih praktis. Dashboard menyediakan pembaruan status secara real-time melalui WebSocket, pencatatan insiden, notifikasi, halaman status publik, pemantauan sertifikat SSL, serta agent untuk membaca kondisi server Linux.
Repository dan kode sumber tersedia di: https://github.com/gagaltotal/Uptime-Monitor.
Tampilan Dashboard
Berikut beberapa tampilan antarmuka Uptime Monitor dari repository:

Halaman login aplikasi.

Tampilan dashboard Uptime Monitor 1

Tampilan dashboard Uptime Monitor 2

Tampilan dashboard Uptime Monitor 3

Tampilan dashboard Uptime Monitor 4

Tampilan dashboard Uptime Monitor 5

Tampilan dashboard Uptime Monitor 6

Tampilan dashboard Uptime Monitor 7

Tampilan dashboard Uptime Monitor 8

Tampilan dashboard Uptime Monitor 9

Tampilan dashboard Uptime Monitor 10

Tampilan dashboard Uptime Monitor 11

Tampilan dashboard Uptime Monitor 12
Fitur Utama
1. Monitoring HTTP(S), TCP, dan ICMP
Uptime Monitor menyediakan tiga tipe pemeriksaan:
- HTTP(S): memeriksa ketersediaan endpoint website atau aplikasi web.
- TCP Port: memeriksa apakah port layanan dapat dijangkau.
- ICMP Ping: memeriksa keterjangkauan host melalui ping.
Status seluruh monitor dirangkum di dashboard. Pembaruan berlangsung secara real-time melalui WebSocket, sehingga administrator tidak perlu melakukan refresh halaman untuk melihat perubahan status.
2. Riwayat Uptime, Downtime, dan Waktu Respons
Setiap pemeriksaan menghasilkan data yang dapat digunakan untuk melihat riwayat ketersediaan dan waktu respons. Informasi tersebut divisualisasikan dalam grafik agar administrator lebih mudah mengenali pola gangguan maupun penurunan performa.
Ketika sebuah layanan terdeteksi down, aplikasi membuat insiden secara otomatis dan mencatat durasinya. Saat layanan pulih, insiden dapat diselesaikan secara otomatis.
3. Notifikasi Gangguan dan Pemulihan
Aplikasi mendukung kanal notifikasi:
- Discord
- Slack
- Telegram
- Email melalui SMTP
Notifikasi dapat digunakan untuk memberi tahu administrator ketika layanan down, pulih kembali, atau sertifikat SSL mendekati masa kedaluwarsa. Kanal yang sudah dikonfigurasi juga dapat digunakan kembali oleh pemantauan agent dan SSL.
Untuk email, konfigurasi SMTP mencakup host, port, mode TLS, kredensial (bila diperlukan), alamat pengirim, dan penerima. Pada Gmail, README menyarankan penggunaan App Password, bukan password utama akun.
4. SSL & Domain Monitoring
Selain pemeriksaan SSL otomatis pada monitor HTTPS, tersedia menu khusus SSL & Domain untuk memantau masa berlaku sertifikat TLS secara mandiri.
Informasi yang ditampilkan meliputi:
- Domain dan port.
- Issuer atau penerbit sertifikat.
- Tanggal kedaluwarsa.
- Sisa hari masa berlaku.
- Status sertifikat.
- Waktu notifikasi terakhir.
Domain dapat dimasukkan sebagai hostname, host:port, atau URL lengkap. Port default adalah 443; pilihan lain yang tercantum di README adalah 8443, 9443, 465, 993, dan 995. Interval pemeriksaan dapat diatur dari 15 menit hingga 3 hari, sedangkan ambang peringatan dapat diatur dari 3 hingga 90 hari.
Status yang digunakan adalah pending, valid, expiring, expired, dan error. Saat sertifikat masuk ambang peringatan, kedaluwarsa, atau gagal diperiksa, aplikasi dapat membuat insiden dan mengirim notifikasi. Ketika sertifikat kembali valid, insiden akan di-resolve.
5. Monitoring Server Linux Menggunakan Agent
Untuk pemantauan host yang lebih mendalam, Uptime Monitor menyediakan agent ringan berbasis Bash. Agent dipasang pada server target dan mengirim metrik ke backend secara berkala.
Metrik yang dikirim mencakup:
- Persentase penggunaan CPU.
- Persentase penggunaan memori.
- Persentase penggunaan disk.
- Load average.
- Uptime host.
- Jumlah proses.
- Informasi jaringan dan service Linux sebagaimana didukung agent.
Agent juga memeriksa service yang gagal pada sistem berbasis systemd atau OpenRC. Service berstatus gagal/crashed ditampilkan pada detail agent dan dapat memicu insiden serta notifikasi.
Secara default, insiden metrik dibuat ketika penggunaan CPU, memori, atau disk mencapai 90% atau lebih. Agent dianggap terputus ketika tidak melaporkan selama 180 detik. Insiden otomatis di-resolve ketika metrik kembali normal atau agent kembali melaporkan data.
Skrip agent mendukung Debian/Ubuntu, RHEL/CentOS/Fedora, Alpine, dan Arch, serta mendeteksi package manager yang tersedia untuk kebutuhan dependensinya.
6. Halaman Status Publik
Uptime Monitor menyediakan halaman status publik yang dapat dibagikan kepada pengguna atau pihak yang membutuhkan informasi ketersediaan layanan. URL mengikuti pola /status/nama-halaman.
Informasi yang ditampilkan pada halaman status publik dibatasi pada label dan status yang telah ditentukan. URL, host, dan port asli monitor tidak ditampilkan kepada pengunjung.
7. Manajemen Pengguna dengan Role
Tersedia dua tingkat akses:
| Role | Hak akses |
|---|---|
| Super Admin | Akses penuh, termasuk membuat, mengubah, dan menghapus pengguna. |
| Admin | Mengelola monitor, SSL, agent, notifikasi, dan halaman status, tetapi tidak mengelola pengguna. |
Setiap akun juga mempunyai status Aktif atau Nonaktif. Akun nonaktif tidak dapat login dan seluruh sesinya langsung diputus.
Akun pertama yang dibuat melalui halaman /setup atau seeder otomatis menjadi Super Admin aktif. Setelah akun pertama dibuat, pendaftaran publik otomatis dinonaktifkan. Pengguna tambahan dibuat oleh Super Admin melalui menu Pengaturan → Pengguna.
Aplikasi juga menerapkan pengaman agar Super Admin aktif terakhir tidak dapat diturunkan role-nya, dinonaktifkan, atau dihapus. Pengguna tidak dapat menghapus akunnya sendiri.
8. Captcha Matematika pada Login
Halaman login dilengkapi captcha matematika dengan operasi penjumlahan, pengurangan, perkalian, dan pembagian. Soal dirancang agar tetap mudah dihitung manusia, sedangkan verifikasinya dilakukan di sisi server.
Menurut README, jawaban benar tidak dikirim ke browser. Token captcha dienkripsi menggunakan AES-256-GCM, terikat pada cookie browser, berlaku selama lima menit, dan hanya dapat digunakan sekali. Fitur ini melengkapi rate limiting serta penguncian akun setelah lima kali kegagalan login.
9. Laporan Insiden PDF
Menu Insiden menyediakan fitur Cetak Laporan PDF. Laporan memuat ringkasan jumlah insiden, status filter yang digunakan, serta tabel detail insiden. Gunakan opsi Simpan sebagai PDF pada dialog cetak browser untuk menyimpan laporan.
Laporan juga mendukung insiden SSL & Domain.
Teknologi yang Digunakan
| Komponen | Teknologi |
|---|---|
| Frontend | React 18, Material UI 6, Vite, @mui/x-charts |
| Backend | Node.js, Express 4, Socket.IO |
| Database | MongoDB 7 dengan Mongoose |
| Deployment | Docker, Docker Compose, nginx sebagai reverse proxy |
Cara Instalasi Menggunakan Docker Compose
Metode Docker Compose direkomendasikan di README. Pastikan Docker dan Docker Compose sudah terpasang pada server.
1. Ambil Repository
Clone repository lalu masuk ke direktori proyek:
git clone https://github.com/gagaltotal/Uptime-Monitor.git
cd Uptime-Monitor
2. Siapkan File Environment
Salin template environment:
cp .env.example .env
Buat tiga secret acak yang kuat:
openssl rand -hex 64 # JWT_ACCESS_SECRET
openssl rand -hex 64 # JWT_REFRESH_SECRET
openssl rand -hex 24 # MONGO_ROOT_PASSWORD
Masukkan hasilnya ke variabel yang sesuai pada file .env. JWT access secret dan refresh secret wajib berbeda. Jangan memakai secret contoh atau password bawaan.
3. Sesuaikan Konfigurasi
Edit file .env:
nano .env
Variabel penting yang perlu diperhatikan:
| Variabel | Kegunaan |
|---|---|
MONGO_ROOT_PASSWORD |
Password root MongoDB. Wajib diganti. |
JWT_ACCESS_SECRET |
Secret access token, minimal 32 karakter dan harus acak. |
JWT_REFRESH_SECRET |
Secret refresh token; harus berbeda dari access secret. |
CORS_ORIGIN |
Origin persis tempat dashboard diakses. |
COOKIE_SECURE |
Gunakan true ketika aplikasi sudah berada di belakang HTTPS. |
FRONTEND_PORT |
Port host dashboard; default 3000. |
HEARTBEAT_RETENTION_DAYS |
Masa simpan riwayat pemeriksaan; default 90 hari. |
AGENT_LOG_RETENTION_DAYS |
Masa simpan log agent; default 7 hari. |
AGENT_METRIC_RETENTION_DAYS |
Masa simpan metrik agent; default 30 hari. |
SSL_WARN_THRESHOLD_DAYS |
Ambang peringatan SSL untuk monitor baru; default 14 hari. |
Variabel opsional lain dan rinciannya tersedia pada .env.example serta README repository.
4. Jalankan Aplikasi
Jalankan seluruh stack:
docker compose up -d --build
Periksa container:
docker compose ps
Kemudian buka dashboard melalui:
http://IP-SERVER:3000
Jika port diubah melalui FRONTEND_PORT, gunakan port tersebut.
5. Buat Akun Super Admin Pertama
Saat pertama kali dibuka, aplikasi akan mengarahkan pengguna ke halaman Setup untuk membuat akun admin. Akun pertama otomatis menjadi Super Admin dan aktif. Setelah akun ini dibuat, pendaftaran publik dinonaktifkan.
Konfigurasi Domain dan HTTPS
Mengakses melalui IP LAN atau Domain
Jika aplikasi diakses bukan melalui localhost, sesuaikan CORS_ORIGIN dengan origin yang benar-benar digunakan di browser. Contohnya:
CORS_ORIGIN=https://status.contoh.com
Nilainya harus sama persis dengan URL akses, termasuk skema dan port bila ada. Setelah perubahan, bangun ulang stack:
docker compose up -d --build
Origin yang tidak sesuai dapat menyebabkan proses login gagal atau pengguna ter-logout setelah refresh karena cookie refresh-token ditolak browser.
Mengaktifkan HTTPS
Frontend aplikasi melayani HTTP pada port yang dipetakan ke FRONTEND_PORT. Untuk produksi, tempatkan reverse proxy TLS-terminating seperti Caddy, Traefik, atau Nginx Proxy Manager di depannya. Setelah HTTPS aktif, atur:
COOKIE_SECURE=true
CORS_ORIGIN=https://status.contoh.com
Contoh konfigurasi Caddy dari README:
status.contoh.com {
reverse_proxy localhost:3000
}
Mengonfigurasi Notifikasi
Buka Pengaturan → Notifikasi, pilih kanal yang dibutuhkan, lalu isi parameter sesuai jenis integrasinya. Gunakan tombol uji coba untuk memastikan konfigurasi berhasil.
- Discord/Slack: gunakan URL webhook yang benar dan tombol uji coba.
- Telegram: isi Bot Token dari
@BotFatherdan Chat ID tujuan. Bot perlu memulai interaksi melalui/start; untuk grup atau channel, bot harus ditambahkan sebagai anggota. - Email SMTP: isi host, port, mode TLS, username/password bila diperlukan, alamat pengirim, dan penerima. Port yang dijelaskan README adalah 587 untuk STARTTLS, 465 untuk TLS langsung, dan 25 untuk relay internal.
Password SMTP tidak dikirim kembali ke browser. Saat mengedit kanal, biarkan field password kosong untuk mempertahankan nilai yang tersimpan.
Memasang Agent pada Server Linux
1. Buat Agent di Dashboard
- Buka menu Agent.
- Klik Tambah Agent.
- Isi nama dan deskripsi opsional.
- Simpan agent.
- Simpan token
agt_...yang ditampilkan satu kali. Token ini digunakan untuk autentikasi agent, bukan JWT. - Pilih kanal notifikasi yang akan menerima alert agent.
Dashboard menyediakan Panduan Instalasi Agent dan tautan unduh file agent dari folder agent/ pada repository.
2. Siapkan Server Target
Salin skrip agent/uptime-agent.sh dan file konfigurasi contoh ke server target. Jalankan perintah berikut sebagai root atau dengan sudo:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin uptime-agent 2>/dev/null || true
sudo install -d -m 750 -o root -g uptime-agent /etc/uptime-agent
sudo install -m 755 agent/uptime-agent.sh /usr/local/bin/uptime-agent.sh
sudo install -m 640 -o root -g uptime-agent agent/agent.conf.example /etc/uptime-agent/agent.conf
3. Isi Konfigurasi Agent
Edit /etc/uptime-agent/agent.conf:
UPTIME_SERVER_URL=https://uptime.example.com
UPTIME_AGENT_TOKEN=agt_xxxxxxxxxxxxxxxxxxxx
UPTIME_INTERVAL=60
UPTIME_SEND_LOGS=true
UPTIME_HTTP_TIMEOUT=10
Ganti URL dashboard dan token dengan nilai milik Anda. Interval default adalah 60 detik; UPTIME_SEND_LOGS secara default bernilai false jika tidak diubah.
4. Aktifkan Service systemd
Salin unit service dan aktifkan:
sudo cp agent/uptime-agent.service /etc/systemd/system/uptime-agent.service
sudo systemctl daemon-reload
sudo systemctl enable --now uptime-agent
sudo systemctl status uptime-agent
Pantau log agent:
journalctl -u uptime-agent -f
Agent juga menyediakan mode --once, --print, --selftest, dan --uninstall. Pada distro tanpa systemd, README menjelaskan opsi menjalankan skrip melalui mekanisme OpenRC, nohup, atau crontab @reboot.
Menggunakan SSL & Domain Monitoring
- Buka menu SSL & Domain.
- Klik Tambah Monitor.
- Isi nama monitor.
- Isi domain sebagai hostname,
host:port, atau URL lengkap. - Pilih port layanan yang sesuai; default
443. - Atur interval pemeriksaan dan ambang peringatan.
- Sesuaikan timeout, percobaan ulang, tag, serta status aktif bila diperlukan.
- Pilih kanal notifikasi.
- Simpan. Sistem langsung menjalankan pemeriksaan pertama.
Pada halaman detail, administrator dapat melihat informasi sertifikat, ringkasan konfigurasi, riwayat insiden, dan tombol Periksa untuk menjalankan pengecekan manual. Tersedia pula aksi untuk mengaktifkan/menonaktifkan, mengubah, dan menghapus monitor.
Pengelolaan Insiden dan Retensi Data
Insiden dari monitor dan SSL dapat ditinjau melalui menu Insiden. Gunakan filter yang tersedia untuk memilih jenis insiden. Untuk dokumentasi, klik Cetak Laporan PDF lalu simpan hasilnya melalui dialog cetak browser.
Secara default, riwayat heartbeat disimpan selama 90 hari, metrik agent selama 30 hari, dan log agent selama 7 hari. Masa simpan dapat disesuaikan melalui variabel environment. Log agent dibersihkan otomatis melalui TTL index MongoDB dan sapuan harian sebagai lapisan tambahan.
Keamanan Aplikasi
README menjelaskan sejumlah lapisan keamanan yang diterapkan pada aplikasi, antara lain:
- Validasi dan sanitasi input: Mongoose, Joi, dan
express-mongo-sanitizedigunakan untuk membantu mencegah NoSQL injection. - Proteksi XSS: output React di-escape secara default dan aplikasi tidak menggunakan
dangerouslySetInnerHTML; nginx menyediakan Content-Security-Policy. - Proteksi RCE: tidak menggunakan
eval,exec, atauchild_processdengan input mentah pengguna. Input ping divalidasi sebelum diproses. - Keamanan token dan cookie: access token berumur 15 menit dan disimpan di memori; refresh token menggunakan cookie
httpOnlydansameSite, serta dirotasi saat digunakan. - Proteksi login: rate limiting, penguncian akun otomatis setelah lima kegagalan login, dan captcha matematika.
- Mass assignment: validasi Joi membuang field yang tidak termasuk skema.
- Kontrol akses: endpoint manajemen pengguna dilindungi middleware Super Admin pada sisi server.
- Kontainer non-root: backend berjalan sebagai user non-root; kapabilitas
NET_RAWdiberikan secara spesifik untuk kebutuhan ping. - Isolasi database: MongoDB ditempatkan pada jaringan Docker internal dan tidak membuka port ke host.
- Privasi halaman status: host, URL, dan port asli monitor tidak ditampilkan ke pengunjung publik.
Tidak ada sistem yang sepenuhnya kebal. Untuk deployment produksi, jaga file .env, gunakan password yang kuat, aktifkan HTTPS, batasi akses administratif sesuai kebutuhan, dan perbarui image serta kode aplikasi secara berkala.
Migrasi Database dan Seeder Admin
Migrasi database disimpan di backend/src/migrations/ dan secara default berjalan otomatis ketika backend start (AUTO_MIGRATE=true). Migrasi dirancang idempoten dan dilindungi lock.
Perintah yang tersedia:
docker compose exec backend npm run migrate
docker compose exec backend npm run migrate:status
docker compose exec backend npm run migrate:down
docker compose exec backend npm run migrate:down -- 3
Akun admin juga dapat dibuat otomatis melalui SEED_ADMIN_EMAIL pada .env. Jika SEED_ADMIN_PASSWORD dikosongkan, seeder membuat password acak dan menampilkannya satu kali pada log backend. Perintah npm run seed, npm run seed:force, dan opsi --role tersedia untuk kebutuhan administrasi. Hati-hati dengan SEED_ADMIN_ROLE: selama variabel itu terisi, role yang ditentukan akan diterapkan kembali setiap backend start.
Menjalankan Mode Pengembangan Tanpa Docker
Untuk pengembangan, README mensyaratkan Node.js 20+ dan instance MongoDB lokal atau container. Contoh menjalankan MongoDB:
docker run -d -p 27017:27017 mongo:7
Backend:
cd backend
cp ../.env.example .env
# Sesuaikan MONGO_URI ke mongodb://localhost:27017/uptime_monitor
npm install
npm run dev
Frontend, pada terminal terpisah:
cd frontend
npm install
npm run dev
Frontend development berjalan pada http://localhost:5173 dan backend pada http://localhost:5000.
Troubleshooting yang Sering Ditemui
| Gejala | Hal yang perlu diperiksa |
|---|---|
| Login gagal atau logout setelah refresh | Pastikan CORS_ORIGIN sama persis dengan URL dashboard yang digunakan. |
| Monitor Ping selalu gagal | Pastikan cap_add: [NET_RAW] pada service backend tidak dihapus. Jika masih terkendala, gunakan TCP Port sebagai alternatif. |
| Notifikasi Discord/Slack tidak terkirim | Periksa URL webhook dan gunakan tombol uji coba di Pengaturan → Notifikasi. |
| Email tidak terkirim | Periksa host, port, mode TLS, autentikasi SMTP, From, dan To. |
| Telegram tidak terkirim | Periksa Bot Token dan Chat ID, pastikan bot sudah menerima /start dan menjadi anggota grup/channel bila digunakan. |
| Menu Pengguna tidak muncul | Pastikan akun memiliki role superadmin. Akun lama dapat dinaikkan melalui docker compose exec backend npm run seed -- --role superadmin sesuai konfigurasi seeder. |
| SSL monitor berstatus error | Periksa DNS, port TLS, timeout, dan koneksi keluar backend ke domain target. |
| Sertifikat sudah diperpanjang tetapi status belum berubah | Jalankan Periksa pada detail monitor agar pengecekan dilakukan segera. |
| Captcha kedaluwarsa atau sudah dipakai | Muat ulang soal captcha dan isi jawaban yang baru. |
Perintah Operasional Docker
Menghentikan stack tanpa menghapus volume data:
docker compose down
Menjalankan ulang setelah perubahan kode:
docker compose up -d --build
Melihat log backend:
docker compose logs -f backend
Penutup
Uptime Monitor menyatukan pemantauan endpoint HTTP(S), TCP, dan ICMP, riwayat uptime/downtime, insiden, notifikasi, status page, pemeriksaan sertifikat TLS, serta metrik host melalui agent dalam satu aplikasi self-hosted.
Bagi administrator sistem yang ingin memiliki kendali lebih besar atas data dan infrastruktur monitoring, pendekatan self-hosted ini layak dicoba. Mulailah dari deployment Docker Compose, amankan konfigurasi .env, aktifkan HTTPS untuk penggunaan produksi, lalu tambahkan monitor dan agent sesuai kebutuhan.
Coba dan pelajari source code-nya: https://github.com/gagaltotal/Uptime-Monitor
Lisensi: MIT.
video tutorial youtube
Tertarik mencoba Uptime Monitor?
Lihat Repository di GitHub
0 Comments