Docker ile WhatsApp Toplu Mesaj Sistemi Kurulumu
Kendi sunucunuzda çalışan, mesaj başına ücret istemeyen bir WhatsApp toplu mesaj sistemini Docker ile kurmak göründüğünden kolaydır: bir veritabanı şeması çalıştırır, tek bir .env dosyası doldurur ve docker compose up dersiniz. Bu rehber gereksinimlerden QR bağlantısına, Dokploy ile üretime almadan sorun gidermeye kadar tüm adımları sırayla anlatıyor. Sistem QR tabanlıdır (whatsapp-web.js), resmi Business API değildir; yani başvuru, şablon onayı veya konuşma ücreti yoktur.
1. Kurulum öncesi gereksinimler
Kuruluma başlamadan önce elinizde şunların olması gerekir:
| Bileşen | Öneri | Neden |
|---|---|---|
| VPS (Linux) | 2 GB RAM, 1–2 vCPU, 10–20 GB disk | Worker headless Chromium çalıştırır; 1 GB yetersizdir |
| Docker + Compose | Docker Engine 24+ ve compose eklentisi | Tüm servisler konteyner olarak ayağa kalkar |
| Supabase projesi | Ücretsiz katman | Kalıcı kayıtları (mesaj/oturum) tutar |
| Telefon | WhatsApp yüklü, aktif hat | QR ile oturum eşleştirme |
Bu mimarinin nasıl çalıştığını ve neden bir sunucuda barındırmanın avantajlı olduğunu ayrıntılı görmek için self-hosted WhatsApp mesaj sistemi yazısına göz atabilirsiniz.
2. Docker Compose neyi ayağa kaldırıyor?
Tek bir docker compose up komutu dört servisi başlatır. Her biri bilinçli olarak ayrılmıştır; böylece hız sınırı yalnızca tek bir yerde — worker'da — yaşar.
| Konteyner | Görev |
|---|---|
| web (React/nginx) | Panel arayüzü, gönderim oluşturma, QR okutma |
| server (Express :3200) | İstekleri doğrular ve kuyruğa ekler; kendisi mesaj göndermez |
| redis (BullMQ) | İş kuyruğu ve zamanlanmış gönderimler; AOF ile kalıcı |
| whatsapp-worker (Node 20 + Chromium) | Tek gönderim yetkilisi; anti-ban zamanlamasını uygular, concurrency 1 |
Server'ın hiçbir zaman mesaj göndermemesi kritik bir tasarım kararıdır: panele saniyede yüz istek de gelse WhatsApp'a giden trafik insan hızını aşamaz. Worker'ın bağlandığı WhatsApp Web protokolü hakkında daha fazlası için whatsapp-web.js nedir yazısına bakın.
3. Adım 1 — Veritabanı şemasını kurun
Önce ücretsiz bir Supabase projesi oluşturun. Projenin SQL Editor bölümünü açın ve depodaki şema dosyasını yapıştırıp çalıştırın. Bu, notification_messages ve whatsapp_web_sessions tablolarını oluşturur.
# Depoyu sunucuya klonlayın git clone https://github.com/kullanici/whatsapp-oto-message.git cd whatsapp-oto-message # supabase/migrations/001_init.sql içeriğini # Supabase > SQL Editor > New query alanına yapıştırıp Run edin
Ardından Supabase panelinden Project URL ile service_role anahtarını not alın; bir sonraki adımda .env dosyasına gireceksiniz.
4. Adım 2 — .env dosyasını doldurun
Örnek dosyayı kopyalayın ve gizli değerleri güçlü bir şekilde üretin. Rastgele sırlar için openssl kullanmak, tahmin edilebilir parolalardan çok daha güvenlidir.
cp .env.example .env # Güçlü sırlar üretin openssl rand -hex 32 # REDIS_PASSWORD için openssl rand -hex 32 # WA_CONTROL_SECRET için
.env içinde doldurulması gereken temel alanlar:
REDIS_PASSWORD=uretilen_32_baytlik_deger WA_CONTROL_SECRET=uretilen_32_baytlik_deger SUPABASE_URL=https://xxxx.supabase.co SUPABASE_SERVICE_ROLE_KEY=eyJ... TZ=Europe/Istanbul
TZ değerini atlamayın. Anti-ban penceresi (05:00–23:00) yerel saate göre çalışır. TZ=Europe/Istanbul ayarlanmazsa konteyner UTC'de kalır ve gönderimler saatlerce kayabilir. Zamanlama mantığının detayı için zamanlanmış mesaj gönderme yazısına bakın.
5. Adım 3 — Servisleri başlatın
Tüm imajları derleyip konteynerleri arka planda başlatmak için tek komut yeterlidir:
docker compose up -d --build # Servislerin durumunu kontrol edin docker compose ps # Worker loglarını canlı izleyin (QR ve gönderim burada görünür) docker compose logs -f whatsapp-worker
İlk derleme, Chromium bağımlılıkları yüzünden birkaç dakika sürebilir. docker compose ps çıktısında dört servisin de running olması gerekir. Sistemi bir HTTP API üzerinden dış uygulamalara bağlamak isterseniz HTTP API entegrasyonu yazısı gönderim uç noktasını ve kimlik doğrulamayı anlatır.
6. Adım 4 — QR kodu okutun
Konteynerler ayağa kalktıktan sonra tarayıcıdan panele girin ve Bağlantı sayfasını açın. Burada worker'ın ürettiği QR kod görünür.
- Telefonunuzda WhatsApp > Ayarlar > Bağlı Cihazlar yolunu açın.
- Cihaz Bağla'ya dokunun ve paneldeki QR kodu okutun.
- Oturum,
LocalAuthile kalıcı bir volume'da saklanır; konteyner yeniden başlasa bile tekrar QR okutmanız gerekmez.
Bilgisayarınızın açık kalmasına gerek yoktur; sistem sunucuda çalışır. Telefonun ise oturumun canlı kalması için yaklaşık iki haftada bir internete bağlanması yeterlidir.
7. Üretime alma: Dokploy ile
Geliştirme için docker compose up yeterli olsa da, üretimde alan adı, TLS sertifikası ve otomatik yeniden başlatma istersiniz. Dokploy gibi bir self-hosted PaaS paneli, aynı compose dosyasını yönetip bunları kolaylaştırır:
- Site ve panel için ayrı alan adları tanımlayın (ör.
dispatch-wa.comvepanel.dispatch-wa.com). - Servisleri ortak bir
dokploy-networkağına bağlayın. - Let's Encrypt ile otomatik HTTPS alın.
- Redis verisi ve WhatsApp oturumu için kalıcı volume tanımlayın; yeniden dağıtımda oturum kaybolmaz.
Etik ve yasal not: Bu sistemi yalnızca iletişim iznine sahip olduğunuz kişilere bildirim göndermek için kurun. İzinsiz toplu mesaj hem WhatsApp şartlarını hem KVKK (6698) ile ticari elektronik ileti (6563/İYS) düzenlemelerini ihlal eder; her pazarlama mesajında bir opt-out satırı (ör. "İPTAL yazın") bulunmalıdır. Ayrıntı için KVKK'ya uygun toplu mesaj yazısına bakın.
8. Sorun giderme
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Worker sürekli yeniden başlıyor | Chromium için yetersiz RAM | En az 2 GB RAM'e çıkın; swap ekleyin |
| Mesajlar yanlış saatte gidiyor | TZ ayarlanmamış (UTC) | .env'e TZ=Europe/Istanbul ekleyip yeniden başlatın |
| QR görünmüyor / boş | Worker henüz hazır değil | docker compose logs -f whatsapp-worker ile bekleyin |
| Kuyruk boşalmıyor | Yanlış REDIS_PASSWORD | server ve worker aynı parolayı kullanmalı; .env'i eşitleyin |
| Oturum her açılışta düşüyor | LocalAuth volume kalıcı değil | Compose'da worker volume'unu named volume yapın |
Kurduğunuz sistemi ilk kez çalıştırırken küçük bir liste ile test edin; hız tavanı zaten güvenlidir ama yeni numaralarda kademeli başlamak isterseniz numara ısıtma (warm-up) yaklaşımını uygulayın.
Sık sorulan sorular
Kurulum için hangi sunucu yeterli?
Headless Chromium bellek istediği için en az 2 GB RAM'li bir VPS önerilir. 1 GB'lık sunucularda worker Chromium açılırken çökebilir. 1–2 vCPU ve 10–20 GB disk yeterlidir.
Docker Compose ile kaç konteyner ayağa kalkar?
Dört servis: web (React/nginx), server (Express :3200), redis ve whatsapp-worker (Node 20 + Chromium). Kalıcı veriler dışarıdaki ücretsiz Supabase projesinde tutulur.
TZ neden önemli?
Anti-ban penceresi 05:00–23:00 yerel saate göre çalışır. TZ=Europe/Istanbul ayarlanmazsa sunucu UTC'de kalır ve mesajlar beklenmedik saatlerde gönderilir.
Üretimde nasıl yayına alırım?
Aynı compose dosyasını Dokploy gibi bir panelle yönetip ayrı alan adları, TLS ve otomatik yeniden başlatma tanımlayın. QR oturumu ve Redis verisi kalıcı volume'larda tutulur.
Kurulumu tamamlayın, göndermeye başlayın
Şema, .env ve docker compose up — üç adımda kendi sunucunuzda. Panele girip QR okutun.