Skip to content

🐧 Ubuntu — Full Developer Environment Guide

Version 1.0 — Updated 2025-11-06
Author: Fahri Aydın — fahriaydin.dev


Bu rehber kimin için?

  • Sunucu kurulumu — VPS, dedicated server, cloud instance uzerinde web uygulamasi deploy etmek isteyenler
  • Geliştirme ortami — Lokal makinede PHP, Node.js, Docker, .NET ile calisanlar
  • ⚠️ Masaustu kullanimlari — GPU driver sorunlari, Wayland uyumsuzluklari yasanabilir
  • .NET agirlikli Windows Server — IIS, Active Directory gibi Windows-native teknolojiler için uygun degil

Önerilen sürüm: Ubuntu 22.04 LTS veya 24.04 LTS (uzun sureli destek, kararli paket deposu)

Alternatif dagitimlar: Debian (minimalist, kararli), CentOS/Rocky Linux (enterprise), Arch Linux (ileri duzey, rolling release)

📘 Introduction (Açıklama)

Bu rehber, Ubuntu 24.04 / 25.10 üzerinde profesyonel bir geliştirme ortamı kurmak isteyen geliştiriciler için hazırlanmıştır.
İçeriğinde terminal komutları, DNS ayarları, Docker, Laravel, Node.js, .NET, SSL, CI/CD ve yedekleme çözümleri yer alır.
Her bölüm hem İngilizce hem Türkçe açıklamalar ve örnek komutlarla desteklenmiştir.

✅ Tüm komutlar ve örnekler Ubuntu terminalinde test edilmiştir.
Her başlık bağımsız olarak uygulanabilir.

© 2025 Fahri Aydın — Tüm hakları saklıdır.

1️⃣ Sunucu Ilk Kurulum (Initial Server Setup)

Yeni bir Ubuntu sunucu aldiktan sonra yapilmasi gereken temel adimlar asagidadir. Bu islemler güvenlik ve kullanilabilirlik acisindan kritiktir.


Kullanici Oluşturma ve Sudo Yetkisi

Root ile dogrudan calismayin. Sudo yetkisine sahip bir kullanici olusturun:

bash
# Yeni kullanici olustur
adduser deployer

# Sudo grubuna ekle
usermod -aG sudo deployer

# Kullaniciya gec ve test et
su - deployer
sudo whoami   # root donmeli

SSH Key ile Giriş

Parola ile SSH erisimini kapatmadan once key-based authentication yapilandirin:

bash
# Lokal makinede key olustur (henuz yoksa)
ssh-keygen -t ed25519 -C "deployer@sunucu"

# Public key'i sunucuya kopyala
ssh-copy-id -i ~/.ssh/id_ed25519.pub deployer@SUNUCU_IP

# Veya manuel olarak sunucuda:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... deployer@sunucu" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Hostname, Timezone ve Locale

bash
# Hostname ayarla
sudo hostnamectl set-hostname web-server-01

# Timezone ayarla (Turkiye icin)
sudo timedatectl set-timezone Europe/Istanbul
timedatectl   # dogrula

# Locale ayarla
sudo locale-gen tr_TR.UTF-8
sudo update-locale LANG=tr_TR.UTF-8

Swap Alani Oluşturma

Ozellikle düşük RAM'li sunucularda (1-2 GB) swap olusturmak onemlidir:

bash
## 2 GB swap dosyasi olustur
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Kalici yap (reboot sonrasi da aktif olsun)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# Swappiness ayarla (dusuk deger = RAM oncelikli)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# Dogrula
free -h
swapon --show

Temel Paketleri Kur

bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl wget unzip zip net-tools build-essential \
  software-properties-common ca-certificates lsb-release apt-transport-https \
  htop tree ncdu tmux ufw fail2ban

🧩 Most Common Ubuntu Commands (En Sık Kullanılan Komutlar)

Updated 2025-11-06

💡 Günlük kullanımda en çok işine yarayacak komutlar.
Sistem bakımı, ağ, Docker, Laravel, Node.js, Git ve veritabanı yönetimi örnekleri içerir.


🧱 System & Package Management (Sistem ve Paket Yönetimi)

bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl wget unzip zip net-tools build-essential
sudo apt autoremove -y && sudo apt clean
sudo journalctl --vacuum-time=7d

⚙️ Service Management (Servis Yönetimi)

bash
sudo systemctl status nginx
sudo systemctl restart php8.3-fpm
sudo systemctl enable --now docker
sudo systemctl stop apache2

💻 XAMPP & PHP

bash
sudo /opt/lampp/lampp start
sudo /opt/lampp/lampp stop
sudo /opt/lampp/lampp restart
php -v && composer -V
php artisan serve
php artisan migrate
php artisan storage:link

🌐 Network & DNS

bash
ip a
nmcli connection show --active
sudo ss -ltnp | grep 3306
ping -c 4 1.1.1.1
dig google.com +short
sudo lockdns
sudo undodns

🐳 Docker & Compose

bash
docker ps -a
docker compose up -d
docker logs -n 50 mysql8
docker exec -it mysql8 bash
docker stop $(docker ps -q)

🐘 Databases (Veritabanı)

bash
mysql -u root -p
psql -U appuser -d appdb -c "\dt"
sqlcmd -S 127.0.0.1 -U sa -P 'Str0ng!Pass' -Q "SELECT name FROM sys.databases;"

🚀 Node.js, React, Angular

bash
npm install
npm run dev
npm run build
npx serve -s dist -l 3000
ng serve --open

🧩 Git & Version Control

bash
git status
git pull origin main
git add -A && git commit -m "Update"
git push origin main

🧱 Nginx & Logs

bash
sudo nginx -t
sudo systemctl reload nginx
sudo tail -n 50 /var/log/nginx/error.log

💾 Backup & Archive

bash
bash ~/DevProjects/07_Tools/scripts/backup.sh
tar -czf backup_$(date +%F).tar.gz ~/DevProjects/01_Laravel
unzip archive.zip -d ~/Desktop/unzipped

🧠 System Monitoring (Sistem Takibi)

bash
htop
df -h
du -sh *
free -h
uptime

🔹 Bu liste, Ubuntu geliştirici ortamında günlük işler için en pratik komutları içerir.
Gerektiğinde her satırı doğrudan terminale kopyalayıp çalıştırabilirsin.

2️⃣ Nginx Kurulum ve Konfigürasyon

Bu bolum Nginx web sunucusunun kurulumunu, reverse proxy yapilandirmasini, SSL entegrasyonunu ve performans optimizasyonlarini kapsar.


Nginx Kurulumu

bash
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx

# Dogrula
nginx -v
sudo systemctl status nginx
curl -I http://localhost

Reverse Proxy Ornekleri

Nginx'i farkli backend uygulamalari için reverse proxy olarak yapilandirabilirsiniz.

Node.js (Express / Next.js) için:

/etc/nginx/sites-available/node-app.conf:

