SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-27

Docker ile n8n Kurulumu: VPS, Postgres ve HTTPS Rehberi

Docker Compose kullanarak VPS üzerinde n8n kurulumunu yapın. Postgres veritabanı entegrasyonu, HTTPS yapılandırması ve WEBHOOK_URL hatalarını çözmek için gereken tüm adımlar.

Ne inşa ediyorsunuz

n8n bir iş akışı otomasyon aracıdır: bir tetikleyicinin, webhook'un, zamanlanmış görevin veya form gönderiminin; API'leri çağıran, verileri yeniden şekillendiren ve diğer sistemlere yazan bir düğüm zincirini başlattığı görsel bir düzenleyicidir. Herhangi bir servis kodu yazmanıza gerek kalmadan tüm model sağlayıcıları ve veritabanları ile iletişim kurabildiği için, yapay zeka tabanlı iş akışları için varsayılan birleştirici haline gelmiştir. Bir adet docker run, iki dakika içinde çalışan bir düzenleyici sağlar. Bu kılavuz, geri kalan yüzde doksanlık kısma odaklanmaktadır: varsayılan SQLite dosyası yerine Postgres kullanarak sistemi dayanıklı hale getirmek, HTTPS üzerinden erişilebilir kılmak ve neredeyse herkesin yanlış yaptığı kısım olan, webhook'ların dış dünyanın gerçekten ulaşabileceği bir URL sunmasını sağlamak.

Tamamlanmış yığın, tek bir Docker ağı üzerinde iki container'dan oluşur: n8n'in kendisi ve iş akışları ile kimlik bilgilerini tutan bir Postgres veritabanı. Ana makinedeki bir reverse proxy, TLS termination işlemini gerçekleştirir ve trafiği localhost üzerindeki n8n'e iletir; böylece proxy dışında hiçbir şey internete doğrudan açık olmaz. Bu yapı, 2026 self-hosting listesindeki diğer servislerin yanında yer alır.

Ön gereksinimler ve gerçekçi sınırlar

En az 1 GB RAM içeren bir VPS gerekir. İş akışları gerçek iş yükü oluşturmaya başladığında 2 GB RAM planlanmalıdır. Çünkü yürütmeler ile Node.js çalışma zamanı belleği tüketir ve out-of-memory killer işlemin ortasında container'ı sonlandırabilir. Bunu öğrenmenin daha kötü bir yolu yoktur.

Başlangıç için tek bir vCPU yeterlidir. Bu sunucu daha ağır bir hizmet de çalıştıracaksa kaynaklar önce o hizmete göre belirlenmelidir. En yaygın kaynak tüketicisi fotoğraf kitaplığıdır. PhotoPrism ve Immich için gerçek RAM gereksinimleri, n8n'in gerektirdiği kaynakları açıkça aşar. Aynı durum bir medya sunucusu için de geçerlidir. Jellyfin sunucusu ve bunun için kullanılacak, örneğin kitaplığı 90'ların kiralama mağazası biçiminde yeniden oluşturan Halcyon gibi taranabilir bir arayüz, n8n fark etmeden önce RAM'i ve transcoding kapasitesini tüketir.

Bir alan adına veya alt alan adına, örneğin n8n.example.com adresine ihtiyacınız vardır. Sertifika talep etmeden önce, bu alan adının VPS genel IP adresini işaret eden bir A kaydına sahip olması ve çözümleniyor olması gerekir. 80 ve 443 numaralı portlar proxy'ye açık olmalıdır; n8n'in kendi 5678 numaralı portu kesinlikle internete açık olmamalıdır. Docker Engine ve Compose eklentisine ihtiyacınız vardır; eğer docker compose version komutu docker: 'compose' is not a docker command hatası veriyorsa, eski bağımsız ikili dosyayı kullanıyorsunuz demektir; eklenti ise sudo apt install docker-compose-plugin şeklindedir.

Test ortamları için SQLite, güvenilir sistemler için Postgres

