@cicore/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/ci.js +13 -0
- package/dist/commands/addon/api-actions.d.ts +45 -0
- package/dist/commands/addon/api-actions.d.ts.map +1 -0
- package/dist/commands/addon/api-actions.js +281 -0
- package/dist/commands/addon/api-actions.js.map +1 -0
- package/dist/commands/addon/build.d.ts +11 -0
- package/dist/commands/addon/build.d.ts.map +1 -0
- package/dist/commands/addon/build.js +182 -0
- package/dist/commands/addon/build.js.map +1 -0
- package/dist/commands/addon/create.d.ts +11 -0
- package/dist/commands/addon/create.d.ts.map +1 -0
- package/dist/commands/addon/create.js +1186 -0
- package/dist/commands/addon/create.js.map +1 -0
- package/dist/commands/addon/delete.d.ts +13 -0
- package/dist/commands/addon/delete.d.ts.map +1 -0
- package/dist/commands/addon/delete.js +83 -0
- package/dist/commands/addon/delete.js.map +1 -0
- package/dist/commands/addon/deploy.d.ts +27 -0
- package/dist/commands/addon/deploy.d.ts.map +1 -0
- package/dist/commands/addon/deploy.js +459 -0
- package/dist/commands/addon/deploy.js.map +1 -0
- package/dist/commands/addon/dev-deploy.d.ts +31 -0
- package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
- package/dist/commands/addon/dev-deploy.js +128 -0
- package/dist/commands/addon/dev-deploy.js.map +1 -0
- package/dist/commands/addon/dev.d.ts +36 -0
- package/dist/commands/addon/dev.d.ts.map +1 -0
- package/dist/commands/addon/dev.js +323 -0
- package/dist/commands/addon/dev.js.map +1 -0
- package/dist/commands/addon/extract-classes.d.ts +23 -0
- package/dist/commands/addon/extract-classes.d.ts.map +1 -0
- package/dist/commands/addon/extract-classes.js +281 -0
- package/dist/commands/addon/extract-classes.js.map +1 -0
- package/dist/commands/addon/generate-safelist.d.ts +24 -0
- package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
- package/dist/commands/addon/generate-safelist.js +276 -0
- package/dist/commands/addon/generate-safelist.js.map +1 -0
- package/dist/commands/addon/index.d.ts +19 -0
- package/dist/commands/addon/index.d.ts.map +1 -0
- package/dist/commands/addon/index.js +296 -0
- package/dist/commands/addon/index.js.map +1 -0
- package/dist/commands/addon/init-repo.d.ts +25 -0
- package/dist/commands/addon/init-repo.d.ts.map +1 -0
- package/dist/commands/addon/init-repo.js +171 -0
- package/dist/commands/addon/init-repo.js.map +1 -0
- package/dist/commands/addon/install.d.ts +23 -0
- package/dist/commands/addon/install.d.ts.map +1 -0
- package/dist/commands/addon/install.js +84 -0
- package/dist/commands/addon/install.js.map +1 -0
- package/dist/commands/addon/list.d.ts +10 -0
- package/dist/commands/addon/list.d.ts.map +1 -0
- package/dist/commands/addon/list.js +102 -0
- package/dist/commands/addon/list.js.map +1 -0
- package/dist/commands/addon/manifest-refresh.d.ts +17 -0
- package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
- package/dist/commands/addon/manifest-refresh.js +48 -0
- package/dist/commands/addon/manifest-refresh.js.map +1 -0
- package/dist/commands/addon/migrate.d.ts +40 -0
- package/dist/commands/addon/migrate.d.ts.map +1 -0
- package/dist/commands/addon/migrate.js +236 -0
- package/dist/commands/addon/migrate.js.map +1 -0
- package/dist/commands/addon/publish.d.ts +33 -0
- package/dist/commands/addon/publish.d.ts.map +1 -0
- package/dist/commands/addon/publish.js +236 -0
- package/dist/commands/addon/publish.js.map +1 -0
- package/dist/commands/addon/scaffold-quality.d.ts +21 -0
- package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
- package/dist/commands/addon/scaffold-quality.js +90 -0
- package/dist/commands/addon/scaffold-quality.js.map +1 -0
- package/dist/commands/addon/sign.d.ts +9 -0
- package/dist/commands/addon/sign.d.ts.map +1 -0
- package/dist/commands/addon/sign.js +83 -0
- package/dist/commands/addon/sign.js.map +1 -0
- package/dist/commands/addon/toggle.d.ts +6 -0
- package/dist/commands/addon/toggle.d.ts.map +1 -0
- package/dist/commands/addon/toggle.js +46 -0
- package/dist/commands/addon/toggle.js.map +1 -0
- package/dist/commands/agent/index.d.ts +34 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +564 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/brand/index.d.ts +54 -0
- package/dist/commands/brand/index.d.ts.map +1 -0
- package/dist/commands/brand/index.js +367 -0
- package/dist/commands/brand/index.js.map +1 -0
- package/dist/commands/build/index.d.ts +53 -0
- package/dist/commands/build/index.d.ts.map +1 -0
- package/dist/commands/build/index.js +726 -0
- package/dist/commands/build/index.js.map +1 -0
- package/dist/commands/cache/flush-local.d.ts +31 -0
- package/dist/commands/cache/flush-local.d.ts.map +1 -0
- package/dist/commands/cache/flush-local.js +161 -0
- package/dist/commands/cache/flush-local.js.map +1 -0
- package/dist/commands/cache/index.d.ts +14 -0
- package/dist/commands/cache/index.d.ts.map +1 -0
- package/dist/commands/cache/index.js +453 -0
- package/dist/commands/cache/index.js.map +1 -0
- package/dist/commands/check/index.d.ts +8 -0
- package/dist/commands/check/index.d.ts.map +1 -0
- package/dist/commands/check/index.js +1316 -0
- package/dist/commands/check/index.js.map +1 -0
- package/dist/commands/cloudflare/index.d.ts +8 -0
- package/dist/commands/cloudflare/index.d.ts.map +1 -0
- package/dist/commands/cloudflare/index.js +453 -0
- package/dist/commands/cloudflare/index.js.map +1 -0
- package/dist/commands/core/create.d.ts +12 -0
- package/dist/commands/core/create.d.ts.map +1 -0
- package/dist/commands/core/create.js +206 -0
- package/dist/commands/core/create.js.map +1 -0
- package/dist/commands/core/delete.d.ts +11 -0
- package/dist/commands/core/delete.d.ts.map +1 -0
- package/dist/commands/core/delete.js +64 -0
- package/dist/commands/core/delete.js.map +1 -0
- package/dist/commands/core/env.d.ts +12 -0
- package/dist/commands/core/env.d.ts.map +1 -0
- package/dist/commands/core/env.js +95 -0
- package/dist/commands/core/env.js.map +1 -0
- package/dist/commands/core/health.d.ts +6 -0
- package/dist/commands/core/health.d.ts.map +1 -0
- package/dist/commands/core/health.js +215 -0
- package/dist/commands/core/health.js.map +1 -0
- package/dist/commands/core/index.d.ts +15 -0
- package/dist/commands/core/index.d.ts.map +1 -0
- package/dist/commands/core/index.js +86 -0
- package/dist/commands/core/index.js.map +1 -0
- package/dist/commands/core/list.d.ts +11 -0
- package/dist/commands/core/list.d.ts.map +1 -0
- package/dist/commands/core/list.js +58 -0
- package/dist/commands/core/list.js.map +1 -0
- package/dist/commands/core/rebuild.d.ts +13 -0
- package/dist/commands/core/rebuild.d.ts.map +1 -0
- package/dist/commands/core/rebuild.js +119 -0
- package/dist/commands/core/rebuild.js.map +1 -0
- package/dist/commands/db/index.d.ts +23 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +355 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/db/promote-silo.d.ts +320 -0
- package/dist/commands/db/promote-silo.d.ts.map +1 -0
- package/dist/commands/db/promote-silo.js +930 -0
- package/dist/commands/db/promote-silo.js.map +1 -0
- package/dist/commands/db/relocate.d.ts +41 -0
- package/dist/commands/db/relocate.d.ts.map +1 -0
- package/dist/commands/db/relocate.js +482 -0
- package/dist/commands/db/relocate.js.map +1 -0
- package/dist/commands/db/rollback-silo.d.ts +44 -0
- package/dist/commands/db/rollback-silo.d.ts.map +1 -0
- package/dist/commands/db/rollback-silo.js +402 -0
- package/dist/commands/db/rollback-silo.js.map +1 -0
- package/dist/commands/deploy/index.d.ts +26 -0
- package/dist/commands/deploy/index.d.ts.map +1 -0
- package/dist/commands/deploy/index.js +107 -0
- package/dist/commands/deploy/index.js.map +1 -0
- package/dist/commands/devops/index.d.ts +6 -0
- package/dist/commands/devops/index.d.ts.map +1 -0
- package/dist/commands/devops/index.js +220 -0
- package/dist/commands/devops/index.js.map +1 -0
- package/dist/commands/domain/index.d.ts +8 -0
- package/dist/commands/domain/index.d.ts.map +1 -0
- package/dist/commands/domain/index.js +386 -0
- package/dist/commands/domain/index.js.map +1 -0
- package/dist/commands/image/index.d.ts +8 -0
- package/dist/commands/image/index.d.ts.map +1 -0
- package/dist/commands/image/index.js +308 -0
- package/dist/commands/image/index.js.map +1 -0
- package/dist/commands/install/factory-reset.d.ts +21 -0
- package/dist/commands/install/factory-reset.d.ts.map +1 -0
- package/dist/commands/install/factory-reset.js +83 -0
- package/dist/commands/install/factory-reset.js.map +1 -0
- package/dist/commands/install/index.d.ts +17 -0
- package/dist/commands/install/index.d.ts.map +1 -0
- package/dist/commands/install/index.js +44 -0
- package/dist/commands/install/index.js.map +1 -0
- package/dist/commands/install/install.d.ts +35 -0
- package/dist/commands/install/install.d.ts.map +1 -0
- package/dist/commands/install/install.js +171 -0
- package/dist/commands/install/install.js.map +1 -0
- package/dist/commands/login/index.d.ts +15 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +58 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/nginx/index.d.ts +11 -0
- package/dist/commands/nginx/index.d.ts.map +1 -0
- package/dist/commands/nginx/index.js +580 -0
- package/dist/commands/nginx/index.js.map +1 -0
- package/dist/commands/server/bootstrap.d.ts +25 -0
- package/dist/commands/server/bootstrap.d.ts.map +1 -0
- package/dist/commands/server/bootstrap.js +260 -0
- package/dist/commands/server/bootstrap.js.map +1 -0
- package/dist/commands/server/index.d.ts +8 -0
- package/dist/commands/server/index.d.ts.map +1 -0
- package/dist/commands/server/index.js +2524 -0
- package/dist/commands/server/index.js.map +1 -0
- package/dist/commands/setup/index.d.ts +34 -0
- package/dist/commands/setup/index.d.ts.map +1 -0
- package/dist/commands/setup/index.js +423 -0
- package/dist/commands/setup/index.js.map +1 -0
- package/dist/commands/ssl/index.d.ts +8 -0
- package/dist/commands/ssl/index.d.ts.map +1 -0
- package/dist/commands/ssl/index.js +275 -0
- package/dist/commands/ssl/index.js.map +1 -0
- package/dist/commands/superadmin/index.d.ts +16 -0
- package/dist/commands/superadmin/index.d.ts.map +1 -0
- package/dist/commands/superadmin/index.js +81 -0
- package/dist/commands/superadmin/index.js.map +1 -0
- package/dist/commands/tenant/index.d.ts +6 -0
- package/dist/commands/tenant/index.d.ts.map +1 -0
- package/dist/commands/tenant/index.js +192 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/addon-sign.d.ts +23 -0
- package/dist/lib/addon-sign.d.ts.map +1 -0
- package/dist/lib/addon-sign.js +39 -0
- package/dist/lib/addon-sign.js.map +1 -0
- package/dist/lib/addon-sign.test.d.ts +2 -0
- package/dist/lib/addon-sign.test.d.ts.map +1 -0
- package/dist/lib/addon-sign.test.js +27 -0
- package/dist/lib/addon-sign.test.js.map +1 -0
- package/dist/lib/cdn.d.ts +25 -0
- package/dist/lib/cdn.d.ts.map +1 -0
- package/dist/lib/cdn.js +131 -0
- package/dist/lib/cdn.js.map +1 -0
- package/dist/lib/cloudflare.d.ts +133 -0
- package/dist/lib/cloudflare.d.ts.map +1 -0
- package/dist/lib/cloudflare.js +435 -0
- package/dist/lib/cloudflare.js.map +1 -0
- package/dist/lib/config.d.ts +96 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +132 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env.d.ts +8 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +64 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/hosts.d.ts +194 -0
- package/dist/lib/hosts.d.ts.map +1 -0
- package/dist/lib/hosts.js +183 -0
- package/dist/lib/hosts.js.map +1 -0
- package/dist/lib/logger.d.ts +68 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +130 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/nginx-config.d.ts +78 -0
- package/dist/lib/nginx-config.d.ts.map +1 -0
- package/dist/lib/nginx-config.js +736 -0
- package/dist/lib/nginx-config.js.map +1 -0
- package/dist/lib/ops/addon-dev.d.ts +93 -0
- package/dist/lib/ops/addon-dev.d.ts.map +1 -0
- package/dist/lib/ops/addon-dev.js +237 -0
- package/dist/lib/ops/addon-dev.js.map +1 -0
- package/dist/lib/ops/addon-quality.d.ts +38 -0
- package/dist/lib/ops/addon-quality.d.ts.map +1 -0
- package/dist/lib/ops/addon-quality.js +338 -0
- package/dist/lib/ops/addon-quality.js.map +1 -0
- package/dist/lib/ops/addon-routes.d.ts +49 -0
- package/dist/lib/ops/addon-routes.d.ts.map +1 -0
- package/dist/lib/ops/addon-routes.js +189 -0
- package/dist/lib/ops/addon-routes.js.map +1 -0
- package/dist/lib/ops/addon.d.ts +120 -0
- package/dist/lib/ops/addon.d.ts.map +1 -0
- package/dist/lib/ops/addon.js +260 -0
- package/dist/lib/ops/addon.js.map +1 -0
- package/dist/lib/ops/cdn.d.ts +87 -0
- package/dist/lib/ops/cdn.d.ts.map +1 -0
- package/dist/lib/ops/cdn.js +170 -0
- package/dist/lib/ops/cdn.js.map +1 -0
- package/dist/lib/ops/cf.d.ts +36 -0
- package/dist/lib/ops/cf.d.ts.map +1 -0
- package/dist/lib/ops/cf.js +114 -0
- package/dist/lib/ops/cf.js.map +1 -0
- package/dist/lib/ops/compose.d.ts +95 -0
- package/dist/lib/ops/compose.d.ts.map +1 -0
- package/dist/lib/ops/compose.js +165 -0
- package/dist/lib/ops/compose.js.map +1 -0
- package/dist/lib/ops/core.d.ts +117 -0
- package/dist/lib/ops/core.d.ts.map +1 -0
- package/dist/lib/ops/core.js +322 -0
- package/dist/lib/ops/core.js.map +1 -0
- package/dist/lib/ops/db.d.ts +116 -0
- package/dist/lib/ops/db.d.ts.map +1 -0
- package/dist/lib/ops/db.js +351 -0
- package/dist/lib/ops/db.js.map +1 -0
- package/dist/lib/ops/dns.d.ts +111 -0
- package/dist/lib/ops/dns.d.ts.map +1 -0
- package/dist/lib/ops/dns.js +306 -0
- package/dist/lib/ops/dns.js.map +1 -0
- package/dist/lib/ops/image.d.ts +94 -0
- package/dist/lib/ops/image.d.ts.map +1 -0
- package/dist/lib/ops/image.js +159 -0
- package/dist/lib/ops/image.js.map +1 -0
- package/dist/lib/ops/nginx.d.ts +114 -0
- package/dist/lib/ops/nginx.d.ts.map +1 -0
- package/dist/lib/ops/nginx.js +388 -0
- package/dist/lib/ops/nginx.js.map +1 -0
- package/dist/lib/ops/redis.d.ts +7 -0
- package/dist/lib/ops/redis.d.ts.map +1 -0
- package/dist/lib/ops/redis.js +35 -0
- package/dist/lib/ops/redis.js.map +1 -0
- package/dist/lib/ops/ssh.d.ts +127 -0
- package/dist/lib/ops/ssh.d.ts.map +1 -0
- package/dist/lib/ops/ssh.js +269 -0
- package/dist/lib/ops/ssh.js.map +1 -0
- package/dist/lib/prompts.d.ts +46 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +113 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/sast.d.ts +43 -0
- package/dist/lib/sast.d.ts.map +1 -0
- package/dist/lib/sast.js +79 -0
- package/dist/lib/sast.js.map +1 -0
- package/dist/lib/sast.test.d.ts +2 -0
- package/dist/lib/sast.test.d.ts.map +1 -0
- package/dist/lib/sast.test.js +33 -0
- package/dist/lib/sast.test.js.map +1 -0
- package/dist/lib/shell.d.ts +61 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +183 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/ssh-config.d.ts +37 -0
- package/dist/lib/ssh-config.d.ts.map +1 -0
- package/dist/lib/ssh-config.js +122 -0
- package/dist/lib/ssh-config.js.map +1 -0
- package/dist/lib/tenant-scope.d.ts +38 -0
- package/dist/lib/tenant-scope.d.ts.map +1 -0
- package/dist/lib/tenant-scope.js +129 -0
- package/dist/lib/tenant-scope.js.map +1 -0
- package/dist/lib/tenant-scope.test.d.ts +2 -0
- package/dist/lib/tenant-scope.test.d.ts.map +1 -0
- package/dist/lib/tenant-scope.test.js +223 -0
- package/dist/lib/tenant-scope.test.js.map +1 -0
- package/package.json +58 -0
- package/templates/bootstrap/.env.template +54 -0
- package/templates/bootstrap/docker-compose.yml +145 -0
- package/templates/vhost.conf.tmpl +446 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI — `ci brand reconcile` (control-plane → node state)
|
|
3
|
+
*
|
|
4
|
+
* The reproducibility keystone (plan B2). The control-plane DB
|
|
5
|
+
* (`vucore_control`: `cp_brands` + `cp_domains`) is the single source of
|
|
6
|
+
* truth; this command *renders* the derived node state from it, idempotently:
|
|
7
|
+
*
|
|
8
|
+
* 1. brand.json — projects each active brand's identity into
|
|
9
|
+
* `cores/<slug>/brand.json` (logo/title/theme) so the Nuxt runtime
|
|
10
|
+
* (core-loader → useBrand → VBrandLogo + titleTemplate) reflects it.
|
|
11
|
+
* Canonical writer; `BrandService::reconcileBrandJson` (PHP) mirrors it.
|
|
12
|
+
* 2. nginx — ensures the core_path map entry + domain→core map + per-domain
|
|
13
|
+
* vhost for every brand domain (`cp_domains` owner_type='brand').
|
|
14
|
+
* 3. DNS (opt-in, --dns) — provisions each domain via the DnsProvider and
|
|
15
|
+
* writes the achieved routing/SSL state back to `cp_domains`.
|
|
16
|
+
* 4. Reloads nginx once (validates first).
|
|
17
|
+
*
|
|
18
|
+
* Idempotent by construction: brand.json is compared semantically (no rewrite
|
|
19
|
+
* if unchanged), nginx map inserts skip-if-present, vhost render is
|
|
20
|
+
* content-stable. Running twice = a clean "unchanged" run. Drift (a hand-
|
|
21
|
+
* edited node, a wiped nginx map) is repaired from the control-plane — the
|
|
22
|
+
* disaster-recovery property the plan calls out (K0).
|
|
23
|
+
*/
|
|
24
|
+
import { Command } from 'commander';
|
|
25
|
+
import { type HostConfig } from '../../lib/hosts.js';
|
|
26
|
+
interface BrandRow {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly slug: string;
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly logo_url: string | null;
|
|
31
|
+
readonly favicon_url: string | null;
|
|
32
|
+
readonly theme: Record<string, unknown> | null;
|
|
33
|
+
readonly data_db_name: string | null;
|
|
34
|
+
}
|
|
35
|
+
export declare function registerBrandCommands(program: Command): void;
|
|
36
|
+
/**
|
|
37
|
+
* Project tenant state between the control-plane and the brand's data DB (K14
|
|
38
|
+
* BD2). Two directions, both idempotent:
|
|
39
|
+
*
|
|
40
|
+
* - mirror UP: data DB `tnt_tenants` → `cp_tenants_ref` (the control-plane's
|
|
41
|
+
* lightweight tenant mirror; tenants are authored in the data plane, the
|
|
42
|
+
* mirror gives the control-plane the brand↔tenant link routing needs).
|
|
43
|
+
* - project DOWN: `cp_domains` (owner_type='tenant', this brand's tenants) →
|
|
44
|
+
* data DB `tnt_domains`, the cache the runtime reads for host→tenant
|
|
45
|
+
* resolution. cp_domains is the authority (K14); tnt_domains is derived.
|
|
46
|
+
*
|
|
47
|
+
* Upsert by default. With `prune`, also delete derived tnt_domains rows the
|
|
48
|
+
* control-plane no longer lists — safe post-BD3 (the tenant write path now
|
|
49
|
+
* authors cp_domains first, so tnt_domains is purely derived). FK misses
|
|
50
|
+
* (a cp_domains tenant whose tenant isn't in the data DB) are skipped + warned.
|
|
51
|
+
*/
|
|
52
|
+
export declare function projectTenantState(cfg: HostConfig, brand: BrandRow, summary: string[], prune?: boolean): Promise<void>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/brand/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAkBnE,UAAU,QAAQ;IAChB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CACrC;AA+BD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D;AAyMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI — `ci brand reconcile` (control-plane → node state)
|
|
3
|
+
*
|
|
4
|
+
* The reproducibility keystone (plan B2). The control-plane DB
|
|
5
|
+
* (`vucore_control`: `cp_brands` + `cp_domains`) is the single source of
|
|
6
|
+
* truth; this command *renders* the derived node state from it, idempotently:
|
|
7
|
+
*
|
|
8
|
+
* 1. brand.json — projects each active brand's identity into
|
|
9
|
+
* `cores/<slug>/brand.json` (logo/title/theme) so the Nuxt runtime
|
|
10
|
+
* (core-loader → useBrand → VBrandLogo + titleTemplate) reflects it.
|
|
11
|
+
* Canonical writer; `BrandService::reconcileBrandJson` (PHP) mirrors it.
|
|
12
|
+
* 2. nginx — ensures the core_path map entry + domain→core map + per-domain
|
|
13
|
+
* vhost for every brand domain (`cp_domains` owner_type='brand').
|
|
14
|
+
* 3. DNS (opt-in, --dns) — provisions each domain via the DnsProvider and
|
|
15
|
+
* writes the achieved routing/SSL state back to `cp_domains`.
|
|
16
|
+
* 4. Reloads nginx once (validates first).
|
|
17
|
+
*
|
|
18
|
+
* Idempotent by construction: brand.json is compared semantically (no rewrite
|
|
19
|
+
* if unchanged), nginx map inserts skip-if-present, vhost render is
|
|
20
|
+
* content-stable. Running twice = a clean "unchanged" run. Drift (a hand-
|
|
21
|
+
* edited node, a wiped nginx map) is repaired from the control-plane — the
|
|
22
|
+
* disaster-recovery property the plan calls out (K0).
|
|
23
|
+
*/
|
|
24
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
25
|
+
import { isDryRun } from '../../lib/config.js';
|
|
26
|
+
import { getHostConfig } from '../../lib/hosts.js';
|
|
27
|
+
import { dbSelectJson, dbExec } from '../../lib/ops/db.js';
|
|
28
|
+
import { coreReconcileBrandJson } from '../../lib/ops/core.js';
|
|
29
|
+
import { nginxDomainAdd, nginxDomainRemove, nginxEnsureCorePath, nginxListDomainsForCore, nginxReload, nginxRemoveVhost, nginxWriteVhost, } from '../../lib/ops/nginx.js';
|
|
30
|
+
import { createDnsProvider } from '../../lib/ops/dns.js';
|
|
31
|
+
const CONTROL_DB = 'vucore_control';
|
|
32
|
+
/** Brand slugs (and the core dirs they map to) — keep in sync with assertSlug (PHP) + assertCoreName (CLI). */
|
|
33
|
+
const SLUG_RE = /^[a-z][a-z0-9_-]{1,62}$/;
|
|
34
|
+
export function registerBrandCommands(program) {
|
|
35
|
+
const brand = program.command('brand').description('Brand control-plane operations');
|
|
36
|
+
brand
|
|
37
|
+
.command('reconcile')
|
|
38
|
+
.description('Render node state (brand.json + nginx + DNS) from the control-plane (idempotent)')
|
|
39
|
+
.option('-h, --host <host>', 'Host alias (cicore | mkt)')
|
|
40
|
+
.option('--brand <slug>', 'Reconcile only this brand slug (default: all active brands)')
|
|
41
|
+
.option('--dns', 'Also provision DNS + TLS for each brand domain via the DnsProvider')
|
|
42
|
+
.option('--fallback-origin <host>', 'CF-for-SaaS fallback origin / owned_zone origin target (with --dns)')
|
|
43
|
+
.option('--ssl-cert-name <name>', "SSL cert basename for vhosts (default: host's defaultSslCertName)")
|
|
44
|
+
.option('--prune', 'Delete orphans the control-plane no longer lists (nginx map/vhost + tnt_domains). Destructive — off by default (BD4)')
|
|
45
|
+
.action(async (options) => {
|
|
46
|
+
await reconcile(options);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function reconcile(options) {
|
|
50
|
+
log.title('🔄 Brand reconcile (control-plane → node state)');
|
|
51
|
+
if (options.host === undefined) {
|
|
52
|
+
log.error('--host is required (cicore | mkt). Pass --host <alias>.');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
if (options.brand !== undefined && !SLUG_RE.test(options.brand)) {
|
|
56
|
+
log.error(`Invalid --brand slug '${options.brand}' (a-z, 0-9, -, _; start with a letter).`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
let cfg;
|
|
60
|
+
try {
|
|
61
|
+
cfg = getHostConfig(options.host);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
const dryRun = isDryRun();
|
|
68
|
+
const sslCertName = options.sslCertName ?? cfg.defaultSslCertName;
|
|
69
|
+
log.info(`Target host: ${cfg.brandName}`);
|
|
70
|
+
log.info(`Scope: ${options.brand ?? 'all active brands'}`);
|
|
71
|
+
log.info(`DNS: ${options.dns ? 'provision (--dns)' : 'skip'}`);
|
|
72
|
+
log.info(`Prune: ${options.prune ? 'delete orphans (--prune)' : 'keep (upsert-only)'}`);
|
|
73
|
+
log.info(`Dry run: ${dryRun ? 'yes' : 'no'}`);
|
|
74
|
+
log.blank();
|
|
75
|
+
// ── Read desired state from the control-plane ──────────────────────────
|
|
76
|
+
const brandFilter = options.brand ? ` AND slug = '${options.brand}'` : '';
|
|
77
|
+
const brands = await dbSelectJson(cfg, CONTROL_DB, `SELECT id, slug, title, logo_url, favicon_url, theme, data_db_name
|
|
78
|
+
FROM cp_brands
|
|
79
|
+
WHERE status = 'active'${brandFilter}
|
|
80
|
+
ORDER BY slug`);
|
|
81
|
+
if (brands.length === 0) {
|
|
82
|
+
log.warn(`No active brands found in ${CONTROL_DB}${options.brand ? ` matching '${options.brand}'` : ''}. Nothing to reconcile.`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const domains = await dbSelectJson(cfg, CONTROL_DB, `SELECT d.domain, d.kind, d.dns_mode, d.ssl_cert_name, b.slug AS brand_slug
|
|
86
|
+
FROM cp_domains d
|
|
87
|
+
JOIN cp_brands b ON b.id = d.owner_id
|
|
88
|
+
WHERE d.owner_type = 'brand'${options.brand ? ` AND b.slug = '${options.brand}'` : ''}
|
|
89
|
+
ORDER BY d.domain`);
|
|
90
|
+
log.info(`Desired: ${brands.length} brand(s), ${domains.length} domain(s).`);
|
|
91
|
+
log.blank();
|
|
92
|
+
const summary = [];
|
|
93
|
+
let nginxTouched = false;
|
|
94
|
+
// ── Render each brand ──────────────────────────────────────────────────
|
|
95
|
+
for (const b of brands) {
|
|
96
|
+
const brandDomains = domains.filter(d => d.brand_slug === b.slug);
|
|
97
|
+
await step(`brand ${b.slug}`, dryRun, async () => {
|
|
98
|
+
// 1. brand.json projection (semantic-idempotent).
|
|
99
|
+
const projection = {
|
|
100
|
+
brand: b.slug,
|
|
101
|
+
title: b.title,
|
|
102
|
+
logoUrl: b.logo_url || null,
|
|
103
|
+
faviconUrl: b.favicon_url || null,
|
|
104
|
+
theme: b.theme ?? {},
|
|
105
|
+
};
|
|
106
|
+
if (dryRun) {
|
|
107
|
+
log.warn(`[dry-run] reconcile brand.json for ${b.slug} + map ${brandDomains.length} domain(s)`);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const bj = await coreReconcileBrandJson(cfg, b.slug, projection);
|
|
111
|
+
if (!bj.success)
|
|
112
|
+
throw new Error(`brand.json: ${bj.stderr}`);
|
|
113
|
+
summary.push(`✓ ${b.slug}: brand.json ${bj.changed ? 'written' : 'unchanged'}`);
|
|
114
|
+
// 2. nginx core_path + per-domain map + vhost.
|
|
115
|
+
const pathRes = await nginxEnsureCorePath(cfg, b.slug);
|
|
116
|
+
if (!pathRes.success)
|
|
117
|
+
throw new Error(`nginx core_path: ${pathRes.stderr}`);
|
|
118
|
+
for (const d of brandDomains) {
|
|
119
|
+
const mapRes = await nginxDomainAdd(cfg, d.domain, b.slug);
|
|
120
|
+
if (!mapRes.success)
|
|
121
|
+
throw new Error(`nginx map ${d.domain}: ${mapRes.stderr}`);
|
|
122
|
+
// Per-domain cert (K14 BD2 fix): the domain's own ssl_cert_name from
|
|
123
|
+
// the control-plane, falling back to the host default only when unset.
|
|
124
|
+
// Multi-brand hosts carry distinct certs — using the host default for
|
|
125
|
+
// every domain would write the wrong cert + break TLS on reload.
|
|
126
|
+
const certName = d.ssl_cert_name ?? sslCertName;
|
|
127
|
+
const vhostRes = await nginxWriteVhost(cfg, b.slug, d.domain, certName);
|
|
128
|
+
if (!vhostRes.success)
|
|
129
|
+
throw new Error(`nginx vhost ${d.domain}: ${vhostRes.stderr}`);
|
|
130
|
+
nginxTouched = true;
|
|
131
|
+
summary.push(`✓ ${b.slug}: nginx ${d.domain} → ${b.slug} (ssl=${certName})`);
|
|
132
|
+
}
|
|
133
|
+
// 2b. Tenant projection (K14 BD2/BD4): mirror tenants up + project
|
|
134
|
+
// tenant domains down into the brand's data DB tnt_domains. With
|
|
135
|
+
// --prune, also delete derived tnt_domains rows the control-plane no
|
|
136
|
+
// longer lists (safe post-BD3: the runtime no longer authors them).
|
|
137
|
+
await projectTenantState(cfg, b, summary, options.prune === true);
|
|
138
|
+
}
|
|
139
|
+
// 2c. Prune nginx orphans (BD4, opt-in): map/vhost the control-plane no
|
|
140
|
+
// longer lists. Honors dry-run (logs only). Runs outside the else so a
|
|
141
|
+
// dry-run still reports what it would remove.
|
|
142
|
+
if (options.prune) {
|
|
143
|
+
const pruned = await pruneBrandNginxOrphans(cfg, b.slug, brandDomains, dryRun, summary);
|
|
144
|
+
if (pruned)
|
|
145
|
+
nginxTouched = true;
|
|
146
|
+
}
|
|
147
|
+
// 3. DNS (opt-in).
|
|
148
|
+
if (options.dns && !dryRun) {
|
|
149
|
+
await provisionBrandDns(cfg, b.slug, brandDomains, options, summary);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// 4. Reload nginx once.
|
|
154
|
+
if (nginxTouched && !dryRun) {
|
|
155
|
+
await step('reload nginx (validates first)', dryRun, async () => {
|
|
156
|
+
const res = await nginxReload(cfg);
|
|
157
|
+
if (!res.success)
|
|
158
|
+
throw new Error(`nginx reload: ${res.stderr}`);
|
|
159
|
+
summary.push('✓ nginx reloaded');
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
log.blank();
|
|
163
|
+
log.title('✨ Reconcile complete');
|
|
164
|
+
for (const line of summary)
|
|
165
|
+
log.info(line);
|
|
166
|
+
if (summary.every(l => l.includes('unchanged')) && nginxTouched === false) {
|
|
167
|
+
log.info('(no drift — node already matches the control-plane)');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Prune nginx routing the control-plane no longer lists for this brand (BD4).
|
|
172
|
+
* Reads the domains nginx currently maps to the brand's core and removes any
|
|
173
|
+
* that aren't a desired cp_domains entry (nor the api.<domain> mirror of one):
|
|
174
|
+
* the DOMAIN_CORE_MAP line plus, for a primary domain, its vhost file. The
|
|
175
|
+
* caller reloads nginx once after all brands. Returns true if anything changed.
|
|
176
|
+
*
|
|
177
|
+
* Scope-safe: only touches entries pointing at THIS brand's core, so other
|
|
178
|
+
* brands/cores are never affected. A domain mapped here but absent from the
|
|
179
|
+
* control-plane is exactly the drift reconcile is meant to repair (K0) — but
|
|
180
|
+
* because removal takes live routing offline it's gated behind --prune.
|
|
181
|
+
*/
|
|
182
|
+
async function pruneBrandNginxOrphans(cfg, slug, brandDomains, dryRun, summary) {
|
|
183
|
+
const mapped = await nginxListDomainsForCore(cfg, slug);
|
|
184
|
+
// Keep desired domains + their api.<domain> mirrors (nginxDomainAdd pairs them).
|
|
185
|
+
const kept = new Set();
|
|
186
|
+
for (const d of brandDomains) {
|
|
187
|
+
kept.add(d.domain);
|
|
188
|
+
kept.add(`api.${d.domain}`);
|
|
189
|
+
}
|
|
190
|
+
const orphans = mapped.filter(d => !kept.has(d));
|
|
191
|
+
if (orphans.length === 0)
|
|
192
|
+
return false;
|
|
193
|
+
let changed = false;
|
|
194
|
+
for (const orphan of orphans) {
|
|
195
|
+
if (dryRun) {
|
|
196
|
+
log.warn(`[dry-run] prune nginx orphan ${orphan} (→ ${slug})${orphan.startsWith('api.') ? '' : ' + vhost'}`);
|
|
197
|
+
summary.push(`✓ ${slug}: [dry-run] would prune ${orphan}`);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const unmap = await nginxDomainRemove(cfg, orphan);
|
|
201
|
+
if (!unmap.success) {
|
|
202
|
+
log.warn(`[prune] ${slug}: could not unmap ${orphan}: ${unmap.stderr.trim()}`);
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
// Only primary domains carry a vhost file; api.<domain> is a map entry only.
|
|
206
|
+
if (!orphan.startsWith('api.')) {
|
|
207
|
+
const rmVhost = await nginxRemoveVhost(cfg, orphan);
|
|
208
|
+
if (!rmVhost.success)
|
|
209
|
+
log.warn(`[prune] ${slug}: could not remove vhost for ${orphan}: ${rmVhost.stderr.trim()}`);
|
|
210
|
+
}
|
|
211
|
+
changed = true;
|
|
212
|
+
summary.push(`✓ ${slug}: pruned orphan ${orphan}`);
|
|
213
|
+
}
|
|
214
|
+
return changed;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Project tenant state between the control-plane and the brand's data DB (K14
|
|
218
|
+
* BD2). Two directions, both idempotent:
|
|
219
|
+
*
|
|
220
|
+
* - mirror UP: data DB `tnt_tenants` → `cp_tenants_ref` (the control-plane's
|
|
221
|
+
* lightweight tenant mirror; tenants are authored in the data plane, the
|
|
222
|
+
* mirror gives the control-plane the brand↔tenant link routing needs).
|
|
223
|
+
* - project DOWN: `cp_domains` (owner_type='tenant', this brand's tenants) →
|
|
224
|
+
* data DB `tnt_domains`, the cache the runtime reads for host→tenant
|
|
225
|
+
* resolution. cp_domains is the authority (K14); tnt_domains is derived.
|
|
226
|
+
*
|
|
227
|
+
* Upsert by default. With `prune`, also delete derived tnt_domains rows the
|
|
228
|
+
* control-plane no longer lists — safe post-BD3 (the tenant write path now
|
|
229
|
+
* authors cp_domains first, so tnt_domains is purely derived). FK misses
|
|
230
|
+
* (a cp_domains tenant whose tenant isn't in the data DB) are skipped + warned.
|
|
231
|
+
*/
|
|
232
|
+
export async function projectTenantState(cfg, brand, summary, prune = false) {
|
|
233
|
+
if (!brand.data_db_name) {
|
|
234
|
+
summary.push(`· ${brand.slug}: data_db yok — tenant projeksiyon atlandı`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const dataDb = brand.data_db_name;
|
|
238
|
+
// ── mirror UP: tnt_tenants → cp_tenants_ref ──────────────────────────
|
|
239
|
+
const tenants = await dbSelectJson(cfg, dataDb, `SELECT id, slug FROM tnt_tenants`);
|
|
240
|
+
for (const t of tenants) {
|
|
241
|
+
await dbExec(cfg, CONTROL_DB, `INSERT INTO cp_tenants_ref (brand_id, data_tenant_id, slug)
|
|
242
|
+
VALUES ('${brand.id}', '${t.id}', '${sqlLit(t.slug)}')
|
|
243
|
+
ON CONFLICT (brand_id, slug) DO UPDATE SET data_tenant_id = EXCLUDED.data_tenant_id`);
|
|
244
|
+
}
|
|
245
|
+
if (tenants.length > 0)
|
|
246
|
+
summary.push(`✓ ${brand.slug}: ${tenants.length} tenant aynalandı (cp_tenants_ref)`);
|
|
247
|
+
// ── project DOWN: cp_domains(tenant) → tnt_domains ───────────────────
|
|
248
|
+
const tdomains = await dbSelectJson(cfg, CONTROL_DB, `SELECT d.domain, d.kind, d.routing_status, r.data_tenant_id
|
|
249
|
+
FROM cp_domains d
|
|
250
|
+
JOIN cp_tenants_ref r ON r.data_tenant_id = d.owner_id
|
|
251
|
+
WHERE d.owner_type = 'tenant' AND r.brand_id = '${brand.id}'`);
|
|
252
|
+
let projected = 0;
|
|
253
|
+
for (const d of tdomains) {
|
|
254
|
+
const type = d.kind === 'subdomain' || d.kind === 'tenant_subdomain' ? 'subdomain' : 'domain';
|
|
255
|
+
const status = d.routing_status === 'active' ? 'active' : 'pending';
|
|
256
|
+
// Manual upsert by (tenant_id, domain) — no assumption about a unique
|
|
257
|
+
// constraint on tnt_domains. UPDATE then conditional INSERT.
|
|
258
|
+
const sql = `UPDATE tnt_domains SET status='${status}', type='${type}', updated_at=now() ` +
|
|
259
|
+
`WHERE tenant_id='${d.data_tenant_id}' AND domain='${sqlLit(d.domain)}';\n` +
|
|
260
|
+
`INSERT INTO tnt_domains (tenant_id, domain, status, type, created_at, updated_at) ` +
|
|
261
|
+
`SELECT '${d.data_tenant_id}','${sqlLit(d.domain)}','${status}','${type}',now(),now() ` +
|
|
262
|
+
`WHERE NOT EXISTS (SELECT 1 FROM tnt_domains WHERE tenant_id='${d.data_tenant_id}' AND domain='${sqlLit(d.domain)}');`;
|
|
263
|
+
const res = await dbExec(cfg, dataDb, sql);
|
|
264
|
+
if (res.success)
|
|
265
|
+
projected++;
|
|
266
|
+
else
|
|
267
|
+
log.warn(`[reconcile] ${brand.slug}: tnt_domains projeksiyon atlandı (${d.domain}): ${res.stderr.trim()}`);
|
|
268
|
+
}
|
|
269
|
+
if (projected > 0)
|
|
270
|
+
summary.push(`✓ ${brand.slug}: ${projected} tenant domain projekte edildi (tnt_domains)`);
|
|
271
|
+
// ── prune DOWN: drop derived tnt_domains rows not in cp_domains (BD4) ──
|
|
272
|
+
if (prune) {
|
|
273
|
+
// Desired domains per tenant from the authority (cp_domains owner=tenant).
|
|
274
|
+
const desired = new Map();
|
|
275
|
+
for (const d of tdomains) {
|
|
276
|
+
const set = desired.get(d.data_tenant_id) ?? new Set();
|
|
277
|
+
set.add(d.domain.toLowerCase());
|
|
278
|
+
desired.set(d.data_tenant_id, set);
|
|
279
|
+
}
|
|
280
|
+
let pruned = 0;
|
|
281
|
+
// Only prune tenants the control-plane knows (this brand's mirrored tenants),
|
|
282
|
+
// never touching data DBs/tenants outside the authority's view.
|
|
283
|
+
for (const t of tenants) {
|
|
284
|
+
const keep = desired.get(t.id);
|
|
285
|
+
const notIn = keep && keep.size > 0
|
|
286
|
+
? ` AND lower(domain) NOT IN (${[...keep].map(d => `'${sqlLit(d)}'`).join(',')})`
|
|
287
|
+
: ''; // no desired domains for this tenant → all its tnt_domains are orphans
|
|
288
|
+
const res = await dbExec(cfg, dataDb, `DELETE FROM tnt_domains WHERE tenant_id='${t.id}'${notIn};`);
|
|
289
|
+
if (res.success) {
|
|
290
|
+
// dbExec doesn't surface rowcount here; count the operation, not rows.
|
|
291
|
+
pruned++;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
log.warn(`[reconcile] ${brand.slug}: tnt_domains prune atlandı (tenant ${t.slug}): ${res.stderr.trim()}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (pruned > 0)
|
|
298
|
+
summary.push(`✓ ${brand.slug}: tnt_domains orphan-prune uygulandı (${pruned} tenant)`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Provision DNS for a brand's domains via the DnsProvider and write the
|
|
303
|
+
* achieved routing/SSL state back to `cp_domains`. Each domain's mode is the
|
|
304
|
+
* control-plane `dns_mode`, falling back to auto-detection. A `pending` SSL
|
|
305
|
+
* (async DV issuance) is recorded as-is, not treated as a failure.
|
|
306
|
+
*/
|
|
307
|
+
async function provisionBrandDns(cfg, slug, brandDomains, options, summary) {
|
|
308
|
+
const provider = createDnsProvider(cfg);
|
|
309
|
+
const originTarget = options.fallbackOrigin ?? '';
|
|
310
|
+
for (const d of brandDomains) {
|
|
311
|
+
// Map the control-plane dns_mode → DnsProvider mode:
|
|
312
|
+
// custom_hostname → custom_hostname (BYO domain, CF for SaaS)
|
|
313
|
+
// full_zone / subdomain → owned_zone (a zone/subdomain we manage)
|
|
314
|
+
// detectMode is the fallback only if the column is somehow unset.
|
|
315
|
+
const mode = d.dns_mode === 'custom_hostname'
|
|
316
|
+
? 'custom_hostname'
|
|
317
|
+
: d.dns_mode === 'full_zone' || d.dns_mode === 'subdomain'
|
|
318
|
+
? 'owned_zone'
|
|
319
|
+
: await provider.detectMode(d.domain);
|
|
320
|
+
if (mode === 'owned_zone' && !originTarget) {
|
|
321
|
+
log.warn(`[dns] ${d.domain}: owned_zone needs --fallback-origin (CNAME target) — skipping DNS for this domain.`);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
const state = await provider.ensureHost({ hostname: d.domain, mode, originTarget });
|
|
325
|
+
if (!state.success) {
|
|
326
|
+
await writeDomainStatus(cfg, d.domain, 'error', 'error');
|
|
327
|
+
throw new Error(`DNS provision failed for ${d.domain}: ${state.errorMessage}`);
|
|
328
|
+
}
|
|
329
|
+
await writeDomainStatus(cfg, d.domain, state.routingStatus, state.sslStatus, state.customHostnameId, state.cfZoneId);
|
|
330
|
+
const sslNote = state.sslStatus === 'active' ? 'ssl active' : 'ssl pending';
|
|
331
|
+
summary.push(`✓ ${slug}: DNS ${d.domain} [${mode}] routing=${state.routingStatus}, ${sslNote}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Write achieved DNS state back to cp_domains. Values are validated/enum — safe to interpolate. */
|
|
335
|
+
async function writeDomainStatus(cfg, domain, routing, ssl, customHostnameId, cfZoneId) {
|
|
336
|
+
const setCh = customHostnameId ? `, cf_custom_hostname_id = '${sqlLit(customHostnameId)}'` : '';
|
|
337
|
+
const setZone = cfZoneId ? `, cf_zone_id = '${sqlLit(cfZoneId)}'` : '';
|
|
338
|
+
const sql = `UPDATE cp_domains SET routing_status = '${routing}', ssl_status = '${ssl}'${setCh}${setZone}, updated_at = now() ` +
|
|
339
|
+
`WHERE domain = '${sqlLit(domain)}';`;
|
|
340
|
+
const res = await dbExec(cfg, CONTROL_DB, sql);
|
|
341
|
+
if (!res.success)
|
|
342
|
+
log.warn(`[dns] could not persist status for ${domain}: ${res.stderr.trim()}`);
|
|
343
|
+
}
|
|
344
|
+
/** Escape single quotes for a SQL string literal (defence-in-depth; inputs already validated). */
|
|
345
|
+
function sqlLit(s) {
|
|
346
|
+
return s.replace(/'/g, "''");
|
|
347
|
+
}
|
|
348
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
349
|
+
// Step runner (consistent log + dry-run handling)
|
|
350
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
351
|
+
async function step(label, dryRun, body) {
|
|
352
|
+
if (dryRun) {
|
|
353
|
+
await body(); // dry-run bodies only log; no spinner noise
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const sp = spinner(label).start();
|
|
357
|
+
try {
|
|
358
|
+
await body();
|
|
359
|
+
sp.succeed(label);
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
sp.fail(label);
|
|
363
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
364
|
+
process.exit(1);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/brand/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI — Build commands (host-aware)
|
|
3
|
+
*
|
|
4
|
+
* Three subcommands, one for each core image plus addons:
|
|
5
|
+
*
|
|
6
|
+
* - `vu build nuxt --host <h> [--deploy]` build Nuxt → push → upload UI → deploy
|
|
7
|
+
* - `vu build php --host <h> [--deploy]` build PHP → push → deploy
|
|
8
|
+
* - `vu build addon <name> --host <h>` vite build → upload → install backend → deploy
|
|
9
|
+
*
|
|
10
|
+
* Everything host-specific (registry namespace, CDN endpoint, server paths,
|
|
11
|
+
* container names, ssh target, CF zone) comes from {@link getHostConfig};
|
|
12
|
+
* there is no global CONFIG sabit any more, no hardcoded URL, no hardcoded
|
|
13
|
+
* `/home/cores/...`. Add a host to STATIC_TOPOLOGY and the same commands
|
|
14
|
+
* deploy to it.
|
|
15
|
+
*
|
|
16
|
+
* Heavy lifting (image build/push/pull/retag, compose ops, CDN clean/upload,
|
|
17
|
+
* nginx reload, CF purge) is delegated to the `ops/` primitives written in
|
|
18
|
+
* step 2. This file is mostly orchestration + CLI plumbing + the things
|
|
19
|
+
* still local to the Mac build host (Tailwind safelist, Vite build, manifest
|
|
20
|
+
* generation, Asset hashing).
|
|
21
|
+
*/
|
|
22
|
+
import { Command } from 'commander';
|
|
23
|
+
export interface NuxtBuildOptions {
|
|
24
|
+
readonly skipCdn?: boolean;
|
|
25
|
+
readonly skipPush?: boolean;
|
|
26
|
+
readonly skipBuild?: boolean;
|
|
27
|
+
readonly skipServer?: boolean;
|
|
28
|
+
readonly skipSafelist?: boolean;
|
|
29
|
+
readonly host?: string;
|
|
30
|
+
readonly core?: string;
|
|
31
|
+
readonly deploy?: boolean;
|
|
32
|
+
readonly dryRun?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface PhpBuildOptions {
|
|
35
|
+
readonly skipPush?: boolean;
|
|
36
|
+
readonly skipServer?: boolean;
|
|
37
|
+
readonly host?: string;
|
|
38
|
+
readonly core?: string;
|
|
39
|
+
readonly deploy?: boolean;
|
|
40
|
+
readonly dryRun?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface AddonBuildOptions {
|
|
43
|
+
readonly core?: string;
|
|
44
|
+
readonly skipCdn?: boolean;
|
|
45
|
+
readonly skipServer?: boolean;
|
|
46
|
+
readonly host?: string;
|
|
47
|
+
readonly dryRun?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare function registerBuildCommands(program: Command): void;
|
|
50
|
+
export declare function buildNuxt(options: NuxtBuildOptions): Promise<void>;
|
|
51
|
+
export declare function buildPHP(options: PhpBuildOptions): Promise<void>;
|
|
52
|
+
export declare function buildAddon(addonName: string, options: AddonBuildOptions): Promise<void>;
|
|
53
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/build/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C5D;AAMD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDxE;AA8HD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCtE;AAkDD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D7F"}
|