n8n İş Akışı Kurulumu

n8n, Zapier'ın açık kaynaklı ve kendi sunucunuzda çalışan bir benzeri. Tetik kuruyorsunuz, sonrasında da "şunu yap, sonra bunu yap" diye kutuları art arda dizerek bir iş akışı oluşturuyorsunuz. jekcms'e entegre edildiğinde şöyle işler yapabiliyorsunuz: "bir yazı yayınlandığında otomatik X ve Pinterest'e paylaş", "her Pazartesi sabahı trend anahtar kelimelerden beş taslak üret", "yorum spam ise sil".

Bu sayfa hiç n8n kullanmamış biri için baştan sona kurulumu anlatıyor.

İçeriği otomatikleştirmeden önce: otomatik üretilen veya içe aktarılan içerikler hatalı, tekrarlı ya da düşük değerli bilgiler içerebilir. İncelemeden yayınlamak arama görünürlüğünüzü ve yayıncı güveninizi etkileyebilir. Taslak olarak kaydetme, zamanlanmış yayın ya da doğrudan yayın — seçim size ait. Aşağıdaki "Yayın biçiminizi seçin" bölümüne bakın.

Hazır şablonlar — indir ve içe aktar

Boş bir workflow'la başlamak yerine, uyarlayabileceğiniz üç örnek workflow indirebilirsiniz:

  • Blog İçerik Hattı — 2 saatte bir içerik kuyruğundan görev çeker, Claude ile makale gövdesi + Gemini ile SEO metası üretir, kapak + içerik görselleri oluşturup yükler, ardından jekcms API'sini çağırıp yazıyı oluşturur. 31 node, tamamen bağlı. Geldiği haliyle son node doğrudan yayınlar — önce incelemeden geçirmek isterseniz aşağıdaki "Yayın biçiminizi seçin" bölümüne bakın.
  • Auto Content Generator (Gemini) — daha basit, yalnız Gemini bazlı, hızlı ve ucuz taslak üretim.
  • RSS → AI Dönüşümlü Yazı — bir RSS beslemesinden öğe alır, LLM ile yeniden yazar. Bunu açmadan önce aşağıdaki "Başkasının içeriğini yeniden yazmak" bölümünü okuyun.

Nasıl içe aktarılır: n8n içinde Workflows → Import from file → JSON dosyasını seçin → placeholder node'ları gözden geçirin ({{YOUR_EMAIL}}, your-site.example gibi değerleri göreceksiniz — gerçek değerlerinizle değiştirin) → her AI node'una kendi credential'ınızı bağlayın → kaydedin.

Şablonlar tamamen temizlenmiştir — kişisel URL, e-posta veya credential içermez. Yapmanız gerekenler:

  1. https://your-site.example yerine gerçek jekcms URL'inizi koyun (her HTTP Request node'unda)
  2. Authorization: Bearer <API_TOKEN> başlığı ekleyin — token'ı admin Settings → API Keys altından oluşturun
  3. Kendi AI credential'larınızı bağlayın — Claude / Gemini / Anthropic node'ları şablonda referanslı ama anahtar taşımaz
  4. {{YOUR_EMAIL}} / {{YOUR_NAME}} / {{SITE_NAME}} placeholder'larını gerçek değerlerinizle değiştirin (sticky note'lar ve mesaj şablonlarında)

Oradan özelleştirebilirsiniz — zamanlamayı değiştirin, Slack bildirimi ekleyin, Claude yerine OpenAI koyun.

Yayın biçiminizi seçin

