#!/usr/bin/env bash
# BarbarosTech – Geliştirici VDS kurulum scripti: n8n
# Kaynak: https://barbarostech.com/kurulum/n8n.sh — çalıştırmadan önce inceleyebilirsiniz.
# Ubuntu 20.04+ / Debian 11+ içindir. Altyapı: BarbarosTech, yazılım: ilgili projelerin resmi kaynakları.

set -Eeuo pipefail
G='\033[1;32m'; Y='\033[1;33m'; R='\033[1;31m'; B='\033[1m'; N='\033[0m'
log()  { printf '%b==>%b %s\n' "$G" "$N" "$*"; }
warn() { printf '%bUyarı:%b %s\n' "$Y" "$N" "$*"; }
die()  { printf '%bHata:%b %s\n' "$R" "$N" "$*" >&2; exit 1; }
trap 'die "Kurulum ${LINENO}. satırda durdu. Çıktıyı kontrol edin; yardım için WhatsApp: +90 541 761 60 77"' ERR

[ "$(id -u)" -eq 0 ] || die "Bu script root olarak çalıştırılmalı. Komutun başına sudo ekleyin."
[ -r /etc/os-release ] || die "İşletim sistemi tespit edilemedi."
# shellcheck disable=SC1091
. /etc/os-release
case "${ID:-}" in
  ubuntu|debian) ;;
  *) die "Bu script yalnızca Ubuntu ve Debian'da çalışır (bulunan: ${ID:-bilinmiyor})." ;;
esac
export DEBIAN_FRONTEND=noninteractive

apt_install() { apt-get update -qq; apt-get install -y -qq "$@" >/dev/null; }

install_docker() {
  if command -v docker >/dev/null 2>&1; then
    log "Docker zaten kurulu: $(docker --version)"
  else
    log "Docker kuruluyor (resmi get.docker.com scripti)..."
    curl -fsSL https://get.docker.com | sh >/dev/null
  fi
  systemctl enable --now docker >/dev/null 2>&1 || true
}

port_busy() { ss -ltnH "sport = :$1" 2>/dev/null | grep -q .; }

public_ip() { curl -fsS4 --max-time 5 https://api.ipify.org 2>/dev/null || hostname -I | awk '{print $1}'; }

# Kullanım:
#   curl -fsSL https://barbarostech.com/kurulum/n8n.sh | sudo bash -s -- n8n.alanadiniz.com
# Kurulanlar: Docker, n8n ve Caddy (otomatik SSL) — /opt/n8n altında Docker Compose ile.
# Ayarlar (isteğe bağlı ortam değişkenleri): TZ_NAME=Europe/Istanbul

DOMAIN="${1:-${N8N_DOMAIN:-}}"
TZ_NAME="${TZ_NAME:-Europe/Istanbul}"
DIR=/opt/n8n

[ -n "$DOMAIN" ] || die "Alan adı gerekli. Örnek: curl -fsSL https://barbarostech.com/kurulum/n8n.sh | sudo bash -s -- n8n.alanadiniz.com"
[[ "$DOMAIN" =~ ^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)+$ ]] || die "Geçersiz alan adı: $DOMAIN"
if [ -e "$DIR/docker-compose.yml" ]; then die "$DIR zaten mevcut. Güncellemek için: cd $DIR && docker compose pull && docker compose up -d"; fi

log "Gerekli paketler kuruluyor..."
apt_install curl ca-certificates iproute2
install_docker

for p in 80 443; do
  if port_busy "$p"; then die "$p portu başka bir servis tarafından kullanılıyor (ör. Apache/Nginx). Önce o servisi durdurun."; fi
done

IP="$(public_ip)"
DNS_IP="$(getent ahostsv4 "$DOMAIN" 2>/dev/null | awk 'NR==1{print $1}')" || true
if [ -n "$IP" ] && [ "${DNS_IP:-}" != "$IP" ]; then
  warn "$DOMAIN şu an '${DNS_IP:-çözülemiyor}' adresine gidiyor; bu sunucunun IP'si $IP."
  warn "SSL sertifikası için DNS'te $DOMAIN için $IP adresine bir A kaydı olmalı. Kayıt yayıldığında Caddy sertifikayı kendisi alır."
fi

log "Yapılandırma $DIR altına yazılıyor..."
mkdir -p "$DIR"
cat > "$DIR/Caddyfile" <<CADDY
$DOMAIN {
    reverse_proxy n8n:5678
}
CADDY
cat > "$DIR/docker-compose.yml" <<COMPOSE
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    environment:
      - N8N_HOST=$DOMAIN
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - WEBHOOK_URL=https://$DOMAIN/
      - GENERIC_TIMEZONE=$TZ_NAME
      - TZ=$TZ_NAME
    volumes:
      - n8n_data:/home/node/.n8n
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
volumes:
  n8n_data:
  caddy_data:
  caddy_config:
COMPOSE

log "n8n ve Caddy başlatılıyor..."
cd "$DIR"
docker compose pull -q
docker compose up -d

printf '\n%bKurulum tamamlandı.%b\n' "$B" "$N"
echo "  Adres     : https://$DOMAIN  (ilk girişte yönetici hesabınızı oluşturun)"
echo "  Klasör    : $DIR"
echo "  Güncelleme: cd $DIR && docker compose pull && docker compose up -d"
echo "  Loglar    : cd $DIR && docker compose logs -f n8n"
