Linux Sunucu Yönetimi: Laravel Projesi Deploy Rehberi
Lokal'de mukemmel calisan bir Laravel projesini production sunucuya tasimak, cogu gelistirici icin stresli bir surecdir. "Bende calisiyor" cumlesi tam da bu noktada anlamsizlasiyor. Ben Azure VM'lerime birden fazla Laravel projesi deploy ettim. Teleasistan, demonet-vm, siparismatik ve daha fazlasi. Bu surecte ogrendigim her seyi, basindan sonuna kadar bu rehberde topluyorum.
VPS Secimi ve Ilk Kurulum
VPS secerken dikkat ettigim kriterler: konum (kullanici kitlenize yakin olsun), RAM (Laravel icin minimum 1GB, ideal 2GB), SSD disk ve saatlik faturalandirma destegi. Azure, DigitalOcean, Hetzner veya Vultr iyi secenekler.
Sunucuya ilk baglandigimda yaptigim islemler:
# Root ile giris yapma, sudo kullanicisi olustur
adduser deployer
usermod -aG sudo deployer
# SSH key ile giris (lokal makinede)
ssh-keygen -t ed25519 -C "deploy@projeman"
ssh-copy-id deployer@sunucu-ip
# Sifre ile girisi kapat
sudo nano /etc/ssh/sshd_config
# PasswordAuthentication no
# PermitRootLogin no
sudo systemctl restart sshd
Firewall yapilandirmasi:
sudo apt update && sudo apt upgrade -y
sudo apt install ufw fail2ban -y
# UFW kurulumu
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Fail2ban yapilandirmasi ile brute force saldirilarini engelliyorum:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
LEMP Stack Kurulumu
Laravel icin Nginx + MySQL (veya PostgreSQL) + PHP-FPM gerekli.
Nginx
sudo apt install nginx -y
sudo systemctl enable nginx
PHP-FPM
# PHP 8.3 kurulumu (Debian/Ubuntu)
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.3-fpm php8.3-cli php8.3-common php8.3-mysql \
php8.3-pgsql php8.3-xml php8.3-mbstring php8.3-curl php8.3-zip \
php8.3-gd php8.3-bcmath php8.3-intl php8.3-readline \
php8.3-redis php8.3-opcache -y
MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation
# Veritabani ve kullanici olusturma
sudo mysql -u root -p
CREATE DATABASE laravel_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'laravel'@'localhost' IDENTIFIED BY 'guclu-sifre-buraya';
GRANT ALL PRIVILEGES ON laravel_app.* TO 'laravel'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
Laravel Deployment Adimlari
Projeyi sunucuya tasimak icin git kullaniyorum:
# Proje dizinini olustur
sudo mkdir -p /var/www/laravel-app
sudo chown deployer:www-data /var/www/laravel-app
# Kodu cek
cd /var/www/laravel-app
git clone [email protected]:kullanici/proje.git .
# Bagimliliklari yukle (production icin)
composer install --no-dev --optimize-autoloader
# Environment dosyasini olustur
cp .env.example .env
nano .env
.env dosyasinda dikkat edilecekler:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://projeman.net
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_app
DB_USERNAME=laravel
DB_PASSWORD=guclu-sifre-buraya
CACHE_STORE=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
# Uygulama anahtari olustur
php artisan key:generate
# Veritabanini migrate et
php artisan migrate --force
# Optimizasyon komutlari
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
php artisan optimize
Nginx Virtual Host Konfigurasyonu
sudo nano /etc/nginx/sites-available/laravel-app
server {
listen 80;
listen [::]:80;
server_name projeman.net www.projeman.net;
root /var/www/laravel-app/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.(?!well-known).* {
deny all;
}
# Static dosyalar icin cache
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
sudo ln -s /etc/nginx/sites-available/laravel-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
SSL Sertifikasi (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d projeman.net -d www.projeman.net
# Otomatik yenileme testi
sudo certbot renew --dry-run
Certbot Nginx konfigurasyonunu otomatik gunceller ve HTTP'den HTTPS'e yonlendirme ekler.
File Permissions
Laravel'in yazma ihtiyaci olan dizinler icin dogru izinler:
# Sahiplik
sudo chown -R deployer:www-data /var/www/laravel-app
sudo chmod -R 755 /var/www/laravel-app
# Storage ve cache dizinleri yazilabilir olmali
sudo chmod -R 775 /var/www/laravel-app/storage
sudo chmod -R 775 /var/www/laravel-app/bootstrap/cache
# .env dosyasi sadece sahip okuyabilsin
sudo chmod 640 /var/www/laravel-app/.env
Bu izinleri yanlis ayarlamak en sik karsilastigim deploy sorunlarindan biridir. storage/logs dizinine yazamama hatasi aldiyseniz buyuk ihtimalle izinler yanlistir.
Supervisor ile Queue Worker
Laravel queue islemleri icin Supervisor gerekli:
sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel-app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=deployer
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel-app/storage/logs/worker.log
stopwaitsecs=3600
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
Cron Job (Laravel Scheduler)
Laravel'in zamanlanmis gorevleri icin tek bir cron entry yeterli:
crontab -e
* * * * * cd /var/www/laravel-app && php artisan schedule:run >> /dev/null 2>&1
Zero-Downtime Deployment
Basit bir deploy script'i:
#!/bin/bash
# deploy.sh
set -e
APP_DIR="/var/www/laravel-app"
cd $APP_DIR
echo "Bakim modu aktif..."
php artisan down --retry=60
echo "Kod guncelleniyor..."
git pull origin main
echo "Bagimliklar yukleniyor..."
composer install --no-dev --optimize-autoloader --no-interaction
echo "Migrate calistiriliyor..."
php artisan migrate --force
echo "Cache temizleniyor..."
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
echo "Queue worker yeniden baslatiliyor..."
php artisan queue:restart
echo "Bakim modu kapatiliyor..."
php artisan up
echo "Deploy tamamlandi!"
Daha gelismis zero-downtime icin Envoyer veya symlink tabanli yaklasimlar kullanilabilir. Ama cogu projede yukaridaki script yeterli oluyor.
Azure VM'lerime Deploy Ederken Ogrendiklerim
Azure VM'lerde birden fazla proje calistiriyorum. Bu surecte ogrendigim bazi seyler:
NSG (Network Security Group) kurallari onemli. SSH, HTTP ve HTTPS disinda tum portlari kapatin. Ihtiyac duydukca acin. Bir keresinde PostgreSQL portunu (5432) acik biraktigimi fark ettim, hemen kapattim.
Swap alani ekleyin. Azure B1s/B2s gibi dusuk RAM'li makinelerde swap olmadan PHP-FPM veya Composer islemi OOM killer tarafindan oldurulebilir:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Log rotasyon yapin. Laravel log dosyalari buyuyup diski doldurabilir. config/logging.php icinde daily driver kullanin ve eski loglari temizleyin.
Yedekleme unutmayin. Veritabani ve storage klasoru icin gunluk yedekleme scripti olusturun. spatie/laravel-backup paketi bu isi otomaticlestirmek icin harika.
Sonuc
Linux sunucuya Laravel deploy etmek ilk seferinde karmasik gorunebilir ama bir kez dogru yaptiginizda sonraki projeler cok daha kolay oluyor. Bu rehberdeki adimlari takip ederek guvenli, performansli ve surdurulebilir bir production ortami kurabilirsiniz. Sunucu yonetimi yazilim gelistirmenin ayrilmaz bir parcasi. Bu becerileri edinmek sizi cok daha iyi bir gelistirici yapar.