n8n / Kurulum rehberiDers 2 · Kısa kurulum yolu
AWS · Öğrenci kurulum dosyası

Beş adım.
Çalışan bir n8n.

Sunucuyu aç. Bağlan. Hazır kodları yapıştır.
Sonunda kendi adresinden n8n’e gir.

Her adımın sonunda sonucu kontrol et. Uzun kodları tek düğmeyle kopyala; istersen açıp incele. “TAMAM” mesajını görmeden ilerleme.

Gerekenler: AWS hesabı + DNS’ini yönetebildiğin domain + yeni, boş sunucu. AWS kaynakları ücretlidir; başlamadan bütçe uyarısı oluştur. Uyarı harcamayı otomatik durdurmaz. Bu rehber eğitim içindir; mevcut bir iş sunucusunda uygulama.

Ubuntu 24.04 LTS / x86_64 · n8n 2.37.10 · Caddy 2.11.4
Hiçbir komut bu sayfada kendiliğinden çalışmaz.

Beş adım ve içindekiler

0 / 5 adım tamamlandı

Takılırsan yardım

1 / AWS konsoluSunucunu aç, adresini kaydet.

AWS’de EC2 → Instances → Launch instances. Aynı bölgede kal; örneğin Frankfurt. Şu seçimlerle tek bir sunucu oluştur:

AyarSeçeceğin değer
İsimn8n-egitim
İşletim sistemiUbuntu Server 24.04 LTS · Canonical · 64-bit (x86)
Makine / diskt3.medium · 30 GiB gp3 · encrypted
Eğitim için başlangıç önerisi; ücretsiz kullanım garantisi değil.
AnahtarCreate new key pair → n8n-egitim · RSA · .pem
İnen dosyayı Downloads / İndirilenler klasöründe sakla. Paylaşma.
Network settingsDefault VPC · public subnet · Auto-assign public IP: Enable

Security Group → Inbound rules için yalnızca bu üç kapıyı ekle:

22 · SSHMy IPSunucuya yalnızca sen bağlan.
80 · HTTP0.0.0.0/0HTTPS sertifikası alınabilsin.
443 · HTTPSŞimdilik My IPİlk hesabı yalnızca sen oluştur.

5678 portunu açma. Outbound’daki varsayılan internet çıkışı kalsın. My IP, senin bağlantının dış IP’sidir; internet bağlantın değişirse yenile.

Sunucuyu açtım. Bu güvenlik ayarlarını nereden yapacağım?

Kod yazmayacaksın; AWS’nin tarayıcı ekranında yapacaksın. Güvenlik grubu, sunucunun hangi kapıdan kimleri içeri alacağını belirler.

  1. EC2 → Bulut Sunucuları (Instances) bölümünde kendi n8n-egitim sunucunu seç.
  2. Alttaki Güvenlik (Security) sekmesine gir. Güvenlik grupları altındaki sg-… bağlantısına tıkla. Adı launch-wizard-1 olabilir; önemli olan kendi sunucuna bağlı grubu açman.
  3. Gelen kurallar (Inbound rules) → Gelen kuralları düzenle (Edit inbound rules) yolunu izle.
  4. Kural ekle (Add rule) ile HTTP · TCP · 80 ekle. Kaynak: Anywhere-IPv4 / Herhangi bir yer IPv4, yani 0.0.0.0/0.
  5. Bir kural daha ekle: HTTPS · TCP · 443. Kaynak: ilk hesabını oluşturana kadar My IP / IP adresim.
  6. Mevcut SSH · TCP · 22 kuralını kontrol et. Bu rehberde kendi bilgisayarından bağlandığın için kaynak My IP olmalı. Bu, sunucunun Elastic IP’si değil, senin internet bağlantının adresidir.
  7. Kuralları kaydet (Save rules). Listede 22, 80 ve 443’ü kaynaklarıyla tekrar kontrol et. Bu değişiklik için sunucuyu yeniden başlatman gerekmez.

İlgili kural zaten varsa ikinci kez ekleme; mevcut satırı düzenle. Yeni güvenlik grubu oluşturma veya bağlı grubu kaldırma. “Güvenlik gruplarını değiştir” ekranı bu işlem için doğru yer değil. Eylemler menüsü pasifse önce grubun satırındaki kutuyu işaretle.

