SIWARTA

Panduan Instalasi Sistem Informasi RT Digital
Firebase Firestore + Cloudinary + Cloudflare Worker + Hosting
Versi Dokumen 1.0 ยท 2026
Bahasa: Indonesia

๐Ÿ“‘ Daftar Isi

  1. Prasyarat & Persiapan Awal
  2. Setting Firebase (Database, Auth, Rules)
  3. Setting Cloudinary (Upload Foto/Bukti)
  4. Setting Cloudflare Worker (Auto-Delete Bukti)
  5. Edit Konfigurasi di index.html
  6. Buat File sw.js (PWA Offline Mode)
  7. Testing Lokal Sebelum Hosting
  8. Hosting ke Internet (4 Opsi Gratis)
  9. Setup Awal Aplikasi (Setelah Online)
  10. Troubleshooting Masalah Umum

1. Prasyarat & Persiapan Awal

1.1 Akun yang Perlu Disiapkan

LayananKegunaanStatus
Google AccountLogin ke Firebase ConsoleWajib Gratis
CloudinaryHosting foto bukti transferWajib Gratis
CloudflareWorker untuk hapus foto otomatisWajib Gratis
GitHubHosting (Opsi A) / simpan kodeOpsional Gratis
Netlify / VercelHosting alternatif (Opsi B/C)Opsional Gratis

1.2 Software yang Perlu Diinstal di Komputer

1.3 File yang Harus Ada

โฑ๏ธ Estimasi Waktu

Total instalasi dari nol sampai online: 45โ€“90 menit. Jika sudah familiar dengan Firebase & hosting, bisa selesai dalam 30 menit.

2. Setting Firebase

Firebase adalah layanan dari Google yang akan menyimpan seluruh data aplikasi (warga, tagihan, kas, pengaduan, dll). Kita akan menggunakan dua fitur utama:

2.1 Buat Project Firebase Baru

1Buka Firebase Console

Buka browser dan kunjungi:

https://console.firebase.google.com

Login menggunakan akun Google Anda.

2Buat Project Baru
  1. Klik tombol "Add project" atau "Create a project".
  2. Isi nama project, contoh: rt9bc2 atau siwarta-rt.
    Nama project tidak boleh ada spasi. Gunakan huruf kecil, angka, dan tanda hubung saja.
  3. Klik Continue.
  4. Google Analytics: pilih Disable atau Enable (bebas, tidak mempengaruhi aplikasi).
  5. Klik Create project. Tunggu sekitar 30 detik sampai selesai.
  6. Klik Continue setelah project siap.

2.2 Aktifkan Firestore Database

1Buka menu Firestore

Di sidebar kiri Firebase Console, klik:

Build โ†’ Firestore Database
2Buat Database
  1. Klik "Create database".
  2. Pilih mode keamanan: pilih "Start in production mode" (kita akan set rules manual di langkah 2.4).
  3. Klik Next.
  4. Pilih lokasi server: pilih yang terdekat, contoh:
    โš ๏ธ PENTING โ€” Lokasi tidak bisa diubah!

    Setelah database dibuat, lokasi server tidak dapat dipindahkan. Pilih dengan hati-hati. Untuk warga Indonesia, Singapore atau Jakarta adalah pilihan terbaik.

  5. Klik Enable. Tunggu proses provisioning (1โ€“2 menit).
3Buat Dokumen Utama
  1. Setelah database siap, klik "Start collection".
  2. Collection ID: ketik apps โ†’ klik Next.
  3. Document ID: ketik rtdigital โ†’ klik Next.
  4. Tambahkan field pertama (dummy dulu):
  5. Klik Save.
โ„น๏ธ Kenapa harus buat collection manual?

Aplikasi dirancang untuk membaca & menulis ke dokumen apps/rtdigital. Jika dokumen ini belum ada, saat aplikasi pertama kali dijalankan, ia akan otomatis membuat seed data di sana. Membuat manual memastikan struktur awal terbentuk.

2.3 Aktifkan Authentication (Anonymous)

1Buka menu Authentication
Build โ†’ Authentication
2Get Started