n8n'in varsayılan veritabanı /home/node/.n8n/database.sqlite konumundaki bir SQLite dosyasıdır. Sistemi denemek için bu yeterlidir; ancak herhangi bir volume bağlamazsanız, container yeniden oluşturulduğunda verileriniz kaybolur ki bu da kendi başına bir ders niteliğindedir. Postgres'e geçişin temel nedeni ham hız değil, SQLite'ın tek bir yazma kilidi (writer lock) kullanmasıdır. Bu durum, aynı anda birden fazla iş akışı çalıştıran bir örnekte veya ileride ihtiyaç duyacağınız kuyruk (queue) modunda, eşzamanlılık nedeniyle SQLITE_BUSY: database is locked hatasına yol açar. Postgres'te bu tür bir kısıtlama yoktur, pg_dump ile temiz bir şekilde yedeklenebilir ve n8n'in kendi dokümantasyonunda, bağımlı olduğunuz bir sunucu için önerilen standarttır. İleride geçiş yapmak verilerin manuel olarak taşınmasını gerektirir; bu nedenle, eğer bu sunucu sizin için önemliyse, işe doğrudan Postgres ile başlayın.

DNS ve güvenlik duvarı

Sertifika adımının çözümlenemeyen bir alan adı nedeniyle başarısız olmaması için önce DNS kaydını yönlendirin ve portları açın.

dig +short n8n.example.com
curl -s ifconfig.me
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow OpenSSH
sudo ufw enable

5678 numaralı portu açmayın. Compose dosyası n8n'i 127.0.0.1:5678 adresine bağlar; böylece yalnızca sunucunun reverse proxy'si n8n'e erişebilir. Bir ufw allow 5678 bu izolasyonu geçersiz kılacaktır.

Compose dosyası

Bir çalışma dizini oluşturun ve bir docker-compose.yml hazırlayın. Bu, iki servis, bir özel ağ ve iki adlandırılmış volume içeren tam bir yığındır.

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - n8n_net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: docker.n8n.io/n8nio/n8n:2.29.10
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=n8n.example.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.example.com/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Europe/London
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n
    networks:
      - n8n_net
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres_data:
  n8n_data:

networks:
  n8n_net:

Doğrudan belirtilmesi gereken birkaç karar bulunmaktadır. DB_POSTGRESDB_HOST=postgres, Docker'ın paylaşımlı ağ üzerinde çözümlediği servis adıdır; n8n container'ı içinde n8n'in kendisini ifade eden localhost ile karıştırılmamalıdır. condition: service_healthy içeren depends_on, n8n'in açılış sırasında Postgres ile yarışa girmesini engeller; bu ayar olmadan n8n başlar, veritabanını bulamaz ve kapanır. /home/node/.n8n konumundaki n8n_data adlandırılmış volume'ü, şifreleme anahtarını ve SQLite kullanılıyorsa veritabanını tutar; burası kaybetmemeniz gereken tek dizindir. İmajı sabit bir sürüme sabitleyin, asla latest kullanmayın; bunun nedenleri aşağıdaki yükseltme bölümünde açıklanmıştır.

Gizli veriler dosyası

Parolaları asla compose dosyası içerisine yazmayın. Bunları, Compose tarafından otomatik olarak okunan bir .env dosyasına yerleştirin ve rastgele oluşturulduklarından emin olun.

printf 'POSTGRES_PASSWORD=%s\n'  "$(openssl rand -hex 24)" >  .env
printf 'N8N_ENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" >> .env
chmod 600 .env

N8N_ENCRYPTION_KEY, buradaki en önemli dizidir; depolanan her kimlik bilgisinin şifrelendiği anahtardır. n8n'in bir anahtar oluşturmasına izin vermek yerine bunu açıkça belirleyin; çünkü kendi oluşturduğunuz bir değeri not edebilir ve geri yükleyebilirsiniz. n8n ilk kimlik bilgisini bu anahtarla şifrelediğinde, anahtarı değiştirmek tüm kimlik bilgilerinin şifresinin çözülmesini imkansız hale getirir. Bu nedenle anahtarı şimdi bir kez belirleyin ve bu satıra bir daha asla dokunmayın.

Webhook'ların çalışmasını belirleyen ortam değişkenleri