Çekimde anlat: “n8n içeride çalışıyor olabilir ama kapı kapalıysa dışarıdan ulaşamayız. Bu kurulumda 80 sertifika doğrulaması, 443 güvenli web erişimi, 22 ise bizim terminal bağlantımız içindir.”

Launch instance → Running ve başarılı durum kontrollerini bekle. Ardından EC2 → Elastic IP addresses → Allocate → Actions → Associate ile sabit IP’yi bu sunucuya bağla. Bundan sonra bu yeni IP’yi kullan.

VPC, anahtar veya maliyet konusunda yardım

Default VPC yoksa ağ yöneticinden public subnet iste. Route table’da 0.0.0.0/0 → Internet Gateway yolu gerekir. Bu eğitim için NAT Gateway/Load Balancer kurma. Anahtarın adı tam olarak n8n-egitim.pem olsun; kaybolursa bağlantı kuramazsın.

AWS hesabında MFA açık olsun. Budgets aramasından aylık bütçe ve e-posta uyarısı oluştur. EC2, disk, Elastic IP ve yedekler ayrı ücret oluşturabilir. Elastic IP boşta kalsa da ücretli olabilir.

Rehberi kendi adreslerine uyarla.

Aşağıya sadece alan adını ve Elastic IP’ni yaz. “Uygula” dediğinde ilgili örnekler ve komutlar değişir. Buraya parola, AWS anahtarı veya gizli bilgi yazma.

Henüz örnek değerler görünüyor. Kişisel adres isteyen komutlar, bilgilerini uygulayana kadar kopyalanamaz.

Yalnızca domain ve IP gir; parola değil. Bunlar başka yere gönderilmez. Sayfa yenilenirse yeniden girmen gerekir. Kontrol işaretlerin tarayıcıda hatırlanır.

2 / BağlantıSunucuya gir. Docker’ı hazırla.

Önce kendi bilgisayarında.

Mac veya Linux’ta Terminal aç. Aşağıdaki kodu kopyala, yapıştır ve Enter’a bas. Anahtarın Downloads klasöründe olmalı.

KENDİ BİLGİSAYARIN · Mac / Linux
cd ~/Downloads &&
chmod 400 n8n-egitim.pem &&
ssh -i n8n-egitim.pem ubuntu@203.0.113.10
Windows kullanıyorum

PowerShell aç. Aşağıdaki blok anahtar dosyasının izinlerini ayarlayıp bağlantıyı açar. “ssh tanınmıyor” hatası varsa Windows’un İsteğe bağlı özellikler bölümünden OpenSSH Client kur.

KENDİ BİLGİSAYARIN · Windows PowerShell
& {
  $ErrorActionPreference = 'Stop'
  Set-Location "$env:USERPROFILE\Downloads"
  if (!(Test-Path .\n8n-egitim.pem)) { throw 'Anahtar dosyasi Downloads klasorunde bulunamadi.' }
  icacls .\n8n-egitim.pem /inheritance:r
  if ($LASTEXITCODE -ne 0) { throw 'Dosya izni ayarlanamadi.' }
  icacls .\n8n-egitim.pem /grant:r "$($env:USERNAME):(R)"
  if ($LASTEXITCODE -ne 0) { throw 'Okuma izni ayarlanamadi.' }
  ssh -i .\n8n-egitim.pem ubuntu@203.0.113.10
}

İlk bağlantıda parmak izi sorulursa AWS → instance → Actions → Monitor and troubleshoot → Get system log içindeki SSH parmak iziyle karşılaştır. Aynıysa yes yaz. Eşleşmiyorsa dur.

Bağlandın mı? ubuntu@ip-…:~$ benzeri bir satır görünür. Artık aynı pencereye yazdıkların sunucuda çalışır.

Şimdi sunucuya bu bloğu yapıştır.

Docker ve gerekli yardımcıları kurar. İşletim sistemi yanlışsa veya bir komut başarısız olursa durur. Bilgisayarına Docker Desktop kurmana gerek yok.

SUNUCU TERMİNALİ · Docker’ı kur
Kodu incele · Tamamı kopyalanır
bash <<'DOCKER_KUR'
set -Eeuo pipefail
trap 'printf "\nDURDU: Docker hazirligi tamamlanamadi (satir %s). Son hata mesajini kontrol et.\n" "$LINENO" >&2' ERR
. /etc/os-release
if [[ "$ID" != ubuntu || "$VERSION_ID" != 24.04 || "$(uname -m)" != x86_64 ]]; then
  echo "DURDU: Bu rehber Ubuntu 24.04 LTS / x86_64 icindir." >&2
  exit 1
