Files
balikci/DEPLOYMENT.md
salvacybersec c62478937e dockerized
2025-11-11 04:30:25 +03:00

20 KiB
Raw Blame History

🚀 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

# 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

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

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

sudo apt update && sudo apt upgrade -y

2. Node.js Kurulumu

# 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

# 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

cd /opt/oltalama/backend
cp .env.example .env
nano .env

Önemli ayarlar:

# 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:

node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"

Frontend .env

cd /opt/oltalama/frontend
cp .env.example .env
nano .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

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

sudo npm install -g pm2

PM2 Konfigürasyonu

/opt/oltalama/ecosystem.config.js dosyası:

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

# 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ı

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:

[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:

[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

# 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 HostsAdd 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):

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ı

# 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:

# 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

# 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)

sudo apt install fail2ban

# /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
sudo systemctl restart fail2ban

5. Düzenli Güncellemeler

# 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

# 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:

#!/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"
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

# 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

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

# Dashboard
pm2 monit

# Memory/CPU kullanımı
pm2 list

Log Dosyaları

# 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

# Port 3000'i kullanan process'i bul
sudo lsof -i :3000

# Process'i öldür
sudo kill -9 <PID>

Database Locked

# SQLite lock'ları temizle
fuser -k /opt/oltalama/backend/database/oltalama.db

PM2 Çalışmıyor

# PM2'yi sıfırla
pm2 kill
pm2 start ecosystem.config.js
pm2 save

High Memory Usage

# 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

cd /opt/oltalama
node scripts/create-admin.js

Admin Şifresi Değiştirme

cd /opt/oltalama
node scripts/change-password.js

Admin Kullanıcısını Manuel Oluşturma (SQL)

# Ş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

cd /opt/oltalama/backend
sqlite3 database/oltalama.db "SELECT id, username, full_name, email, created_at FROM admin_user;"

Admin Kullanıcısı Sil

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

sudo apt install nginx

Nginx Konfigürasyonu

/etc/nginx/sites-available/oltalama:

# 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

# 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)

# 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

# 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

# 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


Son Güncelleme: 2025-11-10 Versiyon: 1.0.0