n8n Arayüzüne Giriş: Node, Workflow ve Temel Kavramlar

İlk kez n8n arayüzünü açtığımda aklımdan geçen ilk şey “bu Zapier’in açık kaynak versiyonu mu acaba?” olmuştu. Birkaç saat sonra fark ettim ki n8n, Zapier’den çok daha fazlasını sunuyor; ama bunu anlamak için önce arayüzün mantığını kavramak gerekiyor. Bugün sıfırdan başlayarak n8n’in temel kavramlarını, workflow yapısını ve node sistemini gerçek örneklerle ele alacağız.

n8n Nedir ve Neden Önemli?

n8n (okunuşu: “n-eight-n”), açık kaynaklı bir workflow otomasyon platformudur. Self-hosted olarak kendi sunucunuzda çalıştırabilir, verilerinizin kontrolünü elinizde tutabilirsiniz. Bu özellik özellikle kurumsal ortamlarda ve KVKK/GDPR uyumluluğu gerektiren projelerde kritik bir avantaj sağlıyor.

Şöyle düşünün: Monitoring sisteminizden gelen bir alert geldiğinde Slack’e mesaj atmak, Jira’da otomatik ticket açmak ve ilgili kişiye e-posta göndermek istiyorsunuz. Bunu bash script ile yapabilirsiniz, evet. Ama iki ay sonra o scripti kim yazdı, neden böyle yazıldı, hata nerede oluşuyor sorularına cevap vermek için saatler harcarsınız. n8n bu problemi görsel bir arayüzle çözüyor.

Kurulum Sonrası İlk Adımlar

n8n’i Docker ile ayağa kaldırdığınızı varsayarak ilerliyoruz. Eğer henüz kurmadıysanız, en basit başlangıç şu şekilde:

docker run -it --rm 
  --name n8n 
  -p 5678:5678 
  -v ~/.n8n:/home/node/.n8n 
  docker.n8n.io/n8nio/n8n

Production ortamı için environment variable’ları da eklemeniz gerekecek:

docker run -d 
  --name n8n 
  -p 5678:5678 
  -e N8N_BASIC_AUTH_ACTIVE=true 
  -e N8N_BASIC_AUTH_USER=admin 
  -e N8N_BASIC_AUTH_PASSWORD=guclu_sifre 
  -e N8N_HOST=n8n.sirketiniz.com 
  -e N8N_PROTOCOL=https 
  -e WEBHOOK_URL=https://n8n.sirketiniz.com/ 
  -v /opt/n8n-data:/home/node/.n8n 
  --restart unless-stopped 
  docker.n8n.io/n8nio/n8n

Tarayıcınızda http://localhost:5678 adresine gittiğinizde sizi n8n’in ana ekranı karşılayacak.

Arayüzün Anatomisi

n8n arayüzü ilk bakışta sade görünür ama içinde çok şey var. Sol panelde workflow listesi, üst menüde temel kontroller ve ortada canvas alanı bulunuyor.

Canvas: İşin Kalbi

Canvas, workflow’larınızı görsel olarak oluşturduğunuz beyaz alan. Burada node’ları sürükleyip bırakıyor, birbirine bağlıyor ve veri akışını takip ediyorsunuz. Canvas üzerinde şu işlemleri yapabilirsiniz:

  • Zoom in/out: Mouse scroll veya sağ alt köşedeki butonlar
  • Pan: Orta mouse tuşuna basılı tutarak sürükleme
  • Node seçme: Tekli tıklama veya alan seçimi için sürükleme
  • Node kopyalama: Seçili node üzerinde Ctrl+C / Ctrl+V
  • Geri al: Ctrl+Z ile son işlemi geri alabilirsiniz

Canvas’ın sağ üst köşesinde minimap var, büyük workflow’larda nerede olduğunuzu görmenizi sağlıyor. Ben kişisel olarak 20’den fazla node içeren workflow’larda minimapı çok kullanıyorum.

Sol Sidebar: Workflow Yönetimi

Sol taraftaki panel workflow’larınızı listeler. Workflows sekmesinde tüm iş akışlarınızı görür, klasörler oluşturabilir ve arama yapabilirsiniz. Credentials sekmesi ise bağlantı bilgilerini yönettiğiniz yer; API key’ler, kullanıcı adı/şifre kombinasyonları hep burada şifreli olarak saklanıyor.

Node Kavramı: Her Şeyin Başladığı Yer

n8n’de her şey node etrafında dönüyor. Node, bir iş akışındaki tekil bir adımı temsil ediyor. “Slack’e mesaj gönder”, “HTTP isteği yap”, “Veriyi filtrele” gibi her eylem ayrı bir node.

