Files
ytp/docs/DEPLOYMENT.md
2025-11-03 23:12:45 +03:00

729 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Geliştirme ve Dağıtım Kılavuzu
Yakıt Takip Sistemi geliştirme ortamı kurulumu, test süreçleri ve prodüksiyon dağıtımı hakkında kapsamlı rehber.
## 📋 İçerlik
- [Geliştirme Ortamı Kurulumu](#geliştirme-ortamı-kurulumu)
- [Geliştirme Süreci](#geliştirme-süreci)
- [Test Stratejisi](#test-stratejisi)
- [Prodüksiyon Dağıtımı](#prodüksiyon-dağıtımı)
- [İzleme ve Bakım](#izleme-ve-bakım)
- [Sorun Giderme](#sorun-giderme)
## 🛠️ Geliştirme Ortamı Kurulumu
### Gereksinimler
- **Node.js**: 16.x veya üzeri
- **npm**: 7.x veya üzeri
- **Git**: Son sürüm
- **Editör**: VS Code (önerilen)
- **Tarayıcı**: Chrome/Firefox (geliştirme araçları)
### Adım 1: Sistemi Kurun
#### Node.js Kurulumu
```bash
# macOS (Homebrew)
brew install node
# Ubuntu/Debian
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Windows
# https://nodejs.org/en/download/ adresinden indirin
```
#### VS Code ve Eklentiler
```bash
# Önerilen VS Code eklentileri
- Svelte for VS Code
- SQLite
- Thunder Client (API testing)
- GitLens
- Prettier
- ESLint
```
### Adım 2: Projeyi Kurun
```bash
# 1. Repoyu klonlayın
git clone <repository-url>
cd ytp
# 2. Ana proje bağımlılıklarını yükleyin
npm install
# 3. Frontend bağımlılıklarını yükleyin
cd client
npm install
cd ..
# 4. Veritabanını başlatın
npm run prepare:db
# 5. Ortam değişkenlerini yapılandırın
cp .env.example .env
```
### Adım 3: Ortam Değişkenleri
#### .env Dosyası
```bash
# Sunucu ayarları
PORT=5005
NODE_ENV=development
# Veritabanı ayarları
DB_PATH=./data/app.db
# Session ayarları
SESSION_SECRET=your-secret-key-here
SESSION_TIMEOUT=24h
# CORS ayarları
CORS_ORIGIN=http://localhost:5173
# Log seviyesi
LOG_LEVEL=debug
```
### Adım 4: Geliştirme Sunucusunu Başlatın
```bash
# Geliştirme modunda başlatma (hem backend hem frontend)
npm run dev
# Sadece backend sunucusu
npm run start:server
# Sadece frontend (ayrı terminal)
cd client && npm run dev
```
### Adım 5: Doğrulama
```bash
# Sunucu çalışıyor mu?
curl http://localhost:5005/api/session
# Frontend çalışıyor mu?
# Tarayıcıda http://localhost:5173 açın
```
## 🔄 Geliştirme Süreci
### Git Workflow
#### Branch Stratejisi
```
main # Prodüksiyon branch'i
├── develop # Geliştirme branch'i
├── feature/* # Yeni özellikler
├── bugfix/* # Hata düzeltmeleri
└── hotfix/* # Acil düzeltmeler
```
#### Commit Mesajları
```bash
# Format
<type>(<scope>): <description>
# Örnekler
feat(auth): add JWT token refresh mechanism
fix(api): handle null vehicle_id gracefully
docs(readme): update installation instructions
refactor(db): optimize fuel_slip queries
```
#### Geliştirme Akışı
```bash
# 1. Yeni feature branch oluştur
git checkout -b feature/fuel-slip-pdf
# 2. Geliştirme yap
# ... kod değişiklikleri
# 3. Değişiklikleri commit et
git add .
git commit -m "feat(fuel): add PDF generation for fuel slips"
# 4. Branch'e push et
git push origin feature/fuel-slip-pdf
# 5. Pull Request oluştur
# GitHub/GitLab üzerinden PR oluştur
# 6. Review ve merge
# Code review sonrası develop branch'ine merge
# 7. Geliştirme sunucusunu güncelle
git checkout develop
git pull origin develop
```
### Kod Kalitesi
#### ESLint Yapılandırması
```json
// .eslintrc.json
{
"extends": ["eslint:recommended"],
"env": {
"node": true,
"es2021": true
},
"rules": {
"no-console": "warn",
"no-unused-vars": "error",
"prefer-const": "error"
}
}
```
#### Prettier Yapılandırması
```json
// .prettierrc
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 80,
"tabWidth": 2
}
```
### Test Stratejisi
#### Test Türleri
- **Unit Tests**: Fonksiyon ve bileşen testleri
- **Integration Tests**: API endpoint testleri
- **E2E Tests**: Kullanıcı senaryoları
- **Manual Tests**: Manuel QA süreçleri
#### Test Tools
```bash
# Test framework'leri
npm install --save-dev jest supertest
npm install --save-dev @testing-library/svelte
npm install --save-dev playwright
```
#### Örnek Testler
```javascript
// tests/api.test.js
const request = require('supertest');
const app = require('../server/index');
describe('Authentication', () => {
test('POST /api/auth/login with valid credentials', async () => {
const response = await request(app)
.post('/api/auth/login')
.send({ username: 'admin', password: 'Admin!123' })
.expect(200);
expect(response.body).toHaveProperty('token');
expect(response.body.user.role).toBe('admin');
});
});
```
## 🚀 Prodüksiyon Dağıtımı
### Dağıtım Seçenekleri
#### 1. Docker Dağıtımı (Önerilen)
##### Dockerfile
```dockerfile
# Multi-stage build
FROM node:18-alpine AS builder
# Build stage
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
WORKDIR /app/client
RUN npm ci
RUN npm run build
# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/server ./server
COPY --from=builder /app/client/dist ./client/dist
COPY --from=builder /app/data ./data
EXPOSE 5005
CMD ["node", "server/index.js"]
```
##### docker-compose.yml
```yaml
version: '3.8'
services:
ytp-app:
build: .
ports:
- "5005:5005"
environment:
- NODE_ENV=production
- PORT=5005
volumes:
- ./data:/app/data
- ./logs:/app/logs
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- ytp-app
restart: unless-stopped
```
##### Docker Komutları
```bash
# Build ve çalıştırma
docker-compose up -d --build
# Logları izleme
docker-compose logs -f ytp-app
# Yeniden başlatma
docker-compose restart ytp-app
# Temizleme
docker-compose down -v
```
#### 2. PM2 ile Dağıtım
##### PM2 Yapılandırması
```json
// ecosystem.config.js
module.exports = {
apps: [{
name: 'ytp-app',
script: 'server/index.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 5005
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_file: './logs/combined.log',
time: true
}]
};
```
##### PM2 Komutları
```bash
# PM2 kurulumu
npm install -g pm2
# Uygulamayı başlatma
pm2 start ecosystem.config.js
# Durumunu kontrol etme
pm2 status
# Logları izleme
pm2 logs ytp-app
# Yeniden başlatma
pm2 restart ytp-app
# Sunucu yeniden başlatığında otomatik başlatma
pm2 startup
pm2 save
```
#### 3. Systemd Service
##### Service Dosyası
```ini
# /etc/systemd/system/ytp.service
[Unit]
Description=Yakit Takip Sistemi
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/ytp
ExecStart=/usr/bin/node server/index.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production
Environment=PORT=5005
[Install]
WantedBy=multi-user.target
```
##### Systemd Komutları
```bash
# Service'i etkinleştirme
sudo systemctl enable ytp.service
# Service'i başlatma
sudo systemctl start ytp.service
# Durumunu kontrol etme
sudo systemctl status ytp.service
# Logları izleme
sudo journalctl -u ytp.service -f
```
### Nginx Yapılandırması
#### nginx.conf
```nginx
events {
worker_connections 1024;
}
http {
upstream ytp_backend {
server 127.0.0.1:5005;
}
server {
listen 80;
server_name your-domain.com;
# Frontend statik dosyaları
location / {
root /var/www/ytp/client/dist;
try_files $uri $uri/ /index.html;
# Cache headers
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# API requests
location /api/ {
proxy_pass http://ytp_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;
}
# WebSocket connections
location /socket.io/ {
proxy_pass http://ytp_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;
}
}
# HTTPS (SSL kuruluysa)
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Aynı proxy ayarları burada da geçerli
# ...
}
}
```
### Prodüksiyon Kurulum Script'i
#### setup.sh
```bash
#!/bin/bash
# Prodüksiyon kurulum script'i
set -e
echo "🚀 YTP Prodüksiyon Kurulumu Başlatılıyor..."
# Sistem güncellemeleri
sudo apt update && sudo apt upgrade -y
# Node.js kurulumu
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# PM2 kurulumu
sudo npm install -g pm2
# Nginx kurulumu
sudo apt install -y nginx
# Firewall ayarları
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw --force enable
# Proje kurulumu
sudo mkdir -p /var/www/ytp
sudo chown $USER:$USER /var/www/ytp
# Git ile projeyi çek
cd /var/www/ytp
git clone <repository-url> .
# Bağımlılıkları yükle
npm install
cd client && npm install && cd ..
# Veritabanını başlat
npm run prepare:db
# PM2 başlat
pm2 start ecosystem.config.js
pm2 startup
pm2 save
# Nginx yapılandırması
sudo cp nginx.conf /etc/nginx/sites-available/ytp
sudo ln -s /etc/nginx/sites-available/ytp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
echo "✅ Kurulum tamamlandı!"
echo "🌐 Uygulama: http://your-domain.com"
echo "📊 PM2 durumu: pm2 status"
echo "📋 Loglar: pm2 logs ytp-app"
```
## 📊 İzleme ve Bakım
### Log Yönetimi
#### Log Yapılandırması
```javascript
// server/logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' }),
new winston.transports.Console({
format: winston.format.simple()
})
]
});
module.exports = logger;
```
#### Log Rotasyon
```bash
# logrotate yapılandırması
# /etc/logrotate.d/ytp
/var/www/ytp/logs/*.log {
daily
missingok
rotate 52
compress
notifempty
create 644 www-data www-data
postrotate
pm2 reloadLogs
endscript
}
```
### Performans İzleme
#### Metrics Collection
```javascript
// server/metrics.js
const express = require('express');
const responseTime = require('response-time');
const app = express();
// Response time middleware
app.use(responseTime((req, res, time) => {
console.log(`${req.method} ${req.url} - ${time}ms`);
}));
// Health check endpoint
app.get('/health', (req, res) => {
res.json({
status: 'healthy',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
memory: process.memoryUsage()
});
});
```
### Backup Stratejisi
#### Database Backup Script
```bash
#!/bin/bash
# backup.sh
BACKUP_DIR="/var/backups/ytp"
DATE=$(date +%Y%m%d_%H%M%S)
DB_PATH="/var/www/ytp/data/app.db"
mkdir -p $BACKUP_DIR
# Veritabanı yedeği
sqlite3 $DB_PATH ".backup $BACKUP_DIR/app_backup_$DATE.db"
# Eski yedekleri temizle (30 gün)
find $BACKUP_DIR -name "app_backup_*.db" -mtime +30 -delete
echo "Backup completed: $BACKUP_DIR/app_backup_$DATE.db"
```
#### Cron Job
```bash
# Günlük backup (saat 02:00)
0 2 * * * /var/www/ytp/scripts/backup.sh
# Log rotation (haftalık)
0 3 * * 0 /usr/sbin/logrotate /etc/logrotate.d/ytp
# Sistem health check (5 dakikada bir)
*/5 * * * * curl -f http://localhost:5005/health || echo "Health check failed" | mail -s "YTP Alert" admin@domain.com
```
## 🔧 Sorun Giderme
### Yaygın Sorunlar
#### 1. Port Çakışması
```bash
# Port kullanan süreci bul
lsof -i :5005
# Süreci sonlandır
kill -9 <PID>
# Farklı port kullan
PORT=3000 npm start
```
#### 2. Veritabanı Hataları
```bash
# Veritabanı dosyası izinleri
sudo chown www-data:www-data data/app.db
sudo chmod 664 data/app.db
# Veritabanı durumu
sqlite3 data/app.db ".tables"
sqlite3 data/app.db "SELECT COUNT(*) FROM fuel_slips;"
```
#### 3. Memory Issues
```bash
# Memory kullanımı
free -h
ps aux --sort=-%mem | head
# Node.js memory limit
node --max-old-space-size=4096 server/index.js
```
#### 4. Socket.IO Connection Issues
```bash
# WebSocket connection test
wscat -c ws://localhost:5005/socket.io/?EIO=4&transport=websocket
# Nginx log kontrolü
sudo tail -f /var/log/nginx/error.log
```
### Debugging Tools
#### Node.js Debugging
```bash
# Debug mode
node --inspect server/index.js
# Chrome DevTools ile debugging
# chrome://inspect adresini açın
```
#### Network Debugging
```bash
# Port test
telnet localhost 5005
# SSL cert test
openssl s_client -connect your-domain.com:443
```
### Performance Optimization
#### Database Optimization
```sql
-- Index ekleme
CREATE INDEX idx_fuel_slips_date ON fuel_slips(slip_date);
CREATE INDEX idx_fuel_slips_status ON fuel_slips(status);
-- Query optimization
EXPLAIN QUERY PLAN SELECT * FROM fuel_slips WHERE status = 'pending';
```
#### Frontend Optimization
```javascript
// vite.config.js
export default {
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['svelte'],
api: ['./src/api.js']
}
}
}
}
};
```
---
**Not**: Prodüksiyon dağıtımından önce mutlaka test ortamında tüm senaryoları doğrulayın.