# ๐Ÿ”ง Fix Railway 502 Error ## โŒ Masalah yang Ditemukan ### 1. **Error: `digitalRead()` is not defined** Di `server.js` baris 105-108, ada kode Arduino yang tidak valid di Node.js: ```javascript relay1: digitalRead(RELAY1) === 'LOW', // โŒ ERROR! ``` **Penyebab:** Copy-paste dari kode Arduino ke Node.js **Fix:** Ganti dengan keep current relay status: ```javascript relay1: latestData.relay1 || false, // โœ… FIXED ``` --- ### 2. **Error: MQTT Broker Port Binding Failed** Railway tidak support custom ports (1883, 8883) untuk MQTT broker. **Penyebab:** ```javascript mqttServer.listen(MQTT_PORT, () => { // โŒ Port 1883 tidak tersedia console.log(`๐Ÿš€ MQTT Broker running on port ${MQTT_PORT}`); }); ``` **Fix:** Disable MQTT broker di Railway, gunakan external broker (HiveMQ): ```javascript if (process.env.ENABLE_MQTT_BROKER === 'true') { mqttServer.listen(MQTT_PORT, () => { console.log(`๐Ÿš€ MQTT Broker running on port ${MQTT_PORT}`); }).on('error', (err) => { console.warn(`โš ๏ธ MQTT Broker failed to start`); }); } else { console.log('โ„น๏ธ MQTT Broker disabled (use external MQTT broker)'); } ``` --- ## โœ… Perubahan yang Dilakukan ### File: `server.js` #### 1. Fix `digitalRead()` Error **Baris 100-111:** ```javascript // SEBELUM (โŒ ERROR): latestData = { suhu: data.suhu || 0, berat: data.berat || 0, target: data.target || 0, relay1: digitalRead(RELAY1) === 'LOW', // โŒ relay2: digitalRead(RELAY2) === 'LOW', // โŒ relay3: digitalRead(RELAY3) === 'LOW', // โŒ relay4: digitalRead(RELAY4) === 'LOW', // โŒ status: latestData.status, timestamp: new Date().toISOString() }; // SESUDAH (โœ… FIXED): latestData = { suhu: data.suhu || 0, berat: data.berat || 0, target: data.target || 0, relay1: latestData.relay1 || false, // โœ… Keep current status relay2: latestData.relay2 || false, // โœ… relay3: latestData.relay3 || false, // โœ… relay4: latestData.relay4 || false, // โœ… status: latestData.status, timestamp: new Date().toISOString() }; ``` #### 2. Disable MQTT Broker di Railway **Baris 180-210:** ```javascript // SEBELUM (โŒ CRASH): mqttServer.listen(MQTT_PORT, () => { console.log(`๐Ÿš€ MQTT Broker running on port ${MQTT_PORT}`); }); httpServer.listen(WS_PORT, () => { console.log(`๐ŸŒ WebSocket MQTT running on port ${WS_PORT}`); }); // SESUDAH (โœ… FIXED): if (process.env.ENABLE_MQTT_BROKER === 'true') { mqttServer.listen(MQTT_PORT, () => { console.log(`๐Ÿš€ MQTT Broker running on port ${MQTT_PORT}`); }).on('error', (err) => { console.warn(`โš ๏ธ MQTT Broker failed to start on port ${MQTT_PORT}:`, err.message); console.log('โ„น๏ธ MQTT Broker disabled. Use external MQTT broker (e.g., HiveMQ)'); }); } else { console.log('โ„น๏ธ MQTT Broker disabled (use external MQTT broker like HiveMQ)'); } if (process.env.ENABLE_MQTT_BROKER === 'true') { httpServer.listen(WS_PORT, () => { console.log(`๐ŸŒ WebSocket MQTT running on port ${WS_PORT}`); }).on('error', (err) => { console.warn(`โš ๏ธ WebSocket MQTT failed to start on port ${WS_PORT}:`, err.message); }); } else { console.log('โ„น๏ธ WebSocket MQTT disabled'); } ``` --- ## ๐Ÿš€ Deploy ```bash cd backend git add . git commit -m "Fix: Remove digitalRead error and disable MQTT broker in Railway" git push ``` โœ… **Pushed to GitHub!** Railway akan auto-deploy dalam 2-3 menit. --- ## ๐Ÿงช Test Setelah Deploy Tunggu 2-3 menit, lalu test: ### PowerShell: ```powershell # Health check Invoke-WebRequest -Uri "https://web-production-47eb.up.railway.app/" -UseBasicParsing # Test database Invoke-WebRequest -Uri "https://web-production-47eb.up.railway.app/api/database/test" -UseBasicParsing # Initialize tables Invoke-WebRequest -Uri "https://web-production-47eb.up.railway.app/api/database/init" -Method POST -UseBasicParsing # Get latest data Invoke-WebRequest -Uri "https://web-production-47eb.up.railway.app/api/data/latest" -UseBasicParsing ``` ### Browser: ``` https://web-production-47eb.up.railway.app/ https://web-production-47eb.up.railway.app/api/database/test https://web-production-47eb.up.railway.app/api/data/latest ``` --- ## ๐Ÿ“Š Expected Logs di Railway Setelah deploy berhasil, Railway logs akan menampilkan: ``` ๐Ÿ“ฆ Using MYSQL_URL for connection ๐Ÿ”ง Database Config: { host: 'mysql.railway.internal', port: 3306, user: 'root', database: 'railway', password: '***' } โœ… Database connected successfully โœ… Database tables initialized โ„น๏ธ MQTT Broker disabled (use external MQTT broker like HiveMQ) โ„น๏ธ WebSocket MQTT disabled ๐Ÿš€ REST API running on port 3000 โœ… Server is ready! ``` --- ## ๐Ÿ”„ Arsitektur Baru ### Sebelum (โŒ CRASH): ``` Backend di Railway: โ”œโ”€โ”€ REST API โœ… โ”œโ”€โ”€ MQTT Broker (port 1883) โŒ CRASH! โ””โ”€โ”€ WebSocket MQTT (port 8883) โŒ CRASH! ``` ### Sesudah (โœ… WORKS): ``` Backend di Railway: โ””โ”€โ”€ REST API โœ… (port 3000) MQTT Broker External (HiveMQ): โ””โ”€โ”€ broker.hivemq.com:1883 โœ… ESP32: โ”œโ”€โ”€ Connect ke HiveMQ โœ… โ””โ”€โ”€ Publish data โœ… Flutter: โ”œโ”€โ”€ Connect ke HiveMQ (real-time) โœ… โ””โ”€โ”€ Call REST API (control) โœ… ``` --- ## ๐Ÿ“ Catatan Penting ### 1. **MQTT Broker di Railway** Railway **TIDAK SUPPORT** custom ports untuk MQTT broker. - โŒ Port 1883 (MQTT) tidak bisa digunakan - โŒ Port 8883 (WebSocket MQTT) tidak bisa digunakan - โœ… Solusi: Gunakan **HiveMQ Cloud** (public MQTT broker) ### 2. **ESP32 Configuration** ESP32 harus connect ke **HiveMQ**, bukan Railway: ```cpp const char* mqtt_server = "broker.hivemq.com"; // โœ… Public broker // BUKAN: "web-production-47eb.up.railway.app" // โŒ Tidak support MQTT ``` ### 3. **Relay Status Tracking** Backend tidak bisa tahu relay status dari MQTT (ESP32 tidak kirim). - Backend track relay status saat kirim command via `/api/control` - Flutter ambil relay status dari `/api/data/latest` --- ## โœ… Checklist - [x] Fix `digitalRead()` error - [x] Disable MQTT broker di Railway - [x] Add error handling untuk port binding - [x] Commit dan push ke GitHub - [ ] Tunggu Railway deploy (2-3 menit) - [ ] Test endpoints - [ ] Cek Railway logs - [ ] Initialize database tables - [ ] Test dengan ESP32 --- ## ๐ŸŽ‰ Done! Backend sekarang akan: - โœ… Start tanpa crash - โœ… Connect ke MySQL Railway - โœ… Handle REST API requests - โœ… Tidak mencoba start MQTT broker (karena tidak support) ESP32 dan Flutter akan connect ke **HiveMQ** untuk MQTT, dan call **Railway** untuk REST API. Selamat! ๐Ÿš€