Node’ları üç ana kategoride düşünebilirsiniz:

  • Trigger Node’lar: Workflow’u başlatan node’lar. Webhook geldiğinde, belli bir saatte, yeni bir e-posta geldiğinde gibi olayları dinlerler.
  • Regular Node’lar: Veri işleyen, dönüştüren veya bir servise istek atan node’lar.
  • Core Node’lar: IF/Else, Loop, Merge, Set gibi mantıksal işlemler yapan node’lar.

Bir node’a çift tıkladığınızda konfigürasyon paneli açılır. Bu panel node’dan node’a değişir ama genel yapı aynıdır: parametreler, bağlantılar ve output.

Workflow Oluşturma: Adım Adım

Yeni bir workflow oluşturmak için sol üstteki “New Workflow” butonuna tıklayın ya da klavyeden Ctrl+Alt+N kombinasyonunu kullanın. Boş bir canvas açılacak.

Canvas üzerinde herhangi bir yere tıkladığınızda veya “+” butonuna bastığınızda node ekleme paneli açılır. Buradan search yaparak istediğiniz node’u bulabilirsiniz.

İlk Workflow: HTTP İsteği ve Slack Bildirimi

Basit bir senaryo ile başlayalım. Her sabah 09:00’da bir API’dan sunucu durumunu çekip Slack’e rapor gönderelim.

1. Adım: Schedule Trigger ekle

Node ekleme panelinden “Schedule Trigger” aratın ve ekleyin. Konfigürasyonunda:

  • Trigger interval: “Cron”
  • Cron expression: 0 9 1-5 (Hafta içi her sabah 09:00)

2. Adım: HTTP Request node ekle

Schedule Trigger’ın sağına “HTTP Request” node ekleyin ve aralarında bağlantı kurun (ilk node’un çıkış noktasından ikinci node’un giriş noktasına sürükleyin).

# n8n dışında test etmek isterseniz curl ile:
curl -X GET "https://api.sunucuizleme.com/status" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json"

HTTP Request node konfigürasyonu:

  • Method: GET
  • URL: https://api.sunucuizleme.com/status
  • Authentication: Header Auth
  • Header Name: Authorization
  • Header Value: Bearer {{$env.SUNUCU_API_TOKEN}}

3. Adım: Slack node ekle

HTTP Request’ten gelen veriyi Slack’e göndereceğiz.

  • Resource: Message
  • Operation: Post
  • Channel: #monitoring
  • Text: Günlük Sunucu Raporu: {{$json.status}} - Toplam Sunucu: {{$json.total}} - Sorunlu: {{$json.unhealthy}}

Bu expression syntax’ı n8n’in en güçlü özelliklerinden biri; birazdan detaylandıracağız.

Expression Sistemi: Dinamik Veriler

n8n’de {{ }} içine yazdığınız her şey JavaScript expression olarak değerlendiriliyor. Bu sayede bir önceki node’un çıktısını, environment variable’ları veya sistem bilgilerini kullanabiliyorsunuz.

Sık kullandığım expression’lar:

  • {{$json.fieldName}}: Mevcut node’un JSON çıktısından alan okuma
  • {{$node["NodeAdi"].json.fieldName}}: Belirli bir node’un çıktısından okuma
  • {{$env.DEGISKEN_ADI}}: Environment variable okuma
  • {{$now.toISO()}}: Şu anki zaman
  • {{$workflow.id}}: Mevcut workflow’un ID’si

Örneğin bir e-posta adresi format kontrolü yapmak istiyorsanız:

# Expression içinde JavaScript kullanımı örneği
# n8n expression editöründe şunu yazabilirsiniz:
# {{$json.email.includes('@') ? 'Geçerli' : 'Geçersiz'}}

Daha karmaşık bir örnek, bir array içindeki verileri filtrelemek için:

# Sunucu listesinden sadece "down" olanları almak için
# Filter node yerine Set node'da expression kullanımı:
# {{$json.servers.filter(s => s.status === 'down').map(s => s.name).join(', ')}}

Credential Yönetimi: Güvenli Bağlantılar

n8n’in en iyi özelliklerinden biri credential yönetimi. API key’leri, OAuth token’ları, database şifrelerini bir kez tanımlıyorsunuz, sonra tüm workflow’larda kullanabiliyorsunuz. Ayrıca bu bilgiler şifreli olarak saklanıyor.

Credential eklemek için:

# n8n CLI ile credential eklemek mümkün ama genellikle UI daha pratik
# Environment variable olarak da geçebilirsiniz:
export N8N_ENCRYPTION_KEY="cok_uzun_ve_rastgele_bir_string"