fi
sudo apt-get update
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates curl openssl dnsutils
if ! command -v docker >/dev/null 2>&1; then
  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 >/dev/null <<'REPO'
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc
REPO
  sudo apt-get update
  sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
fi
sudo systemctl enable --now docker
sudo docker compose version
sudo docker run --rm hello-world
echo "TAMAM: Docker hazir. 3. adima gecebilirsin."
DOCKER_KUR
Beklenen son mesaj: TAMAM: Docker hazir. 3. adima gecebilirsin.

3 / Hazır kurulumÜç dosya, tek yapıştırma.

Bu blok /opt/n8n içinde n8n ayarlarını, Docker tarifini ve HTTPS ayarını hazırlar. Gizli şifreleme anahtarını kendisi üretir. Dosya açıp düzenlemene gerek yok.

SUNUCU TERMİNALİ · Kurulum dosyalarını hazırla
Kodu incele · Tamamı kopyalanır
bash <<'N8N_DOSYALAR'
set -Eeuo pipefail
trap 'printf "\nDURDU: Dosya hazirligi tamamlanamadi (satir %s). Mevcut dosyalari silme; yardim bolumune bak.\n" "$LINENO" >&2' ERR
[[ "$(whoami)" == ubuntu ]] || { echo "DURDU: Sunucuya ubuntu kullanicisi ile baglan."; exit 1; }
sudo docker compose version >/dev/null
n8n_domain='n8n.example.com'
[[ "$n8n_domain" != *.example.com ]] || { echo "DURDU: Once rehbere kendi adreslerini uygula."; exit 1; }
sudo install -d -o ubuntu -g ubuntu -m 750 /opt/n8n
cd /opt/n8n
if [[ -e .env || -e compose.yaml || -e Caddyfile || -e .rehber-v2 ]]; then
  if [[ -f .rehber-v2 && -f .env && -f compose.yaml && -f Caddyfile ]] &&
     grep -Fxq "N8N_DOMAIN=$n8n_domain" .env; then
    sudo docker compose config --quiet
    echo "TAMAM: Bu rehberin dosyalari zaten hazir; anahtar degismedi. 4. adima gec."
    exit 0
  fi
  echo "DURDU: Bu klasorde mevcut veya yarim bir kurulum var. Uzerine yazilmadi."
  echo "Yardim bolumundeki 'Mevcut veya yarim kurulum' aciklamasini oku."
  exit 1
fi
umask 077
set -C
n8n_key=$(openssl rand -hex 32)
printf '%s\n' "N8N_DOMAIN=$n8n_domain" "N8N_ENCRYPTION_KEY=$n8n_key" 'GENERIC_TIMEZONE=Europe/Istanbul' > .env
unset n8n_key
cat > compose.yaml <<'YAML'
name: n8n-egitim

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:2.37.10
    restart: unless-stopped
    stop_grace_period: 60s
    environment:
      N8N_HOST: ${N8N_DOMAIN:?Alan adi eksik}
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_DOMAIN}/
      N8N_WEBHOOK_URL: https://${N8N_DOMAIN}/
      N8N_PROXY_HOPS: 1
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY:?Anahtar eksik}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}
      NODE_ENV: production
      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: 168
    volumes:
      - n8n_data:/home/node/.n8n
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  caddy:
    image: caddy:2.11.4
    restart: unless-stopped
    depends_on:
      - n8n
    ports:
      - "80:80"
      - "443:443"
    environment:
      N8N_DOMAIN: ${N8N_DOMAIN}
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

volumes:
  n8n_data:
  caddy_data:
  caddy_config:
YAML
cat > Caddyfile <<'CADDY'
{$N8N_DOMAIN} {
    tls {
        issuer acme {
            disable_tlsalpn_challenge
        }
    }
    reverse_proxy n8n:5678
}
CADDY
chmod 600 .env
sudo docker compose config --quiet
printf '%s\n' 'n8n-aws-rehber-v2' > .rehber-v2
echo "TAMAM: Dosyalar hazir. Gizli anahtar ekrana yazilmadi. 4. adima gec."
N8N_DOSYALAR
Beklenen son mesaj: TAMAM: Dosyalar hazir… Aynı rehberle tamamlanmış kurulumu tekrar çalıştırırsan anahtarını değiştirmez. Başka veya yarım bir kurulum bulursa üzerine yazmaz, durur.

