Изменения файла scripts/dev.js
This commit is contained in:
parent
12b84a378d
commit
e85d1ce668
2 changed files with 174 additions and 49 deletions
|
|
@ -4,7 +4,7 @@
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "bun run scripts/dev.js",
|
"dev": "bun ./scripts/dev.js",
|
||||||
"dev:backend": "cd backend && ./pocketbase.exe serve",
|
"dev:backend": "cd backend && ./pocketbase.exe serve",
|
||||||
"dev:frontend": "cd frontend && bun dev",
|
"dev:frontend": "cd frontend && bun dev",
|
||||||
"build:frontend": "cd frontend && bun build",
|
"build:frontend": "cd frontend && bun build",
|
||||||
|
|
|
||||||
221
scripts/dev.js
221
scripts/dev.js
|
|
@ -3,64 +3,189 @@
|
||||||
import { $ } from "bun";
|
import { $ } from "bun";
|
||||||
import { spawn } from "child_process";
|
import { spawn } from "child_process";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
import { promisify } from "util";
|
||||||
|
import net from "net";
|
||||||
|
|
||||||
console.log("🚀 Запуск серверов avtourist086...\n");
|
const sleep = promisify(setTimeout);
|
||||||
|
|
||||||
// Запуск Maildev
|
// Проверка занятости порта
|
||||||
const maildev = spawn("maildev", ["--web", "1080", "--smtp", "1025"], {
|
async function isPortInUse(port) {
|
||||||
stdio: "inherit",
|
return new Promise((resolve) => {
|
||||||
shell: true,
|
const server = net.createServer();
|
||||||
});
|
server.once("error", () => resolve(true));
|
||||||
|
server.once("listening", () => {
|
||||||
|
server.close();
|
||||||
|
resolve(false);
|
||||||
|
});
|
||||||
|
server.listen(port);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Запуск PocketBase с SMTP настройками
|
// Принудительное убийство процесса по PID (Windows)
|
||||||
const backend = spawn("pocketbase.exe", ["serve"], {
|
async function killProcess(pid, force = true) {
|
||||||
cwd: path.join(process.cwd(), "backend"),
|
try {
|
||||||
stdio: "inherit",
|
if (process.platform === "win32") {
|
||||||
shell: true,
|
await $`taskkill /PID ${pid} ${force ? "/F" : ""}`.quiet();
|
||||||
env: {
|
} else {
|
||||||
...process.env,
|
process.kill(pid, force ? "SIGKILL" : "SIGTERM");
|
||||||
PB_SMTP_HOST: "localhost",
|
}
|
||||||
PB_SMTP_PORT: "1025",
|
} catch (e) {
|
||||||
PB_SMTP_FROM: "noreply@avtourist-surgut.ru"
|
// Процесс уже мёртв — ок
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
// Запуск Astro
|
// Поиск и убийство процессов по имени порта
|
||||||
const frontend = spawn("bun", ["dev"], {
|
async function killPort(port) {
|
||||||
cwd: "frontend",
|
try {
|
||||||
stdio: "inherit",
|
if (process.platform === "win32") {
|
||||||
shell: true,
|
// Находим PID по порту
|
||||||
});
|
const { stdout } = await $`netstat -ano | findstr :${port}`.quiet().nothrow();
|
||||||
|
const lines = stdout.toString().trim().split("\n");
|
||||||
|
const pids = new Set();
|
||||||
|
|
||||||
// Обработка завершения
|
for (const line of lines) {
|
||||||
const cleanup = () => {
|
const parts = line.trim().split(/\s+/);
|
||||||
|
if (parts.length >= 5) {
|
||||||
|
const pid = parts[4];
|
||||||
|
if (pid && !isNaN(parseInt(pid))) {
|
||||||
|
pids.add(parseInt(pid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const pid of pids) {
|
||||||
|
await killProcess(pid);
|
||||||
|
console.log(` 🔪 Убит процесс ${pid} на порту ${port}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await $`lsof -ti:${port} | xargs kill -9`.quiet().nothrow();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Нет процессов — ок
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка и освобождение портов
|
||||||
|
async function cleanupPorts() {
|
||||||
|
console.log("🔍 Проверка портов...");
|
||||||
|
const ports = [1025, 1080, 4321, 8090];
|
||||||
|
|
||||||
|
for (const port of ports) {
|
||||||
|
if (await isPortInUse(port)) {
|
||||||
|
console.log(` ⚠️ Порт ${port} занят, освобождаем...`);
|
||||||
|
await killPort(port);
|
||||||
|
await sleep(500); // Даём время на освобождение
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let maildev, backend, frontend;
|
||||||
|
|
||||||
|
// Корректное завершение всех процессов
|
||||||
|
async function cleanup() {
|
||||||
console.log("\n🛑 Остановка серверов...");
|
console.log("\n🛑 Остановка серверов...");
|
||||||
maildev.kill();
|
|
||||||
backend.kill();
|
// Принудительно убиваем каждый процесс с SIGKILL
|
||||||
frontend.kill();
|
const kills = [];
|
||||||
|
|
||||||
|
if (maildev && !maildev.killed) {
|
||||||
|
maildev.kill("SIGKILL");
|
||||||
|
kills.push(new Promise(r => maildev.once("exit", r)));
|
||||||
|
}
|
||||||
|
if (backend && !backend.killed) {
|
||||||
|
backend.kill("SIGKILL");
|
||||||
|
kills.push(new Promise(r => backend.once("exit", r)));
|
||||||
|
}
|
||||||
|
if (frontend && !frontend.killed) {
|
||||||
|
frontend.kill("SIGKILL");
|
||||||
|
kills.push(new Promise(r => frontend.once("exit", r)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ждём завершения не дольше 3 секунд
|
||||||
|
await Promise.race([
|
||||||
|
Promise.all(kills),
|
||||||
|
sleep(3000)
|
||||||
|
]);
|
||||||
|
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
};
|
}
|
||||||
|
|
||||||
process.on("SIGINT", cleanup);
|
// Главная функция
|
||||||
process.on("SIGTERM", cleanup);
|
async function main() {
|
||||||
|
await cleanupPorts();
|
||||||
|
|
||||||
// Ожидание завершения процессов
|
console.log("🚀 Запуск серверов avtourist086...\n");
|
||||||
maildev.on("exit", (code) => {
|
|
||||||
console.log(`Maildev остановлен с кодом ${code}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
backend.on("exit", (code) => {
|
// Запуск Maildev с отдельной группой процессов
|
||||||
console.log(`Backend остановлен с кодом ${code}`);
|
maildev = spawn("maildev", ["--web", "1080", "--smtp", "1025"], {
|
||||||
cleanup();
|
stdio: "inherit",
|
||||||
});
|
shell: true,
|
||||||
|
windowsHide: true,
|
||||||
|
detached: false
|
||||||
|
});
|
||||||
|
|
||||||
frontend.on("exit", (code) => {
|
// Запуск PocketBase
|
||||||
console.log(`Frontend остановлен с кодом ${code}`);
|
backend = spawn("pocketbase.exe", ["serve"], {
|
||||||
cleanup();
|
cwd: path.join(process.cwd(), "backend"),
|
||||||
});
|
stdio: "inherit",
|
||||||
|
shell: true,
|
||||||
|
windowsHide: true,
|
||||||
|
detached: false,
|
||||||
|
env: {
|
||||||
|
...process.env,
|
||||||
|
PB_SMTP_HOST: "localhost",
|
||||||
|
PB_SMTP_PORT: "1025",
|
||||||
|
PB_SMTP_FROM: "noreply@avtourist-surgut.ru"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
console.log("✅ Серверы запущены:\n");
|
// Запуск Astro
|
||||||
console.log(" Maildev (SMTP): http://localhost:1080");
|
frontend = spawn("bun", ["dev"], {
|
||||||
console.log(" Backend (PocketBase): http://localhost:8090");
|
cwd: "frontend",
|
||||||
console.log(" Frontend (Astro): http://localhost:4321\n");
|
stdio: "inherit",
|
||||||
console.log("Нажмите Ctrl+C для остановки\n");
|
shell: true,
|
||||||
|
windowsHide: true,
|
||||||
|
detached: false
|
||||||
|
});
|
||||||
|
|
||||||
|
// Обработчики сигналов
|
||||||
|
process.on("SIGINT", cleanup);
|
||||||
|
process.on("SIGTERM", cleanup);
|
||||||
|
process.on("SIGBREAK", cleanup); // Windows-specific
|
||||||
|
|
||||||
|
// Обработка закрытия консоли Windows
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
const readline = await import("readline");
|
||||||
|
readline.createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout
|
||||||
|
}).on("SIGINT", cleanup);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Мониторинг процессов
|
||||||
|
maildev.on("exit", (code) => {
|
||||||
|
console.log(`\n📧 Maildev остановлен с кодом ${code}`);
|
||||||
|
if (code !== 0 && code !== null) cleanup();
|
||||||
|
});
|
||||||
|
|
||||||
|
backend.on("exit", (code) => {
|
||||||
|
console.log(`\n💾 Backend остановлен с кодом ${code}`);
|
||||||
|
if (code !== 0 && code !== null) cleanup();
|
||||||
|
});
|
||||||
|
|
||||||
|
frontend.on("exit", (code) => {
|
||||||
|
console.log(`\n🌐 Frontend остановлен с кодом ${code}`);
|
||||||
|
cleanup();
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("✅ Серверы запущены:\n");
|
||||||
|
console.log(" 📧 Maildev (SMTP): http://localhost:1080");
|
||||||
|
console.log(" 💾 Backend (PocketBase): http://localhost:8090");
|
||||||
|
console.log(" 🌐 Frontend (Astro): http://localhost:4321\n");
|
||||||
|
console.log("Нажмите Ctrl+C для остановки\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(err => {
|
||||||
|
console.error("❌ Ошибка:", err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue