n8n, iş akışlarını sürükle bırak bir tuval üzerinde kurduğunuz, gerektiğinde JavaScript veya Python kodu eklediğiniz bir otomasyon platformudur. Bir formdan gelen veriyi CRM'e yazmak, her sabah bir raporu e-postayla göndermek veya bir webhook ile gelen siparişi muhasebe yazılımına aktarmak gibi işleri tek bir yerden yönetirsiniz. Bulut sürümü olduğu gibi kendi sunucunuza da kurabilirsiniz.

Bu rehberde n8n'i Ubuntu 24.04 çalışan bir VPS'e Docker Compose ile kuruyor, PostgreSQL veritabanı bağlıyor, önüne Nginx ve Let's Encrypt sertifikası koyuyoruz. Webhook adreslerinin doğru üretilmesi için gereken ortam değişkenlerini, saat dilimini, yedeklemeyi ve güncellemeyi de adım adım anlatıyoruz. Komutlar n8n'in resmî belgelerine göre hazırlandı.

n8n Kimler İçin, Lisansı Ne Diyor?

n8n Kimler İçin, Lisansı Ne Diyor? Community, Registered Community, Business, Enterprise

n8n; tekrar eden işleri otomatikleştirmek isteyen küçük ekipler, ajanslar, geliştiriciler ve verisini üçüncü taraf bir otomasyon servisine göndermek istemeyen şirketler için uygundur. Resmî belgeler kendi kendine barındırmayı (self-hosting) deneyimli kullanıcılara önerir ve sunucu yönetimi, güvenlik ve kaynak planlaması bilgisi gerektiğini açıkça yazar. Sunucu yönetmek istemiyorsanız n8n Cloud seçeneği vardır.

Lisans konusu önemlidir: n8n kendini fair-code olarak tanımlar ve Sustainable Use License ile dağıtılır. Bu lisans OSI onaylı bir açık kaynak lisansı değildir. Lisans metnine göre yazılımı yalnızca kendi iç iş amaçlarınız için ya da ticari olmayan veya kişisel kullanım için kullanabilir ve değiştirebilirsiniz; başkalarına dağıtmanız ise ancak ücretsiz ve ticari olmayan amaçla mümkündür. Dosya veya klasör adında .ee geçen kurumsal kodlar ayrı bir Enterprise lisansı gerektirir.

Sürüm / planÜcretÖzet (resmî belgeye göre)
CommunityÜcretsizKendi sunucunuzda neredeyse tüm özellikler
Registered CommunityÜcretsizE-posta ile kayıt; klasörler, editörde hata ayıklama gibi ek özellikler
BusinessÜcretliSSO, ortamlar (environments), projeler
EnterpriseÜcretliGelişmiş güvenlik, ölçekleme ve yönetişim

Kurulum Yöntemini Seçmek