.env ve .pem dosyalarını paylaşma; çekimde açma. Bunlar gizli bilgi içerir. Bu bölümdeki kod ise gerçek gizli anahtarı içermez; onu sunucuda üretir.

4 / İnternetteki adresinDomain’i bağla. n8n’i başlat.

Domain’inin DNS yönetim paneline gir. n8n için aşağıdaki kaydı oluştur:

TürAd / HostDeğerTTL
An8n
n8n alt alanı kullanıyorsan
203.0.113.10300 / varsayılan

Oluşacak tam adres: n8n.example.com. Panel tam ad istiyorsa bunu yaz. Cloudflare kullanıyorsan DNS only / gri bulut seç. Yalnızca bu n8n adresinde çakışan A/CNAME veya eski AAAA kaydı olmasın; ana sitenin kayıtlarına dokunma.

Sonra sunucu terminaline dön ve aşağıdaki bloğu yapıştır. Önce DNS’i kontrol eder, sonra uygulamaları indirip çalıştırır ve HTTPS’i sınar.

SUNUCU TERMİNALİ · Kontrol et ve başlat
Kodu incele · Tamamı kopyalanır
bash <<'N8N_BASLAT'
set -Eeuo pipefail
trap 'printf "\nDURDU: Baslatma tamamlanamadi (satir %s). Son hata mesajini kontrol et.\n" "$LINENO" >&2' ERR
cd /opt/n8n
n8n_domain='n8n.example.com'
n8n_ip='203.0.113.10'
[[ "$n8n_domain" != *.example.com && "$n8n_ip" != 203.0.113.* ]] || { echo "DURDU: Once rehbere kendi adreslerini uygula."; exit 1; }
[[ -f .env && -f compose.yaml && -f Caddyfile ]] || { echo "DURDU: Once 3. adimi tamamla."; exit 1; }
grep -Fxq "N8N_DOMAIN=$n8n_domain" .env || { echo "DURDU: Rehberdeki domain ile .env farkli. Adresini kontrol et."; exit 1; }
n8n_dns=$(dig +short A "$n8n_domain" @1.1.1.1)
n8n_ipv6=$(dig +short AAAA "$n8n_domain" @1.1.1.1)
if [[ "$n8n_dns" != "$n8n_ip" || -n "$n8n_ipv6" ]]; then
  echo "DURDU: DNS henuz dogru degil. A kaydini ve varsa AAAA kaydini kontrol et."
  echo "DNS duzeldikten sonra ayni blogu yeniden calistir."
  exit 1
fi
sudo docker compose config --quiet
sudo docker compose pull
sudo docker compose run --rm --no-deps -T caddy caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile </dev/null
sudo docker compose up -d
echo "HTTPS hazir olana kadar kontrol ediliyor..."
for n8n_attempt in {1..24}; do
  if curl --fail --silent --output /dev/null --connect-timeout 3 --max-time 5 \
      --resolve "$n8n_domain:443:127.0.0.1" "https://$n8n_domain/"; then
    sudo docker compose ps
    echo "TAMAM: n8n ve HTTPS sunucuda yanit veriyor."
    echo "Kendi tarayicinda ac: https://$n8n_domain"
    exit 0
  fi
  sleep 5
done
echo "BEKLIYOR: HTTPS henuz hazir degil. 80 portunu, DNS'i ve Caddy logunu kontrol et."
echo "Log komutu: cd /opt/n8n && sudo docker compose logs --tail=40 caddy n8n"
echo "Veriler silinmedi. Sorunu duzeltince ayni blogu yeniden calistir."
exit 1
N8N_BASLAT
Beklenen son mesaj: TAMAM: n8n ve HTTPS sunucuda yanit veriyor.

“DNS henuz dogru degil” görürsen kayıt ve IP’yi kontrol et, yayılmasını bekle ve aynı bloğu tekrar çalıştır. İndirme veya sertifika beklerken yeniden komut yapıştırma. “BEKLIYOR” başarı değildir; aşağıdaki yardımı aç.