n8n'in kendisini dış dünyaya nasıl tanıttığını dört değişken kontrol eder; bu değişkenlerin yanlış yapılandırılması, n8n destek taleplerinin bir numaralı nedenidir.

  • N8N_HOST, n8n.example.com olan genel ana makine adıdır (public hostname). Bir proxy arkasında varsayılan localhost değerinde bırakırsanız, düzenleyici kendi API'sini tarayıcınızdaki localhost adresinden yüklemeye çalışır ve bu işlem başarısız olur.
  • N8N_PROTOCOL=https, n8n'e TLS üzerinden sunulduğunu bildirir; böylece oturum çerezini Secure olarak işaretler ve https:// URL'leri oluşturur.
  • N8N_PORT=5678, n8n'in container içinde dinlediği porttur. Bu genel port değildir; 443 numaralı port proxy'ye aittir.
  • WEBHOOK_URL=https://n8n.example.com/, en çok sorun çıkaran değişkendir. n8n, Stripe, GitHub veya herhangi bir harici çağrı yapan servise yapıştırdığınız webhook adreslerini bu değerleri kullanarak oluşturur. Eğer bu değişken ayarlanmamışsa veya yanlışsa, n8n varsayılan olarak N8N_HOST:N8N_PORT değerine döner ve size https://n8n.example.com:5678/webhook/... veya daha kötüsü, hiçbir hata vermeden oluşturulmuş, makul görünen ancak internetten erişilemeyen http://localhost:5678/webhook/... adresini verir. Bu durumda çağrı yapan servisin istekleri sessizce kaybolur. Bu değişkeni, sonunda eğik çizgi (trailing slash) olacak şekilde tam genel temel URL'ye ayarlayın ve ardından webhook düğümünün port içermeyen bir URL gösterdiğini doğrulayın.

N8N_PROXY_HOPS=1, n8n'in Express sunucusuna önündeki bir proxy'ye güvenmesini söyler; böylece hız sınırlaması (rate-limiting) ve istemci IP'sini okuyan tüm özellikler, proxy'nin IP'si yerine gerçek adresi görür. Burada özellikle ayarlamanız gerekmeyen tek değişken N8N_RUNNERS_ENABLED'tır: n8n'in Code-node mantığını ayrı bir korumalı süreçte çalıştıran görev yürütücüleri (task runners), 1.69 sürümünden beri varsayılandır ve bu kılavuzun temel aldığı 2.x serisinde zorunludur; bu nedenle eski isteğe bağlı kullanım artık kullanımdan kaldırılmıştır. Eğer bunu şimdi ayarlarsanız, n8n yalnızca kaldırmanızı söyleyen bir uyarı günlüğü oluşturur.

İlk başlatma

docker compose up -d
docker compose ps
docker compose logs -f n8n

Sağlıklı bir ilk başlatma işlemi, üzerinde n8n ready on ..., port 5678 satırı bulunan bir Editor is now accessible via: satırı ile sona erer. docker compose ps, postgres kısmı (healthy) olarak işaretlenmiş şekilde her iki container'ı da Up göstermelidir. Eğer n8n bir Restarting döngüsünde kalıyorsa günlük kayıtlarını inceleyin; bu durum neredeyse her zaman veritabanı bağlantısı veya aşağıda açıklanan birim izinleri ile ilgilidir.

Reverse proxy ile TLS

n8n, 5678 portu üzerinden düz HTTP ile çalışır; HTTPS sonlandırma işlemi ise ön taraftaki bir katmanda yapılır. İki temiz seçenek mevcuttur.

Halihazırda birden fazla container çalıştırıyorsanız, n8n'i otomatik TLS sertifikası oluşturan bir Traefik reverse proxy arkasına alın; birkaç etiket (label) ile Traefik sertifikayı sizin yerinize talep eder ve yeniler.

Sunucuda yalnızca bu uygulama varsa, Let's Encrypt sertifikalı bir nginx sanal ana bilgisayarı (virtual host) daha basittir. Sertifikayı almak için Ubuntu 24.04 üzerinde Certbot ve nginx TLS kurulumu rehberini kullanın ve ardından şu sunucu bloğunu uygulayın:

server {
    listen 443 ssl;
    server_name n8n.example.com;

    ssl_certificate     /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600;
        client_max_body_size 16m;
    }
}