nginx
server {
    listen 80;
    server_name node.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Laravel (PHP-FPM) için:

/etc/nginx/sites-available/laravel.conf:

nginx
server {
    listen 80;
    server_name laravel.example.com;
    root /var/www/laravel/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Django (Gunicorn) için:

/etc/nginx/sites-available/django.conf:

nginx
server {
    listen 80;
    server_name django.example.com;

    location /static/ {
        alias /var/www/django/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media/ {
        alias /var/www/django/media/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Site'i aktiflesitrmek için:

bash
sudo ln -s /etc/nginx/sites-available/APP.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

SSL - Let's Encrypt ve Certbot

bash
# Certbot kur
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# SSL sertifikasi al ve Nginx'e otomatik uygula
sudo certbot --nginx -d example.com -d www.example.com

# Yenileme testi
sudo certbot renew --dry-run

# Sertifika durumunu kontrol et
sudo certbot certificates

Certbot otomatik olarak su degisiklikleri yapar:

  • listen 443 ssl; satirini ekler
  • Sertifika yollarini yapilandirir
  • HTTP'den HTTPS'e yönlendirme kurar

Static File Serving ve Gzip Sikistirma

/etc/nginx/conf.d/performance.conf:

nginx
# Gzip sikistirma
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
    text/plain
    text/css
    text/javascript
    application/javascript
    application/json
    application/xml
    image/svg+xml
    font/woff2;

# Static dosya cache
server {
    # ... mevcut ayarlar ...

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
}

Server Block Yönetimi

bash
# Mevcut siteleri listele
ls /etc/nginx/sites-enabled/

# Default site'i devre disi birak
sudo rm /etc/nginx/sites-enabled/default

# Konfigurasyonu test et
sudo nginx -t

# Nginx'i yeniden yukle (baglantilari kesmeden)
sudo systemctl reload nginx

# Erisim ve hata loglarini kontrol et
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

3️⃣ Linux Terminal Komutları — English (Türkçe)

Updated 2025-11-06

🌍 This section provides dual-language explanations (English + Türkçe) for the most important Ubuntu terminal commands.
💡 Her komut, açıklamasıyla birlikte örneklerle gösterilmiştir.


🧭 1) pwd — Print Working Directory (Bulunduğun dizini göster)

bash
pwd

📂 2) ls — List Files (Dosyaları listele)

bash
ls -la        # Long + hidden (uzun liste + gizli dosyalar)
ls -lh        # Human readable size (insan okunur boyut)
ls -lt        # Sort by time (zamana göre sırala)

🔄 3) cd — Change Directory (Dizin değiştir)

bash
cd /etc
cd ..         # Parent (üst dizin)
cd -          # Previous directory (önceki dizin)

📄 4) cat, nl — Print File Content (Dosya içeriğini görüntüle)

bash
cat file.txt
nl file.txt   # With line numbers (satır numaralı)

📖 5) less — Page Through Text (Sayfa sayfa görüntüle)

bash
less /var/log/syslog
# q: quit (çık), /: search (ara), n: next (sonraki)

🪶 6) head, tail — View Start/End of Files (Dosya başı/sonu)

bash
head -n 20 file.log
tail -n 50 file.log
tail -f /var/log/syslog   # Follow live logs (canlı log izleme)

🧱 7) touch, mkdir, rmdir — Create/Remove Files & Folders

bash
touch notes.txt
mkdir -p projects/src    # -p: parent folders (ebeveynleri oluştur)
rmdir empty-dir

🧩 8) cp, mv, rm — Copy, Move, Delete (Kopyala, taşı, sil)

bash
cp source.txt dest.txt
cp -r src/ dst/           # Recursive (özyinelemeli)
mv old.txt new.txt        # Rename (yeniden adlandır)
rm file.txt
rm -rf build/             # Force remove (dikkatli kullan!)

🔍 9) find — Search Files (Dosya ara)

bash
find . -name "*.log"
find /var -type f -size +100M
find . -type f -mtime -1 -print   # Changed within 1 day (son 1 gün)

🧠 10) grep — Search in Text (Metin içinde ara)

bash
grep -R "ERROR" logs/
grep -i "php" /var/log/nginx/error.log

⚙️ 11) which, type — Locate Commands (Komutun konumunu göster)

bash
which php
type cd

🧾 12) echo & Redirection (Yönlendirme)

bash
echo "hello world" > file.txt     # Overwrite (üzerine yaz)
echo "append" >> file.txt         # Append (sona ekle)
command 1>out.log 2>err.log      # stdout/stderr ayrı kaydet

🔗 13) Pipes | — Chain Commands (Komut zinciri)

bash
journalctl -u nginx | grep -i error | less

🔐 14) sudo — Run as Root (Yönetici olarak çalıştır)

bash
sudo apt update
sudo -v          # Refresh credentials (kimliği yenile)

📦 15) apt — Package Manager (Paket yöneticisi)

bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl git build-essential
sudo apt autoremove && sudo apt clean

🧰 16) systemctl — Manage Services (Servisleri yönet)

bash
sudo systemctl status nginx
sudo systemctl restart docker
sudo systemctl enable --now php8.3-fpm

🧾 17) journalctl — View Logs (Günlükleri görüntüle)

bash
journalctl -u nginx --since "today"
journalctl -xe    # Last critical errors (son hatalar)

👤 18) User & Permission Management (Kullanıcı & izin)

bash
id
whoami
sudo usermod -aG docker $USER   # Add to docker group
chmod 644 file.txt
chmod -R 755 public/
chown user:group file.txt

🔧 19) ps, top, htop — Process Monitoring (Süreç takibi)

bash
ps aux | grep php
top
htop   # (daha okunur, kuruluysa)

💀 20) kill, pkill — Terminate Processes (Süreç sonlandır)

bash
kill -9 1234
pkill -f "php artisan serve"

🌍 21) Networking (Ağ işlemleri)

bash
ip a
ip r
ss -ltnp | grep 3306
ping -c 4 1.1.1.1
curl -I https://example.com

💽 22) Disk & File Systems (Disk ve dosya sistemleri)

bash
df -h        # Disk usage by filesystem
du -sh .     # Folder size
lsblk -f     # Block devices (disk listesi)
mount | column -t

🗜️ 23) Archives (Arşiv işlemleri)

bash
tar -czf site.tar.gz public/
tar -xzf site.tar.gz -C /tmp
zip -r site.zip public/
unzip site.zip -d /tmp/site

🔐 24) ssh, scp, rsync — Remote Operations (Uzak işlemler)

bash
ssh user@server
scp file.txt user@server:/tmp/
rsync -avz ./build/ user@server:/var/www/build/

🌎 25) wget, curl — Download/HTTP

bash
wget https://example.com/file.deb -O /tmp/file.deb
curl -L https://example.com/api | jq '.'

🌿 26) Environment Variables (Ortam değişkenleri)

bash
env | sort
export APP_ENV=local
printenv PATH

🧩 27) alias, history — Shortcuts & Command History

bash
alias ll='ls -alF'
unalias ll
history | tail -n 20

🔠 28) sed, awk, xargs — Text Processing

bash
grep -R "TODO" -n . | cut -d: -f1 | sort -u | xargs -r sed -n '1,5p'

💡 Bu bölüm Ubuntu terminalinde sık kullanılan tüm temel komutları içerir.
Her satır doğrudan terminale uygulanabilir.

4️⃣ Klavye Kısayolları — Terminal & VS Code

Updated 2025-11-06

⌨️ This section lists the most useful keyboard shortcuts for Ubuntu Terminal, Bash, and Visual Studio Code.
💡 Ubuntu Terminal, GNOME/KDE Terminal ve VS Code için en çok kullanılan kısayolları içerir.


🖥️ Bash / Terminal Shortcuts

