# 🚨 SOLUSI LENGKAP: Penjadwalan Tidak Masuk Railway ## 📋 HASIL ANALISIS ### ✅ Yang SUDAH BENAR: 1. **Flutter Code** - Data penjadwalan ditulis dengan benar ke Firebase 2. **Worker Code** - Logic membaca dan execute sudah benar 3. **Format Data** - Compatible antara Flutter dan Worker 4. **Git Repository** - railway-worker sudah di-commit dan push ### ❌ KEMUNGKINAN MASALAH: 1. **Railway Root Directory belum di-set** 2. **Environment Variables belum lengkap/salah** 3. **Redis service belum di-add ke Railway** 4. **Data penjadwalan belum di-set dari Flutter** --- ## 🔧 LANGKAH PERBAIKAN (STEP-BY-STEP) ### **STEP 1: Verifikasi Data Di Firebase Console** 1. Buka [Firebase Console](https://console.firebase.google.com) 2. Pilih project: **project-ta-951b4** 3. Klik **Realtime Database** di sidebar 4. Cek path `/kontrol/` **Yang HARUS ADA:** ```json { "kontrol": { "waktu": true, ← MUST BE TRUE! "waktu_1": "07:30", ← Format HH:mm string "waktu_2": "17:00", ← Format HH:mm string "durasi_1": 60, ← Integer (seconds) "durasi_2": 60, ← Integer (seconds) "otomatis": false, "batas_bawah": 40, "batas_atas": 100 } } ``` **Jika data TIDAK ADA atau `waktu` = false:** - Buka Flutter app - Masuk ke **Kontrol Waktu** - Set jadwal - **Toggle "Aktif" menjadi ON** - Klik **Simpan** --- ### **STEP 2: Test Firebase Connection Dari Local** Di folder railway-worker, buat file `.env`: ```bash cd f:\ApsGo\ApsGo\railway-worker ``` Create `.env` file (copy dari .env.example): ```env FIREBASE_PROJECT_ID=project-ta-951b4 FIREBASE_CLIENT_EMAIL=firebase-adminsdk-xxxxx@project-ta-951b4.iam.gserviceaccount.com FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nYourKeyHere\n-----END PRIVATE KEY-----\n" FIREBASE_DATABASE_URL=https://project-ta-951b4-default-rtdb.firebaseio.com ``` **Cara dapat Firebase credentials:** 1. Firebase Console → Project Settings 2. Service Accounts tab 3. Klik "Generate New Private Key" 4. Download JSON file 5. Copy value dari JSON: - `project_id` → FIREBASE_PROJECT_ID - `client_email` → FIREBASE_CLIENT_EMAIL - `private_key` → FIREBASE_PRIVATE_KEY (ganti \n dengan \\n) - Database URL bisa dari Realtime Database page **Test connection:** ```powershell cd railway-worker npm install node test-firebase-connection.js ``` **Expected output:** ``` ✅ Firebase initialized ✅ DATA FOUND! Structure: ✅ DATA STRUCTURE VALID ✅ WAKTU MODE ENABLED ``` **Jika error:** - Check credentials (terutama PRIVATE_KEY format) - Pastikan Database URL benar - Pastikan Firebase Rules mengizinkan read/write --- ### **STEP 3: Setup Railway - Root Directory** 1. **Login ke Railway:** https://railway.app 2. **Select Project:** mellow-cat 3. **Select Service:** myreppril 4. **Klik tab "Settings"** 5. **Scroll ke section "Build"** 6. **Cari field "Root Directory"** 7. **Isi dengan:** `railway-worker` 8. **Save** (auto-save) **PENTING:** Tanpa ini, Railway akan build dari root folder dan gagal! --- ### **STEP 4: Add Redis Database** 1. Di Railway project dashboard 2. Klik tombol **"+ New"** 3. Pilih **"Database"** 4. Pilih **"Add Redis"** 5. Tunggu provisioning selesai Railway akan auto-inject environment variables: - `REDIS_HOST` - `REDIS_PORT` - `REDIS_PASSWORD` --- ### **STEP 5: Set Environment Variables** Di Railway → Service myreppril → Tab **"Variables"** **ADD THESE:** | Variable Name | Value | |--------------|-------| | `FIREBASE_PROJECT_ID` | `project-ta-951b4` | | `FIREBASE_CLIENT_EMAIL` | `firebase-adminsdk-xxxxx@project-ta-951b4.iam.gserviceaccount.com` | | `FIREBASE_PRIVATE_KEY` | `-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----` | | `FIREBASE_DATABASE_URL` | `https://project-ta-951b4-default-rtdb.firebaseio.com` | **⚠️ PENTING untuk PRIVATE_KEY:** - Harus dalam format string dengan `\n` (backslash-n), BUKAN newline sebenarnya - Contoh: `-----BEGIN PRIVATE KEY-----\nMIIEvQIBADA...\n-----END PRIVATE KEY-----\n` - Copy dari JSON file service account, tapi ganti newline dengan `\n` **Cara mudah:** ```javascript // Di PowerShell atau Node.js console const fs = require('fs'); const key = JSON.parse(fs.readFileSync('service-account.json')).private_key; console.log(key); // Ini sudah format dengan \n ``` --- ### **STEP 6: Redeploy Railway** 1. Setelah set Root Directory & Variables 2. Klik tab **"Deployments"** 3. Klik **"Redeploy"** atau biarkan auto-deploy 4. Tunggu build selesai (2-3 menit) --- ### **STEP 7: Monitor Logs** 1. Klik tab **"Logs"** (di navigation bar atas) 2. Enable "Follow logs" (toggle di kanan atas) **Expected logs saat startup:** ``` 🚀 Starting ApsGo Railway Worker... 📡 Firebase Project: project-ta-951b4 📦 Redis: redis.railway.internal:6379 ✅ Firebase Admin initialized ✅ Redis connected ✅ Waktu Mode scheduler started (check every 30s) ✅ Sensor Mode monitoring started ✨ ApsGo Railway Worker is running! ``` **Jika ada error:** - `Firebase initialization failed` → Check credentials - `Redis error` → Pastikan Redis database sudah di-add - `Cannot find module` → Check Root Directory setting --- ### **STEP 8: Test Penjadwalan** **Cara 1: Set jadwal dekat waktu sekarang** 1. Buka Flutter app 2. Kontrol Waktu → Set Jadwal 1 = (waktu sekarang + 2 menit) 3. Durasi = 10 detik 4. **Toggle "Aktif" = ON** 5. Simpan 6. Tunggu 2 menit 7. Cek Railway logs **Expected di logs:** ``` 🕐 JADWAL 1 TRIGGERED: 14:30 📌 Added to queue: jadwal_1_2026-02-10_14:30 💧 Processing Job: jadwal_1_... Type: waktu_jadwal_1 Pots: [1, 2, 3, 4, 5] Duration: 10s 🔛 Turning ON: mosvet_1, mosvet_3, mosvet_4, mosvet_5, mosvet_6, mosvet_7 ⏳ Waiting 10s... 🔚 Turning OFF: mosvet_1, mosvet_3, mosvet_4, mosvet_5, mosvet_6, mosvet_7 ✅ Worker completed job jadwal_1_... 📊 History logged: 2026-02-10 14:30 ``` **Cara 2: Check Firebase langsung** 1. Firebase Console → Realtime Database 2. Monitor path `/kontrol/waktu` 3. Monitor path `/aktuator/` (harus berubah dari false → true → false) --- ## 🐛 TROUBLESHOOTING CHECKLIST ### ❌ "No logs at all in Railway" - [ ] Root directory = `railway-worker`? - [ ] Environment variables complete? - [ ] Redis database added? - [ ] Check Deployments tab for build errors ### ❌ "Logs show but no schedule triggers" - [ ] Firebase `/kontrol/waktu` = true? - [ ] Jadwal sudah di-set di Flutter? - [ ] Format waktu benar (HH:mm string)? - [ ] Current time match jadwal? ### ❌ "Firebase initialization failed" - [ ] FIREBASE_PRIVATE_KEY format benar (dengan \n)? - [ ] SERVICE_ACCOUNT email benar? - [ ] Database URL benar? - [ ] Firebase Rules allow read/write? ### ❌ "Redis connection error" - [ ] Redis database sudah di-add di Railway? - [ ] REDIS_HOST/PORT/PASSWORD auto-injected? --- ## 📊 CARA CEK DATA FIREBASE DARI FLUTTER Tambahkan button debug di Flutter (temporary): ```dart ElevatedButton( onPressed: () async { final data = await FirebaseDatabase.instance.ref('kontrol').get(); print('KONTROL DATA: ${data.value}'); }, child: Text('Debug: Print Kontrol Data'), ) ``` Check debug console untuk melihat data yang tersimpan. --- ## 🎯 QUICK TEST SCRIPT Jalankan dari terminal: ```powershell # Test 1: Check Firebase data cd f:\ApsGo\ApsGo\railway-worker node test-firebase-connection.js # Test 2: Check queue (if worker running) node check-queue.js ``` --- ## 📞 LANGKAH SELANJUTNYA Setelah mengikuti STEP 1-8: 1. **Screenshot Railway Logs** yang muncul 2. **Screenshot Firebase Console** (path /kontrol/) 3. **Screenshot Railway Settings** (Root Directory & Variables) Dengan screenshot tersebut, saya bisa bantu troubleshoot lebih lanjut jika masih ada masalah! --- ## ✅ CHECKLIST FINAL Sebelum test: - [ ] Data jadwal ada di Firebase `/kontrol/` - [ ] `waktu` = true di Firebase - [ ] Railway root directory = `railway-worker` - [ ] 4 Firebase env variables di Railway - [ ] Redis database added di Railway - [ ] Worker logs muncul di Railway - [ ] Jadwal set 2-3 menit dari sekarang untuk test **Jika semua checked, penjadwalan PASTI jalan!** ✨