Klik tombol "Get started".

3Aktifkan Sign-in Method "Anonymous"
  1. Buka tab Sign-in method.
  2. Cari "Anonymous" di daftar providers.
  3. Klik ikon pensil / Edit.
  4. Toggle Enable menjadi ON.
  5. Klik Save.
โ„น๏ธ Kenapa pakai Anonymous Auth?

Aplikasi memakai login manual sendiri (username + password yang disimpan di Firestore). Firebase Authentication hanya dipakai untuk memenuhi security rules, sehingga siapapun yang mengakses aplikasi harus terautentikasi (dalam hal ini anonymous) sebelum bisa read/write database.

2.4 Set Firestore Security Rules

1Buka tab Rules

Masih di Firestore Database, klik tab Rules di bagian atas.

2Ganti Rules dengan Kode Berikut

Hapus semua isi default, lalu paste kode di bawah ini:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // Dokumen utama aplikasi
    match /apps/{docId} {
      allow read, write: if request.auth != null;
    }

    // Role user (untuk multi-role: ketua/bendahara/keamanan)
    match /userRoles/{uid} {
      allow read, write: if request.auth != null
                         && request.auth.uid == uid;
    }

    // Default: tolak semua akses lain
    match /{document=**} {
      allow read, write: if false;
    }
  }
}
3Publish Rules

Klik tombol Publish di kanan atas. Tunggu sampai muncul notifikasi "Rules published".

โš ๏ธ Jangan pakai "Test Mode" untuk production!

Test mode membuka akses baca/tulis ke semua orang di internet tanpa autentikasi. Rules di atas sudah cukup aman untuk aplikasi RT dengan sistem login internal.

2.5 Daftarkan Web App & Salin Config

1Kembali ke Project Overview

Klik logo Firebase / Project Overview di kiri atas, atau:

Project settings โ†’ General
2Tambahkan Web App
  1. Scroll ke bawah ke bagian "Your apps".
  2. Klik ikon </> (Web) untuk menambahkan web app.
  3. App nickname: ketik SIWARTA Web.
  4. Firebase Hosting: JANGAN centang (kita akan hosting di tempat lain).
  5. Klik Register app.
3Salin firebaseConfig

Firebase akan menampilkan kode seperti ini โ€” salin dan simpan:

const firebaseConfig = {
  apiKey: "AIzaSyAgH9Zz8ORfIFAmvSahAMOJBJld3_yxK_U",
  authDomain: "rt9bc2.firebaseapp.com",
  projectId: "rt9bc2",
  storageBucket: "rt9bc2.firebasestorage.app",
  messagingSenderId: "480773365990",
  appId: "1:480773365990:web:aa1acf0bbdc43a7c4c9b27"
};
โœ… Simpan config ini!

Anda akan membutuhkannya di Bagian 5 saat mengedit index.html. Simpan di notepad sementara.

4Klik "Continue to console"

Selesai! Firebase sudah siap.

3. Setting Cloudinary

Cloudinary dipakai untuk menyimpan foto bukti transfer, selfie absen jaga, lampiran pengaduan, dan foto bank sampah. Free tier Cloudinary memberikan 25 GB storage + 25 GB bandwidth/bulan โ€” lebih dari cukup untuk RT.

3.1 Daftar Akun Cloudinary

1Buka situs Cloudinary
https://cloudinary.com/users/register_free
2Isi form pendaftaran

Klik Create Account. Verifikasi email Anda.

3.2 Dapatkan Cloud Name

1Buka Dashboard

Setelah login, Anda akan diarahkan ke Dashboard. Cari bagian "Account Details":

Cloud name:   e0sfugt2
API Key:      123456789012345
API Secret:   xxxxxxxxxxxxxxxxxxxx
โš ๏ธ Catat Cloud Name Anda!

Cloud Name bersifat unik dan publik โ€” aman disimpan di kode frontend. Contoh di atas (e0sfugt2) hanya ilustrasi, milik Anda akan berbeda.

3.3 Buat Upload Preset (Unsigned)