5 / Son kontrolGiriş yap. İlk akışını çalıştır.

Kendi bilgisayarının tarayıcısında bu adresi aç. Terminale yapıştırma.

TARAYICI · Adres çubuğu
https://n8n.example.com
  1. Sertifika uyarısı olmadan açılmalı. İlk ekranda kendi owner hesabını ve güçlü parolanı oluştur.
  2. Yeni workflow aç → adını Kurulum testi yap.
  3. Manual Trigger → Edit Fields (Set) ekle. Edit Fields içinde String alanı: mesaj, değeri: Merhaba!.
  4. Execute workflow ile çalıştır. Çıkışta mesaj: Merhaba! gör. Kaydet; otomatik kayıt varsa tamamlandığını doğrula.

Şimdi sunucu terminalinde n8n’i yeniden başlat:

SUNUCU TERMİNALİ · Kaydın durduğunu test et
(set -e
cd /opt/n8n
sudo docker compose restart n8n
sudo docker compose ps
)
Bitti: n8n hazır olunca tarayıcıyı yenile. Aynı akışı açıp tekrar çalıştırabiliyorsan kurulum testi başarılı. Bu test, yedek yerine geçmez.

Dışarıdan webhook alacaksan: Owner hesabını oluşturduktan sonra AWS’de yalnızca 443 kaynağını 0.0.0.0/0 yap. SSH / 22 My IP olarak kalır. Yalnız kendin deniyorsan 443’ü My IP’de tutabilirsin.

Yalnızca ihtiyacın olursa.

Kurulum yolu burada bitti. Aşağıdakiler başvuru notların.

Bir adımda hata aldım
Mevcut veya yarım kurulum

Kod verilerini korumak için durdu. Önceki rehberle çalışan n8n’in varsa yeniden kurman gerekmez; aynı adresle 5. adımdaki testi yapabilirsin. Kurulum yarım kaldıysa .env anahtarını veya volume’u silme. Sunucu terminalinde aşağıdaki dosya/durum kontrolünü çalıştır; dosya içerikleri ve anahtar ekrana yazılmaz. Sorunu bu bilgi ve hata mesajıyla inceleyelim.

SUNUCU TERMİNALİ · Mevcut kurulumu kontrol et
(set -e
cd /opt/n8n
ls -la .env compose.yaml Caddyfile
sudo docker compose config --quiet
sudo docker compose ps
)

12 / Sorun çözmeHata gördüğünde baştan kurma.

Önce hatanın hangi bölümde olduğunu bul. Aşağıdaki başlıklardan belirtilerine uyanı aç.

SSH: “Connection timed out”

Sunucu Running mi? Doğru Elastic IP’yi mi yazdın? SSH / 22 kuralındaki My IP güncel mi? Subnet’in Internet Gateway yolu var mı? Kurum ağı 22 çıkışını engelliyorsa ağ yöneticine sor. Çözüm olarak 22’yi herkese açma.

SSH: “Permission denied (publickey)”

Kullanıcı adı ubuntu olmalı. Sunucuyu oluştururken seçtiğin key pair ile elindeki .pem aynı mı? Dosya gerçekten bulunduğun klasörde mi? “Permissions too open” ayrı bir dosya izni sorunudur; bağlantı adımındaki izinleri kontrol et. .pem içeriğini destek mesajına yapıştırma.

Terminalde yalnızca “>” işareti çıktı.

Dosya oluşturma bloğunun kapanış satırı eksik kalmış olabilir. Ctrl+C ile yarım komutu iptal et. Sonra dosyanın oluşup oluşmadığını kontrol et. Oluşmuş dosyayı körlemesine silme; nano compose.yaml veya nano Caddyfile ile ilgili dosyayı rehberle karşılaştır. .env dosyasını ekran paylaşımı sırasında açma.

“cannot overwrite existing file”

Koruma çalışıyor: aynı dosyayı ikinci kez oluşturmaya çalışıyorsun. Mevcut dosyanın üzerine yazma. Özellikle .env anahtarını yeniden üretme. Devam eden kurulumda ilgili dosyayı güvenli biçimde incele ve yalnızca gerekli ayarı düzelt.

“no configuration file provided” veya YAML hatası