KısayolAçıklama (Description)
Ctrl + A / Ctrl + ESatırın başına / sonuna git
Ctrl + U / Ctrl + KSatırın başını / sonunu sil
Ctrl + W / Alt + DÖnceki / sonraki kelimeyi sil
Alt + B / Alt + FBir kelime geri / ileri hareket
Ctrl + YSon silineni yapıştır
Ctrl + RKomut geçmişinde arama
Ctrl + LEkranı temizle
Ctrl + CMevcut komutu iptal et
Ctrl + ZKomutu askıya al (suspend)
fg / bgSüreci öne / arkaya al
Ctrl + DOturumdan çıkış

🪟 Terminal Emulator (GNOME / KDE)

KısayolAçıklama (Description)
Ctrl + Shift + C / Ctrl + Shift + VKopyala / Yapıştır
Ctrl + Shift + TYeni sekme aç
Ctrl + Shift + NYeni pencere aç
Ctrl + Shift + WSekmeyi kapat
Ctrl + Alt + TTerminali aç
Ctrl + Plus / Minus / 0Yakınlaştır / uzaklaştır / sıfırla

💻 Visual Studio Code Shortcuts

KısayolAçıklama (Description)
Ctrl + PDosya hızlı aç
Ctrl + S / Ctrl + Shift + SKaydet / Farklı kaydet
Ctrl + W / Ctrl + Shift + TSekmeyi kapat / Yeniden aç
Ctrl + Shift + OSembole git
Ctrl + GSatıra git
Ctrl + TabSekmeler arasında geçiş
Alt + ← / →Geri / ileri git
Alt + ↑ / ↓Satırı yukarı / aşağı taşı
Shift + Alt + ↑ / ↓Satırı çoğalt
Ctrl + /Yorum aç / kapat
Ctrl + Shift + KSatırı sil
Ctrl + `Terminal aç / kapat
Ctrl + Shift + `Yeni terminal
Ctrl + Shift + BBuild görevi çalıştır
F5 / Ctrl + F5Hata ayıklama / Çalıştır
Ctrl + BKenar çubuğunu aç / kapat
Ctrl + Shift + E / F / G / XExplorer / Search / Source Control / Extensions
Ctrl + K ZZen Mode (Odak modu)
Ctrl + ,Ayarlar
Ctrl + Shift + PKomut paleti
Ctrl + K Ctrl + SKısayollar menüsü