Upload Preset adalah "profil" upload yang menentukan folder, format, dan ukuran file yang diizinkan. Kita pakai unsigned preset supaya bisa upload langsung dari browser tanpa perlu signature server-side.

1Buka Settings โ†’ Upload

Di sidebar kiri, klik ikon gerigi (โš™๏ธ) โ†’ Upload.

Atau langsung ke:

https://console.cloudinary.com/settings/upload
2Scroll ke "Upload presets"

Klik "Add upload preset".

3Isi Konfigurasi Preset
FieldNilai
Preset namert_bukti (harus persis sama!)
Signing ModeUnsigned
Folderrt-bukti
Access modePublic (default)
Use filenameOff
Unique filenameOn โœ“
OverwriteOff
Incoming transformationKosongkan (biar kode yang handle kompresi)
4Save Preset

Klik Save di kanan atas.

โœ… Preset siap!

Preset rt_bukti sekarang bisa dipakai untuk upload dari browser tanpa login. Ini yang akan dipakai index.html.

3.4 (Opsional) Buat Folder Default

Folder rt-bukti akan otomatis dibuat saat upload pertama. Tidak perlu dibuat manual.

๐Ÿšจ JANGAN pakai "Signed Mode" jika tidak paham backend!

Signed mode butuh signature valid dari server. Karena aplikasi kita murni frontend (tanpa server), WAJIB pakai Unsigned. Preset salah = semua upload akan gagal dengan error 400.

4. Setting Cloudflare Worker

Cloudflare Worker di sini berfungsi sebagai "penghapus foto otomatis". Aplikasi akan memanggilnya untuk menghapus bukti transfer yang sudah lebih dari 30 hari, agar storage Cloudinary tidak penuh.

โ„น๏ธ Kenapa butuh Worker?

Cloudinary melarang proses delete dari browser langsung (karena butuh API Secret). Solusinya: buat "jembatan" berupa Cloudflare Worker yang menyimpan API Secret secara aman dan menerima perintah hapus dari aplikasi.

4.1 Daftar Akun Cloudflare

1Buka Cloudflare
https://dash.cloudflare.com/sign-up

Daftar dengan email, verifikasi, lalu login.

4.2 Buat Worker Baru

1Buka menu Workers

Di sidebar kiri: Workers & Pages โ†’ Create application โ†’ Create Worker.

2Beri nama

Ketik nama, contoh: rt-cloudinary-delete. Klik Deploy.

3Edit Code

Setelah deploy sukses, klik Edit code (atau "Quick edit"). Hapus kode default, ganti dengan kode berikut:

// Cloudflare Worker โ€” Cloudinary Delete Proxy
export default {
  async fetch(request, env, ctx) {
    // CORS headers
    const corsHeaders = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type',
    };

    // Preflight
    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: corsHeaders });
    }

    if (request.method !== 'POST') {
      return new Response(
        JSON.stringify({ success: false, error: 'Method not allowed' }),
        { status: 405, headers: { 'Content-Type': 'application/json', ...corsHeaders } }
      );
    }

    try {
      const { publicIds } = await request.json();

      if (!Array.isArray(publicIds) || publicIds.length === 0) {
        return new Response(
          JSON.stringify({ success: false, error: 'publicIds kosong' }),
          { status: 400, headers: { 'Content-Type': 'application/json', ...corsHeaders } }
        );
      }

      const CLOUD_NAME = env.CLOUDINARY_CLOUD_NAME;
      const API_KEY    = env.CLOUDINARY_API_KEY;
      const API_SECRET = env.CLOUDINARY_API_SECRET;

      if (!CLOUD_NAME || !API_KEY || !API_SECRET) {
        return new Response(
          JSON.stringify({ success: false, error: 'Env variable belum diset' }),
          { status: 500, headers: { 'Content-Type': 'application/json', ...corsHeaders } }
        );
      }

      const results = [];

      for (const publicId of publicIds) {
        try {
          const timestamp = Math.floor(Date.now() / 1000);
          const toSign = `public_id=${publicId}×tamp=${timestamp}${API_SECRET}`;
          const signature = await sha1(toSign);

          const formData = new FormData();
          formData.append('public_id', publicId);
          formData.append('api_key', API_KEY);
          formData.append('timestamp', timestamp);
          formData.append('signature', signature);

          const res = await fetch(
            `https://api.cloudinary.com/v1_1/${CLOUD_NAME}/image/destroy`,
            { method: 'POST', body: formData }
          );

          const data = await res.json();
          results.push({ publicId, result: data.result, error: data.error });
        } catch (err) {
          results.push({ publicId, result: 'error', error: err.message });
        }
      }

      const sukses = results.filter(r => r.result === 'ok' || r.result === 'not found').length;

      return new Response(
        JSON.stringify({ success: true, deleted: sukses, total: publicIds.length, results }),
        { headers: { 'Content-Type': 'application/json', ...corsHeaders } }
      );

    } catch (e) {
      return new Response(
        JSON.stringify({ success: false, error: e.message }),
        { status: 500, headers: { 'Content-Type': 'application/json', ...corsHeaders } }
      );
    }
  }
};