Önce cd /opt/n8n çalıştır. Dosyanın adı tam olarak compose.yaml olmalı. YAML’de boşluklar önemlidir; Tab ile girinti yapma. sudo docker compose config --quiet çıktısındaki satırı incele. “Alan adi eksik” veya “Anahtar eksik” görürsen .env oluşturma adımını kontrol et.

“permission denied” / “Cannot connect to the Docker daemon”

Komutun başında sudo var mı? Docker servisini sudo systemctl status docker --no-pager ile kontrol et. Çalışmıyorsa sudo systemctl start docker dene. Hata sürüyorsa önce servis mesajını çöz.

n8n “Restarting” / “Exited” görünüyor.

sudo docker compose logs --tail=80 n8n ile nedeni oku. Yanlış ayar, dolu disk veya yetersiz bellek olabilir. df -h disk alanını, free -h belleği gösterir. “Encryption key mismatch” görürsen yeni anahtar üretme; mevcut kurulumun doğru anahtarını yedekten geri bul.

Alan adı açılmıyor veya HTTPS sertifika hatası var.

Baştan kurma. Çekim provasındaki örnekte n8n çalışıyordu; 80 portu kapalı olduğu için sertifika alınamıyordu. Güvenlik kuralı düzeltildikten sonra sertifika alındı.

  1. A kaydı kendi Elastic IP’ne mi gidiyor? Aynı ad için yanlış AAAA kaydı var mı? Cloudflare kullanıyorsan kayıt DNS only mı?
  2. Sunucuya bağlı grupta 80 → 0.0.0.0/0 ve 443 → güncel My IP kurallarını kontrol et. Yolu: EC2 → sunucun → Güvenlik → sg-… → Gelen kuralları düzenle.
  3. Aşağıdaki kodu SSH ile bağlandığın sunucu terminaline yapıştır. Son kayıtları gösterir ve biter; kurulum yapmaz.
SUNUCU TERMİNALİ · Sertifika durumunu gör
cd /opt/n8n &&
sudo docker compose logs --since=10m --tail=60 caddy

certificate obtained successfully sertifikanın alındığını gösterir. Tarayıcıda kendi HTTPS adresini aç. Eski hata satırları sonradan alınan başarı mesajını geçersiz kılmaz; en yeni kayıtlara bak.

retrying_in görürsen Caddy yeniden denemeden önce bekliyordur; değer saniyedir. 80 kuralını düzelttiysen beklemek yerine yalnızca Caddy’yi bir kez yeniden başlatabilirsin:

SUNUCU TERMİNALİ · Kural düzeltildikten sonra bir kez
cd /opt/n8n &&
sudo docker compose restart caddy

Ardından yukarıdaki log kontrolünü tekrar kullan. Hata sürerse mesajı incele; varsa CAA kayıtları veya başka ağ kuralları da sertifika doğrulamasını engelleyebilir. Sürekli yeniden başlatma, sertifika veri alanını veya volume’ları silme; sertifika istek limitlerine takılabilirsin.

“502 Bad Gateway” / “Connection lost”

Caddy’ye ulaşılmış ama n8n henüz hazır olmayabilir. sudo docker compose ps ve n8n loglarını kontrol et. Sürekli sürüyorsa Caddy hedefi n8n:5678 olmalı; localhost:5678 değil. Bağlantı kopmasında HTTPS adresini, DNS-only ayarını ve N8N_PROXY_HOPS değerini de kontrol et.

Webhook adresi localhost veya :5678 gösteriyor.

Compose’ta N8N_WEBHOOK_URL ve N8N_EDITOR_BASE_URL doğru HTTPS adresinden üretilmeli. .env değişikliğinden sonra sudo docker compose up -d çalıştır. Test webhook’u yalnızca dinlerken çalışır; yayınlanan akışın production URL’si ayrı olabilir. Dış servisler için 443’ün erişilebilir olması da gerekir.

Yeniden açınca workflow kaybolmuş gibi görünüyor.

Önce doğru alan adına ve doğru hesaba girdiğini kontrol et. Kayıt gerçekten tamamlanmış mıydı? Farklı Compose proje adı yeni bir volume oluşturmuş olabilir. Rehberdeki name: n8n-egitim ve n8n_data tanımını değiştirme. Volume silme veya prune komutu çalıştırma. Önce eski veri alanını/yedeği bul.

