# n8n, Docker Compose, PostgreSQL ve HTTPS ile nasıl kurulur

> n8n'i Docker Compose, PostgreSQL ve resmi task runner ile Caddy HTTPS arkasında kendi sunucunuza kurun; queue mode, yedekleme ve güvenli güncellemeyi ekleyin.

Zorluk: Orta\
Denendiği sistemler: Ubuntu 24.04 LTS, Ubuntu 26.04 LTS, Debian 12, Debian 13

n8n bir iş akışı otomasyon platformudur. Uygulamaları, API'leri ve yapay zeka modellerini görsel bir tuval üzerinde birbirine bağlar, webhook'lara ve zamanlamalara tepki verir, bir düğüm tam istediğinizi yapmadığında JavaScript veya Python koduna geçersiniz. n8n'i kendi sunucunuzda çalıştırmak iş akışlarını, kimlik bilgilerini ve çalıştırma verilerini sizin kontrolünüzde tutar.

Bu rehber n8n'i, n8n'in resmi `n8n-hosting` deposundaki örnekleri izleyerek **Docker Compose** ile kurar: **PostgreSQL** ile çalışan n8n ve Code düğümü betiklerini ana sürecin dışında çalıştıran resmi **task runner** konteyneri. n8n yalnızca `127.0.0.1` üzerinde dinler, **Caddy** ise onu alan adınızda HTTPS ile yayınlar. Ardından sahip (owner) hesabını oluşturur, Redis ve worker konteynerleriyle **queue mode**'a ne zaman ve nasıl geçeceğinizi öğrenir, yedekleme, geri yükleme ve güncellemeyi ayarlarsınız.

## Ön koşullar

- Docker Engine ve Compose eklentisi kurulu, **Ubuntu 24.04 LTS**, **Ubuntu 26.04 LTS**, **Debian 12** veya **Debian 13** çalıştıran bir sunucu. Önce [Ubuntu'ya Docker kurulumu](/guides/install-docker-ubuntu) veya [Debian'a Docker kurulumu](/guides/install-docker-debian) rehberini izleyin.
- [Yeni bir Linux sunucusunu güvenli hale getirin](/guides/secure-a-new-linux-server) ve [SSH anahtarlarını ayarlayın](/guides/ssh-keys) rehberlerindeki gibi hazırlanmış, `sudo` yetkili ve SSH anahtarıyla giriş yapan root olmayan bir kullanıcı.
- Sunucuyu gösteren bir A kaydına (IPv6 kullanıyorsanız AAAA kaydına da) sahip `n8n.example.com` gibi bir alt alan adı.
- [Caddy reverse proxy](/guides/caddy-reverse-proxy) rehberinde anlatıldığı gibi sunucuya kurulmuş Caddy. Nginx veya Traefik de olur; n8n tarafındaki ayarlar aynıdır.

n8n, PostgreSQL'li bir Docker Compose kurulumu için en düşük donanım değeri yayınlamaz. Yapay zeka sandbox servislerini de içeren yeni hepsi bir arada Compose yapısı için en az 2 vCPU ve 4 GB RAM ister; bu rehberdeki yapı daha hafiftir. Bellek kullanımı paralel çalıştırma sayısı ve iş akışlarının taşıdığı veri miktarıyla birlikte artar; bu nedenle aşağıdaki değerleri temkinli bir başlangıç noktası olarak görün.

| Kaynak | En düşük (resmi) | Önerilen başlangıç |
|---|---|---|
| CPU | Yayınlanmamış | 2 vCPU |
| RAM | Yayınlanmamış | 2 GB, queue mode ile 4 GB |
| Disk | Yayınlanmamış | 20 GB SSD, uzun çalıştırma geçmişi tutacaksanız daha fazlası |

## Adım 1 — Proje klasörünü ve gizli değerleri oluşturun

n8n ile ilgili her şeyi yönetici kullanıcınıza ait `/opt/n8n` klasöründe tutun:

```bash
sudo mkdir -p /opt/n8n
sudo chown $USER:$USER /opt/n8n
cd /opt/n8n
```

`.env` dosyasını oluşturun. Docker Compose bu dosyayı kendiliğinden okur; `openssl` çağrıları da dosya yazılırken uzun, rastgele gizli değerleri doldurur:

```bash
cat > .env <<EOF
N8N_VERSION=2.42.5
N8N_DOMAIN=n8n.example.com
GENERIC_TIMEZONE=Europe/Istanbul

POSTGRES_USER=postgres
POSTGRES_PASSWORD=$(openssl rand -hex 24)
POSTGRES_DB=n8n
POSTGRES_NON_ROOT_USER=n8n
POSTGRES_NON_ROOT_PASSWORD=$(openssl rand -hex 24)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF
chmod 600 .env
```

Değerlerin görevleri:

- `N8N_VERSION`, n8n ve task runner imajlarını tek bir sürüme sabitler. `2.42.5`, 2026-10-09 tarihindeki güncel kararlı sürümdü; n8n'in Docker sayfasında veya sürüm notlarında güncel kararlı sürümü kontrol edip onu kullanın. Sürümü sabitlemek, güncellemelerin yalnızca bu satırı değiştirdiğinizde yapılması demektir.
- `N8N_DOMAIN` genel host adıdır; `GENERIC_TIMEZONE` ise Schedule tetikleyicilerinin kullandığı saat dilimidir. Kendi IANA saat dilimi adınızı, örneğin `Europe/Berlin` veya `America/New_York` değerini kullanın.
- `POSTGRES_*` değerleri veritabanını oluşturur. n8n, resmi örnekte olduğu gibi süper kullanıcı olmayan ayrı `n8n` hesabıyla bağlanır.
- `N8N_ENCRYPTION_KEY`, n8n'in sakladığı her kimlik bilgisini şifreler. `RUNNERS_AUTH_TOKEN`, n8n ile task runner arasındaki ortak gizli değerdir.

> **Uyarı**
>
> `.env` dosyasını hemen yedekleyin ve bir kopyasını sunucu dışında saklayın. `N8N_ENCRYPTION_KEY` kaybolursa geri yüklenen iş akışları açılır, ancak kayıtlı tüm kimlik bilgileri okunamaz hale gelir. Kimlik bilgisi barındıran bir kurulumda anahtarı asla değiştirmeyin.

## Adım 2 — Veritabanı başlangıç betiğini ekleyin

Resmi örnek, PostgreSQL'in `/docker-entrypoint-initdb.d` klasörüne küçük bir betik bağlar. Betik, veritabanı volume'u boşken yalnızca bir kez çalışır ve yetkileri `n8n` veritabanıyla sınırlı `n8n` kullanıcısını oluşturur:

```bash
cat > /opt/n8n/init-data.sh <<'EOF'
#!/bin/bash
set -e
if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<EOSQL
CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER};
GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER};
EOSQL
else
echo "SETUP INFO: No Environment variables given!"
fi
EOF
chmod +x /opt/n8n/init-data.sh
```

Tırnak içindeki `'EOF'`, kabuğunuzun değişkenleri genişletmesini engeller; değerleri PostgreSQL konteyneri ilk açılışta kendi ortam değişkenlerinden doldurur.

## Adım 3 — Compose dosyasını yazın

`/opt/n8n/compose.yaml` dosyasını oluşturun. Bu dosya, n8n'in resmi `withPostgres` örneğinin üç değişiklik yapılmış halidir: port yalnızca `127.0.0.1` üzerinde yayınlanır, reverse proxy için genel adres ayarları eklenir ve şifreleme anahtarı `.env` dosyasından gelir:

```yaml
services:
  postgres:
    image: postgres:18
    restart: always
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_NON_ROOT_USER
      - POSTGRES_NON_ROOT_PASSWORD
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - db_storage:/var/lib/postgresql/data
      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: always
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
      - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_HOST=${N8N_DOMAIN}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - N8N_WEBHOOK_URL=https://${N8N_DOMAIN}/
      - N8N_PROXY_HOPS=1
      - NODE_ENV=production
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${GENERIC_TIMEZONE}
      - N8N_RUNNERS_MODE=external
      - N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
      - N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
    ports:
      - "127.0.0.1:5678:5678"
    volumes:
      - n8n_storage:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: always
    environment:
      - N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
      - N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
    depends_on:
      - n8n

volumes:
  db_storage:
  n8n_storage:
```

Bazı ayarlar açıklamayı hak ediyor:

- `postgres:18` imajı varsayılan veri klasörünü değiştirdiği için `PGDATA` sabitlenmiştir. n8n'in örneği eski yolu korur; böylece volume bağlantısı ana sürümler arasında değişmez. Bu satırı silmeyin.
- `n8n_storage` volume'u `/home/node/.n8n` klasörünü tutar. PostgreSQL kullansa bile n8n ayar dosyasını ve şifreleme anahtarını burada saklar; bu nedenle volume kalıcı olmalıdır.
- `N8N_WEBHOOK_URL` ve `N8N_PROXY_HOPS=1`, n8n'e tek bir reverse proxy arkasında olduğunu ve webhook'lar için hangi genel adresi göstereceğini söyler. `N8N_WEBHOOK_URL`, n8n 2.35.0 ile eski `WEBHOOK_URL` adının yerini aldı; eski ad hâlâ çalışır ama kullanımdan kalkma uyarısı yazar.
- `N8N_RUNNERS_MODE=external`, Code düğümü betiklerini n8n'in alt süreci yerine ayrı `n8nio/runners` konteynerinde çalıştırır. n8n belgeleri üretim için harici task runner önerir ve runner imajının sürümü her zaman n8n sürümüyle aynı olmalıdır.

## Adım 4 — n8n'i başlatın

İmajları çekin ve yapıyı arka planda başlatın:

```bash
cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps
```

Üç servisin de `running` göstermesi, `postgres` servisinin de `healthy` olması gerekir. n8n logunu, editörün erişilebilir olduğunu bildirene kadar izleyin, ardından `Ctrl+C` tuşlarına basın:

```bash
docker compose logs -f n8n
```

Sağlık uç noktasını sunucunun kendisinden kontrol edin:

```bash
curl -s http://127.0.0.1:5678/healthz
```

`{"status":"ok"}` çıktısını görmelisiniz. Runner bağlanamıyorsa `docker compose logs n8n-runner` nedenini gösterir; genellikle token veya sürüm uyuşmazlığıdır.

## Adım 5 — n8n'i Caddy ile HTTPS üzerinden yayınlayın

`/etc/caddy/Caddyfile` dosyasına alt alan adınız için bir site bloğu ekleyin. `flush_interval -1` satırı n8n'in kendi Caddy örneğinden gelir ve akış halindeki yanıtları tarayıcıya hemen iletir:

```caddyfile
n8n.example.com {
    reverse_proxy 127.0.0.1:5678 {
        flush_interval -1
    }
}
```

Caddy'yi yeniden yükleyin ve güvenlik duvarının yalnızca SSH ve web trafiğine izin verdiğinden emin olun. n8n'e yalnızca Caddy üzerinden erişildiği için 5678 numaralı port açılmamalıdır:

```bash
sudo systemctl reload caddy
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
curl -I https://n8n.example.com
```

Son komut geçerli bir sertifikayla `HTTP/2 200` döndürmelidir. Caddy sertifikayı kendiliğinden alır ve yeniler; n8n'in beklediği `X-Forwarded-For`, `X-Forwarded-Host` ve `X-Forwarded-Proto` başlıklarını da iletir. Caddy yerine Nginx veya Traefik için [Nginx ve Certbot](/guides/nginx-reverse-proxy-certbot) ile [Traefik](/guides/traefik-reverse-proxy) rehberlerine bakın.

## Adım 6 — Sahip hesabını oluşturun

`https://n8n.example.com` adresini hemen açın. n8n ilk açılışta **sahip hesabı** için bir kayıt formu gösterir ve formu ilk dolduran kişi kurulumun sahibi olur. En az sekiz karakterli, bir rakam ve bir büyük harf içeren, tercihen bir parola yöneticisiyle üretilmiş bir parola kullanın.

SMTP sunucusu olmadan n8n davet ve parola sıfırlama bağlantılarını e-postayla gönderemez; davet bağlantılarını elle kopyalarsınız.

