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; 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 | Ücretsiz | Kendi sunucunuzda neredeyse tüm özellikler |
| Registered Community | Ücretsiz | E-posta ile kayıt; klasörler, editörde hata ayıklama gibi ek özellikler |
| Business | Ücretli | SSO, ortamlar (environments), projeler |
| Enterprise | Ücretli | Geliş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şen | Görevi | Dışarı açık mı? |
|---|---|---|
| n8n konteyneri | Editö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ılar | Hayır, yalnızca Docker ağı |
| Nginx | TLS sonlandırma ve ters vekil | Evet, 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.
sudo apt update && sudo apt upgrade -y
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable2. 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:
# 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 versionDocker Compose kavramlarına yabancıysanız önce Docker Compose rehberimize göz atabilirsiniz.
3. .env ve compose.yaml Dosyalarını Oluşturun

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.
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.
# /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=n8nchmod 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.
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 | Örnek | Açıklama |
|---|---|---|
| N8N_HOST | n8n.example.com | n8n'in çalıştığı alan adı (varsayılan localhost) |
| N8N_PROTOCOL | https | n8n'e erişilen protokol (varsayılan http) |
| N8N_PORT | 5678 | n8n'in iç HTTP portu |
| N8N_WEBHOOK_URL | https://n8n.example.com/ | Ters vekil arkasında webhook adresini elle belirler |
| N8N_PROXY_HOPS | 1 | n8n'in önündeki ters vekil sayısı |
| GENERIC_TIMEZONE | Europe/Istanbul | Schedule gibi zamanlama düğümlerinin saat dilimi (varsayılan America/New_York) |
| TZ | Europe/Istanbul | Konteynerin sistem saat dilimi |
| N8N_RESTRICT_FILE_ACCESS_TO | /files | Dosya düğümlerinin erişebileceği klasör |
docker compose up -d
docker compose ps
curl -sf http://127.0.0.1:5678/healthz && echo n8n ayakta4. 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.
# /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.
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-run5. İlk Giriş ve Sertleştirme

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=trueekleyin (n8n Docs: Disable the public API). - Konteyner içinde
docker compose exec n8n n8n auditkomutuyla 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.
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:
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 n8nSık Karşılaşılan Sorunlar
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Editör sunucuyla bağlantının koptuğunu söylüyor | Nginx WebSocket başlıklarını iletmiyor | Upgrade ve Connection başlıklarını ekleyin; gerekirse N8N_PUSH_BACKEND=sse deneyin |
| Webhook adresi localhost:5678 gösteriyor | N8N_WEBHOOK_URL tanımlı değil | Değişkeni tam https adresiyle ekleyip konteyneri yeniden oluşturun |
| Zamanlanmış akış yanlış saatte çalışıyor | GENERIC_TIMEZONE ayarlanmamış | Europe/Istanbul gibi bir değer verin |
| 502 Bad Gateway | n8n 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ıyor | Bellek yetersiz | Swap 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ı