// Helper SHA-1
async function sha1(str) {
  const buf = new TextEncoder().encode(str);
  const hash = await crypto.subtle.digest('SHA-1', buf);
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}
4Save & Deploy

Klik Save and Deploy di kanan atas.

4.3 Set Environment Variables (API Secret Cloudinary)

1Buka Settings Worker

Di halaman Worker, klik tab Settings โ†’ Variables and Secrets.

2Tambahkan 3 variable

Klik Add variable tiga kali, isi sebagai berikut (ambil dari Dashboard Cloudinary di Bagian 3.2):

Variable nameValueType
CLOUDINARY_CLOUD_NAMECloud Name Anda (contoh: e0sfugt2)Text
CLOUDINARY_API_KEYAPI Key dari CloudinarySecret
CLOUDINARY_API_SECRETAPI Secret dari CloudinarySecret
โš ๏ธ Pilih "Secret" untuk API Key & API Secret!

Kalau diset sebagai "Text", siapa pun yang bisa akses dashboard Worker bisa lihat nilainya. Untuk keamanan, gunakan tipe Secret.

3Save & Deploy ulang

Klik Save and Deploy lagi supaya variable aktif.

4.4 Salin URL Worker

Kembali ke halaman utama Worker. URL akan tampak seperti ini:

https://rt-cloudinary-delete.username.workers.dev

Salin URL ini โ€” akan dipakai di Bagian 5.

4.5 Test Worker (Opsional tapi Direkomendasikan)

Untuk memastikan Worker bekerja, buka Terminal / Command Prompt, jalankan:

curl -X POST https://rt-cloudinary-delete.username.workers.dev ^
  -H "Content-Type: application/json" ^
  -d "{\"publicIds\":[\"dummy-test-id\"]}"

Respons yang benar (meski public_id tidak ada):

{"success":true,"deleted":1,"total":1,"results":[{"publicId":"dummy-test-id","result":"not found"}]}

5. Edit Konfigurasi di index.html

Sekarang saatnya menempelkan konfigurasi dari langkah-langkah sebelumnya ke dalam file index.html.

5.1 Buka index.html di Text Editor

Klik kanan file index.html โ†’ Open with โ†’ VS Code / Notepad++.

5.2 Cari Bagian firebaseConfig

Gunakan Ctrl+F, cari kata kunci:

firebaseConfig

Anda akan menemukan kode seperti ini di baris ~30:

const firebaseConfig = {
  apiKey: "AIzaSyAgH9Zz8ORfIFAmvSahAMOJBJld3_yxK_U",
  authDomain: "rt9bc2.firebaseapp.com",
  projectId: "rt9bc2",
  storageBucket: "rt9bc2.firebasestorage.app",
  messagingSenderId: "480773365990",
  appId: "1:480773365990:web:aa1acf0bbdc43a7c4c9b27"
};

Ganti semua nilai dengan config dari Firebase Console Anda (yang disalin di Bagian 2.5):