💡 Bu kısayollar hem Ubuntu terminalinde hem de VS Code'da üretkenliği büyük ölçüde artırır.
Özellikle Ctrl + R, Ctrl + Shift + T, ve Ctrl + ` kombinasyonlarını sık kullanman önerilir.

5️⃣ 🌐 DNS Lock & Restore Scripts — Ubuntu (DNS Kilitleme ve Geri Alma)

Updated 2025-11-06

🔧 Amaç: DNS ayarlarını kalıcı olarak (ör. 1.1.1.1 + 8.8.8.8) tanımlayıp, bozulma olursa tek komutla geri almak.
İki komut içerir: lockdns (kilitle) ve undodns (geri al).


🔒 1️⃣ DNS'i Kilitle — (Lock DNS: 1.1.1.1 + 8.8.8.8)

bash
sudo tee /usr/local/bin/lockdns >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
CONN="$(nmcli -t -f NAME connection show --active | head -n1)"
[ -z "${CONN:-}" ] && { echo "Aktif bağlantı yok."; exit 1; }

nmcli connection modify "$CONN" ipv4.ignore-auto-dns yes
nmcli connection modify "$CONN" ipv4.dns "1.1.1.1 8.8.8.8"

nmcli connection down "$CONN" && nmcli connection up "$CONN"
echo "✅ DNS kilitlendi -> 1.1.1.1 8.8.8.8 (Bağlantı: $CONN)"
resolvectl status | sed -n '1,80p' | sed -n '/Link/,$p' | head -n 40 || true
EOF

sudo chmod +x /usr/local/bin/lockdns

▶️ Çalıştırmak için:

bash
sudo lockdns

🔓 2️⃣ DNS'i Geri Al — (Undo DNS → DHCP Default)

bash
sudo tee /usr/local/bin/undodns >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
CONN="$(nmcli -t -f NAME connection show --active | head -n1)"
[ -z "${CONN:-}" ] && { echo "Aktif bağlantı yok."; exit 1; }

nmcli connection modify "$CONN" ipv4.ignore-auto-dns no
nmcli connection modify "$CONN" ipv4.dns ""
nmcli connection modify "$CONN" ipv4.dns-priority 0

sudo sed -i 's/^\s*DNS=.*/#DNS=/' /etc/systemd/resolved.conf || true
sudo sed -i 's/^\s*FallbackDNS=.*/#FallbackDNS=/' /etc/systemd/resolved.conf || true

systemctl restart systemd-resolved
nmcli connection down "$CONN" && nmcli connection up "$CONN"

echo "✅ DNS ayarları DHCP'ye geri alındı (Bağlantı: $CONN)"
resolvectl status | sed -n '1,80p' | sed -n '/Link/,$p' | head -n 40 || true
EOF

sudo chmod +x /usr/local/bin/undodns

▶️ Geri almak için:

bash
sudo undodns

💡 Notlar

  • Birden fazla ağ profili varsa, özel isimle uygulamak için:
    bash
    nmcli connection show
    sudo nmcli connection modify "Wi-Fi-Name" ipv4.ignore-auto-dns yes
    sudo nmcli connection modify "Wi-Fi-Name" ipv4.dns "1.1.1.1 8.8.8.8"
  • Bozulma durumunda önce sudo undodns, ardından istersen tekrar sudo lockdns çalıştır.
  • Scriptler /usr/local/bin dizininde bulunur, tüm kullanıcılar tarafından çağrılabilir.

🧠 Bu iki betik sayesinde ağ DNS ayarlarını tek satırla sıfırlayabilir veya sabitleyebilirsin.

6️⃣ 🧱 Project Folder Structure — One‑liner Setup (+ Backup Script)

Updated 2025-11-06

Tek komutla profesyonel bir proje klasör yapısı oluşturur.
Laravel, React, ASP.NET, Dokümantasyon, Yedekler, Configler ve Araçlar dahil.


🚀 Kurulum — Tek Satır Komut

bash
# Ana klasörü ve alt yapıyı oluştur
mkdir -p ~/DevProjects/{01_Laravel,02_React,03_ASP.NET,04_Docs,05_Backups/{databases,storage_uploads,full_project_zips},06_Configs/{.env_samples,nginx_apache_configs,php_ini_customs},07_Tools/{scripts,installers}} && echo "# Laravel projeleri buraya" > ~/DevProjects/01_Laravel/README.md && echo "# React / Next.js projeleri buraya" > ~/DevProjects/02_React/README.md && echo "# ASP.NET MVC projeleri buraya" > ~/DevProjects/03_ASP.NET/README.md && echo "# Markdown veya dokümantasyonlar buraya" > ~/DevProjects/04_Docs/README.md && echo "# Yedekler (DB, uploads, zipler)" > ~/DevProjects/05_Backups/README.md && echo "# Ortak yapılandırmalar (.env örnekleri, nginx, php.ini)" > ~/DevProjects/06_Configs/README.md && echo "# Scriptler, araçlar, kurulum dosyaları" > ~/DevProjects/07_Tools/README.md

💾 Otomatik Yedekleme Scripti (zip)

~/DevProjects/07_Tools/scripts/backup.sh dosyasını oluştur:

bash
cat <<'EOF' > ~/DevProjects/07_Tools/scripts/backup.sh
#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR=~/DevProjects/05_Backups/full_project_zips
SOURCE_DIR=~/DevProjects
DATE=$(date +"%Y-%m-%d_%H-%M")

mkdir -p "$BACKUP_DIR"
cd "$SOURCE_DIR"

zip -r "$BACKUP_DIR/dev_backup_$DATE.zip" 01_Laravel 02_React 03_ASP.NET 04_Docs 06_Configs \
  -x "*/node_modules/*" "*/vendor/*" "*/storage/framework/*"

echo "✅ Backup tamamlandı: $BACKUP_DIR/dev_backup_$DATE.zip"
EOF

chmod +x ~/DevProjects/07_Tools/scripts/backup.sh

▶️ Çalıştır

bash
bash ~/DevProjects/07_Tools/scripts/backup.sh

📂 Oluşacak Yapı (Özet)

~/DevProjects/
├── 01_Laravel/
├── 02_React/
├── 03_ASP.NET/
├── 04_Docs/
├── 05_Backups/
│   ├── databases/
│   ├── storage_uploads/
│   └── full_project_zips/
├── 06_Configs/
│   ├── .env_samples/
│   ├── nginx_apache_configs/
│   └── php_ini_customs/
└── 07_Tools/
    ├── scripts/
    │   └── backup.sh
    └── installers/

🧠 İpuçları

  • 05_Backups/databases: DB dökümleri (mysqldump, pg_dump, .bak) için.
  • 06_Configs: Ortak nginx site config, özel php.ini, .env örnekleri tut.
  • 07_Tools/installers: Sık kullandığın kurulum dosyaları (node, dotnet, mssql tools) için.

Bu yapı; projeleri düzenli tutar, yedekleri tek noktada toplar ve yeni makineye taşımayı kolaylaştırır.

7️⃣ 🛠️ Ubuntu Dev Setup & 🐳 Docker Environment

Updated 2025-11-06

Ubuntu 24.04+/25.10 üzerinde PHP, Composer, Laravel, Node.js, React, Angular, Git, Docker, .NET, MSSQL, Nginx kurulum ve kullanım rehberi.
Her alt başlıkta doğrulama komutları ve hızlı troubleshoot notları bulunur.


7.1 ✅ PHP 8.3 + Composer + Laravel

bash
# PHP temel paketler
sudo apt update
sudo apt install -y software-properties-common ca-certificates lsb-release apt-transport-https curl git unzip

# Ubuntu repo ile (örnek: 8.3)
sudo apt install -y php php-fpm php-cli php-mbstring php-xml php-curl php-zip php-intl php-bcmath php-gd

# Composer (resmi yükleyici)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php

# Laravel installer (opsiyonel)
composer global require laravel/installer
echo 'export PATH="$PATH:$HOME/.config/composer/vendor/bin"' >> ~/.bashrc && source ~/.bashrc

# Doğrula
php -v
composer -V
laravel --version || php artisan --version || true

Hızlı notlar (Laravel):

  • php artisan serve yerine prod'da Nginx + PHP-FPM kullan.
  • GD hatası için: sudo apt install php-gd && sudo systemctl reload php8.3-fpm.

7.2 ✅ Node.js (NVM), React (Vite), Angular CLI

bash
# NVM (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# LTS Node kurulumu
nvm install --lts
node -v && npm -v

# React (Vite) örnek
npm create vite@latest my-react-app -- --template react
cd my-react-app && npm install && npm run dev

# Angular CLI
npm install -g @angular/cli
ng version

Not: Vite dev server varsayılan 5173 portunda çalışır. Nginx reverse proxy için 7.5'e bak.


7.3 ✅ Git kurulumu ve temel ayarlar

bash
sudo apt install -y git
git --version

git config --global user.name "Fahri Aydın"
git config --global user.email "you@example.com"
git config --global core.autocrlf input
git config --global pull.rebase false

7.4 ✅ Docker Engine & Docker Compose

bash
# Önkoşullar
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release

# Docker repo anahtarı
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Repo ekle
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# sudo'suz kullanım
sudo usermod -aG docker $USER
newgrp docker <<<'refresh'

# Doğrula
docker version && docker compose version

7.5 ✅ Docker Compose — MySQL & PostgreSQL Stack

docker-compose.yml:

yaml
services:
  mysql:
    image: mysql:8.0
    container_name: mysql8
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: appdb
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  postgres:
    image: postgres:16
    container_name: pg16
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: rootpass
      POSTGRES_DB: appdb
      POSTGRES_USER: appuser
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data

volumes:
  mysql_data:
  pg_data:

Çalıştır:

bash
docker compose up -d
mysql -h 127.0.0.1 -uroot -prootpass -e "SHOW DATABASES;" || echo "mysql-client: sudo apt install mysql-client"
psql "postgresql://appuser:apppass@127.0.0.1:5432/appdb" -c "\l" || echo "psql: sudo apt install postgresql-client"

7.6 ✅ Microsoft SQL Server (Linux) — Docker

bash
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=Str0ng!Pass'   -p 1433:1433 --name mssql2022 --restart unless-stopped -d   mcr.microsoft.com/mssql/server:2022-latest

sqlcmd aracı:

bash
debver=$(. /etc/os-release && echo $VERSION_CODENAME)
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/keyrings/microsoft.asc >/dev/null
echo "deb [signed-by=/etc/apt/keyrings/microsoft.asc] https://packages.microsoft.com/ubuntu/$debver/prod $debver main" |   sudo tee /etc/apt/sources.list.d/microsoft-prod.list >/dev/null
sudo apt update && sudo apt install -y mssql-tools18 unixodbc-dev
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc && source ~/.bashrc

# Test
sqlcmd -S 127.0.0.1 -U sa -P 'Str0ng!Pass' -Q "SELECT @@VERSION;"

7.7 ✅ Nginx — Virtual Host Örnekleri

7.7.1 Laravel (PHP-FPM)/etc/nginx/sites-available/laravel.conf:

nginx
server {
  listen 80;
  server_name example.local;
  root /var/www/laravel/public;

  index index.php index.html;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock; # PHP sürümünüze göre güncelleyin
  }

  location ~ /\.(?!well-known).* { deny all; }
}

Aktifleştir:

bash
sudo ln -s /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

7.7.2 React/Vite Dev Proxy

nginx
server {
  listen 80;
  server_name app.local;
  location / {
    proxy_pass http://127.0.0.1:5173;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

7.7.3 ASP.NET (Kestrel) Reverse Proxy

nginx
server {
  listen 80;
  server_name dotnet.local;
  location / {
    proxy_pass http://127.0.0.1:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

7.8 ✅ .NET SDK & ASP.NET MVC (C#)

bash
debver=$(. /etc/os-release && echo $VERSION_CODENAME)
wget https://packages.microsoft.com/config/ubuntu/$debver/packages-microsoft-prod.deb -O /tmp/packages-microsoft-prod.deb
sudo dpkg -i /tmp/packages-microsoft-prod.deb
sudo apt update && sudo apt install -y dotnet-sdk-8.0

# İlk proje
mkdir -p ~/DevProjects/03_ASP.NET && cd $_
dotnet new mvc -n HelloMvc
cd HelloMvc
ASPNETCORE_URLS=http://0.0.0.0:5000 dotnet run
# Tarayıcı: http://localhost:5000

EF Core CLI (opsiyonel):

bash
dotnet tool install --global dotnet-ef
echo 'export PATH="$PATH:$HOME/.dotnet/tools"' >> ~/.bashrc && source ~/.bashrc

7.9 ✅ PM2 ile Node Servis Yönetimi

bash
sudo npm install -g pm2
pm2 start "npm --name my-react-app -- start" --cwd ~/DevProjects/02_React/my-react-app
pm2 status
pm2 save && pm2 startup systemd -u $USER --hp $HOME

7.10 🧪 Hızlı Troubleshoot

bash
# Portlar
ss -ltnp | egrep ':80|:443|:3000|:5000|:5173'

# Nginx testi
sudo nginx -t

# PHP-FPM soket
ls /run/php/ | grep fpm

# Docker günlükleri
docker ps -a
docker logs -n 100 <CONTAINER>

# Node izin sorunları (global)
sudo chown -R $USER:$USER ~/.npm ~/.config

# Laravel cache
php artisan config:cache
php artisan route:cache || true

✅ Bu bölümle Ubuntu üzerinde modern bir full‑stack ortamı (PHP/Laravel + Node/React/Angular + Docker + .NET + MSSQL + Nginx) kurup çalıştırabilirsiniz.

8️⃣ Servis Yönetimi — systemd Detayli

Bu bolum systemd servis yönetimi, custom servis dosyasi oluşturma ve journalctl ile log inceleme konularini kapsar.


systemctl Temel Komutları

bash
# Servis durumu sorgulama
sudo systemctl status nginx
sudo systemctl status php8.3-fpm

# Servisi baslatma, durdurma, yeniden baslatma
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx      # Tamamen durdurup baslatir
sudo systemctl reload nginx       # Konfigurasyonu yeniden yukler (downtime yok)

# Servisin boot'ta otomatik baslamasini saglama
sudo systemctl enable nginx
sudo systemctl disable nginx
sudo systemctl enable --now nginx  # Hem enable hem start

# Tum servisleri listeleme
systemctl list-units --type=service --state=running
systemctl list-units --type=service --state=failed

# Servis dosyasinin konumunu gorme
systemctl show -p FragmentPath nginx

# Servisi maskele (baslatmayi tamamen engelle)
sudo systemctl mask apache2
sudo systemctl unmask apache2

Custom Service Dosyasi Oluşturma

Kendi uygulamanizi systemd servisi olarak calistirmak için bir unit dosyasi olusturun.

Örnek: Node.js uygulamasi için /etc/systemd/system/node-app.service:

ini
[Unit]
Description=Node.js Web Uygulamasi
After=network.target

[Service]
Type=simple
User=deployer
Group=www-data
WorkingDirectory=/var/www/node-app
ExecStart=/usr/bin/node /var/www/node-app/server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Servisi aktiflesitrmek:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now node-app
sudo systemctl status node-app

Örnek: Python/Django (Gunicorn) için /etc/systemd/system/django-app.service:

ini
[Unit]
Description=Django Gunicorn Servisi
After=network.target

[Service]
Type=notify
User=deployer
Group=www-data
WorkingDirectory=/var/www/django-app
ExecStart=/var/www/django-app/venv/bin/gunicorn \
    --workers 3 \
    --bind unix:/run/gunicorn.sock \
    myproject.wsgi:application
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

journalctl ile Log Inceleme

bash
# Belirli bir servisin loglarini gor
journalctl -u nginx
journalctl -u node-app --since "1 hour ago"
journalctl -u node-app --since "2025-01-01" --until "2025-01-02"

# Son N satir
journalctl -u nginx -n 100

# Canli log takibi (tail -f gibi)
journalctl -u node-app -f

# Hata oncelikli loglar
journalctl -u nginx -p err
journalctl -p crit --since today

# Tum boot loglarini gor
journalctl -b         # Mevcut boot
journalctl -b -1      # Onceki boot

# Disk kullanimini gor ve temizle
journalctl --disk-usage
sudo journalctl --vacuum-time=7d    # 7 gunden eski loglari sil
sudo journalctl --vacuum-size=500M  # 500 MB'nin ustundeki loglari sil

8️⃣-b 🔒 SSL (Let's Encrypt + Nginx)

Updated 2025-11-06

Ubuntu 24.04+ / 25.10 için Let's Encrypt kullanarak ücretsiz SSL sertifikası kurulum rehberi.
certbot aracını kullanarak Nginx yapılandırmasını otomatik olarak düzenler.


🔧 8.1 Certbot Kurulumu (Snap ile önerilen yöntem)

bash
sudo apt update
sudo apt install -y snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Doğrula:

bash
certbot --version

🌐 8.2 Nginx Konfigürasyon Kontrolü

server_name satırı doğru ayarlanmış olmalı (örn. example.com, www.example.com)

bash
sudo nginx -t && sudo systemctl reload nginx

Örnek /etc/nginx/sites-available/example.conf:

server {
  listen 80;
  server_name example.com www.example.com;
  root /var/www/html;
  index index.php index.html;
}

🔑 8.3 SSL Sertifikası Alma ve Nginx'e Uygulama

bash
sudo certbot --nginx -d example.com -d www.example.com

Bu komut otomatik olarak:

  • SSL sertifikasını indirir (/etc/letsencrypt/live/example.com/)
  • Nginx yapılandırmasını günceller (listen 443 ssl; ekler)
  • HTTP → HTTPS yönlendirmesini ekler

🧪 8.4 Sertifika Yenileme (Otomatik Yenileme Testi)

bash
sudo certbot renew --dry-run

Bu komut yenileme işlemini simüle eder. Gerçek yenileme systemd veya cron ile otomatik yapılır.


🧩 8.5 Wildcard (Alt Alan Adı) Sertifika (DNS Challenge)

Wildcard sertifikalar için manuel DNS kaydı gerekir:

bash
sudo certbot -d "*.example.com" -d example.com --manual --preferred-challenges dns certonly

Komut, TXT kaydını DNS paneline girmeni ister. Doğrulama tamamlanınca sertifika /etc/letsencrypt/live/example.com/ dizininde oluşturulur.

⚠️ Wildcard sertifikalarda --manual yöntemiyle otomatik yenileme yapılamaz.


🔄 8.6 Sertifikayı Yenileme ve Nginx Yeniden Başlatma

bash
sudo certbot renew
sudo systemctl reload nginx

🧠 8.7 Sertifika Durumunu Görüntüleme

bash
sudo certbot certificates

Çıktı örneği:

Certificate Name: example.com
    Domains: example.com www.example.com
    Expiry Date: 2025-02-05 08:00:00+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

🧩 8.8 HTTP → HTTPS Yönlendirmesi (Elle)

Nginx dosyasına ekle:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

✅ Let's Encrypt sertifikaları 90 gün geçerlidir. Certbot otomatik olarak yeniler.
🔒 Sertifikalar /etc/letsencrypt/live/ dizininde bulunur.

9️⃣ 🚀 CI/CD — GitHub Actions (Laravel + React/Angular + Docker)

Production'a otomatik deploy etmek için GitHub Actions örnekleri.
Laravel (PHP 8.3), React/Angular (static build), Docker (GHCR) senaryoları ve gerekli Secrets listesi dahildir.


🔐 Gerekli Secrets (Repository → Settings → Secrets and variables → Actions)

  • SSH_HOST — Sunucu IP/hostname
  • SSH_USER — Sunucu kullanıcı adı (deploy user)
  • SSH_PORT — SSH port (default: 22)
  • SSH_KEY — Private key (PEM, tek satır base64 değil; doğrudan metin)
  • REMOTE_PATH — Laravel projesinin sunucudaki yolu (örn. /var/www/laravel)
  • FRONT_REMOTE_PATH — Frontend build'in atılacağı yol (örn. /var/www/app/public)
  • (Docker için) CR_PAT — GitHub Container Registry Personal Access Token

İpucu: Private key'i oluşturmak için: ssh-keygen -t ed25519 -C "deployer"


🟦 9.1 Laravel — SSH/Rsync Deploy Pipeline

.github/workflows/deploy-laravel.yml

yaml
name: Deploy Laravel
on:
  push:
    branches: ["main"]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: "8.3"
          extensions: mbstring, intl, xml, curl, zip, bcmath, gd
          coverage: none

      - name: Cache composer
        uses: actions/cache@v4
        with:
          path: vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

      - name: Install dependencies
        run: composer install --no-dev --prefer-dist --no-progress --no-interaction

      - name: (Optional) Build assets with Vite
        run: |
          npm ci || true
          npm run build || true

      - name: Rsync to server
        uses: burnett01/rsync-deployments@5.2
        with:
          switches: -avz --delete --exclude='.git' --exclude='node_modules' --exclude='storage/framework/*' --exclude='.env'
          path: ./
          remote_path: ${{ secrets.REMOTE_PATH }}
          remote_host: ${{ secrets.SSH_HOST }}
          remote_user: ${{ secrets.SSH_USER }}
          remote_key: ${{ secrets.SSH_KEY }}
          remote_port: ${{ secrets.SSH_PORT }}

      - name: Remote post-deploy (composer, cache, migrate)
        uses: appleboy/ssh-action@v1.1.0
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            cd ${{ secrets.REMOTE_PATH }}
            composer install --no-dev --prefer-dist --no-interaction
            php artisan storage:link || true
            php artisan config:cache
            php artisan route:cache || true
            php artisan migrate --force
            sudo systemctl reload php8.3-fpm || true
            sudo systemctl reload nginx || true

Sunucuda önkoşul: Nginx + PHP-FPM hazır olmalı; .env dosyan sunucuda bulunmalı (repo'ya konmaz).


🟨 9.2 Frontend (React/Angular) — Static Build + Rsync

.github/workflows/deploy-frontend.yml

yaml
name: Deploy Frontend
on:
  push:
    branches: ["main"]
    paths:
      - "frontend/**"
      - ".github/workflows/deploy-frontend.yml"

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: "lts/*"
          cache: "npm"
          cache-dependency-path: "**/package-lock.json"

      - name: Install & Build
        working-directory: ./frontend
        run: |
          npm ci
          npm run build

      - name: Upload dist to server
        uses: burnett01/rsync-deployments@5.2
        with:
          switches: -avz --delete
          path: frontend/dist/
          remote_path: ${{ secrets.FRONT_REMOTE_PATH }}
          remote_host: ${{ secrets.SSH_HOST }}
          remote_user: ${{ secrets.SSH_USER }}
          remote_key: ${{ secrets.SSH_KEY }}
          remote_port: ${{ secrets.SSH_PORT }}

Nginx statik dosyaları FRONT_REMOTE_PATH içinden servis etmeli (örn. /var/www/app/public).


🟩 9.3 Docker — Build & Push (GitHub Container Registry)

.github/workflows/docker-build-push.yml

yaml
name: Docker Build & Push
on:
  push:
    branches: ["main"]
    paths:
      - "Dockerfile"
      - ".github/workflows/docker-build-push.yml"
      - "src/**"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Login to GHCR
        run: echo $CR_PAT | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
        env:
          CR_PAT: ${{ secrets.CR_PAT }}

      - name: Build image
        run: docker build -t ghcr.io/${{ github.repository }}:latest .

      - name: Push image
        run: docker push ghcr.io/${{ github.repository }}:latest

Sunucuda güncelleme:

bash
docker compose pull && docker compose up -d

🧪 9.4 Test Matrix (Opsiyonel)

.github/workflows/test-matrix.yml

yaml
name: CI Tests
on:
  pull_request:
    branches: ["main"]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: "8.3"
      - run: composer install --no-interaction --prefer-dist
      - run: php artisan test --no-interaction

  eslint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "lts/*"
      - run: npm ci
      - run: npm run lint

🧯 9.5 Troubleshoot (Hızlı Çözümler)

  • Rsync permission deniedREMOTE_PATH yazılabilir mi? chown -R deployer:www-data ve chmod -R 775 deneyin.
  • Composer memoryCOMPOSER_MEMORY_LIMIT=-1 ile tekrar deneyin.
  • SSH key format → PEM formatında, parolasız private key; public key sunucuda ~/.ssh/authorized_keys.
  • Nginx cache → Deploy sonrası sudo systemctl reload nginx.
  • Node build fail → Node sürümü ile proje sürümü uyumlu mu (nvm use --lts)?
  • Docker login → GHCR için CR_PAT scope: read:packages, write:packages.

🧠 Öneri: main branch → otomatik staging; prod tag → prod deploy (iki ayrı workflow ile).
İstersen Blue/Green veya Zero‑Downtime stratejisini de ekleyebilirim.

🔟 🧳 Backup & Restore — Databases + Files + Cron

Updated 2025-11-06

Bu bölümde veritabanı (MySQL, PostgreSQL, MSSQL) ve dosya yedeklemelerini otomatik hale getirme adımları yer alır.
Ayrıca cron job ile zamanlanmış yedekleme örnekleri bulunur.


💾 10.1 MySQL Dump (Database Yedeği)

bash
mkdir -p ~/DevProjects/05_Backups/databases

# Tek DB
mysqldump -u root -p appdb > ~/DevProjects/05_Backups/databases/appdb_$(date +%F).sql

# Tüm DB'ler
mysqldump -u root -p --all-databases > ~/DevProjects/05_Backups/databases/all_dbs_$(date +%F).sql

# Sıkıştırılmış (gzip)
mysqldump -u root -p appdb | gzip > ~/DevProjects/05_Backups/databases/appdb_$(date +%F).sql.gz

Geri Yükleme (Restore):

bash
mysql -u root -p appdb < appdb_2025-11-07.sql
gunzip < appdb_2025-11-07.sql.gz | mysql -u root -p appdb

🐘 10.2 PostgreSQL Dump

bash
pg_dump -U appuser appdb > ~/DevProjects/05_Backups/databases/appdb_pg_$(date +%F).sql

# Geri yükleme
psql -U appuser -d appdb -f ~/DevProjects/05_Backups/databases/appdb_pg_2025-11-07.sql

Tüm DB'ler için:

bash
pg_dumpall -U postgres | gzip > ~/DevProjects/05_Backups/databases/pg_all_$(date +%F).sql.gz

🧩 10.3 MSSQL Backup (sqlcmd)

bash
sqlcmd -S 127.0.0.1 -U sa -P 'Str0ng!Pass' -Q "BACKUP DATABASE [appdb] TO DISK='/var/opt/mssql/backups/appdb_$(date +%F).bak'"

Restore (geri yükleme):

bash
sqlcmd -S 127.0.0.1 -U sa -P 'Str0ng!Pass' -Q "RESTORE DATABASE [appdb] FROM DISK='/var/opt/mssql/backups/appdb_2025-11-07.bak' WITH REPLACE"

🗂️ 10.4 File Backup (Full Project Zip)

bash
cd ~/DevProjects
tar -czf ~/DevProjects/05_Backups/full_project_zips/dev_full_$(date +%F).tar.gz 01_Laravel 02_React 03_ASP.NET 04_Docs 06_Configs   --exclude="*/node_modules/*" --exclude="*/vendor/*" --exclude="*/storage/framework/*"

Geri açmak için:

bash
tar -xzf ~/DevProjects/05_Backups/full_project_zips/dev_full_2025-11-07.tar.gz -C ~/RestoreTest/

⏰ 10.5 Cron ile Otomatik Yedekleme

bash
crontab -e

Günde 1 kez saat 02:00'de yedekleme:

0 2 * * * bash ~/DevProjects/07_Tools/scripts/backup.sh >> ~/DevProjects/05_Backups/backup.log 2>&1

Her Pazar tam sistem yedeği:

0 3 * * 0 tar -czf ~/DevProjects/05_Backups/system_$(date +\%F).tar.gz /etc /var/www /home

☁️ 10.6 Harici Disk / Drive Senkronizasyonu

Google Drive veya rclone ile uzak yedekleme:

bash
sudo apt install -y rclone
rclone config

# Manuel test
rclone copy ~/DevProjects/05_Backups remote:ubuntu_backups --progress

# Cron ekle
0 6 * * * rclone sync ~/DevProjects/05_Backups remote:ubuntu_backups --progress

🧠 10.7 Ekstra: Docker Volume Backup

bash
docker run --rm -v mysql_data:/data -v $(pwd):/backup ubuntu   tar -czf /backup/mysql_volume_$(date +%F).tar.gz /data

Geri yükleme:

bash
docker run --rm -v mysql_data:/data -v $(pwd):/backup ubuntu   tar -xzf /backup/mysql_volume_2025-11-07.tar.gz -C /data

✅ Bu otomasyonlarla birlikte veritabanı, dosya ve sistem yedeklerini düzenli aralıklarla saklayabilir, gerektiğinde hızlıca geri yükleyebilirsin.

1️⃣1️⃣ Log Yönetimi

Sistem ve uygulama loglarini etkin bir sekilde yonetmek sunucu sagligi acisindan kritiktir.


journalctl Detayli Kullanım

bash
# Tum sistem loglarini gor
journalctl

# Belirli servis loglari
journalctl -u nginx --no-pager
journalctl -u php8.3-fpm -n 50

# Zaman araligina gore filtreleme
journalctl --since "2025-01-01 00:00:00" --until "2025-01-02 00:00:00"
journalctl --since "30 min ago"
journalctl --since today

# Oncelik seviyesine gore filtreleme
## 0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug
journalctl -p err                  # Sadece error ve ustu
journalctl -p warning -u nginx     # Nginx warning ve ustu

# Kernel mesajlari
journalctl -k
journalctl -k -b -1    # Onceki boot'un kernel loglari

# JSON formatinda cikti
journalctl -u nginx -o json-pretty -n 5

# Canli takip
journalctl -u node-app -f

/var/log/ Dizin Yapisi

Önemli log dosyaları ve ne ise yaradiklari:

bash
# Sistem loglari
/var/log/syslog          # Genel sistem mesajlari
/var/log/auth.log        # Kimlik dogrulama (SSH giris, sudo kullanimi)
/var/log/kern.log        # Kernel mesajlari
/var/log/dmesg           # Boot sirasindaki donanim mesajlari
/var/log/dpkg.log        # Paket kurulum/kaldirma gecmisi
/var/log/apt/history.log # apt islemleri gecmisi

# Uygulama loglari
/var/log/nginx/access.log   # Nginx erisim loglari
/var/log/nginx/error.log    # Nginx hata loglari
/var/log/mysql/error.log    # MySQL hata loglari

# Loglari inceleme
sudo tail -f /var/log/auth.log          # SSH girislerini canli izle
sudo grep "Failed password" /var/log/auth.log | tail -20
sudo less /var/log/syslog

logrotate Konfigurasyonu

logrotate, log dosyalarinin kontolsuz buyumesini onler. Otomatik olarak dosyaları dondurur, sikistirir ve eski olanlari siler.

Varsayılan konfigürasyon: /etc/logrotate.conf

Örnek: Nginx loglari için ozel ayar /etc/logrotate.d/nginx-custom:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

Örnek: Uygulama loglari için /etc/logrotate.d/app-logs:

/var/www/*/storage/logs/*.log {
    weekly
    missingok
    rotate 8
    compress
    delaycompress
    notifempty
    create 0644 www-data www-data
}

logrotate'i manuel calistirma ve test:

bash
# Kuru calistirma (degisiklik yapmaz, sadece gosterir)
sudo logrotate -d /etc/logrotate.conf

# Zorla calistir
sudo logrotate -f /etc/logrotate.conf

# Belirli bir dosya icin test
sudo logrotate -d /etc/logrotate.d/nginx-custom

1️⃣2️⃣ Monitoring (Sistem İzleme)

Sunucu performansini izlemek için kullanilan temel araclar ve komutlar.


CPU ve Bellek İzleme

bash
# htop - interaktif surec izleyici
sudo apt install -y htop
htop
# F6: siralama, F5: agac gorunumu, F9: surec sonlandirma, q: cikis

# btop - modern alternatif (daha gorsel)
sudo apt install -y btop
btop

# free - bellek kullanimi ozeti
free -h
free -h -s 5    # Her 5 saniyede guncelle

# vmstat - CPU, bellek, I/O, sistem istatistikleri
vmstat 2 10     # Her 2 saniyede, 10 kez goster
# Onemli sutunlar:
#   r  = calismayi bekleyen surec sayisi
#   si/so = swap in/out (yuksekse RAM yetersiz)
#   us = user CPU, sy = system CPU, id = idle

Disk I/O İzleme

bash
# iostat - disk I/O istatistikleri
sudo apt install -y sysstat
iostat -xz 2    # Her 2 saniyede detayli disk I/O
# Onemli metrikler:
#   %util  = diskin ne kadar mesgul oldugu (>80% sorunlu)
#   await  = ortalama I/O bekleme suresi (ms)
#   r/s, w/s = saniyedeki okuma/yazma sayisi

# iotop - hangi surec ne kadar disk I/O yapiyor
sudo apt install -y iotop
sudo iotop -o   # Sadece aktif I/O yapan surecleri goster
sudo iotop -a   # Kumulatif I/O goster

Ag İzleme

bash
# nethogs - hangi surec ne kadar bant genisligi kullaniyor
sudo apt install -y nethogs
sudo nethogs          # Varsayilan ag arayuzunde izle
sudo nethogs eth0     # Belirli arayuz

# ss - baglanti ve port bilgileri (netstat yerine)
ss -ltnp              # Dinleyen TCP portlari
ss -s                 # Baglanti ozeti istatistikleri

# Basit bant genisligi testi
sudo apt install -y iperf3
# Sunucuda: iperf3 -s
# Istemcide: iperf3 -c SUNUCU_IP

Genel Sistem Durumu

bash
# uptime ve yuk ortalamasi
uptime
# load average: 0.5, 0.3, 0.2  (1dk, 5dk, 15dk)
# CPU cekirdek sayisinin altinda olmali

# Disk kullanimi
df -h             # Dosya sistemi kullanimi
df -ih            # Inode kullanimi (dosya sayisi limiti)

# Klasor boyutlari
du -sh /var/log/
du -sh /var/www/*

# ncdu - interaktif disk kullanim analizi
sudo apt install -y ncdu
ncdu /             # Kok dizinden baslayarak analiz et
ncdu /var/log      # Belirli dizini analiz et

1️⃣3️⃣ Güvenlik Detayli

Sunucu guvenligini saglamak için uygulanmasi gereken temel adimlar.


UFW Firewall Kurallari

bash
# UFW'yi kur ve etkinlestir
sudo apt install -y ufw

# Varsayilan politikalar
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Temel portlari ac
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# Belirli IP'den erisime izin ver
sudo ufw allow from 192.168.1.100 to any port 3306 comment 'MySQL belirli IP'

# Belirli bir subnetten erisim
sudo ufw allow from 10.0.0.0/24 to any port 5432 comment 'PostgreSQL yerel ag'

# Port araligini ac
sudo ufw allow 8000:8100/tcp comment 'Uygulama portlari'

# Kurali sil
sudo ufw status numbered
sudo ufw delete 5          # 5 numarali kurali sil

# UFW'yi etkinlestir
sudo ufw enable

# Durum kontrolu
sudo ufw status verbose

fail2ban Konfigurasyonu

fail2ban, tekrarlayan basarisiz giriş denemelerini tespit edip IP'leri otomatik olarak engeller.

bash
# Kurulum
sudo apt install -y fail2ban

# Konfigurasyonu kopyala (jail.local dosyasini olustur, jail.conf'u degistirme)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

/etc/fail2ban/jail.local dosyasinda su ayarlari yapin:

ini
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = ufw

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h

[nginx-http-auth]
enabled  = true
port     = http,https
filter   = nginx-http-auth
logpath  = /var/log/nginx/error.log
maxretry = 5

[nginx-limit-req]
enabled  = true
port     = http,https
filter   = nginx-limit-req
logpath  = /var/log/nginx/error.log
maxretry = 10
findtime = 1m
bantime  = 1h

fail2ban yönetim komutları:

bash
# Servisi baslat
sudo systemctl enable --now fail2ban

# Durum kontrolu
sudo fail2ban-client status
sudo fail2ban-client status sshd

# Belirli bir IP'yi engellemeyi kaldir
sudo fail2ban-client set sshd unbanip 203.0.113.50

# Yasakli IP'leri listele
sudo fail2ban-client get sshd banned

SSH Hardening (sshd_config)

/etc/ssh/sshd_config dosyasinda su degisiklikleri yapin:

bash
# SSH portunu degistir (opsiyonel ama onerilen)
Port 2222

# Root girisini devre disi birak
PermitRootLogin no

# Parola ile girisi kapat (sadece key-based)
PasswordAuthentication no
PubkeyAuthentication yes

# Bos parola ile girisi engelle
PermitEmptyPasswords no

# X11 forwarding kapat
X11Forwarding no

# Maksimum giris denemesi
MaxAuthTries 3

# Bos oturum zaman asimi (300 saniye = 5 dakika)
ClientAliveInterval 300
ClientAliveCountMax 2

# Sadece belirli kullanicilara izin ver
AllowUsers deployer admin

Degisiklikleri uygula:

bash
# Konfigurasyonu test et
sudo sshd -t

# SSH servisini yeniden baslat
sudo systemctl restart sshd

# UFW'de yeni portu ac (port degistirdiyseniz)
sudo ufw allow 2222/tcp comment 'SSH yeni port'
sudo ufw delete allow 22/tcp

Otomatik Güvenlik Guncellemeleri (unattended-upgrades)

bash
# Kur
sudo apt install -y unattended-upgrades apt-listchanges

# Etkinlestir
sudo dpkg-reconfigure -plow unattended-upgrades

/etc/apt/apt.conf.d/50unattended-upgrades dosyasinda önemli ayarlar:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
};

// Kullanilmayan bagimliliklari otomatik kaldir
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Gerekirse otomatik yeniden baslat
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

Doğrulama:

bash
sudo unattended-upgrade --dry-run --debug

AppArmor

AppArmor, uygulamalarin erisebilecegi kaynaklari kisitlayan zorunlu erişim kontrol sistemidir.

bash
# Durum kontrolu
sudo apparmor_status
sudo aa-status

# Profilleri listele
sudo ls /etc/apparmor.d/

# Belirli bir profili enforce moduna al
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

# Profili complain moduna al (sadece loglar, engellemez)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

# Servisi yeniden baslat
sudo systemctl restart apparmor

Root Hesabini Devre Disi Birakma

bash
# Root parolasini kilitle
sudo passwd -l root

# Root girisi durumunu kontrol et
sudo passwd -S root
# Cikti: root L ... (L = locked)

# Gerekirse geri ac (acil durumlar icin)
sudo passwd -u root

1️⃣4️⃣ İpuçları ve Verimlilik (Tips)

Gunluk calismayi hizlandiran araclar ve kisayollar.


tmux - Terminal Multiplexer

tmux ile tek bir SSH bagantisinda birden fazla terminal oturumu yonetebilirsiniz. Bağlantı kopsa bile oturumlar devam eder.

bash
# Kurulum
sudo apt install -y tmux

# Yeni oturum baslat
tmux new -s myproject

# Temel kisayollar (prefix: Ctrl+B)
# Ctrl+B, d     -> Oturumdan ayril (detach)
# Ctrl+B, c     -> Yeni pencere
# Ctrl+B, n/p   -> Sonraki/onceki pencere
# Ctrl+B, %     -> Dikey bol
# Ctrl+B, "     -> Yatay bol
# Ctrl+B, o     -> Paneller arasi gecis
# Ctrl+B, x     -> Paneli kapat
# Ctrl+B, [     -> Scroll modu (q ile cik)

# Oturumlari listele
tmux ls

# Oturuma geri baglan
tmux attach -t myproject

# Oturumu sonlandir
tmux kill-session -t myproject

screen alternatifi (daha basit):

bash
sudo apt install -y screen
screen -S mywork       # Yeni oturum
# Ctrl+A, d            -> Detach
screen -r mywork       # Geri baglan
screen -ls             # Oturumlari listele

Faydali Terminal Komutları

bash
# ncdu - interaktif disk kullanim analizi
sudo apt install -y ncdu
ncdu /var/log

# sudo !! - son komutu sudo ile tekrar calistir
apt update        # Permission denied!
sudo !!           # sudo apt update olarak calisir

# Ctrl+R - komut gecmisinde arama
# Ctrl+R yazinca arama moduna girersiniz
# Aradiginiz komutu yazmaya baslayin
# Ctrl+R ile sonraki eslesmye gecin
# Enter ile calistirin, Esc ile iptal edin

# Son komutun argumanlariyla calis
ls /var/www/html
cd !$             # cd /var/www/html

# Klasor boyutlarini sirali goster
du -sh /var/www/* | sort -rh | head -20

# Dosya icinde hizli arama ve degistirme
grep -rn "eski_deger" /var/www/ --include="*.conf"
sed -i 's/eski_deger/yeni_deger/g' /etc/nginx/sites-available/app.conf

# watch - komutu periyodik calistir
watch -n 2 'df -h'           # Her 2 saniyede disk durumu
watch -n 5 'docker ps'       # Her 5 saniyede container durumu

# Buyuk dosyalari bul
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20

Bu ipuclari ile terminal verimliligini önemli olcude artirabilirsiniz. Ozellikle tmux ve Ctrl+R kombinasyonlari uzak sunucu yonetiminde vazgecilmezdir.


Ilgili Rehberler

DevOps & Tools

Diger Kategoriler

Developer Guides & Technical References