🐧 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:
# Yeni kullanici olustur
adduser deployer
# Sudo grubuna ekle
usermod -aG sudo deployer
# Kullaniciya gec ve test et
su - deployer
sudo whoami # root donmeliSSH Key ile Giriş
Parola ile SSH erisimini kapatmadan once key-based authentication yapilandirin:
# 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_keysHostname, Timezone ve Locale
# 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-8Swap Alani Oluşturma
Ozellikle düşük RAM'li sunucularda (1-2 GB) swap olusturmak onemlidir:
## 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 --showTemel Paketleri Kur
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)
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)
sudo systemctl status nginx
sudo systemctl restart php8.3-fpm
sudo systemctl enable --now docker
sudo systemctl stop apache2💻 XAMPP & PHP
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
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
docker ps -a
docker compose up -d
docker logs -n 50 mysql8
docker exec -it mysql8 bash
docker stop $(docker ps -q)🐘 Databases (Veritabanı)
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
npm install
npm run dev
npm run build
npx serve -s dist -l 3000
ng serve --open🧩 Git & Version Control
git status
git pull origin main
git add -A && git commit -m "Update"
git push origin main🧱 Nginx & Logs
sudo nginx -t
sudo systemctl reload nginx
sudo tail -n 50 /var/log/nginx/error.log💾 Backup & Archive
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)
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
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
# Dogrula
nginx -v
sudo systemctl status nginx
curl -I http://localhostReverse 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:
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:
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:
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:
sudo ln -s /etc/nginx/sites-available/APP.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxSSL - Let's Encrypt ve Certbot
# 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 certificatesCertbot 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:
# 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
# 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.log3️⃣ 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)
pwd📂 2) ls — List Files (Dosyaları listele)
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)
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)
cat file.txt
nl file.txt # With line numbers (satır numaralı)📖 5) less — Page Through Text (Sayfa sayfa görüntüle)
less /var/log/syslog
# q: quit (çık), /: search (ara), n: next (sonraki)🪶 6) head, tail — View Start/End of Files (Dosya başı/sonu)
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
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)
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)
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)
grep -R "ERROR" logs/
grep -i "php" /var/log/nginx/error.log⚙️ 11) which, type — Locate Commands (Komutun konumunu göster)
which php
type cd🧾 12) echo & Redirection (Yönlendirme)
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)
journalctl -u nginx | grep -i error | less🔐 14) sudo — Run as Root (Yönetici olarak çalıştır)
sudo apt update
sudo -v # Refresh credentials (kimliği yenile)📦 15) apt — Package Manager (Paket yöneticisi)
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)
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)
journalctl -u nginx --since "today"
journalctl -xe # Last critical errors (son hatalar)👤 18) User & Permission Management (Kullanıcı & izin)
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)
ps aux | grep php
top
htop # (daha okunur, kuruluysa)💀 20) kill, pkill — Terminate Processes (Süreç sonlandır)
kill -9 1234
pkill -f "php artisan serve"🌍 21) Networking (Ağ işlemleri)
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)
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)
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)
ssh user@server
scp file.txt user@server:/tmp/
rsync -avz ./build/ user@server:/var/www/build/🌎 25) wget, curl — Download/HTTP
wget https://example.com/file.deb -O /tmp/file.deb
curl -L https://example.com/api | jq '.'🌿 26) Environment Variables (Ortam değişkenleri)
env | sort
export APP_ENV=local
printenv PATH🧩 27) alias, history — Shortcuts & Command History
alias ll='ls -alF'
unalias ll
history | tail -n 20🔠 28) sed, awk, xargs — Text Processing
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ısayol | Açıklama (Description) |
|---|---|
| Ctrl + A / Ctrl + E | Satırın başına / sonuna git |
| Ctrl + U / Ctrl + K | Satırın başını / sonunu sil |
| Ctrl + W / Alt + D | Önceki / sonraki kelimeyi sil |
| Alt + B / Alt + F | Bir kelime geri / ileri hareket |
| Ctrl + Y | Son silineni yapıştır |
| Ctrl + R | Komut geçmişinde arama |
| Ctrl + L | Ekranı temizle |
| Ctrl + C | Mevcut komutu iptal et |
| Ctrl + Z | Komutu askıya al (suspend) |
| fg / bg | Süreci öne / arkaya al |
| Ctrl + D | Oturumdan çıkış |
🪟 Terminal Emulator (GNOME / KDE)
| Kısayol | Açıklama (Description) |
|---|---|
| Ctrl + Shift + C / Ctrl + Shift + V | Kopyala / Yapıştır |
| Ctrl + Shift + T | Yeni sekme aç |
| Ctrl + Shift + N | Yeni pencere aç |
| Ctrl + Shift + W | Sekmeyi kapat |
| Ctrl + Alt + T | Terminali aç |
| Ctrl + Plus / Minus / 0 | Yakınlaştır / uzaklaştır / sıfırla |
💻 Visual Studio Code Shortcuts
| Kısayol | Açıklama (Description) |
|---|---|
| Ctrl + P | Dosya hızlı aç |
| Ctrl + S / Ctrl + Shift + S | Kaydet / Farklı kaydet |
| Ctrl + W / Ctrl + Shift + T | Sekmeyi kapat / Yeniden aç |
| Ctrl + Shift + O | Sembole git |
| Ctrl + G | Satıra git |
| Ctrl + Tab | Sekmeler 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 + K | Satırı sil |
| Ctrl + ` | Terminal aç / kapat |
| Ctrl + Shift + ` | Yeni terminal |
| Ctrl + Shift + B | Build görevi çalıştır |
| F5 / Ctrl + F5 | Hata ayıklama / Çalıştır |
| Ctrl + B | Kenar çubuğunu aç / kapat |
| Ctrl + Shift + E / F / G / X | Explorer / Search / Source Control / Extensions |
| Ctrl + K Z | Zen Mode (Odak modu) |
| Ctrl + , | Ayarlar |
| Ctrl + Shift + P | Komut paleti |
| Ctrl + K Ctrl + S | Kı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) veundodns(geri al).
🔒 1️⃣ DNS'i Kilitle — (Lock DNS: 1.1.1.1 + 8.8.8.8)
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:
sudo lockdns🔓 2️⃣ DNS'i Geri Al — (Undo DNS → DHCP Default)
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:
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 tekrarsudo lockdnsçalıştır. - Scriptler
/usr/local/bindizininde 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
# 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:
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 ~/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: Ortaknginxsite config, özelphp.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
# 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 || trueHızlı notlar (Laravel):
php artisan serveyerine prod'da Nginx + PHP-FPM kullan.GDhatası için:sudo apt install php-gd && sudo systemctl reload php8.3-fpm.
7.2 ✅ Node.js (NVM), React (Vite), Angular CLI
# 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 versionNot: 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
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 false7.4 ✅ Docker Engine & Docker Compose
# Ö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 version7.5 ✅ Docker Compose — MySQL & PostgreSQL Stack
docker-compose.yml:
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:
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
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-latestsqlcmd aracı:
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:
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:
sudo ln -s /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx7.7.2 React/Vite Dev Proxy
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
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#)
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:5000EF Core CLI (opsiyonel):
dotnet tool install --global dotnet-ef
echo 'export PATH="$PATH:$HOME/.dotnet/tools"' >> ~/.bashrc && source ~/.bashrc7.9 ✅ PM2 ile Node Servis Yönetimi
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 $HOME7.10 🧪 Hızlı Troubleshoot
# 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ı
# 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 apache2Custom 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:
[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.targetServisi aktiflesitrmek:
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:
[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.targetjournalctl ile Log Inceleme
# 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 sil8️⃣-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.
certbotaracını kullanarak Nginx yapılandırmasını otomatik olarak düzenler.
🔧 8.1 Certbot Kurulumu (Snap ile önerilen yöntem)
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/certbotDoğrula:
certbot --version🌐 8.2 Nginx Konfigürasyon Kontrolü
server_name satırı doğru ayarlanmış olmalı (örn. example.com, www.example.com)
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
sudo certbot --nginx -d example.com -d www.example.comBu 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)
sudo certbot renew --dry-runBu 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:
sudo certbot -d "*.example.com" -d example.com --manual --preferred-challenges dns certonlyKomut, TXT kaydını DNS paneline girmeni ister. Doğrulama tamamlanınca sertifika /etc/letsencrypt/live/example.com/ dizininde oluşturulur.
⚠️ Wildcard sertifikalarda
--manualyöntemiyle otomatik yenileme yapılamaz.
🔄 8.6 Sertifikayı Yenileme ve Nginx Yeniden Başlatma
sudo certbot renew
sudo systemctl reload nginx🧠 8.7 Sertifika Durumunu Görüntüleme
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/hostnameSSH_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
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 || trueSunucuda önkoşul: Nginx + PHP-FPM hazır olmalı;
.envdosyan sunucuda bulunmalı (repo'ya konmaz).
🟨 9.2 Frontend (React/Angular) — Static Build + Rsync
.github/workflows/deploy-frontend.yml
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_PATHiçinden servis etmeli (örn./var/www/app/public).
🟩 9.3 Docker — Build & Push (GitHub Container Registry)
.github/workflows/docker-build-push.yml
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 }}:latestSunucuda güncelleme:
docker compose pull && docker compose up -d🧪 9.4 Test Matrix (Opsiyonel)
.github/workflows/test-matrix.yml
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 denied →
REMOTE_PATHyazılabilir mi?chown -R deployer:www-datavechmod -R 775deneyin. - Composer memory →
COMPOSER_MEMORY_LIMIT=-1ile 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_PATscope: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)
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.gzGeri Yükleme (Restore):
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
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.sqlTüm DB'ler için:
pg_dumpall -U postgres | gzip > ~/DevProjects/05_Backups/databases/pg_all_$(date +%F).sql.gz🧩 10.3 MSSQL Backup (sqlcmd)
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):
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)
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:
tar -xzf ~/DevProjects/05_Backups/full_project_zips/dev_full_2025-11-07.tar.gz -C ~/RestoreTest/⏰ 10.5 Cron ile Otomatik Yedekleme
crontab -eGünde 1 kez saat 02:00'de yedekleme:
0 2 * * * bash ~/DevProjects/07_Tools/scripts/backup.sh >> ~/DevProjects/05_Backups/backup.log 2>&1Her 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:
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
docker run --rm -v mysql_data:/data -v $(pwd):/backup ubuntu tar -czf /backup/mysql_volume_$(date +%F).tar.gz /dataGeri yükleme:
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
# 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:
# 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/sysloglogrotate 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:
# 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-custom1️⃣2️⃣ Monitoring (Sistem İzleme)
Sunucu performansini izlemek için kullanilan temel araclar ve komutlar.
CPU ve Bellek İzleme
# 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 = idleDisk I/O İzleme
# 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 gosterAg İzleme
# 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_IPGenel Sistem Durumu
# 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 et1️⃣3️⃣ Güvenlik Detayli
Sunucu guvenligini saglamak için uygulanmasi gereken temel adimlar.
UFW Firewall Kurallari
# 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 verbosefail2ban Konfigurasyonu
fail2ban, tekrarlayan basarisiz giriş denemelerini tespit edip IP'leri otomatik olarak engeller.
# 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:
[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 = 1hfail2ban yönetim komutları:
# 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 bannedSSH Hardening (sshd_config)
/etc/ssh/sshd_config dosyasinda su degisiklikleri yapin:
# 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 adminDegisiklikleri uygula:
# 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/tcpOtomatik Güvenlik Guncellemeleri (unattended-upgrades)
# 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:
sudo unattended-upgrade --dry-run --debugAppArmor
AppArmor, uygulamalarin erisebilecegi kaynaklari kisitlayan zorunlu erişim kontrol sistemidir.
# 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 apparmorRoot Hesabini Devre Disi Birakma
# 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 root1️⃣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.
# 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 myprojectscreen alternatifi (daha basit):
sudo apt install -y screen
screen -S mywork # Yeni oturum
# Ctrl+A, d -> Detach
screen -r mywork # Geri baglan
screen -ls # Oturumlari listeleFaydali Terminal Komutları
# 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 -20Bu ipuclari ile terminal verimliligini önemli olcude artirabilirsiniz. Ozellikle tmux ve Ctrl+R kombinasyonlari uzak sunucu yonetiminde vazgecilmezdir.
Ilgili Rehberler
DevOps & Tools
- DevOps Genel Bakış
- Git Notlari
- Docker Rehberi
- Kubernetes
- Nginx Rehberi
- Linux CLI
- Deployment & Hosting
- VS Code Rehberi
- Regex Rehberi