Staf logistik Anda berteriak frustrasi karena proses unggah ribuan baris data inventaris tiba-tiba gagal tersimpan di tengah jalan. Layar monitor hanya menampilkan layar putih dengan tulisan Gateway Timeout 504 atau Connection Request Time Out (RTO). Jangan buru-buru memarahi penyedia server komputasi awan (Cloud) Anda atau menambah kapasitas RAM mesin virtual. Akar masalah dari kegagalan transmisi data sistem Enterprise Resource Planning (ERP) seperti Odoo sering kali berada jauh di luar server, tersembunyi di dalam lapisan jaringan penyedia internet dan ketidaksesuaian protokol proksi.
Membangun dan memelihara sistem perencanaan sumber daya perusahaan menuntut jalur komunikasi yang tidak boleh terputus sepersekian detik pun. Saat sebuah paket data yang berisi detail transaksi finansial atau perpindahan stok gudang hilang di tengah rute (packet loss), sistem basis data relasional akan langsung mengunci tabel (table lock) untuk mencegah korupsi data. Anda membutuhkan pembedahan teknis radikal mulai dari ujung router kantor hingga parameter konfigurasi Nginx di dalam peladen pusat.
Anatomi Kegagalan: Nginx dan HTTP 504
HTTP 504 Gateway Timeout pada sistem Odoo terjadi ketika Nginx yang bertindak sebagai reverse proxy gagal mendapatkan respons dari proses backend (Werkzeug WSGI) dalam batas waktu `proxy_read_timeout` yang ditentukan. Kegagalan ini memutus paksa koneksi klien sebelum eksekusi basis data selesai.
Banyak pengembang sistem amatir hanya menjalankan Odoo menggunakan konfigurasi bawaan pabrik. Secara asal, Odoo berjalan sebagai proses tunggal (single-threaded) pada port 8069. Ini adalah sebuah bencana untuk lingkungan kerja multi-pengguna. Ketika Manajer Keuangan meminta sistem mencetak laporan PDF neraca lajur selama satu tahun penuh, proses tunggal tersebut akan bekerja keras melakukan komputasi yang mungkin memakan waktu hingga 90 detik.
Di saat yang bersamaan, staf gudang mencoba menyimpan resi penerimaan barang. Permintaan dari staf gudang ini terpaksa mengantre karena prosesor sedang sibuk melayani laporan keuangan. Nginx, yang berdiri di depan sebagai penerima tamu, memiliki kesabaran yang sangat terbatas (biasanya hanya 60 detik). Karena proses Odoo tidak kunjung memberikan jawaban atas antrean tersebut, Nginx menyerah dan melemparkan pesan Error 504 ke layar browser staf gudang Anda. Seluruh proses yang sedang berjalan pun terputus paksa.
Untuk menghindari malapetaka ini, administrator wajib mengubah topologi peladen menjadi mode multi-proses (multiprocessing). Anda harus mematikan proses tunggal dan mengaktifkan parameter workers di dalam berkas odoo.conf. Rumus dasar yang dianjurkan oleh dokumentasi resmi adalah jumlah inti prosesor dikalikan dua, ditambah satu. Dengan mode pekerja ini, Odoo bisa menangani puluhan hingga ratusan permintaan klien secara paralel tanpa saling memblokir antrean.

