# 🚀 Development vs Production

## 📊 Сравнение

| Аспект | Development (Локально) | Production (Боевой сервер) |
|--------|------------------------|---------------------------|
| **PHP** | 7.4+ (любая) | 8.0+ рекомендуется |
| **MySQL** | 5.7+ | 8.0+ рекомендуется |
| **HTTPS** | ❌ HTTP | ✅ HTTPS (Let's Encrypt) |
| **JWT Secret** | Общий ключ | 🔐 Уникальный 256-символьный |
| **CORS** | Всем открыт | ✅ Только фронтенду |
| **Rate Limit** | ❌ Нет | ✅ 100 req/min на IP |
| **Логирование** | Console | ✅ File + Syslog |
| **Backup БД** | Вручную | ✅ Автоматический (ежедневно) |
| **SSL сертификат** | Самоподписанный | ✅ Let's Encrypt или платный |
| **Caching** | ❌ Нет | ✅ Redis/Memcached |
| **Code Minification** | ❌ Нет | ✅ Включено |
| **Password Admin** | admin123 | 🔐 Сложный пароль |

---

## ⚙️ Установка на VPS (Ubuntu 20.04)

### 1. Подготовка сервера

```bash
# Обновить систему
sudo apt update && sudo apt upgrade -y

# Установить PHP 8.0+
sudo apt install php php-mysql php-curl php-json -y

# Установить MySQL 8.0
sudo apt install mysql-server -y

# Установить Node.js 16+
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install nodejs -y

# Установить Nginx (вместо Apache)
sudo apt install nginx -y

# Установить certbot для HTTPS
sudo apt install certbot python3-certbot-nginx -y
```

### 2. Разворачивание приложения

```bash
# Перейти в папку
cd /var/www/messenger

# Загрузить код (git или файлы)
git clone <your-repo> . 
# или скопировать файлы через SFTP

# Установить права
sudo chown -R www-data:www-data /var/www/messenger
sudo chmod -R 755 /var/www/messenger
```

### 3. Конфигурация БД

```bash
# Создать базу данных
mysql -u root -p -e "CREATE DATABASE messenger_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# Импортировать структуру
mysql -u root -p messenger_db < backend/config/init.sql

# Создать пользователя БД
mysql -u root -p -e "CREATE USER 'messenger_user'@'localhost' IDENTIFIED BY 'strong_password_here';"
mysql -u root -p -e "GRANT ALL PRIVILEGES ON messenger_db.* TO 'messenger_user'@'localhost';"
mysql -u root -p -e "FLUSH PRIVILEGES;"
```

### 4. Конфигурация PHP

Отредактируйте `/var/www/messenger/backend/config/database.php`:

```php
$user = 'messenger_user';
$password = 'strong_password_here';
```

Отредактируйте `/var/www/messenger/backend/config/constants.php`:

```php
define('JWT_SECRET', bin2hex(random_bytes(32))); // Очень длинный ключ!
define('APP_DEBUG', false); // Отключить debug
```

### 5. Конфигурация Nginx

Создайте `/etc/nginx/sites-available/messenger`:

```nginx
server {
    listen 80;
    server_name your-domain.com;
    
    # Перенаправить HTTP на HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;
    
    # SSL сертификат (Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    
    # Оптимизация SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    
    root /var/www/messenger;
    
    # Frontend
    location /frontend {
        alias /var/www/messenger/frontend;
        try_files $uri $uri/ /frontend/index.html;
    }
    
    # Backend API
    location /backend/api {
        alias /var/www/messenger/backend/api;
        try_files $uri $uri/ @php;
    }
    
    location @php {
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    # Socket.io proxy
    location /socket.io {
        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_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
```

Активируйте:

```bash
sudo ln -s /etc/nginx/sites-available/messenger /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```

### 6. SSL сертификат

```bash
# Получить Let's Encrypt сертификат
sudo certbot certonly --nginx -d your-domain.com
```

### 7. Запуск Node.js сервера

Создайте systemd сервис `/etc/systemd/system/messenger-socket.service`:

```ini
[Unit]
Description=Messenger Socket.io Server
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/messenger/node_server
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```

Запустите:

```bash
sudo systemctl daemon-reload
sudo systemctl enable messenger-socket
sudo systemctl start messenger-socket
sudo systemctl status messenger-socket
```

### 8. Backup БД

Создайте скрипт `/usr/local/bin/backup-messenger.sh`:

```bash
#!/bin/bash

BACKUP_DIR="/var/backups/messenger"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Backup БД
mysqldump -u messenger_user -p'password' messenger_db > $BACKUP_DIR/db_$TIMESTAMP.sql

# Сжать
gzip $BACKUP_DIR/db_$TIMESTAMP.sql

# Удалить старые (старше 30 дней)
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +30 -delete

echo "Backup completed: $BACKUP_DIR/db_$TIMESTAMP.sql.gz"
```

Добавьте в crontab:

```bash
0 2 * * * /usr/local/bin/backup-messenger.sh >> /var/log/messenger_backup.log 2>&1
```

### 9. Мониторинг

Создайте `/var/www/messenger/backend/api/health.php`:

```php
<?php
header('Content-Type: application/json');

$health = [
    'status' => 'healthy',
    'timestamp' => date('c'),
    'services' => [
        'database' => check_database(),
        'socket_server' => check_socket(),
        'disk_space' => check_disk()
    ]
];

function check_database() {
    try {
        $db = new Database();
        $conn = $db->connect();
        $result = $conn->query("SELECT 1");
        return 'ok';
    } catch (Exception $e) {
        return 'error';
    }
}

function check_socket() {
    $fp = @fsockopen('localhost', 3000, $errno, $errstr, 2);
    return $fp ? 'ok' : 'error';
}

function check_disk() {
    $free = disk_free_space('/');
    $total = disk_total_space('/');
    $percent = (($total - $free) / $total) * 100;
    return $percent > 90 ? 'warning' : 'ok';
}

echo json_encode($health);
```

---

## 🔐 Security Checklist для Production

- [ ] **HTTPS включен** (Let's Encrypt)
- [ ] **JWT_SECRET изменен** на уникальный 256-символьный
- [ ] **Пароль админа изменен** на сложный
- [ ] **CORS ограничен** (только фронтенд домен)
- [ ] **Rate Limiting включен**
- [ ] **SQL Logging отключен** (не логировать пароли)
- [ ] **File Permissions корректны** (644 файлы, 755 папки)
- [ ] **Database пароль в .env** (не в коде)
- [ ] **Debug mode отключен** (APP_DEBUG = false)
- [ ] **Логирование включено** (все ошибки в файл)
- [ ] **Backup автоматизирован** (ежедневно)
- [ ] **Firewall настроен** (порты 80, 443, 3000)
- [ ] **Reverse proxy настроен** (Nginx)
- [ ] **Monitoring включен** (heartbeat checks)

---

## 📈 Performance Optimization для Production

### PHP

```php
// Включить OPcache (в php.ini)
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
```

### MySQL

```sql
-- Оптимизация БД
OPTIMIZE TABLE users;
OPTIMIZE TABLE invites;
OPTIMIZE TABLE messages;
OPTIMIZE TABLE groups;

-- Проверка индексов
ANALYZE TABLE users;
ANALYZE TABLE invites;
ANALYZE TABLE messages;
```

### Nginx

```nginx
# Сжатие
gzip on;
gzip_types text/plain text/css text/javascript application/json;
gzip_min_length 1000;

# Кеширование
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}
```

### Node.js

```javascript
// Cluster mode для Socket.io
const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
    const numCPUs = os.cpus().length;
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
    // Start server
}
```

---

## 🚨 Логирование и Мониторинг

### Логирование ошибок PHP

```php
// php.ini
error_log = /var/log/php_errors.log
log_errors = On
error_reporting = E_ALL
```

### Мониторинг Socket.io

```bash
# Проверить процесс Node.js
ps aux | grep node

# Проверить порт 3000
netstat -tuln | grep 3000

# Логи systemd
journalctl -u messenger-socket -f
```

### Uptime Monitoring

Используйте UptimeRobot или аналог для проверки /backend/api/health

---

## 🐛 Troubleshooting

### Socket.io не подключается через proxy

```nginx
# Убедитесь что WebSocket поддерживается
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
```

### Slow database queries

```sql
-- Включить query log
SET GLOBAL log_queries_not_using_indexes = 'ON';

-- Анализировать медленные запросы
EXPLAIN SELECT * FROM messages WHERE created_at > DATE_SUB(NOW(), INTERVAL 1 DAY);

-- Проверить индексы
SHOW INDEX FROM messages;
```

### Memory issues

```bash
# Проверить использование памяти
free -h

# Увеличить PHP memory limit
php_value memory_limit 256M
```

---

## 📊 Мониторинг CPU/RAM

```bash
# Установить htop
sudo apt install htop -y

# Запустить мониторинг
htop
```

---

## 🎯 Итоговый чек-лист deployment

- [ ] Код загружен на VPS
- [ ] БД инициализирована
- [ ] PHP конфигурирован
- [ ] Nginx конфигурирован
- [ ] SSL сертификат установлен
- [ ] Node.js Socket server запущен
- [ ] Firewall настроен
- [ ] Backup скрипт работает
- [ ] Monitoring настроено
- [ ] Логирование работает
- [ ] DNS настроен на VPS IP
- [ ] HTTPS редирект активен
- [ ] Приложение доступно через https://your-domain.com

---

**Готово к production deployment! 🚀**
