Membuat dan Menjalankan Proyek Socket.io dengan ServBay
Socket.io adalah library JavaScript populer yang dirancang untuk membangun aplikasi web real-time, dua arah, dan berbasis event. Socket.io didasarkan pada protokol WebSocket dan menyediakan fallback secara otomatis (seperti long polling) untuk memastikan komunikasi yang stabil dan handal di berbagai klien dan kondisi jaringan.
Panduan ini akan membahas secara detail cara memanfaatkan lingkungan pengembangan lokal ServBay untuk membangun, menjalankan, dan mengelola proyek Socket.io. ServBay menyediakan lingkungan Node.js yang sudah terkonfigurasi dan fitur manajemen situs (sebelumnya disebut: host) yang memudahkan proses pengembangan aplikasi Socket.io lebih efisien.
Apa Itu Socket.io?
Socket.io adalah library yang mengimplementasikan komunikasi dua arah secara real-time dan berbasis event. Socket.io terdiri dari dua bagian:
- Library backend yang berjalan di server Node.js.
- Library klien JavaScript yang berjalan di browser.
Walaupun tujuan utama Socket.io adalah menggunakan WebSocket, library ini akan secara otomatis mendeteksi dan melakukan fallback ke metode transportasi lain (seperti Adobe Flash Socket, Ajax Long Polling, Ajax Multipart Streaming, Forever IFrame, JSONP Polling, dan lainnya) untuk menjaga kompatibilitas pada browser lama atau jaringan yang terbatas.
Fitur Utama dan Kelebihan Socket.io
- Komunikasi Real-time: Memungkinkan pertukaran data secara instan antara server dan klien, sangat cocok untuk aplikasi chat, alat kolaborasi, dashboard real-time, game online, dan sebagainya.
- Dukungan Multiplatform: Dapat digunakan baik di browser web, aplikasi mobile, maupun di lingkungan server Node.js.
- Reconnect Otomatis: Jika koneksi jaringan terputus, klien akan mencoba kembali secara otomatis sehingga aplikasi lebih robust.
- Berbasis Event: Model pemrograman berbasis event memudahkan penanganan komunikasi asinkron.
- Room dan Namespace: Mendukung pengelompokan klien ke dalam “room” untuk broadcast pesan ke kelompok tertentu; “namespace” memungkinkan penggunaan multi-channel pada satu koneksi.
- Dukungan Data Biner: Mudah untuk mengirim dan menerima data biner.
- Kompatibilitas Tinggi: Menyediakan banyak mekanisme transportasi agar tetap andal di berbagai kondisi jaringan.
Dengan Socket.io, developer bisa fokus pada logika aplikasi tanpa harus mengurusi detail teknis komunikasi real-time yang kompleks di level bawah.
Membuat dan Menjalankan Proyek Socket.io dengan ServBay
ServBay menyediakan lingkungan siap pakai untuk developer Node.js, termasuk runtime Node.js, npm, dan alat manajemen situs yang sangat mudah. Kita akan memanfaatkan semua fitur tersebut untuk membuat dan menjalankan proyek contoh Socket.io.
Prasyarat
Sebelum memulai, pastikan Anda sudah menyelesaikan langkah-langkah berikut:
- Instal ServBay: Unduh dan instal ServBay versi terbaru dari situs resmi ServBay.
- Instal Paket Node.js di ServBay: Pastikan Anda sudah menginstal paket Node.js di ServBay. Anda bisa memasang dan mengatur Node.js melalui panel kontrol ServBay pada bagian “Paket” (sebelumnya disebut “Service”). Lihat dokumentasi Menggunakan Node.js di ServBay untuk instruksi lebih lanjut.
Membuat Proyek Contoh Socket.io
Kita akan membuat aplikasi chat sederhana sebagai contoh.
Inisialisasi Folder Proyek:
Buka aplikasi terminal Anda. Direkomendasikan oleh ServBay untuk menempatkan proyek website di direktori
/Applications/ServBay/www
. Masuk ke direktori tersebut, buat folder proyek baru, kemudian inisialisasi proyek Node.js dan instal dependensi yang diperlukan:bashcd /Applications/ServBay/www mkdir servbay-socketio-chat cd servbay-socketio-chat npm init -y npm install express socket.io
1
2
3
4
5Ini akan membuat file
package.json
di folderservbay-socketio-chat
serta menginstal dua dependensi inti:express
(untuk menyediakan file statis dan menangani request HTTP) dansocket.io
(library server dan klien).Buat File Server (
server.js
):Pada root folder
servbay-socketio-chat
, buat file bernamaserver.js
dan tempelkan kode berikut. File ini bertanggung jawab untuk memulai HTTP server, mengintegrasikan Socket.io, serta menangani koneksi dan broadcast pesan.javascriptconst express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const path = require('path'); // Import modul path const app = express(); // Membuat HTTP server berbasis aplikasi express const server = http.createServer(app); // Pasang Socket.io pada HTTP server const io = socketIo(server); // Set direktori file statis ke direktori saat ini app.use(express.static(__dirname)); // Tangani permintaan GET pada root, kirim file index.html app.get('/', (req, res) => { // Gunakan path.join agar path cocok di semua OS res.sendFile(path.join(__dirname, 'index.html')); }); // Dengarkan event koneksi Socket.io io.on('connection', (socket) => { console.log('a user connected'); // Log saat user terhubung // Dengarkan event disconnect socket.on('disconnect', () => { console.log('user disconnected'); // Log saat user terputus }); // Dengarkan event 'chat message' socket.on('chat message', (msg) => { console.log('message: ' + msg); // Tampilkan pesan masuk // Broadcast pesan ke semua klien io.emit('chat message', msg); }); }); // Ambil port dari environment variable atau gunakan default const port = process.env.PORT || 3000; server.listen(port, () => { console.log(`Server running on port ${port}`); console.log(`Access it via http://localhost:${port} (direct) or via ServBay reverse proxy`); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43Penjelasan kode:
- Kita menggunakan
express
untuk membuat web server sederhana guna menyajikan fileindex.html
. http.createServer(app)
membuat HTTP server standar, sebagai dasar untuk Socket.io.socketIo(server)
menginisialisasi Socket.io dan mengaitkannya ke HTTP server.io.on('connection', ...)
memantau koneksi klien baru.socket.on('disconnect', ...)
memantau ketika klien memutuskan koneksi.socket.on('chat message', ...)
menerima pesan dari event bertajuk'chat message'
dari klien.io.emit('chat message', msg)
membroadcast pesan ke seluruh klien yang terhubung.
- Kita menggunakan
Buat File Klien (
index.html
):Pada root folder
servbay-socketio-chat
, buat fileindex.html
dan tempelkan kode berikut. File ini berisi struktur HTML, style, dan kode JavaScript aman di klien untuk berkomunikasi dengan server menggunakan Socket.io.html<!DOCTYPE html> <html> <head> <title>ServBay Socket.io Chat</title> <style> body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); } #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; } #input:focus { outline: none; } #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages > li { padding: 0.5rem 1rem; } #messages > li:nth-child(odd) { background: #efefef; } .servbay-banner { background-color: #007bff; /* ServBay Biru */ color: white; text-align: center; padding: 15px 0; font-size: 22px; margin-bottom: 20px; font-weight: bold; } </style> </head> <body> <div class="servbay-banner">Selamat datang di demo ServBay Socket.io Chat!</div> <ul id="messages"></ul> <form id="form" action=""> <input id="input" autocomplete="off" /><button type="submit">Kirim</button> </form> <!-- Memuat library klien Socket.io --> <!-- File ini dihasilkan secara dinamis oleh server Socket.io --> <script src="/socket.io/socket.io.js"></script> <script> // Terhubung ke server Socket.io // Jika klien dan server berjalan pada domain dan port yang sama, io() akan otomatis terhubung var socket = io(); var form = document.getElementById('form'); var input = document.getElementById('input'); var messages = document.getElementById('messages'); // Dapatkan elemen messages form.addEventListener('submit', function(e) { e.preventDefault(); // Mencegah submit form secara default if (input.value) { // Kirim event 'chat message' beserta pesan ke server socket.emit('chat message', input.value); input.value = ''; // Kosongkan input } }); // Dengarkan event 'chat message' dari server socket.on('chat message', function(msg) { // Buat list item baru untuk pesan var item = document.createElement('li'); item.textContent = msg; // Gunakan textContent untuk mencegah XSS messages.appendChild(item); // Tambahkan ke list pesan // Scroll ke pesan terbaru window.scrollTo(0, document.body.scrollHeight); }); </script> </body> </html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64Penjelasan kode:
- Halaman terdiri dari struktur HTML sederhana, CSS (termasuk banner warna biru khas ServBay), daftar pesan (
ul#messages
), serta form untuk mengirim pesan (form#form
). <script src="/socket.io/socket.io.js"></script>
memuat library klien Socket.io yang otomatis disediakan oleh server pada endpoint/socket.io/socket.io.js
.io()
akan menginisialisasi koneksi ke Socket.io server.- Klien akan menangani submit form dengan mencegah perilaku default form, kemudian mengirim pesan ke server menggunakan
socket.emit('chat message', input.value)
. - Klien juga akan menerima event
'chat message'
dari server, dan menampilkannya di daftar pesan pada halaman.
- Halaman terdiri dari struktur HTML sederhana, CSS (termasuk banner warna biru khas ServBay), daftar pesan (
Sampai di sini, proyek contoh Socket.io sudah selesai dibuat. Selanjutnya, kita akan menjalankannya dan mengakses lewat ServBay.
Menjalankan Proyek via ServBay (Mode Pengembangan)
Pada tahap pengembangan, Anda biasanya menjalankan server Node.js langsung, lalu memanfaatkan fitur reverse proxy ServBay untuk mengaksesnya lewat domain lokal.
Jalankan Server Node.js untuk Pengembangan:
Buka terminal, masuk ke direktori proyek
/Applications/ServBay/www/servbay-socketio-chat
, dan jalankan perintah di bawah. Kita contohkan menggunakan port 8585, bisa diubah sesuai kebutuhan.bashcd /Applications/ServBay/www/servbay-socketio-chat PORT=8585 node server.js
1
2Setelah server berjalan, akan muncul output seperti
Server running on port 8585
di terminal. Artinya, server mendengarkan di port 8585 lokal.Konfigurasi Situs (Reverse Proxy) di ServBay:
Agar bisa diakses lewat domain lokal dan memanfaatkan HTTPS/SSL, kita akan menambahkan situs reverse proxy di ServBay.
- Buka panel kontrol ServBay.
- Masuk ke bagian “Website” (sebelumnya: Host).
- Klik tombol untuk menambah situs baru.
- Isi konfigurasi berikut:
- Nama:
ServBay Socket.io Dev
(atau nama lain yang mudah dikenali) - Domain:
servbay-socketio-dev.servbay.demo
(atau domain.servbay.demo
lain) - Tipe Website: Pilih
Reverse Proxy
- Proxy Destination: Isi dengan
http://127.0.0.1:8585
(mengarah ke Node.js server Anda)
- Nama:
- Simpan konfigurasi. ServBay akan otomatis menerapkan perubahan dan mungkin me-restart web server terkait (Caddy atau Nginx, tergantung pengaturan ServBay Anda).
Catatan: Reverse proxy sangat penting untuk Socket.io karena tidak hanya meneruskan request HTTP biasa, tetapi juga mendukung handshake upgrade untuk WebSocket. Konfigurasi default di Caddy/Nginx ServBay sudah mendukung WebSocket proxying.
Untuk langkah detail menambah website di ServBay, lihat dokumentasi Menambah Website Node.js untuk Development. Untuk mengaktifkan HTTPS di domain lokal, lihat Mengamankan Website dengan SSL/TLS. ServBay User CA dan ServBay Public CA bisa digunakan untuk membuat dan mempercayai sertifikat SSL lokal.
Akses Situs Pengembangan:
Buka browser dan akses domain lokal yang Anda setup, misal
https://servbay-socketio-dev.servbay.demo
. Anda akan melihat interface chat dan bisa langsung mencoba berkirim pesan secara real-time dari tab atau perangkat berbeda.
Deployment Proyek via ServBay (Mode Produksi)
Untuk produksi, Anda kemungkinan akan menjalankan Node.js menggunakan process manager (mis. PM2, forever) dan mengintegrasikannya dengan reverse proxy ServBay. Berikut hanya dijelaskan bagian pengaturan reverse proxy di ServBay, dengan asumsi aplikasi Node.js Anda sudah berjalan stabil pada port tertentu.
Jalankan Server Node.js untuk Produksi:
Pada produksi, disarankan menggunakan process manager agar aplikasi otomatis restart jika crash dan berjalan di background. Contoh menggunakan PM2:
bash# Jika belum menginstal PM2 # npm install pm2 -g cd /Applications/ServBay/www/servbay-socketio-chat PORT=8586 NODE_ENV=production pm2 start server.js --name servbay-socketio-prod
1
2
3
4
5Ini menjalankan
server.js
lewat PM2 pada port 8586 dan environment production.Konfigurasi Situs Produksi (Reverse Proxy) di ServBay:
Seperti di mode pengembangan, buat situs reverse proxy baru di ServBay yang mengarah ke port Node.js versi produksi.
- Buka panel kontrol ServBay.
- Masuk ke bagian Website.
- Tambah situs baru.
- Isi konfigurasi berikut:
- Nama:
ServBay Socket.io Prod
(atau nama lain) - Domain:
servbay-socketio-prod.servbay.demo
(atau domain.servbay.demo
lain) - Tipe Website: Pilih
Reverse Proxy
- Proxy Destination: Isi
http://127.0.0.1:8586
(port produksi)
- Nama:
- Simpan konfigurasi.
Akses Situs Produksi:
Di browser, akses domain produksi misal
https://servbay-socketio-prod.servbay.demo
.
Manfaat reverse proxy di ServBay sangat besar: Anda bisa dengan mudah mengelola banyak aplikasi Node.js — baik dev maupun produksi — lengkap dengan domain lokal dan sertifikat SSL, tanpa perlu modifikasi file hosts sistem atau konfigurasi web server yang rumit.
Menghubungkan Database yang Disediakan ServBay
ServBay mendukung banyak database populer seperti MySQL, MariaDB, PostgreSQL, MongoDB, dan Redis. Aplikasi Socket.io Anda mungkin memerlukan database untuk menyimpan data user, histori pesan, dll. Berikut contoh kode Node.js untuk menghubungkan ke database yang sudah disediakan ServBay.
Penting: Sebelum menjalankan kode berikut, pastikan Anda telah menginstal dan menjalankan paket database terkait melalui panel kontrol ServBay. Info default koneksi database (seperti port, user, password) tersedia di panel database ServBay atau dokumentasi. Untuk MySQL/MariaDB, password root biasanya Anda tentukan saat instalasi ServBay. Anda juga bisa reset password root via fitur ServBay.
Koneksi ke MongoDB:
Instal Mongoose ODM (atau driver resmi
mongodb
):bashnpm install mongoose
1Tambahkan kode berikut di Node.js Anda (misal di
server.js
atau modul database khusus):javascriptconst mongoose = require('mongoose'); // Default terhubung ke MongoDB lokal (port 27017 default MongoDB) // Nama database 'servbay_socketio_app' hanya contoh mongoose.connect('mongodb://localhost:27017/servbay_socketio_app', { useNewUrlParser: true, useUnifiedTopology: true, // Tambahkan user & password jika perlu autentikasi // user: 'your_mongo_user', // pass: 'your_mongo_password' }) .then(() => console.log('MongoDB terhubung sukses via Mongoose')) .catch(err => console.error('Error koneksi MongoDB:', err)); // Anda sekarang dapat menggunakan mongoose.model() untuk define Schema & Model // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Koneksi ke Redis:
Instal library klien
redis
:bashnpm install redis
1Tambahkan kode berikut:
javascriptconst redis = require('redis'); // Buat objek klien Redis, default ke localhost:6379 const client = redis.createClient({ // Jika Redis membutuhkan password // password: 'your_redis_password', // url: 'redis://localhost:6379' // Bisa juga dengan URL }); client.on('error', (err) => { console.error('Error koneksi Redis:', err); }); client.on('connect', () => { console.log('Klien Redis berhasil terhubung'); }); // Koneksi ke server Redis client.connect(); // Untuk versi v4+ wajib panggil connect() // Sekarang Anda bisa gunakan client untuk operasi Redis // Contoh: await client.set('mykey', 'myvalue'); // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Koneksi ke MariaDB / MySQL:
ServBay mendukung keduanya. Contoh di bawah memakai library
mariadb
(kompatibel MySQL):Instal library klien mariadb:
bashnpm install mariadb
1Tambahkan kode berikut:
javascriptconst mariadb = require('mariadb'); // Buat pool koneksi const pool = mariadb.createPool({ host: 'localhost', port: 3306, // Port default MariaDB/MySQL user: 'root', // User default di ServBay biasanya root password: 'password', // Ganti dengan password root ServBay Anda database: 'servbay_socketio_app', // Nama database contoh connectionLimit: 5 // Ukuran pool koneksi }); // Ambil koneksi dari pool dan test pool.getConnection() .then(conn => { console.log("Berhasil konek ke MariaDB/MySQL"); conn.release(); // Kembalikan koneksi ke pool // Anda kini bisa menjalankan query lewat pool // Contoh: await pool.query("SELECT 1"); // ... }) .catch(err => { console.error("Error koneksi MariaDB/MySQL:", err); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Catatan: Pastikan
password
diganti sesuai password user root database Anda di ServBay. Sebaiknya buat user khusus aplikasi, bukan root.Koneksi ke PostgreSQL:
Instal library klien pg:
bashnpm install pg
1Tambahkan kode berikut:
javascriptconst { Pool } = require('pg'); // Buat pool koneksi const pool = new Pool({ user: 'user', // User default PostgreSQL umumnya 'user' host: 'localhost', database: 'servbay_socketio_app', // Nama database contoh password: 'password', // Password PostgreSQL dari ServBay port: 5432, // Port default PostgreSQL }); // Test koneksi dari pool pool.connect((err, client, done) => { if (err) { console.error('Error koneksi PostgreSQL:', err); return; } console.log('Berhasil konek ke PostgreSQL'); client.release(); // Kembalikan ke pool // Anda kini bisa menjalankan query via pool // Contoh: pool.query('SELECT NOW()', (err, res) => { ... }); // ... });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Catatan: Pastikan
user
danpassword
disesuaikan dengan user dan password PostgreSQL yang Anda atur di ServBay.
Dengan integrasi ke berbagai database di atas, aplikasi Socket.io Anda dapat melakukan penyimpanan data, membangun fitur lanjutan, dan ServBay membuat setup lingkungan Node.js/database di lokal jadi sangat mudah dan efisien.
Hal yang Harus Diperhatikan
- Konflik Port: Pastikan port Node.js Anda (contoh 8585/8586) tidak sedang digunakan aplikasi lain. Jika bentrok, ubah nilai environment variable
PORT
. - Konfigurasi Situs ServBay: Setelah menambahkan konfigurasi reverse proxy di ServBay, pastikan web server (Caddy atau Nginx) sudah restart dan menerapkan konfigurasi baru.
- Proxy WebSocket: Reverse proxy ServBay sudah mendukung WebSocket secara default. Jika ada masalah koneksi WebSocket, periksa log web server ServBay dan pastikan pengaturannya benar.
- Firewall: Pastikan firewall sistem operasi Anda tidak memblok port yang digunakan ServBay (misal 80, 443) atau port Node.js.