Docker ile WhatsApp Toplu Mesaj Sistemi Kurulumu

≈ 9 dk okuma

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ÖneriNeden
VPS (Linux)2 GB RAM, 1–2 vCPU, 10–20 GB diskWorker headless Chromium çalıştırır; 1 GB yetersizdir
Docker + ComposeDocker Engine 24+ ve compose eklentisiTüm servisler konteyner olarak ayağa kalkar
Supabase projesiÜcretsiz katmanKalıcı kayıtları (mesaj/oturum) tutar
TelefonWhatsApp yüklü, aktif hatQR 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.

KonteynerGö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.

  1. Telefonunuzda WhatsApp > Ayarlar > Bağlı Cihazlar yolunu açın.
  2. Cihaz Bağla'ya dokunun ve paneldeki QR kodu okutun.
  3. Oturum, LocalAuth ile 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.com ve panel.dispatch-wa.com).
  • Servisleri ortak bir dokploy-network ağı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

BelirtiOlası nedenÇözüm
Worker sürekli yeniden başlıyorChromium için yetersiz RAMEn az 2 GB RAM'e çıkın; swap ekleyin
Mesajlar yanlış saatte gidiyorTZ ayarlanmamış (UTC).env'e TZ=Europe/Istanbul ekleyip yeniden başlatın
QR görünmüyor / boşWorker henüz hazır değildocker compose logs -f whatsapp-worker ile bekleyin
Kuyruk boşalmıyorYanlış REDIS_PASSWORDserver ve worker aynı parolayı kullanmalı; .env'i eşitleyin
Oturum her açılışta düşüyorLocalAuth volume kalıcı değilCompose'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.

Panele Git →