const firebaseConfig = {
  apiKey: "PASTE_API_KEY_ANDA_DI_SINI",
  authDomain: "NAMA_PROJECT.firebaseapp.com",
  projectId: "NAMA_PROJECT",
  storageBucket: "NAMA_PROJECT.firebasestorage.app",
  messagingSenderId: "PASTE_SENDER_ID",
  appId: "PASTE_APP_ID"
};
๐Ÿšจ Jangan sampai ada typo!

Satu karakter salah = login gagal. Copy-paste langsung dari Firebase Console, jangan ketik ulang manual.

5.3 Cari Bagian Cloudinary Config

Masih dengan Ctrl+F, cari:

CLOUDINARY_CLOUD_NAME

Anda akan menemukan 3 baris ini (baris ~44):

const CLOUDINARY_CLOUD_NAME = 'e0sfugt2';
const CLOUDINARY_UPLOAD_PRESET = 'rt_bukti';
const CLOUDINARY_UPLOAD_URL = 'https://api.cloudinary.com/v1_1/' + CLOUDINARY_CLOUD_NAME + '/auto/upload';
const CLOUDINARY_DELETE_WORKER_URL = 'https://rt-cloudinary-delete.helmy-bagus-saputra.workers.dev';

Ganti 2 nilai berikut:

const CLOUDINARY_CLOUD_NAME = 'CLOUD_NAME_ANDA';          // โ† dari Bagian 3.2
const CLOUDINARY_UPLOAD_PRESET = 'rt_bukti';               // โ† JANGAN DIUBAH
const CLOUDINARY_UPLOAD_URL = 'https://api.cloudinary.com/v1_1/' + CLOUDINARY_CLOUD_NAME + '/auto/upload';
const CLOUDINARY_DELETE_WORKER_URL = 'URL_WORKER_ANDA';    // โ† dari Bagian 4.4
โ„น๏ธ Preset HARUS "rt_bukti"

Kalau Anda mengubah nama preset di Cloudinary, ubah juga nilai CLOUDINARY_UPLOAD_PRESET. Tapi disarankan tetap rt_bukti supaya konsisten.

5.4 Verifikasi Perubahan

Periksa sekali lagi dengan Ctrl+F, cari kata-kata ini, pastikan tidak ada lagi:

Simpan file dengan Ctrl+S.

6. Buat File sw.js (PWA Offline Mode)

File sw.js membuat aplikasi bisa dibuka saat offline dan di-install ke home screen HP (PWA). Ini opsional, tapi sangat direkomendasikan.

1Buat file baru

Di folder yang sama dengan index.html, buat file baru bernama:

sw.js
2Isi dengan kode berikut
// sw.js โ€” Service Worker SIWARTA PWA
const CACHE_NAME = 'siwarta-v1';
const PRECACHE = [
  './',
  './index.html'
];

// Install: cache aset dasar
self.addEventListener('install', (e) => {
  e.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => cache.addAll(PRECACHE))
      .catch(err => console.warn('[SW] Precache gagal:', err))
  );
  self.skipWaiting();
});

// Activate: bersihkan cache lama
self.addEventListener('activate', (e) => {
  e.waitUntil(
    caches.keys().then(keys => Promise.all(
      keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))
    ))
  );
  self.clients.claim();
});

// Fetch: network-first untuk API, cache-first untuk aset statis
self.addEventListener('fetch', (e) => {
  const url = e.request.url;

  // Skip non-GET
  if (e.request.method !== 'GET') return;

  // Skip Firebase, Cloudinary, Google APIs โ€” selalu live
  if (url.includes('firestore') ||
      url.includes('firebase') ||
      url.includes('cloudinary') ||
      url.includes('googleapis') ||
      url.includes('gstatic') ||
      url.includes('workers.dev')) {
    return;
  }

  e.respondWith(
    fetch(e.request)
      .then(res => {
        // Simpan clone ke cache untuk offline
        if (res && res.status === 200) {
          const clone = res.clone();
          caches.open(CACHE_NAME)
            .then(c => c.put(e.request, clone))
            .catch(() => {});
        }
        return res;
      })
      .catch(() => caches.match(e.request).then(cached => cached || caches.match('./index.html')))
  );
});
3Simpan file