> **Not**
>
> HyperDC VPS'lerde giden 25 numaralı port varsayılan olarak kapalıdır. 3 ay veya daha uzun süreyle satın alınan hizmetlerde talep üzerine açılır: [destek talebi açın](/guides/support-tickets). O zamana kadar e-postaları 587 numaralı port üzerinden bir SMTP relay ile gönderin.

E-postayı açmak için bu satırları `n8n` servisinin `environment` listesine ekleyin, `N8N_SMTP_PASS` değerini `.env` dosyasına yazın ve konteyneri yeniden oluşturmak için `docker compose up -d` çalıştırın. `N8N_SMTP_SSL` varsayılan olarak `true` olduğundan 587 numaralı port için bunu `false` yapın ve `N8N_SMTP_STARTTLS` ayarını açık tutun:

```yaml
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=smtp.example.com
      - N8N_SMTP_PORT=587
      - N8N_SMTP_SSL=false
      - N8N_SMTP_STARTTLS=true
      - N8N_SMTP_USER=n8n@example.com
      - N8N_SMTP_PASS=${N8N_SMTP_PASS}
      - N8N_SMTP_SENDER=n8n@example.com
```

> **İpucu**
>
> SMTP olmadan hesabınıza erişemiyor musunuz? `docker compose exec -u node n8n n8n user-management:reset` kullanıcı yönetimini kurulum öncesi durumuna döndürür ve yeni bir sahip hesabı oluşturmanızı sağlar. Tüm kullanıcı hesaplarını sildiği için önce yedek alın; iş akışları ve kimlik bilgileri veritabanında kalır.

## Adım 7 — Queue mode ile ölçekleyin (isteğe bağlı)

Varsayılan modda tek bir n8n süreci webhook'ları alır, editörü çalıştırır ve tüm iş akışlarını yürütür. **Queue mode**'da ana örnek yalnızca tetikleyicileri ve webhook'ları kabul eder, her çalıştırmayı veritabanına yazar ve kimliğini bir Redis kuyruğuna koyar. Ayrı **worker** süreçleri bu kimlikleri alır, iş akışlarını çalıştırır ve sonuçları geri yazar.

Çalıştırmalar birikiyorsa, ağır iş akışları editörü veya webhook'ları yavaşlatıyorsa ya da daha fazla worker çalıştırarak kapasite eklemek istiyorsanız queue mode'a ihtiyacınız vardır. n8n belgelerine göre gereksinimler şunlardır:

- PostgreSQL (dağıtık kurulumlarda SQLite ile queue mode desteklenmez) ve ana sürecin ve tüm worker'ların erişebildiği bir Redis.
- Ana örnekte ve her worker'da **aynı `N8N_ENCRYPTION_KEY`**; aksi halde worker'lar kimlik bilgilerini çözemez.
- Tüm süreçlerde aynı n8n sürümü.
- Queue mode, ikili (binary) veriler için dosya sistemi depolamasını desteklemez; büyük dosyalarla çalışan iş akışlarından önce n8n'in binary data ayarlarını kontrol edin.

Önce yedek alın (sonraki bölüme bakın), ardından `compose.yaml` dosyasını bu sürümle değiştirin. Dosya n8n'in resmi `withPostgresAndWorker` örneğini izler: bir YAML anchor'ı ayarları ana örnek ile worker arasında paylaştırır ve her birine ayrı bir task runner verilir:

