# 🚀 Oltalama Panel - Sunucu Kurulum Dokümanı Bu doküman, Oltalama Test Yönetim Paneli'nin production sunucusuna kurulumu için hazırlanmıştır. ## 📋 Gereksinimler ### Sistem Gereksinimleri - **İşletim Sistemi**: Ubuntu 20.04+ / Debian 11+ / CentOS 8+ (önerilen: Ubuntu 22.04 LTS) - **RAM**: Minimum 1GB, Önerilen 2GB+ - **Disk**: Minimum 5GB boş alan - **CPU**: 1 core minimum, 2+ core önerilen ### Yazılım Gereksinimleri - Node.js 18.x veya üzeri - npm 9.x veya üzeri - Git - PM2 (process manager) veya systemd - SQLite3 ### Opsiyonel - Nginx Proxy Manager (reverse proxy için önerilir) - Certbot/Let's Encrypt (SSL için) - fail2ban (güvenlik için) ## 🎯 Hızlı Kurulum (Otomatik) ### 1. Kurulum Scriptini İndir ve Çalıştır ```bash # Projeyi klonla git clone /opt/oltalama cd /opt/oltalama # Kurulum scriptini çalıştırılabilir yap chmod +x deploy.sh # Kurulumu başlat (interaktif mod) sudo ./deploy.sh ``` Script otomatik olarak şunları yapacak: - ✅ Node.js kurulumu - ✅ Dependencies kurulumu - ✅ Database migration ve seed - ✅ PM2 ile process management kurulumu - ✅ Auto-restart ve startup konfigürasyonu - ✅ Frontend build - ✅ Güvenlik ayarları ## 🛠️ Yardımcı Scriptler Kurulum sonrası kullanabileceğiniz yardımcı scriptler: ### Admin Kullanıcısı Oluşturma ```bash cd /opt/oltalama node scripts/create-admin.js ``` Bu script: - ✅ Yeni admin kullanıcısı oluşturur - ✅ Kullanıcı adı benzersizliği kontrol eder - ✅ Şifre güvenlik validasyonu yapar - ✅ Şifreyi güvenli bir şekilde hash'ler ### Şifre Değiştirme ```bash cd /opt/oltalama node scripts/change-password.js ``` Bu script: - ✅ Mevcut admin kullanıcısının şifresini değiştirir - ✅ Şifre güvenlik validasyonu yapar - ✅ Yeni şifreyi güvenli bir şekilde hash'ler **Şifre Gereksinimleri:** - En az 8 karakter - En az 1 harf (a-z, A-Z) - En az 1 rakam (0-9) - Önerilen: Özel karakterler (!@#$%^&*) ## 🔧 Manuel Kurulum ### 1. Sistem Güncellemesi ```bash sudo apt update && sudo apt upgrade -y ``` ### 2. Node.js Kurulumu ```bash # Node.js 20.x kurulumu (önerilen) curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # Versiyonu kontrol et node --version # v20.x.x olmalı npm --version # 10.x.x olmalı ``` ### 3. Proje Kurulumu ```bash # Proje dizinini oluştur sudo mkdir -p /opt/oltalama sudo chown -R $USER:$USER /opt/oltalama # Projeyi klonla cd /opt/oltalama git clone . # Backend dependencies cd /opt/oltalama/backend npm install --production # Frontend dependencies ve build cd /opt/oltalama/frontend npm install npm run build ``` ### 4. Çevre Değişkenlerini Ayarla #### Backend .env ```bash cd /opt/oltalama/backend cp .env.example .env nano .env ``` **Önemli ayarlar:** ```env # Sunucu Ayarları NODE_ENV=production PORT=3000 BASE_URL=https://yourdomain.com # Session Secret (güçlü bir değer oluştur) SESSION_SECRET=uzun-rastgele-gizli-anahtar-buraya-gelecek # Gmail Ayarları (panelden de girebilirsiniz) GMAIL_USER=your-email@gmail.com GMAIL_APP_PASSWORD=your-app-password # Telegram Bot (panelden de girebilirsiniz) TELEGRAM_BOT_TOKEN=your-bot-token TELEGRAM_CHAT_ID=your-chat-id # Database DB_PATH=/opt/oltalama/backend/database/oltalama.db # Log Seviyesi LOG_LEVEL=info ``` **Session Secret oluşturma:** ```bash node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" ``` #### Frontend .env ```bash cd /opt/oltalama/frontend cp .env.example .env nano .env ``` ```env # Backend API URL (Nginx Proxy Manager ile yönlendirme yapacaksanız domain) VITE_API_BASE_URL=https://yourdomain.com # Veya lokal test için # VITE_API_BASE_URL=http://localhost:3000 ``` ### 5. Database Kurulumu ```bash cd /opt/oltalama/backend # Migrations çalıştır node migrations/run-migrations.js # Admin kullanıcısı oluştur node -e " const bcrypt = require('bcrypt'); const readline = require('readline'); const { sequelize } = require('./src/config/database'); const AdminUser = require('./src/models/AdminUser'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); (async () => { await sequelize.authenticate(); rl.question('Admin kullanıcı adı: ', async (username) => { rl.question('Admin şifresi: ', async (password) => { const hashedPassword = await bcrypt.hash(password, 10); await AdminUser.create({ username, password_hash: hashedPassword, email: null, full_name: 'Administrator' }); console.log('Admin kullanıcısı oluşturuldu!'); rl.close(); process.exit(0); }); }); })(); " ``` **Admin Kullanıcısı:** - Kurulum sırasında oluşturulacak - Kullanıcı adı ve şifre: İnteraktif olarak sizden istenecek - Şifre gereksinimleri: - En az 8 karakter - En az 1 harf ve 1 rakam içermeli - Güçlü şifre kullanmanız önerilir ### 6. PM2 ile Process Management #### PM2 Kurulumu ```bash sudo npm install -g pm2 ``` #### PM2 Konfigürasyonu `/opt/oltalama/ecosystem.config.js` dosyası: ```javascript module.exports = { apps: [ { name: 'oltalama-backend', cwd: '/opt/oltalama/backend', script: 'src/app.js', instances: 1, exec_mode: 'cluster', watch: false, max_memory_restart: '500M', env: { NODE_ENV: 'production', PORT: 3000, }, error_file: '/var/log/oltalama/backend-error.log', out_file: '/var/log/oltalama/backend-out.log', log_date_format: 'YYYY-MM-DD HH:mm:ss Z', }, { name: 'oltalama-frontend', cwd: '/opt/oltalama/frontend', script: 'npm', args: 'run preview', instances: 1, exec_mode: 'fork', watch: false, max_memory_restart: '300M', env: { NODE_ENV: 'production', PORT: 4173, }, error_file: '/var/log/oltalama/frontend-error.log', out_file: '/var/log/oltalama/frontend-out.log', log_date_format: 'YYYY-MM-DD HH:mm:ss Z', }, ], }; ``` #### PM2 Başlatma ```bash # Log dizini oluştur sudo mkdir -p /var/log/oltalama sudo chown -R $USER:$USER /var/log/oltalama # Frontend build (eğer henüz build etmediyseniz) cd /opt/oltalama/frontend npm run build # PM2 ile uygulamayı başlat cd /opt/oltalama pm2 start ecosystem.config.js # Durumu kontrol et pm2 status # Logları izle pm2 logs # Startup script oluştur (sunucu yeniden başladığında otomatik başlasın) pm2 startup # Komutu çıktıdaki komutu çalıştırın # Mevcut durumu kaydet pm2 save ``` #### PM2 Komutları ```bash pm2 status # Durum kontrolü pm2 logs # Tüm loglar pm2 logs oltalama-backend # Backend logları pm2 logs oltalama-frontend # Frontend logları pm2 restart all # Tümünü yeniden başlat pm2 restart oltalama-backend # Backend'i yeniden başlat pm2 stop all # Tümünü durdur pm2 delete all # Tümünü sil ``` ### 7. Systemd Service Alternatifi (PM2 yerine) PM2 yerine systemd kullanmak isterseniz: #### Backend Service `/etc/systemd/system/oltalama-backend.service`: ```ini [Unit] Description=Oltalama Backend Service After=network.target [Service] Type=simple User=oltalama WorkingDirectory=/opt/oltalama/backend Environment=NODE_ENV=production ExecStart=/usr/bin/node /opt/oltalama/backend/src/app.js Restart=always RestartSec=10 StandardOutput=append:/var/log/oltalama/backend.log StandardError=append:/var/log/oltalama/backend-error.log [Install] WantedBy=multi-user.target ``` #### Frontend Service `/etc/systemd/system/oltalama-frontend.service`: ```ini [Unit] Description=Oltalama Frontend Service After=network.target [Service] Type=simple User=oltalama WorkingDirectory=/opt/oltalama/frontend Environment=NODE_ENV=production ExecStart=/usr/bin/npm run preview Restart=always RestartSec=10 StandardOutput=append:/var/log/oltalama/frontend.log StandardError=append:/var/log/oltalama/frontend-error.log [Install] WantedBy=multi-user.target ``` #### Servisleri Başlat ```bash # Servisleri yükle sudo systemctl daemon-reload # Servisleri başlat sudo systemctl start oltalama-backend sudo systemctl start oltalama-frontend # Başlangıçta otomatik başlasın sudo systemctl enable oltalama-backend sudo systemctl enable oltalama-frontend # Durumu kontrol et sudo systemctl status oltalama-backend sudo systemctl status oltalama-frontend ``` ## 🌐 Nginx Proxy Manager Kurulumu ### Portlar - **Backend**: `http://localhost:3000` - **Frontend**: `http://localhost:4173` ### Nginx Proxy Manager Ayarları 1. **Nginx Proxy Manager'a giriş yapın** 2. **Proxy Hosts** → **Add Proxy Host** #### Frontend Proxy Host ``` Domain Names: yourdomain.com Scheme: http Forward Hostname/IP: localhost Forward Port: 4173 Cache Assets: ✓ Block Common Exploits: ✓ Websockets Support: ✓ SSL: - Force SSL: ✓ - HTTP/2 Support: ✓ - HSTS Enabled: ✓ ``` #### Backend API Proxy (Eğer ayrı subdomain kullanacaksanız) ``` Domain Names: api.yourdomain.com Scheme: http Forward Hostname/IP: localhost Forward Port: 3000 Block Common Exploits: ✓ Websockets Support: ✓ SSL: - Force SSL: ✓ - HTTP/2 Support: ✓ - HSTS Enabled: ✓ ``` **Custom Nginx Configuration (Advanced sekmesi):** ```nginx location /api { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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; } ``` ## 🔒 Güvenlik Önerileri ### 1. Firewall Ayarları ```bash # UFW kurulumu ve ayarları sudo apt install ufw # SSH izin ver (bağlantınızı koparmayın!) sudo ufw allow 22/tcp # Backend ve Frontend portları (sadece localhost'tan erişilebilir olmalı) # Nginx Proxy Manager kullanıyorsanız bu portları kapatın sudo ufw deny 3000/tcp sudo ufw deny 4173/tcp # HTTP/HTTPS (Nginx Proxy Manager için) sudo ufw allow 80/tcp sudo ufw allow 443/tcp # Firewall'ı aktifleştir sudo ufw enable ``` ### 2. Admin Şifresini Değiştir (Gerekirse) Şifrenizi değiştirmek isterseniz: ```bash # Backend dizinine git cd /opt/oltalama/backend # Yeni şifre oluşturma scripti node -e " const bcrypt = require('bcrypt'); const readline = require('readline'); const { sequelize } = require('./src/config/database'); const { AdminUser } = require('./src/models'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); (async () => { await sequelize.authenticate(); rl.question('Admin kullanıcı adı: ', async (username) => { rl.question('Yeni şifre: ', async (password) => { const hashedPassword = await bcrypt.hash(password, 10); await AdminUser.update( { password_hash: hashedPassword }, { where: { username } } ); console.log('Şifre değiştirildi!'); rl.close(); process.exit(0); }); }); })(); " ``` ### 3. Dosya İzinleri ```bash # Proje dizini izinleri sudo chown -R oltalama:oltalama /opt/oltalama sudo chmod -R 755 /opt/oltalama # .env dosyalarını koru sudo chmod 600 /opt/oltalama/backend/.env sudo chmod 600 /opt/oltalama/frontend/.env # Database izinleri sudo chmod 600 /opt/oltalama/backend/database/oltalama.db ``` ### 4. Fail2Ban Kurulumu (Opsiyonel) ```bash sudo apt install fail2ban # /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local ``` ```ini [DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 [sshd] enabled = true ``` ```bash sudo systemctl restart fail2ban ``` ### 5. Düzenli Güncellemeler ```bash # Sistem güncellemeleri sudo apt update && sudo apt upgrade -y # Node paketleri cd /opt/oltalama/backend && npm update cd /opt/oltalama/frontend && npm update # PM2 güncelleme pm2 update ``` ## 💾 Yedekleme ### 1. Database Yedekleme ```bash # Manuel yedekleme cp /opt/oltalama/backend/database/oltalama.db \ /opt/oltalama/backups/oltalama-$(date +%Y%m%d-%H%M%S).db ``` ### 2. Otomatik Yedekleme Script `/opt/oltalama/backup.sh`: ```bash #!/bin/bash BACKUP_DIR="/opt/oltalama/backups" DB_PATH="/opt/oltalama/backend/database/oltalama.db" DATE=$(date +%Y%m%d-%H%M%S) # Backup dizini oluştur mkdir -p $BACKUP_DIR # Database yedekle cp $DB_PATH "$BACKUP_DIR/oltalama-$DATE.db" # 30 günden eski yedekleri sil find $BACKUP_DIR -name "oltalama-*.db" -mtime +30 -delete echo "Backup completed: oltalama-$DATE.db" ``` ```bash chmod +x /opt/oltalama/backup.sh # Crontab ekle (her gün saat 03:00'te) crontab -e # Ekle: 0 3 * * * /opt/oltalama/backup.sh >> /var/log/oltalama/backup.log 2>&1 ``` ### 3. Tam Sistem Yedeği ```bash # Tüm projeyi yedekle tar -czf /backup/oltalama-full-$(date +%Y%m%d).tar.gz \ /opt/oltalama \ /etc/systemd/system/oltalama-*.service \ /var/log/oltalama ``` ## 🔄 Güncelleme ### Git ile Güncelleme ```bash cd /opt/oltalama # Değişiklikleri al git pull origin main # Backend güncelleme cd backend npm install --production node migrations/run-migrations.js # Frontend güncelleme cd ../frontend npm install npm run build # Servisleri yeniden başlat pm2 restart all # veya sudo systemctl restart oltalama-backend sudo systemctl restart oltalama-frontend ``` ## 📊 Monitoring ve Loglar ### PM2 Monitoring ```bash # Dashboard pm2 monit # Memory/CPU kullanımı pm2 list ``` ### Log Dosyaları ```bash # Backend logs tail -f /var/log/oltalama/backend.log tail -f /var/log/oltalama/backend-error.log # Frontend logs tail -f /var/log/oltalama/frontend.log # PM2 logs pm2 logs --lines 100 ``` ### Log Rotation `/etc/logrotate.d/oltalama`: ``` /var/log/oltalama/*.log { daily rotate 30 compress delaycompress missingok notifempty create 0640 oltalama oltalama sharedscripts postrotate pm2 reloadLogs endscript } ``` ## 🐛 Sorun Giderme ### Port Zaten Kullanımda ```bash # Port 3000'i kullanan process'i bul sudo lsof -i :3000 # Process'i öldür sudo kill -9 ``` ### Database Locked ```bash # SQLite lock'ları temizle fuser -k /opt/oltalama/backend/database/oltalama.db ``` ### PM2 Çalışmıyor ```bash # PM2'yi sıfırla pm2 kill pm2 start ecosystem.config.js pm2 save ``` ### High Memory Usage ```bash # Memory kullanımını kontrol et pm2 list # Uygulamayı yeniden başlat pm2 restart oltalama-backend --update-env ``` ## 👥 Kullanıcı Yönetimi ### Yeni Admin Kullanıcısı Ekleme ```bash cd /opt/oltalama node scripts/create-admin.js ``` ### Admin Şifresi Değiştirme ```bash cd /opt/oltalama node scripts/change-password.js ``` ### Admin Kullanıcısını Manuel Oluşturma (SQL) ```bash # Şifre hash'i oluştur node -p "require('bcrypt').hashSync('YourPassword123', 10)" # SQLite ile kullanıcı ekle cd /opt/oltalama/backend sqlite3 database/oltalama.db INSERT INTO admin_user (username, password_hash, full_name, created_at, updated_at) VALUES ('newadmin', '$2b$10$...', 'New Admin', datetime('now'), datetime('now')); .quit ``` ### Tüm Admin Kullanıcılarını Listele ```bash cd /opt/oltalama/backend sqlite3 database/oltalama.db "SELECT id, username, full_name, email, created_at FROM admin_user;" ``` ### Admin Kullanıcısı Sil ```bash cd /opt/oltalama/backend sqlite3 database/oltalama.db "DELETE FROM admin_user WHERE username='oldadmin';" ``` ## 📝 Opsiyonel: Manuel Nginx Kurulumu Nginx Proxy Manager yerine klasik Nginx kullanmak isterseniz: ### Nginx Kurulumu ```bash sudo apt install nginx ``` ### Nginx Konfigürasyonu `/etc/nginx/sites-available/oltalama`: ```nginx # Upstream tanımları upstream backend { server localhost:3000; keepalive 64; } upstream frontend { server localhost:4173; keepalive 64; } # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name yourdomain.com; return 301 https://$server_name$request_uri; } # HTTPS server server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com; # SSL sertifikaları (Let's Encrypt ile oluşturun) ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem; # SSL ayarları ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Security headers add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; # Client body size client_max_body_size 10M; # Gzip compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json; # Backend API location /api { proxy_pass http://backend; 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; } # Tracking endpoint location /t/ { proxy_pass http://backend; proxy_http_version 1.1; 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; } # Frontend location / { proxy_pass http://frontend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # Logs access_log /var/log/nginx/oltalama-access.log; error_log /var/log/nginx/oltalama-error.log; } ``` ### Nginx'i Aktifleştir ```bash # Symlink oluştur sudo ln -s /etc/nginx/sites-available/oltalama /etc/nginx/sites-enabled/ # Konfigürasyonu test et sudo nginx -t # Nginx'i yeniden başlat sudo systemctl restart nginx sudo systemctl enable nginx ``` ### SSL Sertifikası (Let's Encrypt) ```bash # Certbot kurulumu sudo apt install certbot python3-certbot-nginx # Sertifika oluştur sudo certbot --nginx -d yourdomain.com # Otomatik yenileme sudo certbot renew --dry-run ``` ## ✅ Kurulum Kontrolü ### Sistemin Çalıştığını Kontrol Et ```bash # Servis durumları pm2 status # veya sudo systemctl status oltalama-backend sudo systemctl status oltalama-frontend # Port dinleme kontrolü sudo netstat -tulpn | grep -E ':(3000|4173)' # HTTP istekleri curl http://localhost:3000/api/health curl http://localhost:4173 # Domain kontrolü (Nginx Proxy Manager kurulduysa) curl https://yourdomain.com ``` ### Performans Testi ```bash # Backend response time time curl http://localhost:3000/api/health # Memory kullanımı free -h # Disk kullanımı df -h ``` ## 📞 Destek Sorun yaşarsanız: 1. Logları kontrol edin: `pm2 logs` veya `/var/log/oltalama/` 2. GitHub Issues'da sorun bildirin 3. Dokümanı tekrar gözden geçirin ## 📚 Ek Kaynaklar - [PM2 Documentation](https://pm2.keymetrics.io/) - [Nginx Documentation](https://nginx.org/en/docs/) - [Node.js Best Practices](https://github.com/goldbergyoni/nodebestpractices) - [SQLite Documentation](https://www.sqlite.org/docs.html) --- **Son Güncelleme**: 2025-11-10 **Versiyon**: 1.0.0