refactor(caddy): разделить site-блоки по хостам под переезд #3062
2 changed files with 43 additions and 3 deletions
|
|
@ -55,6 +55,26 @@ describe("палитра v3 доезжает до CSS", () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Эффективный конфиг Caddy = корневой Caddyfile + всё, что он импортирует из
|
||||||
|
* caddy/sites/*.caddy. С #3059 site-блоки живут в отдельных файлах (переезд на
|
||||||
|
* Selectel: на новом хосте поднимаются только apps, на Beget остаются infra),
|
||||||
|
* а корневой файл держит глобальные опции и два import'а. Читать один
|
||||||
|
* Caddyfile здесь больше нельзя — проверка стала бы пустой и молча зелёной.
|
||||||
|
*
|
||||||
|
* Берём ВСЕ файлы из caddy/sites/ намеренно: `import caddy/sites/{$CADDY_SITES:*}`
|
||||||
|
* без переменной раскрывается в звёздочку, то есть это и есть конфиг по умолчанию.
|
||||||
|
*/
|
||||||
|
function readEffectiveCaddyConfig(repoRoot: string): string {
|
||||||
|
const sitesDir = path.join(repoRoot, "caddy", "sites");
|
||||||
|
const siteFiles = readdirSync(sitesDir)
|
||||||
|
.filter((f) => f.endsWith(".caddy"))
|
||||||
|
.sort()
|
||||||
|
.map((f) => readFileSync(path.join(sitesDir, f), "utf8"));
|
||||||
|
return [readFileSync(path.join(repoRoot, "Caddyfile"), "utf8"), ...siteFiles].join("
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
describe("короткие адреса публичного домена", () => {
|
describe("короткие адреса публичного домена", () => {
|
||||||
/**
|
/**
|
||||||
* Дефект 15.08.2026: подвал v3 вёл «Главную» на `/mera-public`, а Caddy на
|
* Дефект 15.08.2026: подвал v3 вёл «Главную» на `/mera-public`, а Caddy на
|
||||||
|
|
@ -62,7 +82,7 @@ describe("короткие адреса публичного домена", () =
|
||||||
* голый путь падал в catch-all 404. Страница, которой нет в allowlist
|
* голый путь падал в catch-all 404. Страница, которой нет в allowlist
|
||||||
* Caddyfile, недоступна независимо от того, что она собралась.
|
* Caddyfile, недоступна независимо от того, что она собралась.
|
||||||
*/
|
*/
|
||||||
const caddyfile = readFileSync(path.join(REPO_ROOT, "Caddyfile"), "utf8");
|
const caddyfile = readEffectiveCaddyConfig(REPO_ROOT);
|
||||||
const meraBlock = caddyfile.slice(
|
const meraBlock = caddyfile.slice(
|
||||||
caddyfile.indexOf("meraocenka.ru {"),
|
caddyfile.indexOf("meraocenka.ru {"),
|
||||||
caddyfile.indexOf("merahome.ru {"),
|
caddyfile.indexOf("merahome.ru {"),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { readFileSync } from "node:fs";
|
import { readFileSync, readdirSync } from "node:fs";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
|
|
@ -19,6 +19,26 @@ import { isPublicPath } from "../RouteGuard";
|
||||||
* ТОЧНЫМ совпадением. Наивное добавление его в префиксный список сделало бы
|
* ТОЧНЫМ совпадением. Наивное добавление его в префиксный список сделало бы
|
||||||
* публичным всё приложение — `"/v2/admin".startsWith("/")` истинно.
|
* публичным всё приложение — `"/v2/admin".startsWith("/")` истинно.
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* Эффективный конфиг Caddy = корневой Caddyfile + всё, что он импортирует из
|
||||||
|
* caddy/sites/*.caddy. С #3059 site-блоки живут в отдельных файлах (переезд на
|
||||||
|
* Selectel: на новом хосте поднимаются только apps, на Beget остаются infra),
|
||||||
|
* а корневой файл держит глобальные опции и два import'а. Читать один
|
||||||
|
* Caddyfile здесь больше нельзя — проверка стала бы пустой и молча зелёной.
|
||||||
|
*
|
||||||
|
* Берём ВСЕ файлы из caddy/sites/ намеренно: `import caddy/sites/{$CADDY_SITES:*}`
|
||||||
|
* без переменной раскрывается в звёздочку, то есть это и есть конфиг по умолчанию.
|
||||||
|
*/
|
||||||
|
function readEffectiveCaddyConfig(repoRoot: string): string {
|
||||||
|
const sitesDir = path.join(repoRoot, "caddy", "sites");
|
||||||
|
const siteFiles = readdirSync(sitesDir)
|
||||||
|
.filter((f) => f.endsWith(".caddy"))
|
||||||
|
.sort()
|
||||||
|
.map((f) => readFileSync(path.join(sitesDir, f), "utf8"));
|
||||||
|
return [readFileSync(path.join(repoRoot, "Caddyfile"), "utf8"), ...siteFiles].join("
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
describe("isPublicPath", () => {
|
describe("isPublicPath", () => {
|
||||||
it("пропускает поддерево лэндинга (путь без basePath)", () => {
|
it("пропускает поддерево лэндинга (путь без basePath)", () => {
|
||||||
expect(isPublicPath("/mera-public")).toBe(true);
|
expect(isPublicPath("/mera-public")).toBe(true);
|
||||||
|
|
@ -50,7 +70,7 @@ describe("isPublicPath", () => {
|
||||||
it("совпадает с тем, что публичный домен реально раздаёт (Caddyfile)", () => {
|
it("совпадает с тем, что публичный домен реально раздаёт (Caddyfile)", () => {
|
||||||
// __tests__ → auth → components → src → frontend → tradein-mvp → корень.
|
// __tests__ → auth → components → src → frontend → tradein-mvp → корень.
|
||||||
const repoRoot = path.resolve(__dirname, "../../../../../..");
|
const repoRoot = path.resolve(__dirname, "../../../../../..");
|
||||||
const caddyfile = readFileSync(path.join(repoRoot, "Caddyfile"), "utf8");
|
const caddyfile = readEffectiveCaddyConfig(repoRoot);
|
||||||
const served = caddyfile
|
const served = caddyfile
|
||||||
.match(/@meraPages path ([^\n]+)/)?.[1]
|
.match(/@meraPages path ([^\n]+)/)?.[1]
|
||||||
.split(/\s+/)
|
.split(/\s+/)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue