Backup
Ada dua hal berbeda yang perlu dijaga:
- Watchbell itu sendiri: folder
app/data(database-nya) danapp/.env(pengaturan dan encryption key-nya). Inilah yang Anda restore setelah disk rusak atau saat Anda pindah ke mesin lain. - Ringkasan bulanan di Google Drive (opsional): catatan yang mudah dibaca untuk setiap bulan (uptime, insiden, database, domain), disimpan di luar mesin Anda. Ini adalah laporan, bukan salinan database.
- Mem-backup Watchbell itu sendiri
- Restore atau pindah ke mesin lain
- Ringkasan bulanan di Google Drive
- Membuat Google OAuth client sendiri
Mem-backup Watchbell itu sendiri
Hentikan Watchbell dulu: menyalin folder database saat database itu masih terbuka bisa menghasilkan salinan yang rusak. Jalankan perintah berikut dari folder Watchbell.
Linux:
systemctl --user stop watchbell
tar czf ~/watchbell-backup-$(date +%F).tar.gz -C app data .env
systemctl --user start watchbell
Windows (PowerShell):
cd app; npm run stop:selfhost; cd ..
Compress-Archive -Path app\data, app\.env -DestinationPath "$HOME\watchbell-backup-$(Get-Date -Format yyyy-MM-dd).zip"
Start-ScheduledTask Watchbell
Kalau Anda menjalankan Watchbell secara manual, hentikan dengan Ctrl+C (atau npm run stop:selfhost di app/), lalu
jalankan lagi dengan npm run start:selfhost. Pakai Stop-ScheduledTask Watchbell hanya kalau
npm run stop:selfhost kehabisan waktu di Windows.
Simpan backup-nya di tempat selain disk yang sama. Backup ini berisi app/.env, jadi berisi juga encryption key Anda:
simpan seperti Anda menyimpan password.
Kenapa app/.env penting
OPS_ENCRYPTION_KEY di app/.env mengenkripsi setiap token provider, koneksi Google Drive, webhook Discord, dan
setiap secret authenticator di database. Salinan app/data tanpa key yang cocok tetap bisa dibuka, tetapi:
- setiap connection menampilkan "Can't read the stored credential" sampai Anda mengganti token-nya;
- Google Drive harus dihubungkan ulang;
- kode authenticator berhenti bekerja, jadi setiap owner dan operator perlu
npm run reset-login -- <email>(lihat Pertama kali dijalankan).
Password sendiri disimpan sebagai hash satu arah dan tetap bisa dipakai.
Restore atau pindah ke mesin lain
-
Pasang Watchbell di mesin baru seperti dijelaskan di Instalasi, tetapi sebelum menjalankan installer, taruh
.envyang Anda simpan diapp/.envdan folderdatayang Anda simpan diapp/data:tar xzf ~/watchbell-backup-2026-10-01.tar.gz -C app bash install.shExpand-Archive watchbell-backup-2026-10-01.zip -DestinationPath app .\install.batInstaller mempertahankan setiap nilai yang sudah ada di
app/.envdan hanya menambahkan key yang belum ada. -
Kalau alamatnya berubah (port lain, atau akses LAN), perbarui
SITE_URLdiapp/.env, serta redirect URI di Google OAuth client Anda kalau Anda memakainya. -
Jalankan Watchbell lalu sign in dengan akun Anda yang biasa.
Untuk restore di mesin yang sama: hentikan Watchbell, pindahkan app/data yang sekarang ke tempat lain, ekstrak backup
ke app, lalu jalankan Watchbell lagi. Restore dengan versi Watchbell yang sama dengan yang membuat backup, atau yang
lebih baru: perubahan database untuk versi yang lebih baru diterapkan otomatis saat versi itu dijalankan, tetapi tidak
ada yang membatalkannya untuk versi yang lebih lama.
Ringkasan bulanan di Google Drive
Backups (khusus owner) menyimpan ringkasan setiap bulan ke Google Drive Anda, di folder bernama Watchbell backups:
| File | Isinya |
|---|---|
| Summary sheet (Google Sheets) | Tab: Overview (uptime, insiden, dan deployment bulan itu), Applications (uptime %, response p95, jumlah 5xx, deploy per aplikasi), Incidents (setiap alert dengan waktu mulai, selesai, dan durasinya), Databases (perubahan status, ukuran, CU-hour, read Firestore), Domains (tanggal kedaluwarsa sertifikat dan registrar di akhir bulan) |
Data mentah .csv.gz |
Rollup per jam dan event bulan itu |
- Berjalan sendiri setiap tanggal 1 bersama job harian (sekitar pukul 03:00 di zona waktu Anda) dan mencakup bulan sebelumnya. Run yang gagal dicoba lagi oleh run harian berikutnya. Back up now menulis bulan berjalan sampai saat ini.
- Backup yang lebih tua dari 3 bulan dipindahkan ke trash Drive, dan Drive menghapusnya permanen 30 hari kemudian.
- Database ditampilkan dengan alias-nya (db-a, db-b) dan email disembunyikan, sama seperti di bagian lain console.
- Watchbell hanya meminta izin
drive.fileke Google: ia hanya bisa melihat dan mengubah file yang dibuatnya sendiri, tidak pernah isi Drive Anda yang lain. Anda bisa mencabut aksesnya kapan saja di pengaturan Google Account Anda.
Ringkasan ini untuk dibaca dan menyimpan riwayat. Watchbell tidak bisa mengimpornya kembali; untuk me-restore
Watchbell, pakai backup app/data dan app/.env di atas.
Membuat Google OAuth client sendiri
Watchbell terhubung ke Drive dengan OAuth client yang Anda buat di Google Cloud project milik Anda sendiri. Gratis.
-
Buka https://console.cloud.google.com lalu buat project (atau pilih yang sudah ada).
-
APIs & Services › Library: aktifkan Google Drive API.
-
Google Auth Platform (di beberapa akun disebut OAuth consent screen): siapkan dengan user type External, nama aplikasi seperti "Watchbell", dan email Anda. Tambahkan scope
.../auth/drive.file. -
Set publishing status ke In production. Dengan status "Testing", Google memutus koneksi setelah 7 hari dan Anda harus menghubungkan ulang setiap minggu.
drive.fileadalah scope yang tidak sensitif, jadi publikasi tidak perlu direview oleh Google. -
Credentials › Create credentials › OAuth client ID, tipe Web application. Di bawah Authorized redirect URIs, tambahkan:
http://localhost:3100/auth/google/callbackPakai
SITE_URLAnda sendiri dengan/auth/google/callbackdi belakangnya kalau berbeda. Google hanya menerimahttp://biasa untuklocalhost; untuk alamat lain,SITE_URLharushttps://. Kalau Anda juga ingin membuat project Firebase dari Watchbell, tambahkan juga<SITE_URL>/auth/google/create/callback(lihat Provider). -
Salin client ID dan secret ke
app/.envlalu restart Watchbell:GOOGLE_CLIENT_ID=1234567890-abc.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=... -
Di Watchbell: Backups › Connect Google Drive, setujui satu izin itu, dan selesai.
Kalau Google menjawab redirect_uri_mismatch, redirect URI di langkah 5 tidak persis sama dengan SITE_URL ditambah
/auth/google/callback (periksa port dan http/https-nya).