``` # Hoppscotch Fix - Step-by-Step Guide ## 📋 **Step-by-Step Fix Hoppscotch (Dari Error 502 → Sukses)** Berikut rangkuman lengkap langkah-langkah yang kita lakukan untuk memperbaiki Hoppscotch. --- ### 🔍 **STEP 1: Identifikasi Masalah Awal** **Gejala:** - Co-worker tidak bisa load workspace list di Hoppscotch (loading terus) - Error di log: `502 Bad Gateway` **Diagnosa:** ```bash # Cek log container hoppscotch docker logs --tail=100 48fc01c8f9a2 2>&1 | grep -i error ``` **Hasil:** ``` dial tcp [::1]:8080: connect: connection refused ``` → Caddy (reverse proxy) tidak bisa konek ke backend service. --- ### 🔍 **STEP 2: Cek Status Container & Port** ```bash # Cek container yang running docker ps --filter "publish=8080" docker ps -a | grep hoppscotch ``` **Hasil:** Container hoppscotch sudah running tapi backend-nya mati. **Cek apakah ada yang listen di port 9502:** ```bash sudo netstat -tulpn | grep 9502 ``` **Hasil:** `0.0.0.0:9502` → ada port mapping, tapi service di dalamnya mati. --- ### 🔍 **STEP 3: Cek Log Lengkap Container** ```bash docker logs -f af2efe1a9953 ``` **Dari log terlihat:** - ✅ Backend server mulai jalan: `Backend Server | Port: 8080` - ✅ Semua route terdaftar: `/graphql`, `/ping`, `/auth`, dll. - ✅ Ada request sukses: `POST /graphql 200` - ❌ Tapi Caddy masih error: `dial tcp [::1]:8080: connection refused` **Kesimpulan:** Backend jalan di `127.0.0.1:8080`, tapi Caddy coba pake `localhost:8080` (IPv6 `::1`). --- ### 🔍 **STEP 4: Cek Konfigurasi Caddy** ```bash # Masuk ke container docker exec -it af2efe1a9953 sh # Lihat konfigurasi Caddy cat /etc/caddy/aio-subpath-access.Caddyfile ``` **Isi Caddyfile:** ``` handle_path /backend* { reverse_proxy localhost:8080 # <-- MASALAH: pake localhost (IPv6) } ``` --- ### 🔧 **STEP 5: Perbaiki Konfigurasi Caddy** **Ganti `localhost` menjadi `127.0.0.1` (IPv4):** ```bash docker exec af2efe1a9953 sed -i 's/localhost:8080/127.0.0.1:8080/g' /etc/caddy/aio-subpath-access.Caddyfile ``` **Verifikasi:** ```bash docker exec af2efe1a9953 cat /etc/caddy/aio-subpath-access.Caddyfile | grep reverse_proxy ``` **Hasil:** ``` reverse_proxy 127.0.0.1:8080 ``` --- ### 🔧 **STEP 6: Restart Container** ```bash docker restart af2efe1a9953 # Tunggu beberapa detik sleep 10 ``` --- ### 🔧 **STEP 7: Update Konfigurasi Nginx Host** **Edit Nginx:** ```bash sudo nano /etc/nginx/sites-available/hoppscotch ``` **Tambahkan location /backend/:** ```nginx location /backend/ { proxy_pass http://127.0.0.1:9500/backend/; # Lewat Caddy di container proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket support (penting untuk Hoppscotch) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ``` **Test & Reload:** ```bash sudo nginx -t sudo systemctl reload nginx ``` --- ### ✅ **STEP 8: Test Endpoint** **Test dari host (seharusnya 400 - CSRF error, bukan 502):** ```bash curl -v https://hoppscotch.konstruksi.ai/backend/graphql ``` **Hasil:** ``` < HTTP/2 400 < content-type: application/json {"errors":[{"message":"This operation has been blocked as a potential Cross-Site Request Forgery (CSRF)..."}]} ``` ✅ **SUKSES!** Response 400 = backend sudah jalan. --- ### ✅ **STEP 9: Test dengan Request Valid** ```bash curl -X POST https://hoppscotch.konstruksi.ai/backend/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{ __typename }"}' ``` **Hasil:** ```json {"data":{"__typename":"Query"}} ``` ✅ **Backend benar-benar berfungsi!** --- ### 🎯 **STEP 10: Verifikasi Hoppscotch di Browser** 1. Buka `https://hoppscotch.konstruksi.ai` 2. Login dengan GitHub 3. Cek workspace list → **sudah bisa load!** --- ## 📝 **Ringkasan Root Cause & Fix** | Masalah | Penyebab | Solusi | |---------|----------|--------| | 502 Bad Gateway | Caddy pake IPv6 (`[::1]:8080`), backend listen di IPv4 (`127.0.0.1:8080`) | Ubah Caddyfile: `localhost:8080` → `127.0.0.1:8080` | | Nginx 502 | Nginx gak ada konfigurasi `/backend/*` | Tambahkan location /backend/ di Nginx | | Port mapping | Backend listen di 8080, bukan 3170 | Biarkan mapping `9502:3170` (tidak dipakai) | --- ## 🚀 **Command Penting yang Digunakan** ```bash # Lihat log error docker logs --tail=100 2>&1 | grep -i error # Follow log live docker logs -f # Masuk ke container docker exec -it sh # Edit file di container docker exec sed -i 's/old/new/g' /path/to/file # Restart container docker restart # Edit Nginx sudo nano /etc/nginx/sites-available/hoppscotch # Reload Nginx sudo nginx -t && sudo systemctl reload nginx ``` --- ## 📌 **Tips Debugging Kedepan** 1. **Cek log dulu:** `docker logs --tail=50 ` 2. **Cek dari dalam container:** `docker exec curl http://127.0.0.1:8080/graphql` 3. **Cek Nginx:** `sudo nginx -t` 4. **Test endpoint langsung:** `curl -v https://domain.com/path` --- ## 📊 **Arsitektur Akhir** ``` Browser ↓ https://hoppscotch.konstruksi.ai ↓ Nginx (Host) ├── / → http://127.0.0.1:9500 (Caddy → Frontend) └── /backend/* → http://127.0.0.1:9500/backend/* (Caddy → Backend) ↓ Container: hoppscotch (af2efe1a9953) ├── Caddy (port 9500) │ └── /backend/* → reverse_proxy 127.0.0.1:8080 └── Backend Server (port 8080) └── /graphql, /ping, /auth, dll. ``` --- ## ✅ **Status Akhir** - ✅ Frontend Hoppscotch jalan di `https://hoppscotch.konstruksi.ai` - ✅ Backend GraphQL jalan di `https://hoppscotch.konstruksi.ai/backend/graphql` - ✅ WebSocket support untuk realtime - ✅ Co-worker bisa login dan load workspace list ```