Ctrl+S. Sekarang folder Anda punya 2 file:

๐Ÿ“ folder-anda/
   โ”œโ”€โ”€ index.html
   โ””โ”€โ”€ sw.js
โ„น๏ธ Kalau tidak mau pakai PWA

Hapus saja file sw.js. Aplikasi tetap jalan normal, hanya saja tidak bisa dibuka offline dan tidak muncul tombol "Install Aplikasi". Service worker akan di-skip otomatis oleh kode.

7. Testing Lokal Sebelum Hosting

๐Ÿšจ JANGAN buka index.html lewat double-click!

Kalau dibuka dengan file:///C:/Users/.../index.html, maka:

Harus dijalankan lewat local server.

7.1 Jalankan Local Server

Opsi A: Pakai Python (paling mudah)

Buka Terminal / Command Prompt di folder tempat index.html berada:

Windows (Command Prompt):

cd C:\path\ke\folder\anda
python -m http.server 8000

macOS / Linux:

cd /path/ke/folder/anda
python3 -m http.server 8000

Buka browser, akses:

http://localhost:8000

Opsi B: Pakai Node.js

npx serve

Opsi C: Pakai VS Code Extension

Install ekstensi "Live Server" di VS Code. Klik kanan index.html โ†’ "Open with Live Server".

7.2 Checklist Testing

7.3 Cara Cek Koneksi Firebase

Di Console browser, ketik:

console.log('Firebase ready?', fbReady);
console.log('Project:', firebaseConfig.projectId);

Harus keluar: Firebase ready? true. Kalau false, berarti config Anda salah.

8. Hosting ke Internet

Pilih salah satu dari 4 opsi di bawah. Untuk pemula, saya rekomendasikan Netlify Drop (paling cepat) atau GitHub Pages (paling fleksibel).

Opsi A: Netlify Drop Tercepat 5 Menit

1Buka Netlify Drop
https://app.netlify.com/drop
2Drag & Drop folder

Seret folder yang berisi index.html dan sw.js ke area upload. Netlify otomatis deploy dalam 10โ€“30 detik.

3Dapatkan URL

Setelah deploy, Anda akan dapat URL random seperti:

https://spontaneous-cat-a1b2c3.netlify.app
4Ganti nama domain (opsional)

Klik Site settings โ†’ Change site name. Ganti jadi:

https://siwarta-rt09.netlify.app
โš ๏ธ Daftar akun dulu!

Tanpa akun Netlify, site akan hilang dalam beberapa jam. Klik Claim your site untuk daftar gratis.

Opsi B: GitHub Pages Gratis Selamanya

1Daftar GitHub
https://github.com/signup
2Buat Repository Baru
  1. Klik ikon + di kanan atas โ†’ New repository.
  2. Repository name: siwarta-rt
  3. Visibility: Public (wajib untuk GitHub Pages gratis).
  4. Centang Add a README file.
  5. Klik Create repository.
3Upload File
  1. Klik Add file โ†’ Upload files.
  2. Drag index.html dan sw.js ke area upload.
  3. Klik Commit changes.
4Aktifkan GitHub Pages
  1. Klik tab Settings repository.
  2. Di sidebar kiri, klik Pages.
  3. Source: pilih Deploy from a branch.
  4. Branch: pilih main, folder / (root).
  5. Klik Save.
  6. Tunggu 1โ€“2 menit. Refresh halaman โ€” akan muncul URL:
https://username-anda.github.io/siwarta-rt/
โ„น๏ธ Cara update nanti

Setiap kali Anda edit index.html, upload ulang ke GitHub. GitHub Pages otomatis rebuild dalam 1 menit.

Opsi C: Vercel Modern & Cepat

1Daftar Vercel
https://vercel.com/signup
2New Project

Klik Add New... โ†’ Project โ†’ Continue with GitHub (import dari repo GitHub) atau upload folder manual.

3Deploy

Klik Deploy. Tunggu 30 detik. URL akan muncul:

https://siwarta-rt.vercel.app

Opsi D: Firebase Hosting Untuk yang Sudah Pakai Firebase

1Install Firebase CLI

Buka Terminal / Command Prompt, ketik:

npm install -g firebase-tools
2Login Firebase
firebase login

Browser akan terbuka. Login dengan akun Google yang dipakai di Firebase.

3Inisialisasi Project

Masuk ke folder Anda, lalu:

cd path/ke/folder/anda
firebase init hosting

Jawab pertanyaan:

4Deploy!
firebase deploy

Setelah selesai, URL akan muncul:

https://projectid-anda.web.app
https://projectid-anda.firebaseapp.com

9. Setup Awal Aplikasi (Setelah Online)

Setelah aplikasi online, lakukan langkah-langkah berikut untuk mengisi data awal:

9.1 Login Pertama

  1. Buka URL aplikasi Anda.
  2. Klik Daftar Sebagai Warga Baru.
  3. Isi data:
  4. Setelah submit, akan muncul halaman "Menunggu Persetujuan".
โš ๏ธ Yang pertama daftar adalah Anda sendiri (Ketua RT)

Karena belum ada Ketua RT yang bisa approve, Anda harus meng-approve diri sendiri lewat Firebase Console.

9.2 Approve Diri Sendiri via Firebase Console

  1. Buka Firebase Console โ†’ Firestore Database.
  2. Klik collection apps โ†’ dokumen rtdigital.
  3. Cari field warga (array). Klik untuk expand.
  4. Cari entry dengan nama Anda, ubah:
  5. Klik Update.
  6. Logout dari aplikasi, login ulang dengan akun Anda.
  7. Sekarang Anda akan punya akses penuh sebagai Ketua RT.

9.3 Setup Data Master

Login sebagai Ketua RT, lalu isi data berikut secara berurutan:

A. Set Nama & Alamat RT

  1. Menu โ†’ Pengaturan โ†’ Identitas RT โ†’ Nama RT.
  2. Isi: contoh RT 9 BC 2.
  3. Ulangi untuk Alamat / Lokasi RT.

B. Set Rekening Kas (via Bendahara)

Login sebagai Bendahara (atau dari akun Ketua, buka Pengaturan):

  1. Pengaturan โ†’ Rekening Kas RT.
  2. Isi: Nama Bank, Nomor Rekening, Atas Nama.

C. Buat Pos Tagihan

  1. Menu โ†’ Tagihan โ†’ tab Pos.
  2. Klik + Tambah Pos.
  3. Contoh pos:

D. Tambah Data Warga

  1. Menu โ†’ Data Warga โ†’ + Tambah Warga Baru.
  2. Isi data setiap kepala keluarga.
  3. Password default akan otomatis dibuat dan ditampilkan โ€” salin dan berikan ke warga.

E. Setting Denda Keamanan (Opsional)

  1. Login sebagai Petugas Keamanan โ†’ Sesi Keamanan โ†’ tab Aturan.
  2. Set nominal denda, jam jaga, jumlah orang per sesi.

9.4 Backup Pertama Kali

โœ… Wajib dilakukan setelah setup!

Login sebagai Bendahara/Ketua โ†’ Pengaturan โ†’ Data & Backup โ†’ Backup Sekarang. File JSON akan terunduh. Simpan di Google Drive / email.

10. Troubleshooting Masalah Umum

โŒ "Firebase belum siap" saat buka aplikasi

Penyebab: Config Firebase salah atau project belum aktif.

Solusi:

  1. Buka Console browser (F12) โ†’ tab Console, lihat pesan error detail.
  2. Cek firebaseConfig di index.html โ€” pastikan tidak ada typo.
  3. Pastikan Firestore sudah dibuat & Authentication Anonymous sudah ON.
  4. Refresh halaman (Ctrl+Shift+R).

โŒ "Auth gagal: permission-denied"

Penyebab: Firestore Rules terlalu ketat, atau Anonymous Auth belum aktif.

