sitemap и тд
This commit is contained in:
345
Manuals/VPS_SYNC_EXAMPLES.md
Normal file
345
Manuals/VPS_SYNC_EXAMPLES.md
Normal file
@@ -0,0 +1,345 @@
|
||||
# Примеры интеграции главного сайта с Панелью управления
|
||||
|
||||
## Как главному сайту передать данные о новом 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` правильный
|
||||
- Убедитесь что пользователь существует в БД
|
||||
- Проверьте логи панели на ошибки
|
||||
Reference in New Issue
Block a user