# 📝 راهنمای تنظیمات دستی پنل مدیریت VPN

اگر به هر دلیلی نمی‌توانید از نصب خودکار استفاده کنید، می‌توانید به صورت دستی پنل را راه‌اندازی کنید.

---

## 🗄️ مرحله 1: ایجاد دیتابیس

### روش 1: از phpMyAdmin

1. وارد **phpMyAdmin** شوید
2. از منوی سمت چپ روی **New** کلیک کنید
3. نام دیتابیس را وارد کنید (مثلاً: `vpn_panel`)
4. **Collation** را روی `utf8mb4_unicode_ci` تنظیم کنید
5. روی **Create** کلیک کنید

### روش 2: از خط فرمان MySQL

```sql
CREATE DATABASE vpn_panel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

---

## 📊 مرحله 2: Import جداول

### روش 1: از phpMyAdmin

1. دیتابیس `vpn_panel` را انتخاب کنید
2. به تب **Import** بروید
3. روی **Choose File** کلیک کنید
4. فایل `database.sql` را انتخاب کنید
5. روی **Go** کلیک کنید

### روش 2: از خط فرمان

```bash
mysql -u USERNAME -p vpn_panel < database.sql
```

---

## ⚙️ مرحله 3: ایجاد فایل Config

فایل `backend/config/config.php` را ایجاد کنید:

```php
<?php
/**
 * VPN Panel Configuration
 * تنظیمات اصلی پنل مدیریت
 */

// Database Configuration
define('DB_HOST', 'localhost');           // آدرس سرور MySQL
define('DB_NAME', 'vpn_panel');          // نام دیتابیس
define('DB_USER', 'your_db_username');   // نام کاربری MySQL
define('DB_PASS', 'your_db_password');   // رمز عبور MySQL

// Site Configuration
define('SITE_URL', 'http://your-domain.com');
define('SITE_NAME', 'پنل مدیریت VPN');

// Security Keys
// برای تولید کلید امن از این سایت استفاده کنید: https://randomkeygen.com/
define('JWT_SECRET', 'REPLACE_WITH_RANDOM_64_CHAR_STRING');
define('ENCRYPTION_KEY', 'REPLACE_WITH_RANDOM_64_CHAR_STRING');

// Session Configuration
define('SESSION_LIFETIME', 3600 * 24); // 24 ساعت

// Payment Gateways
define('ZARINPAL_MERCHANT', ''); // Merchant ID از ZarinPal
define('IDPAY_API_KEY', '');     // API Key از IDPay

// V2Ray Panel Configuration
define('V2RAY_PANEL_URL', '');   // آدرس پنل V2Ray
define('V2RAY_PANEL_TOKEN', ''); // توکن API پنل V2Ray

// Email Configuration (SMTP)
define('SMTP_HOST', 'smtp.gmail.com');
define('SMTP_PORT', 587);
define('SMTP_USER', '');
define('SMTP_PASS', '');
define('SMTP_FROM', 'noreply@yourdomain.com');

// Timezone
date_default_timezone_set('Asia/Tehran');

// Error Reporting
define('DEBUG_MODE', false); // در production حتماً false باشد

if (DEBUG_MODE) {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
} else {
    error_reporting(0);
    ini_set('display_errors', 0);
}
?>
```

---

## 🔐 مرحله 4: ایجاد کاربر ادمین

فایل `backend/config/database.php` را ایجاد کنید:

```php
<?php
/**
 * Database Connection Handler
 */

require_once 'config.php';

class Database {
    private static $instance = null;
    private $connection;
    
    private function __construct() {
        try {
            $this->connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
            
            if ($this->connection->connect_error) {
                throw new Exception('Database connection failed: ' . $this->connection->connect_error);
            }
            
            $this->connection->set_charset('utf8mb4');
            
        } catch (Exception $e) {
            die('Database Error: ' . $e->getMessage());
        }
    }
    
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function getConnection() {
        return $this->connection;
    }
    
    public function query($sql) {
        return $this->connection->query($sql);
    }
    
    public function prepare($sql) {
        return $this->connection->prepare($sql);
    }
    
    public function escape($value) {
        return $this->connection->real_escape_string($value);
    }
    
    public function lastInsertId() {
        return $this->connection->insert_id;
    }
}

function db() {
    return Database::getInstance();
}
?>
```

سپس یک فایل موقت برای ایجاد ادمین بسازید (`create_admin.php`):

```php
<?php
require_once 'backend/config/config.php';
require_once 'backend/config/database.php';

// تنظیمات ادمین
$username = 'admin';                    // نام کاربری
$password = 'Admin@123456';             // رمز عبور (تغییر دهید!)
$email = 'admin@yourdomain.com';       // ایمیل

// هش کردن رمز عبور
$hashed_password = password_hash($password, PASSWORD_BCRYPT);

// اتصال به دیتابیس
$conn = db()->getConnection();

// ایجاد کاربر ادمین
$stmt = $conn->prepare("INSERT INTO users (username, password, email, role, status, created_at) VALUES (?, ?, ?, 'admin', 'active', NOW())");
$stmt->bind_param("sss", $username, $hashed_password, $email);

if ($stmt->execute()) {
    echo "✅ کاربر ادمین با موفقیت ایجاد شد!\n\n";
    echo "📝 اطلاعات ورود:\n";
    echo "نام کاربری: $username\n";
    echo "رمز عبور: $password\n";
    echo "ایمیل: $email\n\n";
    echo "⚠️ توجه: این فایل را بلافاصله حذف کنید!\n";
} else {
    echo "❌ خطا: " . $stmt->error;
}

$stmt->close();
?>
```

این فایل را یکبار اجرا کنید و سپس حذف کنید:

```bash
php create_admin.php
rm create_admin.php
```

---

## 🔒 مرحله 5: تنظیمات امنیتی

### 1. دسترسی‌های فایل

```bash
# دسترسی پوشه‌ها
find vpn-panel/ -type d -exec chmod 755 {} \;

# دسترسی فایل‌ها
find vpn-panel/ -type f -exec chmod 644 {} \;

# محافظت از فایل‌های حساس
chmod 600 backend/config/config.php
chmod 600 backend/config/database.php
```

### 2. فایل .htaccess برای پوشه config

فایل `backend/config/.htaccess` را ایجاد کنید:

```apache
# محافظت از فایل‌های کانفیگ
<Files "*.php">
    Order Allow,Deny
    Deny from all
</Files>

# فقط از سرور خودتان قابل دسترسی
<FilesMatch "config\.php|database\.php">
    Order Allow,Deny
    Allow from 127.0.0.1
    Allow from ::1
</FilesMatch>
```

### 3. فایل .htaccess اصلی

فایل `vpn-panel/.htaccess` را ایجاد کنید:

```apache
# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# محافظت از فایل‌های حساس
<FilesMatch "\.(sql|lock|md|git)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>

# جلوگیری از لیست دایرکتوری
Options -Indexes

# محافظت از XSS
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"
```

---

## 🌐 مرحله 6: تنظیمات وب سرور

### Apache

فایل `.htaccess` اصلی در ریشه سایت:

```apache
RewriteEngine On

# API Routes
RewriteRule ^api/(.*)$ vpn-panel/backend/api/$1 [L]

# Admin Panel
RewriteRule ^admin/?$ vpn-panel/admin-panel/index.php [L]
RewriteRule ^admin/(.*)$ vpn-panel/admin-panel/$1 [L]

