346 lines
11 KiB
Markdown
346 lines
11 KiB
Markdown
# Примеры интеграции главного сайта с Панелью управления
|
||
|
||
## Как главному сайту передать данные о новом VPS?
|
||
|
||
### Шаг 1: Настройка переменных окружения на Панели
|
||
|
||
Убедитесь что в `.env` установлен `VPS_SYNC_API_KEY`:
|
||
|
||
```env
|
||
VPS_SYNC_API_KEY="ваш_секретный_ключ_минимум_32_символа"
|
||
```
|
||
|
||
### Шаг 2: Отправить данные о новом VPS
|
||
|
||
После того как пользователь оплатил тариф на главном сайте и был создан VPS:
|
||
|
||
#### Пример на Node.js/TypeScript
|
||
|
||
```typescript
|
||
// services/vps-sync.ts
|
||
|
||
interface VPSData {
|
||
user_id: number; // ID из SSO (от Панели)
|
||
name: string; // Имя VPS
|
||
cpu: number; // Количество ядер
|
||
ram: number; // ОЗУ в GB (будет конвертировано в MB)
|
||
disk: number; // Диск в GB
|
||
os: string; // ОС (Ubuntu 22.04, CentOS 7, etc)
|
||
hypervisor?: string; // proxmox (по умолчанию)
|
||
}
|
||
|
||
export async function syncVPSToPanel(vpsData: VPSData) {
|
||
const panelApiUrl = process.env.OSPAB_PANEL_URL;
|
||
const syncApiKey = process.env.VPS_SYNC_API_KEY;
|
||
|
||
if (!panelApiUrl || !syncApiKey) {
|
||
throw new Error('Missing OSPAB_PANEL_URL or VPS_SYNC_API_KEY');
|
||
}
|
||
|
||
try {
|
||
const response = await fetch(`${panelApiUrl}/api/vps/sync`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'X-API-Key': syncApiKey,
|
||
},
|
||
body: JSON.stringify({
|
||
action: 'create',
|
||
vps: {
|
||
user_id: vpsData.user_id,
|
||
name: vpsData.name,
|
||
status: 'creating',
|
||
cpu: vpsData.cpu,
|
||
ram: vpsData.ram * 1024, // GB → MB
|
||
disk: vpsData.disk,
|
||
os: vpsData.os,
|
||
hypervisor: vpsData.hypervisor || 'proxmox',
|
||
},
|
||
}),
|
||
});
|
||
|
||
if (!response.ok) {
|
||
const error = await response.json();
|
||
throw new Error(`Sync failed: ${error.message}`);
|
||
}
|
||
|
||
const result = await response.json();
|
||
console.log('VPS synced successfully:', result.vps);
|
||
return result.vps;
|
||
} catch (error) {
|
||
console.error('Failed to sync VPS:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Пример использования в Express
|
||
|
||
```typescript
|
||
// routes/orders.ts
|
||
import { syncVPSToPanel } from '../services/vps-sync';
|
||
|
||
router.post('/orders/complete', async (req, res) => {
|
||
const { order_id, user_id, vps_config } = req.body;
|
||
|
||
try {
|
||
// Создаем VPS на хостинге (Proxmox, etc)
|
||
const proxmoxResponse = await createVPSOnProxmox(vps_config);
|
||
|
||
// Синхронизируем с Панелью управления
|
||
const vpsSynced = await syncVPSToPanel({
|
||
user_id: user_id,
|
||
name: vps_config.name,
|
||
cpu: vps_config.cpu,
|
||
ram: vps_config.ram,
|
||
disk: vps_config.disk,
|
||
os: vps_config.os,
|
||
});
|
||
|
||
// Обновляем статус заказа
|
||
await updateOrderStatus(order_id, 'completed', vpsSynced.id);
|
||
|
||
res.json({
|
||
success: true,
|
||
vps_id: vpsSynced.id,
|
||
message: 'VPS created successfully',
|
||
});
|
||
} catch (error) {
|
||
res.status(500).json({
|
||
success: false,
|
||
message: error.message,
|
||
});
|
||
}
|
||
});
|
||
```
|
||
|
||
### Шаг 3: После создания VPS - обновить статус
|
||
|
||
Когда VPS полностью готов и запущен:
|
||
|
||
```typescript
|
||
export async function updateVPSStatus(vpsId: number, status: string) {
|
||
const panelApiUrl = process.env.OSPAB_PANEL_URL;
|
||
const syncApiKey = process.env.VPS_SYNC_API_KEY;
|
||
|
||
const response = await fetch(`${panelApiUrl}/api/vps/sync`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'X-API-Key': syncApiKey,
|
||
},
|
||
body: JSON.stringify({
|
||
action: 'update',
|
||
vps: {
|
||
id: vpsId,
|
||
status: status, // 'running', 'stopped', 'creating', etc
|
||
},
|
||
}),
|
||
});
|
||
|
||
const result = await response.json();
|
||
if (!response.ok) throw new Error(result.message);
|
||
return result.vps;
|
||
}
|
||
```
|
||
|
||
### Шаг 4: Удаление VPS
|
||
|
||
Если клиент отменил услугу:
|
||
|
||
```typescript
|
||
export async function deleteVPSFromPanel(vpsId: number) {
|
||
const panelApiUrl = process.env.OSPAB_PANEL_URL;
|
||
const syncApiKey = process.env.VPS_SYNC_API_KEY;
|
||
|
||
const response = await fetch(`${panelApiUrl}/api/vps/sync`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'X-API-Key': syncApiKey,
|
||
},
|
||
body: JSON.stringify({
|
||
action: 'delete',
|
||
vps: {
|
||
id: vpsId,
|
||
},
|
||
}),
|
||
});
|
||
|
||
const result = await response.json();
|
||
if (!response.ok) throw new Error(result.message);
|
||
return result;
|
||
}
|
||
```
|
||
|
||
## Переменные окружения
|
||
|
||
### На главном сайте добавить:
|
||
|
||
```env
|
||
# URL Панели управления OSPAB
|
||
OSPAB_PANEL_URL=https://panel.ospab.host
|
||
# или при тестировании: http://localhost:5050
|
||
|
||
# API ключ для синхронизации (ДОЛЖЕН СОВПАДАТЬ с VPS_SYNC_API_KEY на Панели)
|
||
VPS_SYNC_API_KEY=ваш_секретный_ключ_минимум_32_символа
|
||
```
|
||
|
||
### На Панели управления (уже добавлено):
|
||
|
||
```env
|
||
VPS_SYNC_API_KEY=ваш_секретный_ключ_минимум_32_символа
|
||
```
|
||
|
||
## Тестирование
|
||
|
||
### 1. Создание VPS через curl
|
||
|
||
```bash
|
||
curl -X POST http://localhost:5050/api/vps/sync \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: your_secret_api_key_here_min_32_chars_change_this" \
|
||
-d '{
|
||
"action": "create",
|
||
"vps": {
|
||
"user_id": 5,
|
||
"name": "test-vps-01",
|
||
"status": "creating",
|
||
"cpu": 4,
|
||
"ram": 8192,
|
||
"disk": 100,
|
||
"os": "Ubuntu 22.04 LTS",
|
||
"hypervisor": "proxmox"
|
||
}
|
||
}'
|
||
```
|
||
|
||
### 2. Обновление статуса VPS
|
||
|
||
```bash
|
||
curl -X POST http://localhost:5050/api/vps/sync \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: your_secret_api_key_here_min_32_chars_change_this" \
|
||
-d '{
|
||
"action": "update",
|
||
"vps": {
|
||
"id": 1,
|
||
"status": "running"
|
||
}
|
||
}'
|
||
```
|
||
|
||
### 3. Удаление VPS
|
||
|
||
```bash
|
||
curl -X POST http://localhost:5050/api/vps/sync \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: your_secret_api_key_here_min_32_chars_change_this" \
|
||
-d '{
|
||
"action": "delete",
|
||
"vps": {
|
||
"id": 1
|
||
}
|
||
}'
|
||
```
|
||
|
||
### 4. Получение всех VPS клиента (в Панели - с клиентским токеном)
|
||
|
||
```bash
|
||
curl -X GET http://localhost:5050/api/vps \
|
||
-H "Authorization: Bearer your_jwt_token_here"
|
||
```
|
||
|
||
## Workflow
|
||
|
||
```
|
||
┌─────────────────────────────┐
|
||
│ Главный сайт (ospab.host) │
|
||
│ │
|
||
│ 1. Пользователь выбирает │
|
||
│ тариф и оплачивает │
|
||
└──────────────┬──────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────┐
|
||
│ Создание VPS на хостинге │
|
||
│ (Proxmox API call) │
|
||
│ - Выделяю CPU │
|
||
│ - Выделяю RAM │
|
||
│ - Выделяю Storage │
|
||
│ - Устанавливаю ОС │
|
||
└──────────────┬──────────────────┘
|
||
│
|
||
▼
|
||
┌──────────────────────────────────────┐
|
||
│ POST /api/vps/sync (action: create) │
|
||
│ X-API-Key: secret_key │
|
||
│ │
|
||
│ { │
|
||
│ user_id: 5, │
|
||
│ name: "web-server-01", │
|
||
│ cpu: 4, │
|
||
│ ram: 8192, │
|
||
│ disk: 100, │
|
||
│ os: "Ubuntu 22.04", │
|
||
│ hypervisor: "proxmox" │
|
||
│ } │
|
||
└──────────────┬───────────────────────┘
|
||
│
|
||
▼
|
||
┌───────────────────────────────┐
|
||
│ Панель управления (ospab) │
|
||
│ INSERT VPS в БД │
|
||
│ - Сохранить все параметры │
|
||
│ - Связать с user_id │
|
||
│ - Установить status:creating │
|
||
└──────────────┬────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────┐
|
||
│ VPS готов и запущен │
|
||
│ Главный сайт отправляет: │
|
||
│ POST /api/vps/sync │
|
||
│ action: "update" │
|
||
│ status: "running" │
|
||
└──────────────┬──────────────┘
|
||
│
|
||
▼
|
||
┌──────────────────────────────┐
|
||
│ Панель управления UPDATE │
|
||
│ VPS status = "running" │
|
||
│ │
|
||
│ Клиент видит VPS в панели │
|
||
│ и может им управлять │
|
||
└──────────────────────────────┘
|
||
```
|
||
|
||
## Проверка безопасности
|
||
|
||
✅ **API ключ в заголовке** - используется для синхронизации
|
||
✅ **JWT токен** - используется для доступа клиентов
|
||
✅ **User ID фильтр** - каждый пользователь видит только свои VPS
|
||
✅ **HTTPS в production** - все данные зашифрованы
|
||
✅ **Изоляция данных** - нет утечек между пользователями
|
||
|
||
## Решение проблем
|
||
|
||
### Ошибка: "Invalid or missing API key"
|
||
|
||
- Проверьте что `VPS_SYNC_API_KEY` установлен на Панели
|
||
- Убедитесь что API ключ одинаковый на обоих сайтах
|
||
- Проверьте заголовок `X-API-Key` в запросе
|
||
|
||
### Ошибка: "Missing required fields"
|
||
|
||
- Убедитесь что в JSON присутствуют: `action`, `vps`
|
||
- Для `create`: нужны все поля VPS
|
||
- Для `update`: минимум `id` и `status`
|
||
- Для `delete`: нужен `id`
|
||
|
||
### VPS не появляется в панели
|
||
|
||
- Проверьте что `user_id` правильный
|
||
- Убедитесь что пользователь существует в БД
|
||
- Проверьте логи панели на ошибки
|