Настройка API и веб-хуков для Bedrock сервера

Материал из ARK-HOSTER.RU | Документация хостинга
Версия от 10:17, 3 ноября 2025; Admin (обсуждение | вклад) (Новая страница: «= Настройка API и веб-хуков для Bedrock сервера = == 1. Подготовка == * Убедитесь, что Bedrock сервер у…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Настройка API и веб-хуков для Bedrock сервера

1. Подготовка

  • Убедитесь, что Bedrock сервер установлен и работает.
  • Установите Node.js или Python для создания API.
  • Имейте базовые знания веб-разработки.
  • Рекомендуется использовать Ubuntu 24.04 LTS.

2. Создание REST API

Установка Node.js

1. Установите Node.js:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

2. Проверьте установку:

node -v
npm -v

Создание проекта

1. Создайте директорию:

sudo mkdir -p /opt/bedrock-api
cd /opt/bedrock-api

2. Инициализируйте проект:

sudo npm init -y

3. Установите зависимости:

sudo npm install express body-parser cors axios

Базовый API сервер

1. Создайте файл app.js:

sudo nano app.js

2. Добавьте содержимое:

const express = require('express');
const { spawn } = require('child_process');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
const port = 3000;

app.use(cors());
app.use(bodyParser.json());

\# Функция выполнения команд
function executeCommand(command) {
    return new Promise((resolve, reject) => {
        const proc = spawn('sudo', ['systemctl', ...command.split(' ')]);
        let output = '';
        let error = '';
        
        proc.stdout.on('data', (data) => {
            output += data.toString();
        });
        
        proc.stderr.on('data', (data) => {
            error += data.toString();
        });
        
        proc.on('close', (code) => {
            if (code === 0) {
                resolve(output);
            } else {
                reject(error || `Command failed with code ${code}`);
            }
        });
    });
}

\# Функция отправки команды в консоль сервера
function sendServerCommand(command) {
    return new Promise((resolve) => {
        const proc = spawn('screen', ['-S', 'minecraft-bedrock', '-X', 'stuff', command + '\\n']);
        proc.on('close', () => {
            setTimeout(resolve, 1000);
        });
    });
}

\# API Endpoints

\# Статус сервера
app.get('/api/server/status', async (req, res) => {
    try {
        const result = await executeCommand('systemctl is-active minecraft-bedrock');
        const status = result.trim() === 'active' ? 'running' : 'stopped';
        res.json({ status });
    } catch (error) {
        res.json({ status: 'stopped', error: error.message });
    }
});

\# Запуск сервера
app.post('/api/server/start', async (req, res) => {
    try {
        await executeCommand('systemctl start minecraft-bedrock');
        res.json({ success: true, message: 'Server started' });
    } catch (error) {
        res.status(500).json({ success: false, error: error.message });
    }
});

\# Остановка сервера
app.post('/api/server/stop', async (req, res) => {
    try {
        await executeCommand('systemctl stop minecraft-bedrock');
        res.json({ success: true, message: 'Server stopped' });
    } catch (error) {
        res.status(500).json({ success: false, error: error.message });
    }
});

\# Перезапуск сервера
app.post('/api/server/restart', async (req, res) => {
    try {
        await executeCommand('systemctl restart minecraft-bedrock');
        res.json({ success: true, message: 'Server restarted' });
    } catch (error) {
        res.status(500).json({ success: false, error: error.message });
    }
});

\# Выполнение команды
app.post('/api/server/command', async (req, res) => {
    const { command } = req.body;
    
    if (!command) {
        return res.status(400).json({ error: 'Command is required' });
    }
    
    try {
        await sendServerCommand(command);
        res.json({ success: true, message: 'Command sent' });
    } catch (error) {
        res.status(500).json({ success: false, error: error.message });
    }
});

\# Получение логов
app.get('/api/server/logs', (req, res) => {
    const fs = require('fs');
    const logFile = '/opt/bedrock/logs/latest.log';
    const lines = parseInt(req.query.lines) || 100;
    
    try {
        const content = fs.readFileSync(logFile, 'utf-8');
        const logLines = content.split('\\n').slice(-lines);
        res.json({ logs: logLines });
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

\# Информация о сервере
app.get('/api/server/info', async (req, res) => {
    const fs = require('fs');
    
    try {
        const pid = require('child_process').execSync('pgrep bedrock_server').toString().trim();
        const memory = parseInt(require('child_process').execSync(`ps -o rss= -p ${pid}`).toString().trim()) / 1024;
        const cpu = require('child_process').execSync(`ps -o %cpu= -p ${pid}`).toString().trim();
        
        const props = {};
        const propsContent = fs.readFileSync('/opt/bedrock/server.properties', 'utf-8');
        propsContent.split('\\n').forEach(line => {
            if (line && !line.startsWith('#')) {
                const [key, value] = line.split('=');
                if (key && value) {
                    props[key.trim()] = value.trim();
                }
            }
        });
        
        res.json({
            pid,
            memory: memory.toFixed(2),
            cpu,
            properties: props
        });
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

app.listen(port, () => {
    console.log(`Bedrock API server running on port ${port}`);
});

3. Запустите API:

sudo node app.js

3. Настройка systemd сервиса =

Создание сервиса

1. Создайте файл сервиса:

sudo nano /etc/systemd/system/bedrock-api.service

2. Добавьте конфигурацию:

[Unit]
Description=Bedrock Server API
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/bedrock-api
ExecStart=/usr/bin/node app.js
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

3. Запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable bedrock-api
sudo systemctl start bedrock-api
sudo systemctl status bedrock-api

4. Настройка веб-хуков =

Создание webhook endpoint

1. Добавьте в app.js:

const axios = require('axios');

\# Webhook конфигурация
const webhookConfig = {
    url: process.env.WEBHOOK_URL || 'https://discord.com/api/webhooks/YOUR_WEBHOOK',
    enabled: true
};

function sendWebhook(event, data) {
    if (!webhookConfig.enabled) return;
    
    const payload = {
        content: `🚨 **${event}**\\n\\n${JSON.stringify(data, null, 2)}`
    };
    
    axios.post(webhookConfig.url, payload).catch(err => {
        console.error('Webhook error:', err.message);
    });
}

\# Webhook endpoint для событий
app.post('/api/webhook/event', (req, res) => {
    const { event, data } = req.body;
    
    sendWebhook(event, data);
    res.json({ success: true });
});

\# Автоматические webhook события
app.post('/api/server/start', async (req, res) => {
    try {
        await executeCommand('systemctl start minecraft-bedrock');
        sendWebhook('Server Started', { timestamp: new Date() });
        res.json({ success: true, message: 'Server started' });
    } catch (error) {
        res.status(500).json({ success: false, error: error.message });
    }
});

5. Аутентификация API =

Добавление токенов

1. Обновите app.js:

const API_TOKEN = process.env.API_TOKEN || 'your-secret-token';

\# Middleware для проверки токена
function authenticate(req, res, next) {
    const token = req.headers['authorization']?.replace('Bearer ', '') || req.query.token;
    
    if (token === API_TOKEN) {
        next();
    } else {
        res.status(401).json({ error: 'Unauthorized' });
    }
}

\# Применение к защищенным routes
app.post('/api/server/*', authenticate);
app.get('/api/server/logs', authenticate);

2. Использование:

curl -H "Authorization: Bearer your-secret-token" http://localhost:3000/api/server/status

6. Примеры использования =

Получение статуса

curl http://localhost:3000/api/server/status

Ответ:

{
  "status": "running"
}

Выполнение команды

curl -X POST http://localhost:3000/api/server/command \\
  -H "Content-Type: application/json" \\
  -H "Authorization: Bearer your-secret-token" \\
  -d '{"command": "say Hello from API"}'

Получение логов

curl "http://localhost:3000/api/server/logs?lines=50"

7. Настройка Nginx для API =

Проксирование

1. Создайте конфигурацию Nginx:

sudo nano /etc/nginx/sites-available/bedrock-api

2. Добавьте конфигурацию:

server {
    listen 80;
    server_name api.yourdomain.com;

    location / {
        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_cache_bypass $http_upgrade;
    }
}

3. Активируйте сайт:

sudo ln -s /etc/nginx/sites-available/bedrock-api /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

8. Мониторинг через API =

Создание клиента

1. Пример JavaScript клиента:

const axios = require('axios');

const apiClient = axios.create({
    baseURL: 'http://localhost:3000/api',
    headers: {
        'Authorization': 'Bearer your-secret-token'
    }
});

async function checkServerStatus() {
    try {
        const response = await apiClient.get('/server/status');
        console.log('Server status:', response.data.status);
    } catch (error) {
        console.error('Error:', error.message);
    }
}

setInterval(checkServerStatus, 60000);

9. Безопасность =

Рекомендации

1. Используйте HTTPS для внешнего доступа 2. Ограничьте доступ по IP 3. Используйте сильные токены 4. Регулярно обновляйте зависимости

10. Устранение неполадок =

Проблемы с API

1. Проверьте логи:

sudo journalctl -u bedrock-api -f

2. Проверьте порт:

sudo netstat -tlnp | grep 3000

3. Проверьте права sudo

Заключение

Настройка API и веб-хуков для Bedrock сервера позволяет интегрировать сервер с внешними системами и автоматизировать управление. REST API предоставляет удобный интерфейс для управления сервером программно.

Для размещения ваших Bedrock серверов с API на надежном хостинге рекомендуем воспользоваться услугами [ARK-HOSTER.RU](https://ark-hoster.ru):

Наши специалисты помогут с настройкой API и веб-хуков для Bedrock серверов!