UI üzerinden: Sol sidebar > Credentials > Add Credential

Bir credential’ı birden fazla workflow’da kullanabilirsiniz. Bir API key değiştiğinde tek bir yerden güncellemek yeterli; her workflow’u tek tek düzenlemenize gerek yok. Bu özellik production’da büyük vakit kurtarıyor.

IF Node: Koşullu Akışlar

Gerçek dünya senaryolarında veri her zaman temiz ve tek tip gelmiyor. IF node ile farklı koşullara göre farklı dallar oluşturabilirsiniz.

Senaryo: Bir monitoring API’dan sunucu durumu çekiyorsunuz. Durum “critical” ise hem Slack’e mesaj at hem PagerDuty’ye alert gönder, “warning” ise sadece Slack’e yaz, “ok” ise hiçbir şey yapma.

IF node konfigürasyonu:

  • Value 1: {{$json.severity}}
  • Operation: Equal
  • Value 2: critical

IF node’un “true” çıkışından Slack ve PagerDuty node’larına bağlanırsınız, “false” çıkışından başka bir IF node’a giderek “warning” kontrolü yaparsınız.

# Benzer bir mantığı bash'ta şöyle yazardınız:
#!/bin/bash
STATUS=$(curl -s https://api.monitoring.com/status | jq -r '.severity')

if [ "$STATUS" = "critical" ]; then
    curl -X POST https://hooks.slack.com/... -d '{"text":"CRITICAL ALERT"}'
    curl -X POST https://api.pagerduty.com/... -d '{"incident":{"title":"Critical"}}'
elif [ "$STATUS" = "warning" ]; then
    curl -X POST https://hooks.slack.com/... -d '{"text":"Warning"}'
fi

n8n ile aynı mantığı görsel olarak kuruyorsunuz ve debugging çok daha kolay hale geliyor.

Loop Node: Tekrarlayan İşlemler

Bir array içindeki her eleman için aynı işlemi yapmak istediğinizde “Loop Over Items” node’unu kullanıyorsunuz.

Senaryo: 50 sunucunuzun her biri için ayrı ayrı disk kullanımını Elasticsearch’e kaydetmek istiyorsunuz.

# Önce sunucu listesini çekiyorsunuz (HTTP Request veya Database node ile)
# Sonra Loop Over Items ile her sunucu için:

# Her iterasyonda mevcut item:
# {{$json.hostname}} -> "web-01.sirket.com"
# {{$json.ip}} -> "10.0.1.15"

# Loop içindeki SSH Execute node:
# Host: {{$json.ip}}
# Command: df -h / | tail -1 | awk '{print $5}'

Loop node’u kullanırken dikkat etmeniz gereken bir şey var: büyük listelerde performans sorunları yaşanabilir. 1000’den fazla item’ı tek seferde loop etmek yerine batch işlem yapmanızı öneririm.

Error Handling: Hataları Yönetmek

Production’da kullandığınız bir workflow hata verdiğinde ne olmasını istiyorsunuz? n8n’de iki yaklaşım var.

1. Node Bazlı Error Handling: Her node’un sağ üst köşesindeki üç nokta menüsünden “Settings” açın. Burada “On Error” seçeneğini “Continue” olarak ayarlarsanız hata olsa bile workflow devam eder.

2. Error Workflow: n8n’de özel bir “Error Workflow” tanımlayabilirsiniz. Herhangi bir workflow’da hata oluştuğunda bu özel workflow tetiklenir.

# Error workflow için örnek Slack bildirimi:
# Error Trigger node çıktısı şunları içerir:
# {{$json.workflow.name}} -> Hangi workflow hata verdi
# {{$json.execution.id}} -> Execution ID (log takibi için)
# {{$json.error.message}} -> Hata mesajı
# {{$json.error.stack}} -> Stack trace

# Örnek mesaj:
# "Workflow HATA: {{$json.workflow.name}} | Execution: {{$json.execution.id}} | Hata: {{$json.error.message}}"

Error workflow’u tanımlamak için: Settings > n8n Settings > Error Workflow kısmından oluşturduğunuz error workflow’u seçin.

Webhook Node: Dış Sistemlerden Tetiklemek

Webhook node, n8n’i dış sistemlerin tetikleyebileceği bir API endpoint’e dönüştürüyor. Bu özellikle CI/CD pipeline entegrasyonlarında çok işe yarıyor.

# Webhook URL'i n8n'den alırsınız, şuna benzer:
# https://n8n.sirketiniz.com/webhook/abc123def456

# Gitlab CI'dan trigger örneği:
curl -X POST https://n8n.sirketiniz.com/webhook/abc123def456 
  -H "Content-Type: application/json" 
  -d '{
    "project": "backend-api",
    "branch": "main",
    "commit": "a1b2c3d4",
    "deployer": "ahmet.yilmaz",
    "environment": "production"
  }'

