# Setup Bot WhatsApp di Ubuntu VPS - Step by Step ## 1. Update Sistem & Install Dependencies ```bash # Update package list dan upgrade sistem apt update && apt upgrade -y # Install curl, wget, dan tools penting lainnya apt install -y curl wget git unzip software-properties-common build-essential # Install Node.js versi terbaru (LTS) curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - apt install -y nodejs # Verifikasi instalasi node --version npm --version ``` ## 2. Buat User Non-Root (Recommended untuk Security) ```bash # Buat user baru adduser botuser # Tambahkan ke grup sudo usermod -aG sudo botuser # Switch ke user baru su - botuser ``` ## 3. Setup Project Bot WhatsApp ```bash # Buat direktori project mkdir ~/whatsapp-bot cd ~/whatsapp-bot # Inisialisasi npm project npm init -y # Install dependencies npm install @whiskeysockets/baileys qrcode-terminal # Buat struktur folder mkdir session mkdir logs ``` ## 4. Buat File Bot Buat file `bot.js`: ```bash nano bot.js ``` Copy paste kode berikut: ```javascript const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('@whiskeysockets/baileys') const fs = require('fs') // Fungsi untuk log dengan timestamp function log(message) { const timestamp = new Date().toISOString() const logMessage = `[${timestamp}] ${message}` console.log(logMessage) // Simpan ke file log fs.appendFileSync('./logs/bot.log', logMessage + '\n') } async function startBot() { try { // Setup authentikasi const { state, saveCreds } = await useMultiFileAuthState('./session') // Buat koneksi WhatsApp const sock = makeWASocket({ auth: state, printQRInTerminal: true, browser: ['Bot WhatsApp', 'Chrome', '1.0.0'] }) // Event ketika koneksi berubah sock.ev.on('connection.update', async (update) => { const { connection, lastDisconnect, qr } = update if (qr) { log('šŸ“± QR Code generated! Scan dengan WhatsApp Anda.') } if (connection === 'close') { const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut log(`āŒ Koneksi terputus: ${lastDisconnect?.error?.output?.statusCode}`) if (shouldReconnect) { log('šŸ”„ Mencoba reconnect dalam 5 detik...') setTimeout(() => startBot(), 5000) } else { log('šŸ” Bot logout. Perlu scan QR lagi.') } } else if (connection === 'open') { log('āœ… Bot WhatsApp berhasil terhubung!') // Kirim pesan ke diri sendiri sebagai test const myNumber = sock.user?.id if (myNumber) { await sock.sendMessage(myNumber, { text: 'šŸ¤– Bot WhatsApp berhasil online!\n\nBot siap menerima pesan.' }) } } }) // Simpan kredensial ketika berubah sock.ev.on('creds.update', saveCreds) // Event ketika ada pesan masuk sock.ev.on('messages.upsert', async (messageUpdate) => { try { const messages = messageUpdate.messages for (const message of messages) { // Skip pesan dari bot sendiri if (message.key.fromMe) continue // Skip status updates if (message.key.remoteJid === 'status@broadcast') continue // Ambil informasi pesan const text = message.message?.conversation || message.message?.extendedTextMessage?.text || '' if (!text) continue const sender = message.key.remoteJid const senderName = message.pushName || 'Unknown' const isGroup = sender.endsWith('@g.us') log(`šŸ“© Pesan ${isGroup ? 'grup' : 'pribadi'} dari ${senderName}: ${text}`) // Handle pesan await handleMessage(sock, sender, text.toLowerCase().trim(), senderName, isGroup) } } catch (error) { log(`āŒ Error processing messages: ${error.message}`) } }) return sock } catch (error) { log(`āŒ Error starting bot: ${error.message}`) log('šŸ”„ Restart bot dalam 10 detik...') setTimeout(() => startBot(), 10000) } } // Fungsi untuk menangani pesan async function handleMessage(sock, sender, message, senderName, isGroup) { try { let response = '' // Perintah bot switch (message) { case '/start': case '/help': response = `šŸ¤– *Bot WhatsApp Server*\n\n` + `Halo ${senderName}! Bot berjalan di Ubuntu VPS.\n\n` + `*Perintah tersedia:*\n` + `šŸ†˜ /help - Menu bantuan\n` + `ā° /time - Waktu server\n` + `šŸ“Š /status - Status server\n` + `šŸŽ² /random - Angka random\n` + `šŸ“ /ping - Test koneksi\n` + `ā„¹ļø /info - Info bot` break case '/time': const now = new Date().toLocaleString('id-ID', { timeZone: 'Asia/Jakarta', dateStyle: 'full', timeStyle: 'medium' }) response = `ā° *Waktu Server*\n${now}\n\nšŸ“ Timezone: Asia/Jakarta (WIB)` break case '/status': const uptime = process.uptime() const uptimeFormatted = Math.floor(uptime / 3600) + 'h ' + Math.floor((uptime % 3600) / 60) + 'm ' + Math.floor(uptime % 60) + 's' const memUsage = process.memoryUsage() const memUsed = Math.round(memUsage.heapUsed / 1024 / 1024) response = `šŸ“Š *Status Server*\n\n` + `🟢 Status: Online\n` + `ā±ļø Uptime: ${uptimeFormatted}\n` + `šŸ’¾ Memory: ${memUsed} MB\n` + `šŸ–„ļø OS: Ubuntu 24.04 LTS\n` + `⚔ Node.js: ${process.version}` break case '/ping': const startTime = Date.now() response = `šŸ“ *Pong!*\n\n⚔ Latency: ${Date.now() - startTime}ms\n🟢 Bot responsive` break case '/random': const randomNum = Math.floor(Math.random() * 100) + 1 response = `šŸŽ² *Random Number*\n\nAngka untuk ${senderName}: *${randomNum}*` break case '/info': response = `ā„¹ļø *Bot Information*\n\n` + `šŸ¤– Bot WhatsApp Server\n` + `šŸ–„ļø Platform: Ubuntu VPS\n` + `šŸ“” API: Baileys WhatsApp\n` + `⚔ Runtime: Node.js\n` + `šŸ”§ Status: Production Ready\n` + `šŸ“… Started: ${new Date().toLocaleDateString('id-ID')}` break default: // Auto-reply untuk pesan umum if (message.includes('halo') || message.includes('hai') || message.includes('hello')) { response = `šŸ‘‹ Halo ${senderName}!\n\nBot berjalan dari Ubuntu VPS. Ketik /help untuk melihat perintah tersedia.` } else if (message.includes('bot')) { response = `šŸ¤– Ya, saya bot WhatsApp yang berjalan di server Ubuntu!\n\nKetik /help untuk menu lengkap.` } else if (message.includes('terima kasih') || message.includes('thanks')) { response = `šŸ™ Sama-sama ${senderName}! Senang bisa membantu.` } else { // Respon default dengan rate limiting if (!isGroup) { // Hanya reply di chat pribadi response = `šŸ“ Pesan diterima: "${message}"\n\n✨ Ketik /help untuk melihat perintah yang tersedia!` } } } // Kirim respon (jika ada) if (response) { // Delay untuk avoid spam detection await new Promise(resolve => setTimeout(resolve, 1000)) await sock.sendMessage(sender, { text: response }) log(`āœ… Respon terkirim ke ${senderName}`) } } catch (error) { log(`āŒ Error handling message: ${error.message}`) // Kirim pesan error ke user try { await sock.sendMessage(sender, { text: 'āš ļø Terjadi error saat memproses pesan. Tim teknis sudah diberitahu.' }) } catch (sendError) { log(`āŒ Error sending error message: ${sendError.message}`) } } } // Graceful shutdown process.on('SIGINT', () => { log('šŸ›‘ Bot dihentikan oleh user (SIGINT)') process.exit(0) }) process.on('SIGTERM', () => { log('šŸ›‘ Bot dihentikan oleh sistem (SIGTERM)') process.exit(0) }) // Handle unhandled errors process.on('uncaughtException', (error) => { log(`šŸ’„ Uncaught Exception: ${error.message}`) log('šŸ”„ Restarting bot...') setTimeout(() => startBot(), 5000) }) process.on('unhandledRejection', (error) => { log(`šŸ’„ Unhandled Rejection: ${error.message}`) }) // Mulai bot log('šŸš€ Starting WhatsApp Bot on Ubuntu VPS...') startBot() ``` Simpan dengan `Ctrl+X`, lalu `Y`, lalu `Enter`. ## 5. Install PM2 untuk Production ```bash # Install PM2 globally sudo npm install -g pm2 # Buat file konfigurasi PM2 nano ecosystem.config.js ``` Isi file `ecosystem.config.js`: ```javascript module.exports = { apps: [{ name: 'whatsapp-bot', script: 'bot.js', instances: 1, autorestart: true, watch: false, max_memory_restart: '500M', error_file: './logs/err.log', out_file: './logs/out.log', log_file: './logs/combined.log', time: true, env: { NODE_ENV: 'production' } }] } ``` ## 6. Menjalankan Bot ```bash # Test jalankan sekali untuk scan QR node bot.js # Setelah berhasil scan QR, hentikan dengan Ctrl+C # Lalu jalankan dengan PM2 pm2 start ecosystem.config.js # Lihat status pm2 status # Lihat logs real-time pm2 logs whatsapp-bot # Auto-start saat server restart pm2 startup pm2 save ``` ## 7. Setup Firewall (Optional tapi Recommended) ```bash # Enable UFW firewall sudo ufw enable # Allow SSH sudo ufw allow ssh # Allow specific ports jika perlu # sudo ufw allow 3000/tcp # Check status sudo ufw status ``` ## 8. Monitoring dan Maintenance ```bash # Restart bot pm2 restart whatsapp-bot # Stop bot pm2 stop whatsapp-bot # Delete bot dari PM2 pm2 delete whatsapp-bot # Monitor resource usage pm2 monit # View logs pm2 logs whatsapp-bot --lines 100 # Rotate logs pm2 install pm2-logrotate ``` ## 9. Backup Session (Penting!) ```bash # Buat backup session tar -czf session-backup.tar.gz session/ # Restore session tar -xzf session-backup.tar.gz ``` ## 10. Troubleshooting ### Jika QR Code tidak muncul: ```bash # Install font untuk QR display sudo apt install fonts-liberation2 # Atau gunakan external QR generator npm install qrcode ``` ### Jika ada masalah permission: ```bash # Fix ownership sudo chown -R botuser:botuser ~/whatsapp-bot # Fix permissions chmod +x bot.js ``` ### Jika bot crash terus: ```bash # Check logs pm2 logs whatsapp-bot # Clear session dan scan ulang rm -rf session/* pm2 restart whatsapp-bot ``` --- ## āœ… Checklist Setup - [ ] Update Ubuntu & install dependencies - [ ] Install Node.js & npm - [ ] Buat project directory - [ ] Copy kode bot - [ ] Install PM2 - [ ] Test run bot & scan QR - [ ] Setup PM2 production - [ ] Enable auto-restart - [ ] Backup session **Bot WhatsApp Anda siap production di Ubuntu VPS! šŸŽ‰**