Upgrade ve Connection "upgrade" başlıkları isteğe bağlı değildir. n8n, canlı yürütme güncellemelerini WebSocket üzerinden düzenleyiciye iletir; bu iki satır olmazsa giriş sayfası yüklenir ancak bağlantı koptu uyarısıyla takılı kalır. proxy_read_timeout 3600, uzun süren yürütmelerin nginx'in varsayılan 60 saniyelik süresi sonunda kesilmesini önler. X-Forwarded-Proto $scheme başlığı, N8N_PROXY_HOPS=1 ile birlikte çalışır: proxy, n8n'e düz HTTP üzerinden ulaşsa bile, orijinal isteğin HTTPS olduğunu n8n'e bildirir. Böylece n8n bağlantının güvensiz olduğuna karar verip kendi çerezini reddetmez.

İlk iş akışınız: Gerçek bir uygulama

https://n8n.example.com/ dosyasını açın, sahip hesabını oluşturun (sonraki bölüm) ve yolun çalıştığını kanıtlayan en küçük iş akışını oluşturun: bir webhook girişi, bir HTTP çağrısı ve bir yanıt çıkışı.

  1. Bir Webhook düğümü ekleyin. Yöntemi POST olarak ayarlayın ve hello gibi bir yol belirleyin. Bu düğüm iki URL gösterir: bir Test URL ve bir Production URL. "Webhook'um çalışmıyor" raporlarının yarısının kaynağı budur. Test URL'si yalnızca Listen for test event düğmesine tıkladığınızda tek bir çağrıyı yanıtlar ve ardından süresi dolar. Production URL'si ise iş akışı Active durumdayken her çağrıyı yanıtlar.
  2. Ardından bir HTTP Request düğümü ekleyin ve bunu herkese açık herhangi bir JSON API'sine yönlendirin; https://api.github.com/zen adresine yapılacak bir GET isteği, tek satırlık bir dize döndürür ve bu yeterlidir.
  3. Bir Respond to Webhook düğümü ekleyin ve Webhook düğümünün Respond seçeneğini "Using Respond to Webhook node" olarak ayarlayın; böylece çağrıyı yapan taraf, HTTP düğümünün çıktısını geri alır.
  4. İş akışını Active (sağ üst) konumuna getirin ve çağırın: curl -X POST https://n8n.example.com/webhook/hello. Zen dizesini geri almalısınız; POST girişi, API çağrısı ve yanıt çıkışı, çoğu gerçek otomasyonun temel yapısıdır.

Zamanlanmış bir varyantta, Webhook düğümü yerine bir Schedule Trigger kullanılır ve bunun yerine bir model uç noktası çağrılır; aynı VPS üzerinde çalışan Ollama üzerinden kendi kendine barındırılan bir model kullanmak, gece çalışan bir özetleyici oluşturmak için düzenli bir yoldur.

Temel kimlik doğrulama yerine kullanıcı yönetimi

Eski n8n kılavuzlarında N8N_BASIC_AUTH_ACTIVE=true ayarının yapılması önerilir. Bu değişkenler n8n 1.0 sürümünde kaldırıldı ve artık herhangi bir işlem yapmıyor. Günümüzde kimlik doğrulama owner account üzerinden yapılır: editör ilk kez yüklendiğinde n8n, e-posta ve parola içeren bir owner hesabı oluşturmanızı ister. Bu erişim engeli zorunludur; anonim mod yoktur. İlk açılıştan hemen sonra ve URL’yi başkalarıyla paylaşmadan önce bu hesabı oluşturun: docker compose up ile ilk form gönderimi arasındaki sürede instance, URL’ye ilk ulaşan kişi tarafından sahiplenilebilir. Reverse proxy üzerinde ek bir basic-auth katmanı kullanmak makul bir ek kilittir, ancak bu gerçek kimlik doğrulamanın yerine geçmez; ikinci bir katmandır. Owner hesabı ve bu kılavuzdaki diğer tüm özellikler ücretsiz community edition sürümünde çalışır. İleride ayrıntılı rollere sahip ek kullanıcılar veya SSO kullanmak istiyorsanız planlama yapmadan önce hangi n8n özelliklerinin ücretli lisans gerektirdiğini incelemeniz yararlı olur.

Yedekleme: önce şifreleme anahtarı, sonra veritabanı

Yedeklenmesi gereken iki unsur vardır ve bunların ikame edilebilirlikleri aynı değildir.