n8n belgelerinde şu an üç Docker tabanlı yol var. One-line setup (curl -fsSL https://get.n8n.io | sh) yeni kurulumlar için en hızlı yoldur ve n8n Assistant için gereken sandbox servislerini de kurar. Belgeye göre n8n 3.0 ile birlikte npm kurulumu bırakılıyor ve dağıtım yalnızca Docker üzerinden yapılacak. Install using Docker Compose sayfası aynı yığını elle kurar ve en az 4 GB RAM ile 2 vCPU ister; çünkü kod çalıştıran sandbox konteyneri Docker içinde Docker kullanır. Üçüncü yol olan Use Docker Compose sayfası ise tek bir n8n konteynerini Traefik ters vekil sunucusuyla birlikte kurar.

Bu rehberde üçüncü yolun yapısını temel alıyoruz, ancak Traefik yerine sunucularda yaygın olan Nginx'i kullanıyoruz ve belgede üretim için önerilen PostgreSQL'i ekliyoruz. n8n Assistant'a ihtiyacınız varsa resmî n8n Docs: Install using Docker Compose sayfasındaki yığını kurun; aşağıdaki Nginx ve yedekleme adımları orada da geçerlidir.

BileşenGöreviDışarı açık mı?
n8n konteyneriEditör, API ve webhook'lar (iç port 5678)Hayır, yalnızca 127.0.0.1
PostgreSQL 18İş akışları, çalıştırma geçmişi, kullanıcılarHayır, yalnızca Docker ağı
NginxTLS sonlandırma ve ters vekilEvet, 80 ve 443
n8n_data birimiŞifreleme anahtarı ve ayar dosyasıHayır

1. Sunucuyu ve DNS'i Hazırlayın

Önce sunucuyu güncelleyin, güvenlik duvarında yalnızca SSH ve web portlarını açın. UFW rehberimiz temel kuralları anlatır. Ardından alan adınızın DNS panelinde n8n gibi bir alt alan adı için sunucu IP adresinize bir A kaydı oluşturun.

bash
sudo apt update && sudo apt upgrade -y
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

2. Docker Engine ve Compose Eklentisini Kurun

Docker'ı Ubuntu deposundaki eski paketlerle değil, Docker Docs: Install Docker Engine on Ubuntu sayfasındaki resmî apt deposundan kurun:

bash
# Docker'ın resmî apt deposunu ekleyin
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Kontrol
docker --version
docker compose version

Docker Compose kavramlarına yabancıysanız önce Docker Compose rehberimize göz atabilirsiniz.

3. .env ve compose.yaml Dosyalarını Oluşturun

3. .env ve compose.yaml Dosyalarını Oluşturun: N8N_HOST, N8N_PROTOCOL, N8N_PORT, N8N_WEBHOOK_URL

Proje klasörünü oluşturun ve n8n'in dosya okuma ve yazma düğümleri için paylaşılan local-files klasörünü elle açın. Resmî belge bu klasörü elle oluşturmanın doğru sahiplik ve izinleri sağladığını belirtir.

bash
sudo mkdir -p /opt/n8n && sudo chown $USER: /opt/n8n
cd /opt/n8n
mkdir local-files
openssl rand -base64 32   # PostgreSQL parolası için rastgele bir değer üretir

.env dosyasını oluşturun. N8N_VERSION için GitHub'daki n8n sürümler sayfasından güncel kararlı sürüm numarasını yazın. Belgelerde latest etiketi kararlı sürümü, next ise beta sürümü gösterir; üretimde sabit bir sürüm yazmak, güncellemeyi ne zaman yapacağınızı sizin kontrol etmenizi sağlar. Bu yazının kontrol edildiği gün belgelerde kararlı sürüm 2.45.7 olarak görünüyordu.

ini
# /opt/n8n/.env  (bu dosyayı kimseyle paylaşmayın, git deposuna koymayın)
N8N_VERSION=SURUM_NUMARASI
N8N_DOMAIN=n8n.example.com
GENERIC_TIMEZONE=Europe/Istanbul

POSTGRES_USER=n8n
POSTGRES_PASSWORD=GUCLU_BIR_SIFRE
POSTGRES_DB=n8n
bash
chmod 600 .env

Şimdi compose.yaml dosyasını oluşturun. PostgreSQL bölümü, n8n belgesindeki örnekle aynıdır; PGDATA satırını silmeyin. Belgeye göre PostgreSQL 18 varsayılan veri yolunu değiştirdi ve bu satır olmadan veritabanı birimin dışına yazılıp her yeniden oluşturmada boş başlayabilir.

yaml
services:
  postgres:
    image: postgres:18
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - db-storage:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: n8nio/n8n:${N8N_VERSION}
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=${N8N_DOMAIN}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - N8N_WEBHOOK_URL=https://${N8N_DOMAIN}/
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${GENERIC_TIMEZONE}
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_RESTRICT_FILE_ACCESS_TO=/files
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
      - DB_POSTGRESDB_USER=${POSTGRES_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n
      - ./local-files:/files
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  n8n_data:
  db-storage:

Ortam değişkenleri ne işe yarıyor?

DeğişkenÖrnekAçıklama
N8N_HOSTn8n.example.comn8n'in çalıştığı alan adı (varsayılan localhost)
N8N_PROTOCOLhttpsn8n'e erişilen protokol (varsayılan http)
N8N_PORT5678n8n'in iç HTTP portu
N8N_WEBHOOK_URLhttps://n8n.example.com/Ters vekil arkasında webhook adresini elle belirler
N8N_PROXY_HOPS1n8n'in önündeki ters vekil sayısı
GENERIC_TIMEZONEEurope/IstanbulSchedule gibi zamanlama düğümlerinin saat dilimi (varsayılan America/New_York)
TZEurope/IstanbulKonteynerin sistem saat dilimi
N8N_RESTRICT_FILE_ACCESS_TO/filesDosya düğümlerinin erişebileceği klasör
bash
docker compose up -d
docker compose ps
curl -sf http://127.0.0.1:5678/healthz && echo n8n ayakta

4. Nginx ve Let's Encrypt ile HTTPS

n8n editörü arayüzdeki değişiklikleri varsayılan olarak WebSocket ile iletir (N8N_PUSH_BACKEND varsayılanı websocket). Nginx, Upgrade ve Connection başlıklarını kendiliğinden aktarmadığı için bunları nginx.org: WebSocket proxying belgesindeki gibi açıkça göndermeniz gerekir. n8n ayrıca son vekilin X-Forwarded-For, X-Forwarded-Host ve X-Forwarded-Proto başlıklarını iletmesini ister.

nginx
# /etc/nginx/sites-available/n8n.example.com
server {
    listen 80;
    listen [::]:80;
    server_name n8n.example.com;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;

        # WebSocket (editörün canlı güncellemeleri)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # n8n'in istediği yönlendirme başlıkları
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 300s;
        proxy_buffering off;
    }
}

Siteyi etkinleştirin ve sertifikayı Certbot'un Nginx eklentisiyle alın. Certbot bu sunucu bloğuna 443 dinleyicisini ve sertifika satırlarını kendisi ekler. Ayrıntılar için Let's Encrypt rehberimize ve Nginx server block rehberimize bakabilirsiniz.

bash
sudo apt install nginx
sudo ln -s /etc/nginx/sites-available/n8n.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

# Certbot (resmî talimattaki snap yöntemi)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
sudo certbot --nginx -d n8n.example.com
sudo certbot renew --dry-run

5. İlk Giriş ve Sertleştirme

5. İlk Giriş ve Sertleştirme: Sahip hesabı için uzun ve benzersiz bir parola kullanın, kişisel ayarlardan iki..., Genel REST API'yi kullanmayacaksanız belgede önerildiği gibi...

Tarayıcıda https://n8n.example.com adresini açtığınızda n8n sizden sahip (owner) hesabını oluşturmanızı ister. Bu ekranı kurulumdan hemen sonra tamamlayın; sahip ekranı açık kaldığı sürece adrese ilk ulaşan kişi hesabı oluşturabilir.

  • Sahip hesabı için uzun ve benzersiz bir parola kullanın, kişisel ayarlardan iki adımlı doğrulamayı (2FA) açın.
  • Genel REST API'yi kullanmayacaksanız belgede önerildiği gibi N8N_PUBLIC_API_DISABLED=true ekleyin (n8n Docs: Disable the public API).
  • Konteyner içinde docker compose exec n8n n8n audit komutuyla yerleşik güvenlik denetimini çalıştırın; kullanılmayan kimlik bilgileri ve riskli düğümler raporlanır.
  • Webhook uç noktaları herkese açıktır. Webhook düğümlerinde kimlik doğrulama seçeneklerini kullanın ve gelen veriyi doğrulamadan işlem yapmayın.
  • SSH tarafını VPS güvenlik sertleştirme ve Fail2ban rehberlerine göre kapatın.

6. Yedekleme: Neyi, Nasıl?

n8n Docs: Back up and restore sayfasına göre tam bir yedek iki parçadan oluşur: .n8n kullanıcı klasörü ve harici veritabanı. Kimlik bilgileri veritabanında şifreli saklanır; şifreleme anahtarı .n8n/config dosyasındadır. Anahtar olmadan geri yüklenen veritabanındaki kimlik bilgileri çözülemez. Docker kurulumunda bu klasör n8n_data birimindedir.

bash
cd /opt/n8n

# 1) Veritabanı dökümü (PostgreSQL)
docker compose exec -T postgres pg_dump -U n8n n8n > n8n-db-$(date +%F).sql

# 2) .n8n klasörü (şifreleme anahtarı burada). Önce n8n'i durdurun.
docker volume ls | grep n8n_data
docker compose stop n8n
docker run --rm -v n8n_n8n_data:/data -v "$(pwd)":/backup ubuntu \
  tar czf /backup/n8n-data-$(date +%F).tar.gz -C /data .
docker compose start n8n

# 3) İsteğe bağlı: iş akışlarını ve kimlik bilgilerini JSON olarak dışa aktarın
docker compose exec n8n n8n export:workflow --backup --output=/home/node/.n8n/backups/workflows/
docker compose exec n8n n8n export:credentials --backup --output=/home/node/.n8n/backups/credentials/

Compose, birim adının başına proje klasörünün adını ekler; klasör /opt/n8n ise birim n8n_n8n_data olur. docker volume ls çıktısında gördüğünüz adı kullanın. CLI dışa aktarımları yalnızca iş akışlarını ve kimlik bilgilerini içerir; kullanıcılar, çalıştırma geçmişi, değişkenler ve şifreleme anahtarı bu dosyalarda yoktur. Yedekleri sunucu dışına taşımak için rsync ile yedekleme, veritabanı tarafı için veritabanı yedekleme stratejileri yazılarımıza bakın.

7. Güncelleme

n8n neredeyse her hafta yeni bir küçük sürüm yayımlar. Belgeler en az ayda bir güncellemenizi, sürüm notlarındaki uyumsuz değişiklikleri okumanızı ve güncellemeden önce tam yedek almanızı önerir. Docker Compose ile güncelleme adımları şöyledir:

bash
cd /opt/n8n
# Önce yedek alın, sonra .env içindeki N8N_VERSION değerini yeni sürüme çekin
nano .env
docker compose pull
docker compose down
docker compose up -d
docker compose logs -f n8n

Sık Karşılaşılan Sorunlar

BelirtiOlası nedenÇözüm
Editör sunucuyla bağlantının koptuğunu söylüyorNginx WebSocket başlıklarını iletmiyorUpgrade ve Connection başlıklarını ekleyin; gerekirse N8N_PUSH_BACKEND=sse deneyin
Webhook adresi localhost:5678 gösteriyorN8N_WEBHOOK_URL tanımlı değilDeğişkeni tam https adresiyle ekleyip konteyneri yeniden oluşturun
Zamanlanmış akış yanlış saatte çalışıyorGENERIC_TIMEZONE ayarlanmamışEurope/Istanbul gibi bir değer verin
502 Bad Gatewayn8n konteyneri çalışmıyor veya port yanlışdocker compose ps ve docker compose logs n8n çıktısına bakın
Postgres her yeniden başlatmada boşPGDATA satırı silinmişCompose dosyasını belgedeki örnekle karşılaştırın
Konteyner sık sık yeniden başlıyorBellek yetersizSwap ekleyin, OOM kayıtlarını kontrol edin

502 hatasının genel teşhisi için 502 ve 504 rehberimize, bellek kaynaklı kapanmalar için OOM killer yazımıza ve swap alanı rehberimize bakın.

Sık Sorulan Sorular

n8n için ne kadar RAM gerekir?

Tek n8n konteyneri için resmî belgede sabit bir asgari değer yok. Assistant sandbox'ını da içeren Compose kurulumu için belge en az 4 GB RAM ve 2 vCPU ister. Yoğun iş akışlarında ve büyük dosya işlemlerinde bellek kullanımı artar; kaynakları izleyerek büyütün.

SQLite ile çalıştırsam olur mu?

Olur, n8n veritabanı tanımlanmadığında SQLite kullanır. Belge, birkaç kullanıcıdan fazlası veya sürekli çalışan akışlar için PostgreSQL'i önerir. SQLite'tan PostgreSQL'e veriler kendiliğinden taşınmaz; baştan PostgreSQL ile başlamak daha kolaydır.

n8n'i ücretsiz ticari amaçla kullanabilir miyim?

Lisans, kendi iç iş amaçlarınız için kullanıma izin verir; yani şirket içi otomasyonlarınızda kullanmanız bu kapsamdadır. Yazılımı başkalarına ücretli sunmak ise lisansın sınırları dışında kalabilir; ayrıntı için lisans metnini okuyun.

Editörü yalnızca kendi IP adresimden açabilir miyim?

Evet, Nginx'te allow ve deny yönergeleriyle editörü kısıtlayabilirsiniz. Ancak webhook'ların dış servislerden erişilebilir kalması gerekir; webhook yollarını ayrı bir location bloğunda serbest bırakmanız gerekir.

n8n çalışıyor mu, nasıl izlerim?

/healthz uç noktasını dışarıdan kontrol eden bir izleme aracı kurabilirsiniz. Bunun için Uptime Kuma kurulum rehberimiz iyi bir başlangıçtır.

Yazılım ve hizmet adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen projeler veya şirketlerle ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Uptime Kuma ile site izleme · Portainer ile Docker yönetimi · Coolify kurulumu · Nextcloud kurulumu · Docker Compose rehberi · Reverse proxy nedir? · UFW güvenlik duvarı