Yukarıdaki her şablon, jekcms API'sini çağıran bir HTTP Request node'uyla biter. Bu node'u nereye yönlendirdiğiniz, üretilen içeriğin başına ne geleceğini belirler:

  • Önce inceleme (yeni bir şablonu veya prompt'u test ederken tavsiye edilen yol). Son node'u, queue:write kapsamı taşıyan bir token ile POST /api/v1/queue/submit uç noktasına yönlendirin. Öğe İçerik Kuyruğu'na bekleyen bir taslak olarak düşer — siz ya da bir editör onaylamadan hiçbir şey yayına girmez.
  • Doğrudan yayın. Son node'u, şablonların geldiği haliyle yaptığı gibi doğrudan yazı oluşturma uç noktasına yönlendirin. Workflow bittiği anda içerik, aradan insan geçmeden yayına girer.

İkisi de API'nin meşru kullanım biçimi — hangisini seçeceğiniz, şablonun çıktısına ne kadar güvendiğinize ve ne kadar editoryal risk almaya razı olduğunuza bağlı. Yaygın bir alışkanlık: yeni bir şablonu ilk birkaç düzine öğe boyunca incelemeden geçirin, çıktının insansız da tutarlı olduğunu gördükten sonra son node'u doğrudan yayına çevirin.

Başkasının içeriğini yeniden yazmak

RSS şablonu, isteyen olduğu için burada duruyor — iyi bir varsayılan olduğu için değil. Başkasının yazdığı bir makaleyi LLM'den geçirip yeniden yayınlamak, yeniden ifade edilmiş olsa bile okuyucu için neredeyse hiç editoryal değer taşımaz; arama motorlarının "ölçekli içerik istismarı" (scaled content abuse) diye tarif ettiği kalıba oldukça yakındır. Kullanacaksanız:

  • Kaynağı açıkça belirtin — orijinaline geri link verin, yayıncıyı kredilendirin
  • Kaynakta olmayan bir şey ekleyin: kendi analiziniz, yerel bağlam, bir görüş, güncellenmiş rakamlar
  • Doğrudan yayın yerine yukarıdaki inceleme kuyruğundan geçirin — yeniden yazılan her parçayı yayına girmeden önce bir insan okumalı
  • Denetime hazırlıklı olun: bir alan adı çoğunlukla yeniden yazılmış RSS içeriğinden oluşuyorsa, hem okuyucuya hem arama motoruna içerik çiftliği gibi görünür

Bu şablonu, başkasının işini katkısız çoğaltmanın bir yolu değil, bir küratörlük iş akışının başlangıç noktası olarak görün.

Başlamadan önce

  • Admin erişimi olan çalışan bir jekcms kurulumu
  • n8n'i barındıracak bir yer — VPS, Raspberry Pi, lokal iş istasyonu, en az 1 GB RAM
  • Docker kurulu olsun, en pratik yol bu (npm ile de olur ama Docker daha az uğraştırır)

Adım 1 — n8n'i yükleyin

Terminal açıp şunu çalıştırın:

docker run -d \
  --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  n8nio/n8n

Sonra tarayıcıda http://sunucu-ip-adresi:5678 adresine gidin. İlk girişte size "sahip hesabı oluşturun" diyor. Güçlü bir parola kullanın — n8n bağladığınız her servisin API anahtarını içinde tutuyor, o panel kötü niyetli birinin eline geçerse tüm hizmetlere erişim elde ediyor.

Canlıda kullanacaksanız n8n'i mutlaka HTTPS reverse proxy (Caddy ya da nginx) arkasına alın ve N8N_BASIC_AUTH_ACTIVE=true ayarını ekleyin. Açık portlu n8n, internete açık bir güvenlik açığıdır.

Adım 2 — jekcms'te API belirteci oluşturun

n8n'in jekcms'e istek atması için kimlik doğrulayacağı bir belirtece ihtiyacı var. jekcms admin'inde:

  1. Settings → API Keys → Create new token
  2. İsmini "n8n" koyun ki ne için kullanıldığı belli olsun.
  3. Kapsamlar: en azından posts:read, posts:write, media:read, media:write. İncelemeden geçirecekseniz queue:write ekleyin, iş akışınız büyüdükçe ihtiyaca göre daha fazlasını ekleyebilirsiniz.
  4. Belirteci kopyalayın — yalnızca bir kez gösteriliyor, sonra göremezsiniz. Kaybolursa yeni oluşturmanız gerek.

Adım 3 — jekcms'i webhook kabul edecek şekilde ayarlayın

Webhook dediğimiz şey, jekcms'in bir olay (örn. yazı yayınlandı) gerçekleştiğinde n8n'e HTTP POST atması. Bunun için jekcms'in n8n URL'sini ve ortak bir gizli anahtarı bilmesi lazım.

  1. Settings → Integrations → n8n
  2. Base URL: https://n8n-sunucunuz (lokal geliştirme için http://localhost:5678)
  3. Webhook secret: Generate butonuna basın. Bu anahtar her dışa giden webhook imzasına dahil edilecek; böylece n8n, gelen isteğin gerçekten sizin jekcms kurulumunuzdan geldiğini doğrulayabilir.
  4. Kaydedin.

Adım 4 — n8n'de webhook oluşturun

n8n arayüzünde:

  1. New workflow → Add first step → Webhook
  2. HTTP metodunu POST yapın.
  3. Path: açıklayıcı bir isim, örn. jekcms-post-published.
  4. Önce Test URL düğmesini açın, ardından Production URL görünecek — onu kopyalayın.

Adım 5 — Webhook URL'sini jekcms'e ekleyin

jekcms admin'ine geri dönün:

  1. Automation → Webhooks → Add webhook
  2. Event: post.published seçin (diğer seçenekler: post.updated, post.deleted, comment.approved, order.completed).
  3. URL: 4. adımdaki n8n webhook URL'sini yapıştırın.
  4. Kaydedin.

Adım 6 — Bağlantıyı test edin

Bir yazıyı taslaktan yayına alın. jekcms webhook'u tetiklemeli, n8n de test çalıştırmasında yeşil onay işareti göstermeli. n8n'e gönderilen veri şu biçimde:

{
    "event": "post.published",
    "timestamp": "2026-04-22T10:15:00Z",
    "signature": "sha256=...",
    "data": {
        "post": { "id": 123, "title": "...", "slug": "...", "excerpt": "...", "url": "..." },
        "author": { "id": 1, "name": "...", "email": "..." },
        "categories": [ "Nutrition" ],
        "tags": [ "protein" ]
    }
}

Bu noktadan sonra n8n'de düğümleri birbirine zincirleyebilirsiniz: X'e paylaşmak için HTTP Request, Pinterest için Pinterest düğümü, sosyal medya metni üretmek için OpenAI düğümü... İmkanlar oldukça geniş.

Adım 7 — İmza doğrulaması (güvenlik)

n8n'in Webhook düğümü ham gövdeyi kabul ediyor, ama gelen isteğin gerçekten jekcms'ten geldiğini doğrulamadı. Hemen ardına bir Function düğümü ekleyin:

const crypto = require('crypto');
const secret = $env.JEKCMS_WEBHOOK_SECRET;  // n8n env değişkenlerinde tanımlayın
const rawBody = JSON.stringify($json);
const computed = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
if (computed !== $json.signature) {
    throw new Error('Invalid signature — possible replay attack');
}
return $json;

Bu blok, jekcms dışından gelen uydurma istekleri reddediyor. n8n webhook URL'niz internete açıksa bu doğrulama olmazsa olmazdır — aksi halde URL'yi öğrenen herkes sahte yazı yayınlanmış gibi tetik atabilir.

İlk iş akışınız — örnek senaryo

Haydi klasik bir iş akışı kurarak işi somutlaştıralım: yazı yayınlanınca X'te paylaş.

  1. Webhook düğümü (yukarıda kurduğunuz, post.published)
  2. Function düğümü (imza doğrulaması)
  3. HTTP Request düğümü:

- Method: POST - URL: X API endpoint - Body: { "text": "Yeni yazı: {{$json.data.post.title}} {{$json.data.post.url}}" } - Auth: X Developer hesabınızdan alınan OAuth token

Kaydedip aktif edin. Bir sonraki yayın anından itibaren yazılarınız otomatik X'e düşmeye başlar.

Yaygın iş akışı fikirleri

Günlük özet e-postası. Tetik: cron (08:00) → jekcms API "son 24 saatteki yazıları getir" → OpenAI "özetle" → Send Email düğümü.

AI üretimli haftalık öneri. Tetik: cron (Pazartesi 09:00) → Google Trends → OpenAI (trendi yazı fikrine çevir) → jekcms API "taslak oluştur" → Slack'e inceleme linkiyle bildirim.

Yorum moderasyonu. Tetik: comment.created → OpenAI sınıflandırma → spam ise /comments/{id}/delete, ok ise /comments/{id}/approve.

Sorun giderme

Webhook tetiklenmiyor. jekcms'te Automation → Webhooks → Logs. Her deneme HTTP yanıt koduyla birlikte oraya yazılıyor. curl: 7 (connection refused) görüyorsanız n8n ayakta değil ya da URL yanlış.

İmza doğrulaması başarısız. n8n env değişkenindeki gizli anahtar ile jekcms Settings → Integrations → n8n altındaki anahtar birebir aynı olmalı. Sondaki bir boşluk bile hash'i bozar, gözle kıyaslayın.

n8n jekcms API'sine ulaşamıyor. n8n Docker'da, jekcms ana makinede çalışıyorsa HTTP Request URL'sinde localhost yerine host.docker.internal kullanın. Docker'ın içinden "localhost" Docker'ın kendisini işaret ediyor, sizin makineniz değil.

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri — ayda birkaç e-posta, spam yok.