# React App (اگر استفاده می‌کنید)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.html [L]
```

### Nginx

```nginx
server {
    listen 80;
    server_name your-domain.com;
    root /var/www/html;
    index index.php index.html;

    # API Routes
    location /api/ {
        try_files $uri $uri/ /vpn-panel/backend/api/$uri;
    }

    # Admin Panel
    location /admin/ {
        try_files $uri $uri/ /vpn-panel/admin-panel/index.php?$args;
    }

    # PHP Processing
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
}
```

---

## 🧪 مرحله 7: تست نصب

### 1. تست اتصال دیتابیس

فایل `test_db.php` بسازید:

```php
<?php
require_once 'backend/config/config.php';
require_once 'backend/config/database.php';

try {
    $conn = db()->getConnection();
    echo "✅ اتصال به دیتابیس موفق!\n";
    
    // تست کوئری
    $result = $conn->query("SELECT COUNT(*) as count FROM users");
    $row = $result->fetch_assoc();
    echo "✅ تعداد کاربران: " . $row['count'] . "\n";
    
} catch (Exception $e) {
    echo "❌ خطا: " . $e->getMessage() . "\n";
}
?>
```

### 2. تست ورود به پنل

آدرس زیر را باز کنید:
```
http://your-domain.com/vpn-panel/admin-panel/
```

با اطلاعات ادمین وارد شوید.

---

## 📋 چک‌لیست تنظیمات

- [ ] دیتابیس ایجاد شد
- [ ] جداول import شدند
- [ ] فایل config.php ایجاد شد
- [ ] فایل database.php ایجاد شد
- [ ] کاربر ادمین ساخته شد
- [ ] کلیدهای امنیتی تصادفی تولید شدند
- [ ] دسترسی‌های فایل تنظیم شدند
- [ ] فایل‌های .htaccess ایجاد شدند
- [ ] تنظیمات وب سرور انجام شد
- [ ] تست اتصال موفق بود
- [ ] ورود به پنل موفق بود

---

## 🔧 تنظیمات اختیاری

### Cron Jobs برای وظایف خودکار

```bash
# همگام‌سازی اشتراک‌ها (هر 5 دقیقه)
*/5 * * * * /usr/bin/php /path/to/vpn-panel/backend/cron/sync-subscriptions.php

# پاکسازی سشن‌های منقضی (روزانه)
0 2 * * * /usr/bin/php /path/to/vpn-panel/backend/cron/cleanup-sessions.php

# ارسال ایمیل‌های یادآوری (روزانه)
0 9 * * * /usr/bin/php /path/to/vpn-panel/backend/cron/send-reminders.php
```

### Backup خودکار دیتابیس

```bash
#!/bin/bash
# فایل: backup_db.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/path/to/backups"
DB_NAME="vpn_panel"
DB_USER="your_username"
DB_PASS="your_password"

mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/backup_$DATE.sql
gzip $BACKUP_DIR/backup_$DATE.sql

# حذف بکاپ‌های قدیمی‌تر از 30 روز
find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +30 -delete
```

اضافه کردن به Cron:
```bash
0 3 * * * /path/to/backup_db.sh
```

---

## 🆘 رفع مشکلات

### خطای 500 Internal Server Error

```bash
# فعال کردن نمایش خطاها
در config.php:
define('DEBUG_MODE', true);

# بررسی لاگ خطاها
tail -f /var/log/apache2/error.log
# یا
tail -f /var/log/nginx/error.log
```

### خطای Permission Denied

```bash
# اعطای دسترسی به وب سرور
sudo chown -R www-data:www-data vpn-panel/
sudo chmod -R 755 vpn-panel/
```

### خطای Database Connection

```php
// تست دستی اتصال
$conn = new mysqli('localhost', 'username', 'password', 'database');
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
```

---

## 📞 پشتیبانی

اگر به مشکلی برخوردید:

1. لاگ خطاها را بررسی کنید
2. نسخه PHP و MySQL را چک کنید
3. دسترسی‌های فایل را بررسی کنید
4. تنظیمات config.php را دوباره چک کنید

---

**موفق باشید! 🎉**
