Files
balikci/DEPLOYMENT.md

969 lines
20 KiB
Markdown
Raw Permalink Normal View History

2025-11-10 20:01:41 +03:00
# 🚀 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 <repository-url> /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 <repository-url> .
# 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=www-data
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=www-data
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 www-data:www-data /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 www-data www-data
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 <PID>
```
### 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