```yaml
x-n8n: &n8n-common
  image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
  restart: always
  environment:
    - DB_TYPE=postgresdb
    - DB_POSTGRESDB_HOST=postgres
    - DB_POSTGRESDB_PORT=5432
    - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
    - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
    - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_HEALTH_CHECK_ACTIVE=true
    - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
    - N8N_HOST=${N8N_DOMAIN}
    - N8N_PORT=5678
    - N8N_PROTOCOL=https
    - N8N_WEBHOOK_URL=https://${N8N_DOMAIN}/
    - N8N_PROXY_HOPS=1
    - NODE_ENV=production
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    - TZ=${GENERIC_TIMEZONE}
    - N8N_RUNNERS_MODE=external
    - N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
    - N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
  volumes:
    - n8n_storage:/home/node/.n8n
  depends_on:
    postgres:
      condition: service_healthy
    redis:
      condition: service_healthy

services:
  postgres:
    image: postgres:18
    restart: always
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_NON_ROOT_USER
      - POSTGRES_NON_ROOT_PASSWORD
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - db_storage:/var/lib/postgresql/data
      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10

  redis:
    image: redis:7-alpine
    restart: always
    volumes:
      - redis_storage:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    <<: *n8n-common
    ports:
      - "127.0.0.1:5678:5678"

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: always
    environment:
      - N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
      - N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
    depends_on:
      - n8n

  n8n-worker:
    <<: *n8n-common
    command: worker --concurrency=5
    depends_on:
      - n8n

  n8n-worker-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: always
    environment:
      - N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
      - N8N_RUNNERS_TASK_BROKER_URI=http://n8n-worker:5679
    depends_on:
      - n8n-worker

volumes:
  db_storage:
  n8n_storage:
  redis_storage:
```

Değişikliği uygulayın ve worker'ın Redis'e ve veritabanına bağlandığını kontrol edin:

```bash
cd /opt/n8n
docker compose up -d --remove-orphans
docker compose ps
docker compose logs --tail=50 n8n-worker
```

Redis'e yalnızca Compose'un iç ağından erişilir; sunucuda yayınlanmaz. Her worker varsayılan olarak aynı anda en fazla 10 iş çalıştırır; `--concurrency=5` bu sayıyı düşürür. n8n 5'in altındaki değerleri önermez, çünkü düşük eşzamanlılıkla çalışan çok sayıda worker veritabanı bağlantı havuzunu tüketebilir. Kapasite eklemek için eşzamanlılığı artırın veya yeni servis adlarıyla bir worker ve runner çifti daha ekleyin. Çok yüksek webhook trafiği için n8n, queue mode belgelerinde anlatılan ve bir yük dengeleyicinin arkasında çalışan ayrı webhook süreçleri (`n8n webhook`) de sunar.

## Yedekleme ve geri yükleme

n8n'in durumu üç yerde tutulur: PostgreSQL veritabanı (iş akışları, kimlik bilgileri, çalıştırma geçmişi), `n8n_storage` volume'u (ayar dosyası, şifreleme anahtarı, topluluk düğümleri) ve `/opt/n8n` içindeki dosyalar (`.env`, `compose.yaml`, `init-data.sh`). Üçünü de yedekleyin:

```bash
sudo mkdir -p /opt/backups
sudo chown $USER:$USER /opt/backups
cd /opt/n8n
docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -Fc "$POSTGRES_DB"' > /opt/backups/n8n-db-$(date +%F).dump
docker run --rm -v n8n_n8n_storage:/data:ro -v /opt/backups:/backup alpine tar czf /backup/n8n-storage-$(date +%F).tar.gz -C /data .
tar czf /opt/backups/n8n-config-$(date +%F).tar.gz -C /opt/n8n .env compose.yaml init-data.sh
chmod 600 /opt/backups/n8n-*
```

Compose volume'lara proje klasörünün adını verir; bu yüzden depolama volume'unun adı `n8n_n8n_storage` olur. Bunu `docker volume ls` ile doğrulayın. Ayrıca n8n'in CLI'ı iş akışlarını ve kimlik bilgilerini JSON dosyaları olarak dışa aktarabilir; bu, tek tek iş akışlarını kurulumlar arasında taşımak için kullanışlıdır. `--backup`, `--all --pretty --separate` seçeneklerinin kısaltmasıdır ve kimlik bilgileri anahtarınızla şifreli kalır:

```bash
docker compose exec -u node n8n n8n export:workflow --backup --output=/home/node/.n8n/backups/workflows/
docker compose exec -u node n8n n8n export:credentials --backup --output=/home/node/.n8n/backups/credentials/
docker compose cp n8n:/home/node/.n8n/backups /opt/backups/n8n-export-$(date +%F)
```