Jebakan Limitasi Sesi TCP dari ISP Murah
Menyelesaikan masalah dari sisi peladen tidak akan berguna jika pintu gerbang kantor Anda sendiri mencekik aliran datanya. Kami sering menemui klien perusahaan manufaktur yang mengeluhkan Odoo mereka selalu RTO setiap jam 10 pagi hingga jam 2 siang. Setelah dilakukan audit forensik jaringan, masalahnya ternyata sangat memalukan: mereka menggunakan layanan internet kelas rumahan untuk menopang operasional ratusan komputer pabrik.
Layanan internet biasa (broadband asimetris) tidak dirancang untuk menangani ribuan koneksi API kecil yang terjadi secara simultan. Penyedia layanan kelas bawah menghemat stok alamat IPv4 mereka dengan menerapkan sistem Carrier-Grade NAT (CGNAT) yang sangat agresif. Router pusat mereka membatasi jumlah sesi TCP maksimum untuk setiap modem pelanggan.
Odoo menggunakan metode longpolling atau websockets untuk melakukan pembaruan antarmuka secara waktu nyata (real-time). Setiap tab peramban web yang terbuka akan terus menerus menahan satu sesi koneksi tetap hidup menuju server. Jika kantor Anda memiliki 50 karyawan, dan masing-masing membuka 10 tab aplikasi, itu berarti ada 500 sesi konstan. Ketika batas sesi dari penyedia internet tercapai, permintaan HTTP baru untuk menyimpan dokumen akan dibuang begitu saja (dropped) oleh perangkat pemusat (BRAS) penyedia jaringan. Anda wajib mengetahui fondasi arsitektur jaringan agar paham beda internet dedicated vs broadband untuk operasional bisnis skala penuh.
Kebutuhan Mutlak Alamat IP Statis
Sistem CGNAT dari jaringan nirkabel atau optik murah secara konstan mengubah alamat IP publik Anda di belakang layar, sering kali setiap beberapa jam sekali untuk tujuan penyeimbangan beban (load balancing). Bagi Odoo, ini adalah mimpi buruk keamanan.
Token sesi pengguna (session cookie) diikat kuat pada validasi lingkungan asal untuk mencegah peretasan identitas. Jika staf Anda sedang berada di tengah-tengah proses rekonsiliasi bank yang panjang, dan tiba-tiba IP publik kantor berubah karena rotasi DHCP dari pihak operator seluler, sistem ERP akan menganggap itu sebagai anomali lalu mereset token tersebut. Pengguna akan secara paksa ditendang keluar (logout) dari sistem dan semua hasil kerjanya hilang. Inilah alasan mengapa paket internet dedicated ip static adalah pondasi dasar jika Anda tidak ingin produktivitas karyawan hancur lebur.
Bulan kemaren pas lagi ngejar target buka cabang baru Ayam Bakar Misterang, saya ngalamin sendiri pusingnya setup sistem ERP buat operasional kasir. Kita kan jualan dari rumah jg buat pesenan online. Waktu anak saya Nusaibah lagi input rekap stok harian, tiba tiba layar muter trus langsung RTO putih. Awalnya saya pikir server cloud nya yg down. Pas saya cek di log terminal mikrotik, ternyata paket data kita ke-drop mulu gara gara provider murahan yg lg saya pake nerapin CGNAT super ketat. IP public nya gonta ganti tiap beberapa menit. Ini bikin sesi login Odoo langsung invalid gara gara ke-detect beda IP. Dari kejadian itu saya makin yakin, project ispmurah.com yg lagi saya bangun buat nargetin pengguna perumahan di area jabodetabek itu harus banget ngasih IP public statis walau harganya murah. Ga bisa jalanin bisnis kalo ngandelin koneksi yg routingnya ngaco terus nendang user keluar sendiri.
Tragedi MTU Mikrotik dan Data Inventori Hilang
Mari kita gali lebih dalam ke area yang sangat jarang disentuh oleh staf teknis standar: Maximum Transmission Unit (MTU). Banyak insiden fatal terjadi di mana aplikasi Odoo bisa dibuka dengan cepat dan lancar untuk sekadar melihat data, namun langsung macet total (freeze) dan RTO ketika pengguna mencoba mengunggah berkas gambar produk, atau menyimpan ratusan baris data jurnal akuntansi.
Fenomena ini disebut ICMP Blackhole akibat MTU yang tidak sinkron. Standar ukuran paket data (MTU) pada jaringan lokal (LAN) adalah 1500 byte. Komputer karyawan Anda akan mengirimkan blok data sebesar 1500 byte menuju router Mikrotik. Namun, jika koneksi internet Anda menggunakan protokol PPPoE (Point-to-Point Protocol over Ethernet) dari operator, protokol ini menambahkan 8 byte untuk tajuk pembungkusnya. Artinya, jalur internet Anda hanya sanggup menelan maksimal 1492 byte data dalam satu kali telan.
Ketika server mengirimkan blok data besar (seperti unduhan laporan Excel dari Odoo), router ISP di tengah jalan akan melihat paket berukuran 1500 byte ini dan berkata, “Ini terlalu besar untuk lewat.” Router tersebut seharusnya mengirimkan pesan peringatan kembali ke peladen asal untuk mengecilkan ukuran paketnya. Sayangnya, banyak penyedia layanan amatir memblokir pesan peringatan ini demi alasan keamanan (mematikan ping ICMP).

Akibatnya, peladen terus menunggu balasan yang tak kunjung tiba. Koneksi membeku (hang) di tengah jalan (stalled connection), dan pada akhirnya terputus akibat Timeout. Untuk menyelesaikan penyakit misterius ini, administrator jaringan Anda harus masuk ke antarmuka baris perintah (CLI) Mikrotik dan membuat aturan di dinding api (Firewall Mangle) untuk secara paksa menjepit nilai TCP MSS (Maximum Segment Size) menjadi ukuran yang lebih kecil, biasanya 1360 atau 1440 byte.
Masalah latensi ekstrem akibat fragmentasi paket ini polanya hampir mirip dengan isu-isu putus sambung yang sering dikeluhkan oleh para pekerja jarak jauh. Anda bisa mempelajari lebih rinci bagaimana mekanisme redaman waktu respons pada kasus solusi forensik latency 10ms yang sering melumpuhkan infrastruktur berbasis cloud.
Konfigurasi Reverse Proxy Nginx Secara Profesional
Menempatkan Odoo langsung menghadap ke internet publik pada port 8069 adalah sebuah kecerobohan sekuritas tingkat tinggi. Anda diwajibkan menggunakan Nginx sebagai perisai proksi. Namun, Nginx harus dikonfigurasi dengan sangat hati-hati agar tidak menjadi penyebab kemacetan data itu sendiri.
Pertama, selesaikan masalah waktu tunggu. Jika operasional bisnis Anda memang melibatkan proses unduh pangkalan data rutin yang berat, Anda harus memberi tahu Nginx untuk bersabar. Buka berkas konfigurasi Nginx dan ubah parameter blok location yang mengarah ke layanan Odoo. Tambahkan parameter proxy_read_timeout 720s; dan proxy_connect_timeout 720s;. Ini akan memberikan waktu hingga 12 menit bagi Nginx sebelum memotong koneksi. Tentu saja, angka ini harus disesuaikan dengan kebutuhan wajar aplikasi, jangan dibiarkan tak terbatas karena akan memicu kerentanan serangan penolakan layanan (DDoS).
Kedua, masalah kapasitas unggah berkas. Secara bawaan, Nginx akan menolak setiap percobaan unggahan berkas yang lebih besar dari 1 Megabyte, memunculkan galat HTTP 413 Payload Too Large. Jika pengguna Anda ingin mengunggah basis data awal, nilai ini harus dilebarkan. Sisipkan baris client_max_body_size 100M; pada tingkatan blok server. Ini akan mengizinkan Odoo menerima lampiran dokumen kontrak atau gambar katalog dengan wajar.
Mengawal Arus Longpolling dan Websockets
Sistem pesan antar pengguna, modul obrolan langsung (Live Chat), dan indikator proses berjalan pada Odoo membutuhkan jalur khusus yang tidak boleh ditangani oleh proses pekerja reguler. Odoo menangani hal ini melalui layanan longpolling (pada Odoo versi 15 ke bawah) yang berjalan di port 8072, atau protokol Websockets murni pada versi 16 ke atas.
Nginx harus diperintahkan secara eksplisit untuk mengarahkan rute permintaan spesifik ini tanpa memutusnya. Pada blok proksi untuk lokasi /longpolling atau /websocket, Anda wajib mengatur tajuk untuk peningkatan sambungan (Connection Upgrade) dan mematikan fungsi *proxy_buffering*. Jika *buffering* Nginx menyala untuk lalu lintas websocket, pesan obrolan di layar pengguna akan tertahan dan baru muncul sepuluh menit kemudian, menciptakan kekacauan koordinasi antar divisi.
Menyelaraskan Koneksi Database PostgreSQL
Titik henti (bottleneck) terakhir yang paling mematikan berada di lapisan terdalam: basis data PostgreSQL. Ketika Anda sudah mengatur 9 pekerja Odoo, setiap pekerja tersebut dapat membuka banyak sambungan langsung menuju PostgreSQL. Masalahnya, setelan dasar PostgreSQL sering kali membatasi jumlah maksimum sambungan paralel hanya di angka 100 (max_connections = 100).
Ketika batas 100 ini terlampaui pada hari gajian (ketika seluruh modul penggajian melakukan komputasi serentak), PostgreSQL akan menolak sambungan baru. Layar Odoo akan mencetak peringatan merah OperationalError: FATAL: sorry, too many clients already. Di mata Nginx, ini kembali diterjemahkan sebagai kegagalan respons berujung 504 Gateway Timeout.
Solusi arsitektur berskala korporasi adalah memasang penampung sambungan (Connection Pooler) pihak ketiga seperti PgBouncer. PgBouncer berdiri di antara Odoo dan PostgreSQL. Ia mengumpulkan dan mengatur lalu lintas ribuan permintaan koneksi dari Odoo, lalu merampingkannya menjadi puluhan sambungan efisien yang stabil ke dalam PostgreSQL. Implementasi ini menjamin sistem tidak akan pernah lumpuh meskipun ada 500 karyawan yang menekan tombol “Simpan” pada detik yang sama.
Jangan pernah membangun infrastruktur jaringan enterprise yang rentan terhadap hambatan tak kasat mata. Pastikan setiap komponen, dari topologi perutean hingga parameter basis data, telah diuji tekanannya (stress tested). Kegagalan sistem bukanlah nasib yang harus diterima, melainkan buah dari desain yang tidak diukur secara matematis. Lakukan migrasi topologi jaringan fisik dan sempurnakan parameter peladen Anda hari ini juga untuk mengeliminasi RTO selamanya.
FAQ
Apa yang harus dilakukan saat instalasi modul Odoo gagal dengan pesan Timeout 504?
Proses instalasi atau pembaruan modul (terutama modul besar seperti Akuntansi dan Manufaktur) mengubah banyak struktur tabel dan memakan waktu sangat lama. Jangan menginstalnya melalui peramban web karena batas waktu Nginx pasti akan terlewati. Akses server Anda melalui terminal SSH dan jalankan pembaruan modul menggunakan baris perintah Odoo (`odoo-bin -u nama_modul -d nama_database`) agar proses dieksekusi secara lokal tanpa hambatan protokol proksi.
Mengapa ekspor file Excel yang besar tiba-tiba berhenti di tengah jalan?
Selain karena ukuran MTU yang bermasalah, proses ekspor data raksasa sering dihentikan oleh pembatas memori pekerja Odoo (`limit_memory_hard`). Jika laporan Excel tersebut menyedot kapasitas RAM melebihi batas (misalnya diatur maksimal 2GB), sistem penjaga (Watchdog) Odoo akan langsung membunuh (kill) proses tersebut untuk melindungi kesehatan server. Tingkatkan batas memori di odoo.conf atau filter data Anda menjadi potongan waktu yang lebih kecil sebelum mengekspornya.
Apakah fitur Load Balancing ISP membantu mencegah RTO pada server lokal?
Tidak jika konfigurasinya salah. Load balancer murah sering kali mendistribusikan lalu lintas secara bergantian (Round Robin) melalui dua jalur WAN yang berbeda. Hal ini membuat alamat IP publik Anda terlihat berubah-ubah di mata klien yang mengaksesnya dari luar. Ini akan merusak sesi persisten TCP. Jika Anda mengekspos Odoo dari kantor lokal, pastikan router disetel dengan aturan perutean statis (Policy Based Routing) agar lalu lintas spesifik Odoo selalu melewati satu antarmuka WAN utama yang stabil.
Seberapa sering file log Nginx perlu dibersihkan untuk menjaga performa?
Berkas log akses dan log kesalahan Nginx akan terus membengkak seiring waktu. Jika penyimpanan disk penuh (100%), peladen akan lumpuh total seketika. Konfigurasikan sistem Rotasi Log (Logrotate) pada distribusi Linux Anda agar berkas log ini dipotong dan diarsipkan secara otomatis setiap minggu. Hapus arsip lama yang umurnya melebihi tiga bulan. Nginx tidak akan bermasalah membaca file log yang besar, namun kehabisan ruang penyimpanan sistem akan membunuh seluruh basis data PostgreSQL Anda.