Bu webhook’a gelen veriyi $json üzerinden okuyabilirsiniz. Örneğin deployment bildirimi workflow’unda:

# Slack mesaj metni:
# "Deployment: {{$json.project}} projesinin {{$json.branch}} branchi 
# {{$json.environment}} ortamına {{$json.deployer}} tarafından deploy edildi.
# Commit: {{$json.commit}}"

Execution History: Debugging’in En İyi Dostu

n8n her workflow çalıştırmasını kaydediyor. Sol sidebar’dan Executions’a gittiğinizde tüm geçmiş çalışmaları görüyorsunuz: başarılı, başarısız veya çalışmaya devam edenler.

Bir execution’a tıkladığınızda o çalışmaya ait canvas açılıyor ve her node’un tam o anda ne aldığı ve ne ürettiğini görebiliyorsunuz. Bu özellik production’da bir şeyin neden çalışmadığını anlamak için inanılmaz değerli.

# n8n CLI ile execution geçmişine bakmak da mümkün:
# (n8n'i CLI ile çalıştırıyorsanız)
n8n execute --id workflow_id

# Veya API üzerinden:
curl -X GET "https://n8n.sirketiniz.com/api/v1/executions" 
  -H "X-N8N-API-KEY: api_key_buraya" 
  -H "Accept: application/json"

Execution history ne kadar süre tutulacağı konusunda bir ayar var. Varsayılan değeri production’da değiştirmenizi öneririm, aksi halde disk dolabilir:

# docker-compose.yml veya environment variable olarak:
EXECUTIONS_DATA_MAX_AGE=168  # 7 gün (saat cinsinden)
EXECUTIONS_DATA_PRUNE=true   # Otomatik temizleme aktif

Gerçek Dünya Senaryosu: Sunucu Provisioning Bildirimi

Şimdi daha gerçekçi bir senaryo kurgulayalım. Terraform ile yeni bir sunucu ayağa kalktığında:

  1. Terraform’dan webhook gelir
  2. IP adresi ve hostname CMDB’ye yazılır
  3. Ansible inventory dosyası güncellenir
  4. Monitoring sistemine sunucu eklenir
  5. DevOps kanalına bildirim gider

Bu workflow’u n8n’de oluşturduğunuzda her adım ayrı bir node olur. Herhangi bir adım başarısız olduğunda tam olarak nerede durduğunu görürsünüz. Hata düzeltildikten sonra o execution’ı “retry” edebilirsiniz; baştan başlamanıza gerek yok.

# Terraform null_resource ile webhook trigger:
resource "null_resource" "notify_n8n" {
  depends_on = [aws_instance.web_server]

  provisioner "local-exec" {
    command = <<-EOT
      curl -X POST ${var.n8n_webhook_url} 
        -H "Content-Type: application/json" 
        -d '{
          "hostname": "${aws_instance.web_server.tags.Name}",
          "ip": "${aws_instance.web_server.private_ip}",
          "instance_type": "${aws_instance.web_server.instance_type}",
          "region": "${var.aws_region}",
          "environment": "${var.environment}"
        }'
    EOT
  }
}

Sonuç

n8n’in arayüzünü kavramak ilk başta biraz zaman alıyor ama temel mantığı oturduktan sonra workflow oluşturmak gerçekten hızlanıyor. Canvas üzerinde görsel olarak çalışmak, özellikle karmaşık conditional logic içeren süreçlerde bash script’lerden çok daha anlaşılır bir yapı sunuyor.

En önemli önerilerim:

  • Küçük başlayın: İlk workflow’unuz çok basit olsun, birkaç node’dan oluşsun
  • Error handling’i ihmal etmeyin: Production’dan önce error workflow tanımlayın
  • Credential’ları merkezi yönetin: Her workflow’a ayrı ayrı credential girmek yerine merkezi tanımlayın
  • Execution history’yi inceleyin: Bir şey çalışmıyorsa önce execution history’ye bakın
  • İsimlendirmeye dikkat edin: Node’lara ve workflow’lara anlamlı isimler verin, üç ay sonraki halinize hediye olur

Sonraki yazıda n8n’in daha gelişmiş özelliklerine bakacağız: sub-workflow’lar, custom code node ve harici servislerle entegrasyon. O zamana kadar yukarıdaki basit örneklerle denemeler yapmanızı tavsiye ederim. Arayüzü en iyi öğrenme yöntemi kullanmak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir