n8n ile Discord Bildirim Entegrasyonu Nasıl Yapılır
Birkaç aydır n8n kullanıyorum ve şunu söyleyeyim: Discord bildirimleri meselesinde en pratik çözümü bu araçla buldum. Eskiden her küçük alert için ayrı script yazardım, Slack webhook’u için başka bir şey, Discord için başka bir şey. Artık o kaosa gerek yok.
Bu yazıda n8n üzerinden Discord’a bildirim göndermenin tüm yöntemlerini ele alacağız. Basit webhook kullanımından, sunucu metriklerini periyodik olarak Discord kanalına atan iş akışlarına kadar her şeyi adım adım göstereceğim.
Neden n8n + Discord?
Pek çok ekip Discord’u sadece yazışma aracı olarak kullanıyor ama aslında harika bir operasyonel bildirim platformu. Kanal yapısı sayesinde prod-alerts, staging-alerts, deploy-notifications gibi ayrı kanallar oluşturup her şeyi organize tutabilirsiniz. n8n ise bu noktada köprü görevi görüyor: herhangi bir kaynaktan veri al, işle, Discord’a gönder.
Discord webhook’larının kullanımı bedava ve limit oldukça cömert (dakikada 30 istek). n8n’in görsel arayüzü de karmaşık koşul mantığı kurmayı çok kolaylaştırıyor.
Ön Hazırlık
Discord Webhook Oluşturma
Önce Discord tarafında webhook’u ayarlamamız gerekiyor. Bu kısım genellikle atlanıyor ama doğru yapılandırılmazsa sonradan başınız ağrıyabilir.
Discord sunucunuzda bildirim göndermek istediğiniz kanalı seçin. Kanal ayarlarına gidin, “Integrations” sekmesine tıklayın, “Create Webhook” deyin. Webhook’a anlamlı bir isim verin, mesela “n8n-prod-alerts”. İkon seçmek opsiyonel ama ekip ortamında hangi sistemden geldiğini anlamak için faydalı.
Webhook URL’ini kopyalayıp bir yere not edin. Şu formatta olacak:
https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN
Bu URL’i güvende tutun. Herkes bu URL’e istek atabilir, dolayısıyla git repo’larına commit etmekten kaçının.
n8n Kurulumu
n8n’i Docker ile ayağa kaldırmak en temiz yöntem:
docker run -it --rm
--name n8n
-p 5678:5678
-v ~/.n8n:/home/node/.n8n
-e N8N_BASIC_AUTH_ACTIVE=true
-e N8N_BASIC_AUTH_USER=admin
-e N8N_BASIC_AUTH_PASSWORD=guclu_bir_sifre
n8nio/n8n
Production ortamı için daha sağlıklı bir docker-compose kullanın:
version: '3.8'
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${N8N_HOST}/
- GENERIC_TIMEZONE=Europe/Istanbul
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
GENERIC_TIMEZONE=Europe/Istanbul ayarı önemli. Aksi halde cron trigger’larınız UTC’ye göre çalışır ve Türkiye saatinde çalışmasını beklediğiniz iş akışları yanlış zamanda tetiklenebilir.
İlk İş Akışı: Basit Webhook ile Discord Bildirimi
n8n arayüzüne girdiğinizde yeni bir workflow oluşturun. İlk iş akışımız şu işi yapacak: dışarıdan bir HTTP isteği geldiğinde o veriyi alıp Discord’a iletecek.
Node yapısı:
- Webhook (Trigger)
- Discord node (veya HTTP Request node)
Webhook node’unu ekleyin, HTTP Method olarak POST seçin, path olarak /discord-notify yazın. Test için “Listen for Test Event” butonuna basın.
Şimdi ayrı bir terminal açıp test isteği gönderelim:
curl -X POST http://localhost:5678/webhook-test/discord-notify
-H "Content-Type: application/json"
-d '{
"mesaj": "Sunucu yeniden başlatıldı",
"ortam": "production",
"sunucu": "web-01",
"onem": "yuksek"
}'
Webhook node’u bu veriyi yakaladıktan sonra HTTP Request node’u ekleyin. Bu node Discord’a POST atacak:
# HTTP Request node ayarları (Expression olarak girin):
# URL: https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN
# Method: POST
# Body Type: JSON
# Body:
{
"content": "🚨 **{{ $json.onem.toUpperCase() }}** | {{ $json.sunucu }}n{{ $json.mesaj }}nOrtam: `{{ $json.ortam }}`",
"username": "n8n-alerts"
}
Discord Embed Mesajları ile Zengin Bildirimler
Düz content yerine embed kullanmak bildirimleri çok daha okunabilir yapıyor. Özellikle birden fazla metrik içeren raporlarda embed’in farkı çok belirgin:
# HTTP Request node body (JSON mode):
{
"embeds": [
{
"title": "🔴 Kritik Uyarı: {{ $json.sunucu }}",
"description": "{{ $json.mesaj }}",
"color": 15158332,
"fields": [
{
"name": "Ortam",
"value": "{{ $json.ortam }}",
"inline": true
},
{
"name": "Zaman",
"value": "{{ $now.format('DD.MM.YYYY HH:mm:ss') }}",
"inline": true
},
{
"name": "Önem Derecesi",
"value": "{{ $json.onem }}",
"inline": true
}
],
"footer": {
"text": "n8n Monitoring | {{ $json.sunucu }}"
},
"timestamp": "{{ $now.toISOString() }}"
}
]
}
Renk değerleri ondalık sistemde. Yaygın kullandıklarım:
- 15158332: Kırmızı (kritik hatalar)
- 16776960: Sarı (uyarılar)
- 3066993: Yeşil (başarılı işlemler)
- 3447003: Mavi (bilgi mesajları)
- 10181046: Mor (deploy bildirimleri)
Gerçek Dünya Senaryosu 1: Sunucu Disk Kullanımı Monitörü
Bu iş akışı her sabah 09:00’da sunucuların disk kullanımını kontrol edip %80 üzerindekileri Discord’a bildiriyor. Bunu basit bir cron + SSH kombinasyonu ile yapıyoruz.
İş akışı node’ları:
- Schedule Trigger (her gün 09:00)
- Execute Command node (veya SSH node)
- IF node (disk kullanımı > 80 kontrolü)
- HTTP Request node (Discord’a gönder)
Execute Command node’unda şu komutu kullanıyoruz:
df -h --output=target,pcent | grep -v Use | awk '{gsub(/%/,"",$2); if($2+0 > 80) print $1 " " $2}'
Bu komut yalnızca %80 üzerindeki bölümleri döndürür. Çıktı yoksa IF node koşulu false’a düşer ve bildirim gönderilmez. Gereksiz gürültüden kaçınmak için bu kontrol şart.
IF node’unda {{ $json.stdout }} değerinin boş olup olmadığını kontrol edin. Boş değilse Discord bildirimi tetiklenir:
# Discord embed body:
{
"embeds": [
{
"title": "💾 Disk Kullanım Uyarısı",
"description": "Aşağıdaki bölümler %80 limitini aşmış durumda:",
"color": 16776960,
"fields": [
{
"name": "Etkilenen Bölümler",
"value": "```n{{ $json.stdout }}n```",
"inline": false
},
{
"name": "Kontrol Zamanı",
"value": "{{ $now.format('DD.MM.YYYY HH:mm') }}",
"inline": true
}
],
"footer": {
"text": "Otomatik disk kontrolü | n8n"
}
}
]
}
Gerçek Dünya Senaryosu 2: CI/CD Pipeline Bildirimleri
GitLab veya GitHub webhook’larını n8n üzerinden Discord’a yönlendirmek yaygın bir kullanım. Pipeline başarısız olduğunda ekibin anında haberdar olması için kurduğumuz akış şöyle:
GitLab’da proje ayarlarından webhook ekleyin, n8n webhook URL’inizi girin, “Pipeline events” kutucuğunu işaretleyin.
n8n tarafında Webhook node’u dinlemeye başladığında GitLab’dan şuna benzer bir payload gelir. Bunu işlemek için Function node kullanıyoruz:
# Function node - JavaScript ile payload işleme:
const pipeline = $input.first().json;
const durum = pipeline.object_attributes?.status;
const proje = pipeline.project?.name;
const branch = pipeline.object_attributes?.ref;
const kullanici = pipeline.user?.name;
const pipelineUrl = pipeline.object_attributes?.url;
let renk = 3066993; // yeşil
let emoji = "✅";
if (durum === "failed") {
renk = 15158332;
emoji = "❌";
} else if (durum === "running") {
renk = 3447003;
emoji = "🔄";
} else if (durum === "canceled") {
renk = 9807270;
emoji = "⏹️";
}
return [{
json: {
renk,
emoji,
durum,
proje,
branch,
kullanici,
pipelineUrl
}
}];
Ardından HTTP Request node’u ile Discord’a gönderiyoruz:
{
"embeds": [
{
"title": "{{ $json.emoji }} Pipeline {{ $json.durum }} | {{ $json.proje }}",
"color": {{ $json.renk }},
"fields": [
{
"name": "Branch",
"value": "`{{ $json.branch }}`",
"inline": true
},
{
"name": "Tetikleyen",
"value": "{{ $json.kullanici }}",
"inline": true
},
{
"name": "Detaylar",
"value": "[Pipeline'ı Görüntüle]({{ $json.pipelineUrl }})",
"inline": false
}
],
"timestamp": "{{ $now.toISOString() }}"
}
]
}
Gerçek Dünya Senaryosu 3: Uygulama Hata Loglari Özeti
Sabah işe geldiğinizde gece boyunca ne olduğunu hızlıca anlamak için günlük log özeti harika. Bu iş akışı her sabah 08:30’da çalışıp gece loglarını özetle Discord’a atıyor:
# Execute Command node - gece loglarını say:
grep -c "ERROR" /var/log/uygulama/app.log 2>/dev/null | tr -d 'n' && echo "," &&
grep -c "WARN" /var/log/uygulama/app.log 2>/dev/null | tr -d 'n' && echo "," &&
grep "ERROR" /var/log/uygulama/app.log 2>/dev/null | tail -5
Bu çıktıyı Function node ile parse edip anlamlı bir Discord mesajına dönüştürüyorsunuz. Hata sayısı 0 ise bildirim gönderme, belirli bir eşiği geçerse farklı renk kullan, son 5 hatayı da mesajın içine ekle.
Credentials Yönetimi: Webhook URL’ini Güvende Tutmak
n8n’de webhook URL’lerini ve API anahtarlarını düz metin olarak node içine yazmayın. n8n’in Credentials sistemi tam olarak bunun için var.
n8n menüsünden Credentials bölümüne gidin. “Add Credential” tıklayın. “Header Auth” tipini seçin. Name olarak discord-webhook-token yazın, token değerine webhook URL’inizin sonundaki token kısmını girin.
Alternatif olarak n8n ortam değişkenleri ile de yönetebilirsiniz:
# .env dosyanızda:
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/123456/abcdef...
DISCORD_WEBHOOK_PROD=https://discord.com/api/webhooks/789012/ghijkl...
DISCORD_WEBHOOK_STAGING=https://discord.com/api/webhooks/345678/mnopqr...
Farklı ortamlar için farklı webhook URL’leri tutmak çok işlevsel. Production hataları prod-alerts kanalına, staging hataları staging kanalına gitsin.
Hata Durumlarını Yönetmek
n8n iş akışlarında hata yönetimi sık atlanan bir konu. Discord’a mesaj gönderirken rate limit’e takılabilirsiniz, webhook silinmiş olabilir ya da ağ sorunu çıkabilir. Bunlar için Error Trigger node’u kullanın:
Ayrı bir “Error Handler” workflow’u oluşturun. Bu workflow ana iş akışlarınızın hatalarını yakalasın ve email veya farklı bir Discord kanalına bildirsin. Ana workflow ayarlarından “Error Workflow” olarak bu yeni workflow’u seçin.
HTTP Request node’unda retry ayarlarını da açın:
- Retry on Fail: Aktif
- Max Tries: 3
- Wait Between Tries: 5000ms (5 saniye)
Discord’un rate limit dönüşü 429 status code ile gelir ve genellikle birkaç saniye bekleyince kendiliğinden çözülür.
İş Akışını Test Etme ve Debug
n8n’in execution history özelliği debug sürecini çok kolaylaştırıyor. Sol menüden “Executions” bölümüne gidince her çalıştırmanın girdisini ve çıktısını görebilirsiniz.
Bir iş akışını manuel tetiklemek için terminal üzerinden:
# n8n CLI ile workflow çalıştır:
npx n8n execute --id=WORKFLOW_ID
# Veya API üzerinden:
curl -X POST http://localhost:5678/api/v1/workflows/WORKFLOW_ID/execute
-H "X-N8N-API-KEY: your_api_key"
-H "Content-Type: application/json"
Test sırasında gerçek Discord kanalına yazmak istemiyorsanız Discord’da ayrı bir #test-alerts kanalı açıp o webhook’u kullanın. Production’a geçerken sadece webhook URL’ini değiştirmeniz yeterli.
Periyodik Bildirim Şablonu
Takımların çok sevdiği bir format: haftalık özet bildirimi. Her Pazartesi sabahı geçen haftanın önemli metriklerini tek bir embed ile Discord’a atmak:
# Haftalık deploy sayısı, incident sayısı, uptime gibi metrikleri
# farklı kaynaklardan çekip birleştiren Function node:
const deployler = $('Deploy Sayisi Node').first().json.count;
const incidentler = $('Incident Sayisi Node').first().json.count;
const uptime = $('Uptime Node').first().json.percentage;
const haftaBasi = $now.minus({days: 7}).format('DD.MM.YYYY');
const bugun = $now.format('DD.MM.YYYY');
return [{
json: {
title: `📊 Haftalık Operasyon Özeti`,
description: `${haftaBasi} - ${bugun} dönemi`,
deployler,
incidentler,
uptime,
renk: incidentler > 0 ? 16776960 : 3066993
}
}];
Sonuç
n8n ile Discord entegrasyonu, ekip içi görünürlüğü ciddi biçimde artırıyor. Sunucu metriklerinden CI/CD pipeline’larına, log özetlerinden anlık uyarılara kadar geniş bir yelpazede kullanabilirsiniz.
Başlangıç için şu üç iş akışını öncelikli olarak kurun: disk kullanım uyarısı, pipeline bildirimleri ve günlük hata log özeti. Bunlar en yüksek değeri en az çabayla sunuyor.
Dikkat etmeniz gereken pratik noktalar: Discord webhook URL’lerini asla kod içine gömmeden credentials veya ortam değişkeni olarak yönetin, farklı ortamlar için farklı kanallar kullanın, gereksiz bildirim gürültüsünden kaçınmak için IF node’larıyla filtreleyin ve her iş akışına mutlaka Error Trigger ekleyin.
n8n’in görsel yapısı zamanla kalabalıklaşabilir. Workflow’ları mantıksal gruplara ayırın, açıklayıcı node isimleri kullanın ve “Sticky Notes” özelliğiyle kritik kısımlara not düşün. Bir ay sonra o iş akışına baktığınızda ne yaptığını anlayabilmek için bu küçük detaylar büyük fark yaratıyor.