Yeni bir sunucuya geri yüklemek için Docker'ı kurun, yapılandırma arşivini **orijinal `.env`** yerinde olacak şekilde `/opt/n8n` içine açın ve veritabanını n8n ilk kez başlamadan önce geri yükleyin:

```bash
cd /opt/n8n
docker compose up -d --wait postgres
docker compose exec -T postgres sh -c 'pg_restore -U "$POSTGRES_USER" -d "$POSTGRES_DB"' < /opt/backups/n8n-db-2026-10-09.dump
docker compose create n8n
docker run --rm -v n8n_n8n_storage:/data -v /opt/backups:/backup alpine tar xzf /backup/n8n-storage-2026-10-09.tar.gz -C /data
docker compose up -d
```

`--wait`, PostgreSQL sağlıklı hale gelip başlangıç betiği geri yüklenen tabloların sahibi olan `n8n` kullanıcısını oluşturduğunda geri döner. Tarihleri kendi dosya adlarınızdakilerle değiştirin. `/opt/backups` klasörünü düzenli olarak başka bir makineye veya nesne depolamaya kopyalayın, örneğin `rsync` ya da `restic` ile; yalnızca aynı sunucuda duran bir yedek, o sunucunun kaybından kurtulamaz.

## n8n güncelleme

n8n sık sürüm yayınlar ve birçok sürümü tek seferde atlamak zorunda kalmamanız için en az ayda bir güncelleme yapmanızı önerir. Her güncellemeden önce:

1. Sürüm notlarını okuyun. Ana sürümlerden önce o sürümün uyumsuz değişiklikler (breaking changes) sayfasını da okuyun; örneğin n8n 2.0, Code düğümünde ortam değişkenlerine erişimi engelledi ve Execute Command düğümünü varsayılan olarak devre dışı bıraktı.
2. Veritabanını, depolama volume'unu ve `.env` dosyasını yukarıdaki gibi yedekleyin.

Ardından `.env` içindeki `N8N_VERSION` değerini yeni sürümle değiştirin ve konteynerleri yeniden oluşturun. n8n ve runner imajlarının ikisi de aynı değişkeni izler:

```bash
cd /opt/n8n
nano .env
docker compose pull
docker compose up -d
docker compose exec n8n n8n --version
```

Veritabanı geçişleri n8n başlarken kendiliğinden çalışır. Sıradan bir güncellemenin parçası olarak `postgres:18` imajını yeni bir ana sürüme geçirmeyin: n8n'in barındırma deposunda açıklandığı gibi PostgreSQL ana sürüm yükseltmesi döküm alıp geri yüklemeyi gerektirir.

## Sorun giderme

### Webhook adresleri http://localhost:5678 gösteriyor

n8n genel adresini bilmiyor. `N8N_WEBHOOK_URL` değerinin sonunda eğik çizgiyle `https://n8n.example.com/` olduğunu, `N8N_PROXY_HOPS=1` ayarının bulunduğunu ve `.env` içindeki alan adının doğru olduğunu kontrol edin, ardından `docker compose up -d` çalıştırın. Düzeltmeden önce harici servislere kaydedilen webhook'ları yeniden kaydetmeniz gerekir; bu genellikle iş akışını kapatıp yeniden etkinleştirerek yapılır.

### /home/node/.n8n üzerinde EACCES: permission denied

n8n konteyneri yetkisiz `node` kullanıcısıyla (UID 1000) çalışır. Bu hata, adlandırılmış volume'u root'a ait bir ana makine klasörüyle değiştirdiğinizde ortaya çıkar. Klasörü UID 1000'e verin, örneğin `sudo chown -R 1000:1000 /opt/n8n/n8n-data`, ya da bu rehberdeki adlandırılmış volume'u kullanmaya devam edin. n8n 2.x ayrıca ayar dosyasının `0600` izinlerine sahip olmasını bekler; daha geniş izinlerle kopyalanmış bir dosyayı `docker compose exec n8n chmod 600 /home/node/.n8n/config` düzeltir.

### Mismatching encryption keys

