Настройка API и веб-хуков для Bedrock сервера
Содержание
- 1 Настройка API и веб-хуков для 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):
- [Выделенные серверы](https://ark-hoster.ru/dedicated/) - для высоконагруженных Bedrock серверов
- [VPS/VDS серверы](https://ark-hoster.ru/vpsgame/) - для небольших и средних серверов
Наши специалисты помогут с настройкой API и веб-хуков для Bedrock серверов!