/
rutur
/
Rutur
Обзор
Документация
Войти
/
rutur
/
Rutur
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
scripts/webhook-server.js
69 строк
3 KB
александр
Roles: superadmin/admin/client with moderation, role display in sidebar
04 фев 2026, 16:14
04 фев 2026, 16:14
858d940
Код
Авторство
О чём код?
/** * Простой HTTP‑сервер для приёма вебхука от GitVerse. * При POST с правильным секретом запускает scripts/deploy.sh. * * Запуск на сервере: * WEBHOOK_SECRET=ваш_секрет PROJECT_ROOT=/opt/Rutur node scripts/webhook-server.js * Или через pm2: * pm2 start scripts/webhook-server.js --name rutur-webhook -- --env WEBHOOK_SECRET=xxx --env PROJECT_ROOT=/opt/Rutur * * Переменные окружения: * WEBHOOK_SECRET — секрет (обязательно). Проверяется в заголовке X-Webhook-Secret или в query ?secret=... * PORT — порт (по умолчанию 4001) * PROJECT_ROOT — корень репозитория (по умолчанию текущая директория) */ const http = require('http'); const { exec } = require('child_process'); const path = require('path'); const PORT = parseInt(process.env.PORT || '4001', 10); const SECRET = process.env.WEBHOOK_SECRET || ''; const PROJECT_ROOT = process.env.PROJECT_ROOT || __dirname.replace(/\/scripts$/, '').replace(/\\scripts$/, '') || process.cwd(); function log(msg) { console.log(`[${new Date().toISOString()}] ${msg}`); } const server = http.createServer((req, res) => { if (req.method !== 'POST') { res.writeHead(405, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('Method Not Allowed'); return; } const url = new URL(req.url || '/', `http://localhost:${PORT}`); const querySecret = url.searchParams.get('secret'); let body = ''; req.on('data', (chunk) => { body += chunk; }); req.on('end', () => { const headerSecret = req.headers['x-webhook-secret'] || req.headers['x-gitverse-secret']; const token = headerSecret || querySecret; if (!SECRET || token !== SECRET) { log('Webhook rejected: invalid or missing secret'); res.writeHead(403, { 'Content-Type': 'application/json; charset=utf-8' }); res.end(JSON.stringify({ ok: false, error: 'Invalid secret' })); return; } res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); res.end(JSON.stringify({ ok: true, message: 'Deploy started' })); const scriptPath = path.join(PROJECT_ROOT, 'scripts', 'deploy.sh'); log(`Running deploy: ${scriptPath}`); exec(`bash "${scriptPath}"`, { cwd: PROJECT_ROOT, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => { if (err) log(`Deploy error: ${err.message}`); if (stdout) log(stdout); if (stderr) log(stderr); }); }); }); if (!SECRET) { console.error('Set WEBHOOK_SECRET environment variable'); process.exit(1); } server.listen(PORT, '127.0.0.1', () => { log(`Webhook server listening on http://127.0.0.1:${PORT}`); });