N8N_ENCRYPTION_KEY. n8n içinde sakladığınız tüm kimlik bilgileri, API anahtarları, veritabanı parolaları ve OAuth gizli anahtarları, bu anahtar ile disk üzerinde şifrelenmiş halde tutulur. Postgres içindeki iş akışları bu anahtar olmadan işlevsizdir: veritabanını farklı bir anahtara sahip yeni bir sunucuya geri yüklerseniz, n8n hiçbir kimlik bilgisinin şifresini çözemez; bu durumun bir kurtarma veya sıfırlama yolu yoktur. .env dosyanız bu anahtarı barındırır; dosyayı oluşturduğunuz gün sunucu dışına, tercihen bir parola yöneticisine kopyalayın. Asıl önemli olan yedek budur.

Postgres veritabanı; iş akışları, yürütme geçmişi ve şifrelenmiş kimlik bilgilerinin kendisi için gereklidir:

docker compose exec -T postgres pg_dump -U n8n -d n8n \
  | gzip > n8n-db-$(date +%F).sql.gz

Bu komutu bir zamanlayıcı üzerinde çalıştırın ve oluşturulan dökümü sunucudan dışarı kopyalayın. Yeni bir VPS üzerinde geri yükleme yapmak için: stack'i bir kez ayağa kaldırarak veritabanının oluşmasını sağlayın, n8n'i durdurun, dökümü psql ile geri yükleyin, aynı N8N_ENCRYPTION_KEY değerini .env içine yerleştirin ve n8n'i başlatın. Aynı anahtar ve döküm dosyası, çalışan bir örnek oluşturur; yeni bir anahtar ise kimlik bilgilerini kullanamayan iş akışları demektir.

Yükseltmeler: etiketi sabitleme

Compose dosyası, latest yerine kasıtlı olarak n8nio/n8n:2.29.10 etiketini sabitler. n8n neredeyse her hafta yeni bir alt sürüm yayınlar ve sürümler arasında veritabanı şemasını veya düğüm davranışını zaman zaman değiştirir; bu nedenle latest kullanmak, otomatik bir çekme işleminin başlatıldığı anda veritabanınızı güncelleyen bir yapı ile karşılaşmanıza neden olabilir. Bir sürümü sabitleyin, yükseltme yapmadan önce sürüm notlarını okuyun; n8n, bozucu değişiklikleri burada belirtir ve yükseltmeleri bilinçli bir şekilde gerçekleştirin:

docker compose exec -T postgres pg_dump -U n8n -d n8n | gzip > pre-upgrade.sql.gz
# edit the image tag in docker-compose.yml, then:
docker compose pull n8n
docker compose up -d n8n
docker compose logs -f n8n

Bu durum özellikle ana sürüm geçişlerinde önem kazanır. Örneğin 2.0 serisi, varsayılan olarak N8N_BLOCK_ENV_ACCESS_IN_NODE değerini true olarak değiştirmiştir; bu nedenle process.env okuyan herhangi bir Code düğümü, siz ayarı tekrar false değerine getirmediğiniz sürece sessizce erişimini kaybeder. Aynı sürüm, ayar dosyasında katı izinleri zorunlu tutmaya başlamıştır. Bir ana sürüm sınırını geçmeden önce 2.0 bozucu değişiklikler sayfasını okuyun. n8n, gerekli veritabanı geçişlerini başlatma sırasında otomatik olarak gerçekleştirir; yükseltme öncesi pg_dump işleminin isteğe bağlı olmamasının nedeni tam olarak budur. Kimlik bilgileri .env içinde bir anahtarla şifrelenmiş halde tutulduğu ve veriler Postgres üzerinde barındırıldığı için container'lar geçicidir: yükseltme işlemini onları değiştirerek yapar, geri alma işlemini ise önceki etiketi sabitleyip yedeği geri yükleyerek gerçekleştirirsiniz.

Hata modları ve karşılaşacağınız dizgeler

The requested webhook "POST hello" is not registered. İş akışı Active (Etkin) olmayan bir webhook'u çağırdığınızda veya kimse dinlemedeyken test yolunu çağırdığınızda 404 hatası alırsınız. Test yolları (/webhook-test/...) yalnızca "Listen for test event" (Test olayını dinle) butonuna tıkladığınızda yanıt verir; üretim yolları (/webhook/...) ise yalnızca iş akışı anahtarı açık olduğunda yanıt verir. Benzer bir hata olan This webhook is not registered for GET requests. Did you mean to make a POST request?, yöntemin yanlış olduğu anlamına gelir; düğüm POST beklerken siz GET gönderdiniz.

Webhook URL'si bir :5678 veya localhost gösteriyor. Düğüm https://n8n.example.com:5678/webhook/... veya http://localhost:5678/... görüntülüyor. WEBHOOK_URL ayarlanmamış veya yanlış, bu yüzden n8n adresi genel temel adresiniz yerine N8N_HOST:N8N_PORT üzerinden oluşturdu. WEBHOOK_URL=https://n8n.example.com/ değerini ayarlayın, docker compose up -d ile container'ı yeniden oluşturun; port bilgisi kaybolacaktır.

Tarayıcıda There was a problem loading init data. Düzenleyici yüklendi ancak kendi arka uç API'sine erişemiyor. Bir proxy arkasında bu durum neredeyse her zaman yanlış bir N8N_HOST veya WEBHOOK_URL değerinden, proxy'nin WebSocket Upgrade başlıklarını eksik iletmesinden veya N8N_PROTOCOL değerinin bağlantı şeklinizle eşleşmemesinden kaynaklanır. Dışa dönük dört değişkeni doğrulayın ve proxy'nin Upgrade ile Connection trafiğini ilettiğinden emin olun.

Loglarda password authentication failed for user "n8n" ve container yeniden başlatılıyor. n8n'in gönderdiği parola, veritabanının başlatıldığı parola ile eşleşmiyor. Tuzak şudur: Postgres, POSTGRES_PASSWORD değerini yalnızca boş bir veri dizinini ilk kez başlatırken okur. Stack'i bir kez başlatıp ardından .env içindeki POSTGRES_PASSWORD değerini değiştirirseniz, mevcut postgres_data volume'ü eski parolayı tutmaya devam eder. Parolayı orijinal değerine geri döndürün veya saklamanız gereken bir veri yoksa docker compose down komutunu kullanıp postgres volume'ünü docker volume rm ile silin ve sistemi temiz bir şekilde ayağa kaldırın.

Başlangıçta EACCES: permission denied, open '/home/node/.n8n/config'. n8n, node kullanıcısı (UID 1000) olarak çalışır ve yapılandırma dizinine yazamaz. Bu durum, root tarafından sahiplenilen bir ana makine klasörünü (./n8n_data:/home/node/.n8n) bind-mount eden kullanıcıların başına gelir. Yukarıda gösterilen adlandırılmış volume'ü kullanın veya bind-mount kullanmakta ısrarcıysanız, önce sudo chown -R 1000:1000 ./n8n_data komutunu çalıştırın.

Permissions 0644 for n8n settings file /home/node/.n8n/config are too wide. Changing permissions to 0600.. 2.x sürümünden itibaren n8n, varsayılan olarak ayar dosyasında 0600 zorunluluğu getirir ve bunu açılışta kendisi düzeltir. Bu log satırı, sistemin modu zaten düzelttiği anlamına gelir; genellikle bir bind-mount işleminden veya bir geri yükleme sonrası dosyanın gevşek izinlerle kopyalanmasından sonra görülür. Herhangi bir işlem yapmanız gerekmez; N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false değerini yalnızca dosya sisteminiz izinleri desteklemiyorsa ayarlayın.

Mismatching encryption keys, daha uzun olan satır, ayar dosyasındaki /home/node/.n8n/config şifreleme anahtarının ortamınızdaki N8N_ENCRYPTION_KEY ile eşleşmediğini belirtir. Ortamınızdaki anahtar, n8n'in önceki bir çalıştırmada veri volume'üne yazdığı anahtardan farklıdır. Bu durum genellikle değişken ayarlanmamışken n8n'in rastgele bir anahtar oluşturması ve sizin daha sonra farklı bir anahtar ayarlamanızdan kaynaklanır. Orijinal anahtarı .env içine geri koyun veya saklamaya değer hiçbir kimlik bilginiz yoksa, n8n_data volume'ü içindeki config dosyasını silin ve n8n'in onu yeniden oluşturmasına izin verin; mevcut kimlik bilgilerinin okunamaz hale geleceğini unutmayın.

Güvenli çerezlerle ilgili bir giriş uyarısı: Your n8n server is configured to use a secure cookie, however you are either visiting this via an insecure URL, or using Safari. N8N_PROTOCOL=https değerini ayarladınız ancak n8n'e HTTPS proxy yerine doğrudan IP ve port üzerinden, yani düz HTTP ile eriştiniz. Erişimi https://n8n.example.com/ üzerinden sağlayın. Yalnızca HTTPS kullanmanızın kesinlikle mümkün olmadığı durumlarda N8N_SECURE_COOKIE=false değerini ayarlayın; bunu asla internete açık bir sunucuda yapmayın.

Bu iş akışlarının içine bir dil modeli eklemek için bkz: Claude ve n8n ile yapay zeka iş akışları oluşturma.

FAQ

n8n için SQLite mı yoksa Postgres mi kullanmalıyım?

SQLite (varsayılan), n8n'i denemek ve aynı anda tek bir iş akışının çalıştığı kişisel bir örnek için uygundur. Bağımlı olduğunuz her türlü iş için Postgres'e geçin: SQLite'ın tek yazıcı kilidi eşzamanlılık durumunda database is locked hatası verir ve Postgres, pg_dump ile temiz bir şekilde yedeklenebilir. Daha sonra geçiş yapmak manuel bir işlemdir; bu nedenle sunucu önemliyse işe Postgres ile başlayın.

n8n webhook'larım neden hiç tetiklenmiyor?

Neredeyse her zaman WEBHOOK_URL kaynaklıdır. Ayarlanmamış veya yanlış yapılandırılmışsa, n8n N8N_HOST:N8N_PORT üzerinden oluşturulan ve genellikle içinde :5678 veya localhost bulunan, geçerli görünen ancak internetten erişilemeyen webhook adresleri yazdırır; bu nedenle çağrı yapanın istekleri asla ulaşmaz. WEBHOOK_URL=https://n8n.example.com/ değerini ayarlayın ve düğümün port içermeyen bir URL gösterdiğini doğrulayın. İkinci neden, iş akışı Active (Etkin) konuma getirilmemiş bir webhook'u çağırmaktır; bu durum The requested webhook ... is not registered. döndürür.

n8n'de neleri yedeklemeliyim?

İki şey. .env dosyanızdaki N8N_ENCRYPTION_KEY değeri; çünkü depolanan her kimlik bilgisi bununla şifrelenir ve kaybedilmesi durumunda kimlik bilgileri kalıcı olarak şifresi çözülemez hale gelir; bu dosyayı oluşturduğunuz gün sunucudan kopyalayın. Bir de iş akışları, geçmiş ve kimlik bilgileri için Postgres veritabanının bir pg_dump yedeği. Geri yükleme işlemi her ikisini de gerektirir: aynı anahtar ve veritabanı dökümü.

n8n'i HTTPS arkasına nasıl alırım?

n8n, 5678 numaralı portta düz HTTP sunar; önündeki bir reverse proxy TLS sonlandırmasını gerçekleştirir. n8n'i 127.0.0.1:5678 adresine bağlayın, böylece yalnızca proxy ona erişebilir; ardından otomatik sertifikalarla Traefik veya Let's Encrypt sertifikasıyla nginx kullanın. N8N_PROTOCOL=https ve WEBHOOK_URL=https://your-host/ değerlerini ayarlayın ve proxy'nin WebSocket Upgrade başlıklarını ilettiğinden emin olun, aksi takdirde düzenleyici donar.

n8n'i nasıl güvenli bir şekilde yükseltirim?

latest yerine belirli bir imaj etiketi sabitleyin, n8n başlatma sırasında otomatik olarak geçişleri (migrations) çalıştırdığı için önce bir pg_dump alın, köklü değişiklikler için sürüm notlarını okuyun, ardından etiketi güncelleyin ve docker compose pull n8n && docker compose up -d n8n komutunu çalıştırın. Container atılabilir yapıdadır; bu nedenle önceki etiketi sabitleyerek ve yükseltme öncesi dökümü geri yükleyerek geri dönüş yapabilirsiniz.