`N8N_ENCRYPTION_KEY` içindeki anahtar, `n8n_storage` içindeki ayar dosyasında kayıtlı anahtardan farklıdır; bu genellikle yeni bir `.env` ile yapılan geri yüklemeden sonra olur. Orijinal anahtarı `.env` dosyasına geri koyun ve `docker compose up -d` çalıştırın. Orijinal anahtar kaybolduysa kayıtlı kimlik bilgileri kurtarılamaz ve yeniden oluşturulmaları gerekir.

### Code düğümü çalıştırmaları başarısız oluyor veya zaman aşımına uğruyor

Task runner bağlı değil. `docker compose logs n8n-runner` çalıştırın: runner ve n8n imajları aynı sürümü kullanmalı, `RUNNERS_AUTH_TOKEN` iki serviste de aynı olmalı ve runner konteynerinin 5679 numaralı porta erişebilmesi için n8n servisinde `N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0` ayarı kalmalıdır.

### FATAL: database files are incompatible with server

PostgreSQL imajı, veri klasörünü oluşturan sürümden daha yeni bir ana sürüme değiştirilmiş. Hiçbir şey silinmez: imajı önceki ana sürüme (örneğin `postgres:16`) geri alın, yeniden başlatın ve yeni sürüme geçmek istiyorsanız n8n'in barındırma deposundaki döküm alıp geri yükleme yöntemini izleyin.

## Sonraki adımlar

- Compose dosya biçimini [Docker Compose temelleri](/guides/docker-compose-basics) rehberiyle ayrıntılı öğrenin.
- Otomasyon ihtiyaçlarınız için n8n'i [Node-RED](/guides/install-node-red) ve [Activepieces](/guides/install-activepieces) ile karşılaştırın.
- Otomasyon iş yüklerine göre boyutlandırılmış sunucuları [n8n hosting](/n8n-hosting) sayfasında bulun.
- Ortam değişkenleri, ölçekleme ve güvenlik ayarları için n8n'in [barındırma belgelerini](https://docs.n8n.io/hosting/) okuyun.

## Sık sorulan sorular

### n8n için PostgreSQL gerekli mi, yoksa SQLite yeterli mi?

n8n varsayılan olarak SQLite kullanır; bu, testler ve küçük tek örnekli kurulumlar için uygundur. n8n'in kendi barındırma örnekleri üretim için PostgreSQL önerir ve queue mode PostgreSQL gerektirir. Baştan PostgreSQL ile başlamak sonradan taşıma yapma zorunluluğunu ortadan kaldırır.

### n8n şifreleme anahtarını kaybedersem ne olur?

n8n kaydedilen her kimlik bilgisini N8N_ENCRYPTION_KEY ile şifreler. Farklı bir anahtarla geri yüklenen veritabanında iş akışları görünür, ancak kayıtlı kimlik bilgileri çözülemez ve yeniden girilmeleri gerekir. .env dosyasını her yedeğe dahil edin.

### n8n queue mode'a ne zaman ihtiyacım olur?

Tek bir n8n süreci çalıştırmalara yetişemediğinde veya uzun süren iş akışları editörü ve webhook'ları yavaşlattığında queue mode'a geçin. Bu mod Redis ve ayrı worker konteynerleri ekler. Çoğu küçük ekip için tek örnek yeterlidir.

### n8n webhook adreslerim neden localhost:5678 gösteriyor?

Genel adresi vermediğiniz sürece n8n webhook adreslerini kendi iç host ve port değerinden üretir. N8N_WEBHOOK_URL (eski sürümlerde WEBHOOK_URL) ve N8N_PROXY_HOPS=1 değerlerini ayarlayın, ardından konteyneri docker compose up -d ile yeniden oluşturun.

### Bunu bir HyperDC sunucusunda çalıştırabilir miyim?

Evet. Adımlar, Ubuntu 24.04, Ubuntu 26.04, Debian 12 veya Debian 13 çalıştıran ve root erişiminiz olan bir HyperDC Linux VPS, VDS veya dedicated sunucuda çalışır. Sunucuyu paralel çalıştırmayı planladığınız iş akışı sayısına göre boyutlandırın.

---

Kaynak: <https://hyperdc.com/tr/guides/tutorials/install-n8n>\
Son güncelleme: 2026-10-09