Solusi:

  1. Cek Firestore Rules โ€” pastikan ada allow read, write: if request.auth != null; untuk apps/{docId}.
  2. Cek Authentication โ†’ Sign-in method โ†’ Anonymous โ†’ Enable.
  3. Publish rules ulang.

โŒ Upload foto gagal: "Cloudinary mengembalikan respons tidak valid"

Penyebab: Preset name salah, atau preset bukan Unsigned.

Solusi:

  1. Buka Cloudinary โ†’ Settings โ†’ Upload โ†’ cek preset rt_bukti ada.
  2. Klik preset, pastikan Signing Mode = Unsigned.
  3. Pastikan CLOUDINARY_CLOUD_NAME di index.html benar.

โŒ Worker error 500 "Env variable belum diset"

Penyebab: Env variables di Cloudflare belum tersimpan.

Solusi:

  1. Buka Worker โ†’ Settings โ†’ Variables and Secrets.
  2. Pastikan 3 variable ada: CLOUDINARY_CLOUD_NAME, CLOUDINARY_API_KEY, CLOUDINARY_API_SECRET.
  3. Klik Save and Deploy ulang.

โŒ GPS error saat absen jaga

Penyebab: Izin lokasi ditolak, atau dibuka via file://.

Solusi:

  1. Pastikan dibuka via https:// atau http://localhost.
  2. Izinkan akses lokasi di browser โ€” cek ikon gembok di address bar.
  3. Nyalakan GPS di HP (mode High Accuracy).
  4. Untuk fallback: aplikasi tetap izinkan absen dengan tombol "Pakai Kode 6 Digit".

โŒ Data tidak muncul di HP warga lain

Penyebab: Sinkronisasi Firestore lambat, atau offline.

Solusi:

  1. Cek indikator sync di pojok kiri bawah โ€” kalau "Gagal sync", cek koneksi.
  2. Tarik ke bawah / refresh halaman.
  3. Pastikan semua HP terkoneksi ke internet.
  4. Cek Firestore Console โ€” apakah data benar-benar tersimpan di server.

โŒ Notifikasi badge tidak hilang setelah dibaca

Penyebab: Cache lokal browser.

Solusi:

  1. Klik tombol "Tandai Semua" di sheet notifikasi.
  2. Atau clear data browser: Settings โ†’ Site data โ†’ Clear.

โŒ PWA tidak muncul tombol Install

Penyebab: PWA hanya bisa diinstall via HTTPS.

Solusi:

  1. Pastikan hosted via HTTPS (Netlify, Vercel, GitHub Pages, Firebase Hosting โ€” semua HTTPS by default).
  2. Kalau pakai domain custom, pastikan SSL aktif.
  3. Di iOS, install via Safari โ†’ Share โ†’ "Add to Home Screen" (iOS tidak dukung auto-prompt).

โŒ Halaman putih kosong

Penyebab: JavaScript error.

Solusi:

  1. F12 โ†’ Console โ†’ cari error merah. Screenshot dan cari pesan errornya di Google.
  2. Error umum: Unexpected token = ada karakter aneh di kode. Copy ulang index.html.
  3. fbReady is not defined = file rusak. Redownload.

โŒ Data hilang setelah ganti device

Penyebab: Data seharusnya tersimpan di Firestore, bukan lokal.

Solusi:

  1. Cek Firestore Console โ†’ collection apps โ†’ dokumen rtdigital. Kalau kosong, ada masalah autentikasi.
  2. Restore dari backup: Pengaturan โ†’ Data & Backup โ†’ Restore.

๐Ÿ“ž Butuh Bantuan Lebih Lanjut?

Kalau masalah Anda tidak ada di daftar di atas:

  1. Buka Console browser (F12), screenshot tab Console dan tab Network.
  2. Catat: URL apa yang error, kode HTTP berapa, pesan errornya apa.
  3. Kirim ke pengembang / forum Firebase Community.
๐Ÿ”— Link Penting

SIWARTA โ€” Sistem Informasi Warga Terpadu

Panduan Instalasi Versi 1.0 ยท 2026

Dokumen ini bebas dibagikan untuk keperluan lingkungan RT/RW.