Destek için hata mesajını paylaşabilirsin; anahtar, parola ve kişisel bilgileri gizle. Komutları körlemesine tekrar çalıştırma.

Bu parçalar ne işe yarıyor?

02 / Büyük resimBeş parçayı tanıyalım.

AWS EC2İnternette kiraladığın bilgisayar. Kendi bilgisayarın kapansa da çalışabilir.
DockerUygulamaları kendi kutularında çalıştırır. Bu kutuya container, yani konteyner denir.
n8nAkışlarını hazırladığın ve çalıştırdığın uygulama.
Domain + CaddyDomain kolay hatırlanan adresindir. Caddy, bu adrese gelen ziyaretçiyi n8n’e yönlendirir ve HTTPS’i yönetir.
Kalıcı veri alanın8n’in defteri. Uygulama yeniden başlasa da akışlar burada kalır. Docker’da buna volume denir.
Tarayıcınn8n.senin-alanin.com
CaddyHTTPS · 443 numaralı kapı
n8nİç ağ · 5678 numaralı kapı

Caddy ve n8n aynı EC2 sunucusunda, Docker içinde çalışır. n8n’in 5678 kapısını internete açmayacağız.

Komutları nereye yazacağım?

AWS konsolu: Tarayıcıda düğmelere tıkladığın yer.
Kendi bilgisayarının terminali: Sunucuya ilk bağlantıyı yaptığın yer.
Sunucu terminali: SSH ile bağlandıktan sonra aynı pencere; artık AWS bilgisayarına komut verirsin.
n8n ekranı: Kurulumun sonunda tarayıcıda açacağın uygulama.

Bir kod bloğunu kopyaladığında tamamını tek seferde yapıştır ve Enter’a bas. Komut bitip yazı yazabileceğin satır geri gelmeden sonraki bloğa geçme. Hata görürsen dur; sorun çözme bölümünü kullan.

11 / Ezberleme, anlamını bilHangi ayar neyi değiştiriyor?

AyarBasit açıklama
N8N_DOMAINBizim dosyalarımızın ortak adres notu. Compose bunu n8n ve Caddy’ye aktarır.
N8N_HOSTn8n’in dışarıdan kullanılan alan adı.
N8N_EDITOR_BASE_URLEditörün tam HTTPS adresi.
N8N_WEBHOOK_URLDış servislerin istek göndereceği adresin başlangıcı. Eski kaynaklarda WEBHOOK_URL görebilirsin; burada sabitlediğimiz sürüm için yeni adı kullanıyoruz.
N8N_PROXY_HOPS = 1n8n’den önce tek aracı var: Caddy. Cloudflare proxy veya başka aracı eklemek bu tarifi değiştirir.
GENERIC_TIMEZONE / TZTürkiye saati: Europe/Istanbul. Zamanlanmış işleri ve sistem saat yorumunu etkiler. Workflow içinde ayrıca seçilmiş saat dilimi varsa onu da kontrol et.
N8N_ENCRYPTION_KEYBağlantı şifrelerini koruyan gizli anahtar. Adres gibi açık bir ayar değil; kaybetme ve rastgele yenileme.
n8n_dataBu basit kurulumda SQLite veritabanı ve n8n verilerinin tutulduğu kalıcı alan.
Bir ayarı daha sonra değiştireceksem?

Önce yedek al. Sunucu terminalinde cd /opt/n8n, ardından nano .env ile düzenle. Nano’da kaydetmek için Ctrl+O → Enter, çıkmak için Ctrl+X. Mac’te Command değil Control kullan. Çekimde .env açma; gizli anahtar görünür.

SUNUCU TERMİNALİ · Düzenlemeden sonra uygula
cd /opt/n8n
sudo docker compose config --quiet
sudo docker compose up -d

Sadece restart yapmak yeni ortam değişkenlerini uygulamaz. Domain değişiyorsa DNS kaydını, .env alanını ve Caddy’nin yeniden oluşturulmasını birlikte kontrol et.

Yedek, güncelleme ve AWS faturasını kapatma

13 / Kurulumdan sonraÇalışıyor. Peki nasıl koruyacağız?

Self-hosted, bakımın sende olması demektir. Bu tek sunuculu SQLite düzeni eğitim içindir; yüksek erişilebilirlik veya yoğun müşteri trafiği için hazır bir mimari sayılmaz.

İlk yedeği AWS’de al.

Bu rehber Docker verilerini ve /opt/n8n klasörünü aynı EC2 kök diskinde tutar. Eğitim ortamı için basit yol: sunucu kapalıyken EBS disk snapshot’ı almak. Kısa kesinti olur.

  1. Workflow’unu kaydet. AWS → EC2 → Instances → n8n-egitim → Instance state → Stop instance. Terminate değil. Stopped durumunu bekle.
  2. Instance → Storage bölümünde kök diskin Volume ID’sini not al. Volumes ekranında tam o diski seç.
  3. Actions → Create snapshot. Açıklamaya n8n-egitim-ilk-kurulum yaz. Özel/private tut; paylaşma. Bu yedek veritabanını, .env anahtarını ve Docker veri alanlarını içerir.
  4. Snapshots sayfasında Completed durumunu doğrula. Sonra Instances ekranından aynı sunucuyu Start instance ile aç.
  5. Durum kontrolleri başarılı olunca HTTPS adresini aç. Akışını tekrar çalıştır.

Snapshot’ın nasıl geri yükleneceğini ayrı bir deneme ortamında test etmeden “yedek kesin çalışıyor” deme. Geri dönüşte snapshot’tan EBS volume oluşturulup uygun EC2’ye bağlanır; şifreli diskin KMS anahtarına erişim de gerekir. Önemli veriyi taşımadan önce geri yükleme provası ve düzenli yedek planı oluştur.

Şu komutları temizlik diye çalıştırma: docker compose down -v, docker volume rm ve volume silen prune komutları veri kaybına yol açabilir. Kalıcı alan, bağımsız yedek demek değildir.

Sürümleri kontrollü güncelle.

Tarifte latest yerine n8n ve Caddy sürümlerini sabitledik; böylece öğrenci ve eğitmen aynı sürümle başlar. Bu sürümleri sonsuza kadar tutma. Çekimden ve sonraki kurulumlardan önce resmî güvenlik duyurularını ve sürüm notlarını kontrol et.

  1. Çalışan ortamın yedeğini al; sürüm notlarını oku. Mümkünse önce test ortamında dene.
  2. nano /opt/n8n/compose.yaml içinde ilgili image: sürümünü onayladığın sürümle değiştir. Kaydet ve çık.
  3. cd /opt/n8nsudo docker compose config --quietsudo docker compose pullsudo docker compose up -d. Sonra giriş, akış ve log testini tekrarla.

Veritabanı dönüşümü yapan sürümlerde sadece eski image’a dönmek yeterli olmayabilir; uygun yedeğe geri dönmen gerekebilir. Ubuntu güvenlik güncellemelerini de planlı uygula ve gerekiyorsa yeniden başlat.

İşin bittiğinde faturayı unutma.

Yaptığın işlemGerçekte ne olur?
Tarayıcıyı / terminali kapatmakSunucu çalışmaya ve kaynaklar ücret oluşturmaya devam eder.
Docker’ı durdurmakn8n durur; EC2 sunucusu ve disk hâlâ vardır.
EC2 → StopÇalışan EC2 hesaplama ücreti durur; EBS, snapshot ve ayrılmış Elastic IP gibi kaynakların ücretleri sürebilir.
EC2 → TerminateSunucuyu kalıcı kaldırır. “Delete on termination” açık diskler silinebilir. Yedeksiz yapma.
Elastic IP → DisassociateSadece sunucuyla bağını keser. Tahsis sürer; artık gerekmiyorsa ayrıca Release gerekir.

Eğitim ortamını tamamen kaldıracaksan önce yedeğini ve geri dönüşünü doğrula. Yalnızca bu eğitime ait instance, disk, snapshot ve Elastic IP’yi tek tek değerlendir. Koruman gerekenleri silme. Alan adının eski A kaydını da temizle. Tüm bölgelerdeki kaynakları ve Billing ekranını kontrol et; faturaya yansıma gecikebilir.

Resmî kaynaklar ve test kapsamı

Resmî belgelerle karşılaştırıldı. HTML işlevleri ve komutların sözdizimi kontrol edildi; gerçek AWS hesabında uçtan uca kurulum testi yapılmadı. Ağ izinleri, hesap yetkileri ve DNS yayılması değişebilir; hatasız kurulum garantisi değildir. Çekimden önce bir eğitim sunucusunda prova yap.