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.
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:
| Ayar | Seçeceğin değer |
|---|---|
| İsim | n8n-egitim |
| İşletim sistemi | Ubuntu Server 24.04 LTS · Canonical · 64-bit (x86) |
| Makine / disk | t3.medium · 30 GiB gp3 · encrypted Eğitim için başlangıç önerisi; ücretsiz kullanım garantisi değil. |
| Anahtar | Create new key pair → n8n-egitim · RSA · .pem İnen dosyayı Downloads / İndirilenler klasöründe sakla. Paylaşma. |
| Network settings | Default VPC · public subnet · Auto-assign public IP: Enable |
Security Group → Inbound rules için yalnızca bu üç kapıyı ekle:
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.
- EC2 → Bulut Sunucuları (Instances) bölümünde kendi n8n-egitim sunucunu seç.
- Alttaki Güvenlik (Security) sekmesine gir. Güvenlik grupları altındaki
sg-…bağlantısına tıkla. Adılaunch-wizard-1olabilir; önemli olan kendi sunucuna bağlı grubu açman. - Gelen kurallar (Inbound rules) → Gelen kuralları düzenle (Edit inbound rules) yolunu izle.
- Kural ekle (Add rule) ile HTTP · TCP · 80 ekle. Kaynak: Anywhere-IPv4 / Herhangi bir yer IPv4, yani
0.0.0.0/0. - Bir kural daha ekle: HTTPS · TCP · 443. Kaynak: ilk hesabını oluşturana kadar My IP / IP adresim.
- 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.
- 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.
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.
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ı.
cd ~/Downloads &&
chmod 400 n8n-egitim.pem &&
ssh -i n8n-egitim.pem ubuntu@203.0.113.10Windows 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.
& {
$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.
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.
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_KURTAMAM: 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.
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_DOSYALARTAMAM: 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ür | Ad / Host | Değer | TTL |
|---|---|---|---|
| A | n8nn8n alt alanı kullanıyorsan | 203.0.113.10 | 300 / 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.
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_BASLATTAMAM: 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.
https://n8n.example.com- Sertifika uyarısı olmadan açılmalı. İlk ekranda kendi owner hesabını ve güçlü parolanı oluştur.
- Yeni workflow aç → adını Kurulum testi yap.
- Manual Trigger → Edit Fields (Set) ekle. Edit Fields içinde String alanı:
mesaj, değeri:Merhaba!. - 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:
(set -e
cd /opt/n8n
sudo docker compose restart n8n
sudo docker compose ps
)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.
(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ı.
- 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ı?
- 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.
- Aşağıdaki kodu SSH ile bağlandığın sunucu terminaline yapıştır. Son kayıtları gösterir ve biter; kurulum yapmaz.
cd /opt/n8n &&
sudo docker compose logs --since=10m --tail=60 caddycertificate 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:
cd /opt/n8n &&
sudo docker compose restart caddyArdı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.
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.
11 / Ezberleme, anlamını bilHangi ayar neyi değiştiriyor?
| Ayar | Basit açıklama |
|---|---|
| N8N_DOMAIN | Bizim dosyalarımızın ortak adres notu. Compose bunu n8n ve Caddy’ye aktarır. |
| N8N_HOST | n8n’in dışarıdan kullanılan alan adı. |
| N8N_EDITOR_BASE_URL | Editörün tam HTTPS adresi. |
| N8N_WEBHOOK_URL | Dış 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 = 1 | n8n’den önce tek aracı var: Caddy. Cloudflare proxy veya başka aracı eklemek bu tarifi değiştirir. |
| GENERIC_TIMEZONE / TZ | Tü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_KEY | Bağlantı şifrelerini koruyan gizli anahtar. Adres gibi açık bir ayar değil; kaybetme ve rastgele yenileme. |
| n8n_data | Bu 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.
cd /opt/n8n
sudo docker compose config --quiet
sudo docker compose up -dSadece 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.
- Workflow’unu kaydet. AWS → EC2 → Instances → n8n-egitim → Instance state → Stop instance. Terminate değil. Stopped durumunu bekle.
- Instance → Storage bölümünde kök diskin Volume ID’sini not al. Volumes ekranında tam o diski seç.
- Actions → Create snapshot. Açıklamaya
n8n-egitim-ilk-kurulumyaz. Özel/private tut; paylaşma. Bu yedek veritabanını, .env anahtarını ve Docker veri alanlarını içerir. - Snapshots sayfasında Completed durumunu doğrula. Sonra Instances ekranından aynı sunucuyu Start instance ile aç.
- 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.
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.
- Çalışan ortamın yedeğini al; sürüm notlarını oku. Mümkünse önce test ortamında dene.
nano /opt/n8n/compose.yamliçinde ilgiliimage:sürümünü onayladığın sürümle değiştir. Kaydet ve çık.cd /opt/n8n→sudo docker compose config --quiet→sudo docker compose pull→sudo 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şlem | Gerçekte ne olur? |
|---|---|
| Tarayıcıyı / terminali kapatmak | Sunucu çalışmaya ve kaynaklar ücret oluşturmaya devam eder. |
| Docker’ı durdurmak | n8n 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 → Terminate | Sunucuyu kalıcı kaldırır. “Delete on termination” açık diskler silinebilir. Yedeksiz yapma. |
| Elastic IP → Disassociate | Sadece 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ı
- AWS — EC2 oluşturma ve bağlantı · SSH bağlantısı
- AWS — Elastic IP ve ücretlendirme · AWS Budgets
- Docker — Ubuntu kurulumu · Kalıcı volume’lar
- n8n — Compose ile self-hosting · Reverse proxy ve webhook adresi
- Caddy — Otomatik HTTPS · HTTP üzerinden sertifika doğrulaması
- n8n 2.37.10 sürümü · Caddy 2.11.4 sürümü
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.