diff --git a/README.md b/README.md index 9b6a11c..7a3d68a 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,8 @@ ``` Панель и API на одном origin: `http://:8081` (caddy: статика + `/api → server`). +Для сборки zip-архивов расширения (страница /download) на сервере должен быть +установлен `zip` (`apt install zip` и т.п.). Первый зарегистрированный через панель аккаунт — обычный пользователь; проекты создаёт каждый сам, публичные ссылки выдаются на проект и репорт. diff --git a/deploy/Caddyfile b/deploy/Caddyfile index b381455..5eccbdc 100644 --- a/deploy/Caddyfile +++ b/deploy/Caddyfile @@ -2,6 +2,11 @@ handle /api/* { reverse_proxy server:8000 } + # extension zips: real files only — no SPA fallback, a missing zip is a 404 + handle /ext/* { + root * /srv/web + file_server + } handle { root * /srv/web try_files {path} /index.html diff --git a/packages/extension/scripts/package.mjs b/packages/extension/scripts/package.mjs index e520298..c2c34fd 100644 --- a/packages/extension/scripts/package.mjs +++ b/packages/extension/scripts/package.mjs @@ -1,7 +1,7 @@ import { execSync } from "node:child_process"; import { createRequire } from "node:module"; -import { mkdirSync, rmSync } from "node:fs"; -import { dirname, join } from "node:path"; +import { existsSync, mkdirSync, rmSync } from "node:fs"; +import { join } from "node:path"; /** * Zips the built extension targets into the web panel's public dir so caddy @@ -13,12 +13,22 @@ const extDir = new URL("..", import.meta.url).pathname; const outDir = join(extDir, "..", "web", "public", "ext"); +if (execSync("command -v zip || true").toString().trim() === "") { + console.error("The `zip` CLI is not installed — install it (apt install zip / apk add zip / pacman -S zip) and re-run."); + process.exit(1); +} + mkdirSync(outDir, { recursive: true }); for (const target of ["chrome", "firefox"]) { + const dist = join(extDir, "dist", target); + if (!existsSync(join(dist, "manifest.json"))) { + console.error(`${dist} has no manifest.json — run \`npm run build -w @ltt/extension\` first.`); + process.exit(1); + } const out = join(outDir, `bugtrail-${target}.zip`); rmSync(out, { force: true }); // zip the directory contents (manifest at the archive root) so the unpacked // folder can be loaded directly via "Load unpacked" - execSync(`zip -qr ${JSON.stringify(out)} .`, { cwd: join(extDir, "dist", target), stdio: "inherit" }); + execSync(`zip -qr ${JSON.stringify(out)} .`, { cwd: dist, stdio: "inherit" }); console.log(`packaged bugtrail-${target} v${version} -> ${out}`); } \ No newline at end of file