@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,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu core:create <name>
|
|
3
|
+
*
|
|
4
|
+
* Creates a new core instance with the standard directory structure
|
|
5
|
+
*/
|
|
6
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
7
|
+
import { ssh } from '../../lib/shell.js';
|
|
8
|
+
import { getEnv } from '../../lib/config.js';
|
|
9
|
+
import { confirm, input } from '../../lib/prompts.js';
|
|
10
|
+
export async function createCore(name, options) {
|
|
11
|
+
const env = getEnv();
|
|
12
|
+
log.title(`Creating Core: ${name}`);
|
|
13
|
+
log.kv('Environment', env);
|
|
14
|
+
log.kv('Domain', options.domain || 'Not specified');
|
|
15
|
+
log.blank();
|
|
16
|
+
// Validate core name
|
|
17
|
+
if (!/^[a-z][a-z0-9_-]*$/i.test(name)) {
|
|
18
|
+
log.error('Invalid core name. Use alphanumeric characters, hyphens, and underscores.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
// Check if core already exists
|
|
22
|
+
const checkSpinner = spinner('Checking if core exists...').start();
|
|
23
|
+
if (env === 'prod') {
|
|
24
|
+
const result = await ssh(`test -d /home/cores/${name} && echo "exists"`, { silent: true });
|
|
25
|
+
if (result.stdout.includes('exists')) {
|
|
26
|
+
checkSpinner.fail(`Core "${name}" already exists`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// DEV mode - check local addons folder structure
|
|
32
|
+
log.debug('DEV mode: Core creation is server-only operation');
|
|
33
|
+
}
|
|
34
|
+
checkSpinner.succeed('Core name is available');
|
|
35
|
+
// Get domain if not provided
|
|
36
|
+
let domain = options.domain;
|
|
37
|
+
if (!domain) {
|
|
38
|
+
domain = await input('Enter domain for this core:', `${name}.example.com`);
|
|
39
|
+
}
|
|
40
|
+
// Confirm creation
|
|
41
|
+
const shouldCreate = await confirm(`Create core "${name}" with domain "${domain}"?`, true);
|
|
42
|
+
if (!shouldCreate) {
|
|
43
|
+
log.warn('Cancelled');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Create core structure
|
|
47
|
+
const createSpinner = spinner('Creating core directory structure...').start();
|
|
48
|
+
if (env === 'prod') {
|
|
49
|
+
const corePath = `/home/cores/${name}`;
|
|
50
|
+
// Create directories
|
|
51
|
+
const commands = [
|
|
52
|
+
`mkdir -p ${corePath}/addons`,
|
|
53
|
+
`mkdir -p ${corePath}/shared/vendor`,
|
|
54
|
+
`mkdir -p ${corePath}/storage/logs`,
|
|
55
|
+
`mkdir -p ${corePath}/storage/cache`,
|
|
56
|
+
`mkdir -p ${corePath}/storage/temp`,
|
|
57
|
+
`mkdir -p ${corePath}/storage/filestorage`,
|
|
58
|
+
];
|
|
59
|
+
for (const cmd of commands) {
|
|
60
|
+
const result = await ssh(cmd, { silent: true });
|
|
61
|
+
if (!result.success) {
|
|
62
|
+
createSpinner.fail(`Failed to create directory: ${cmd}`);
|
|
63
|
+
log.error(result.stderr);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
createSpinner.succeed('Directory structure created');
|
|
68
|
+
// Create .env file
|
|
69
|
+
const envSpinner = spinner('Creating environment file...').start();
|
|
70
|
+
const envContent = generateEnvContent(name, domain);
|
|
71
|
+
const envResult = await ssh(`cat > ${corePath}/.env << 'EOF'
|
|
72
|
+
${envContent}
|
|
73
|
+
EOF`, { silent: true });
|
|
74
|
+
if (!envResult.success) {
|
|
75
|
+
envSpinner.fail('Failed to create .env file');
|
|
76
|
+
log.error(envResult.stderr);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
envSpinner.succeed('Environment file created');
|
|
80
|
+
// Create README
|
|
81
|
+
const readmeSpinner = spinner('Creating README...').start();
|
|
82
|
+
const readmeContent = generateReadmeContent(name, domain);
|
|
83
|
+
await ssh(`cat > ${corePath}/README.md << 'EOF'
|
|
84
|
+
${readmeContent}
|
|
85
|
+
EOF`, { silent: true });
|
|
86
|
+
readmeSpinner.succeed('README created');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
createSpinner.info('DEV mode: Core creation is a server-only operation');
|
|
90
|
+
log.warn('Run with --env prod to create core on server');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Summary
|
|
94
|
+
log.blank();
|
|
95
|
+
log.success(`Core "${name}" created successfully!`);
|
|
96
|
+
log.blank();
|
|
97
|
+
log.box('Core Details', [
|
|
98
|
+
`Name: ${name}`,
|
|
99
|
+
`Domain: ${domain}`,
|
|
100
|
+
`Path: /home/cores/${name}`,
|
|
101
|
+
]);
|
|
102
|
+
log.blank();
|
|
103
|
+
log.info('Next steps:');
|
|
104
|
+
log.item('Update Nginx configuration to add domain routing');
|
|
105
|
+
log.item('Run: vu addon:install <AddonName> ' + name);
|
|
106
|
+
log.item('Run: vu core:rebuild ' + name);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Generate .env file content
|
|
110
|
+
*/
|
|
111
|
+
function generateEnvContent(name, domain) {
|
|
112
|
+
return `# ciCore Core Configuration
|
|
113
|
+
# Core: ${name}
|
|
114
|
+
# Generated: ${new Date().toISOString()}
|
|
115
|
+
|
|
116
|
+
# Core Identity
|
|
117
|
+
CORE_NAME=${name}
|
|
118
|
+
DOMAIN=${domain}
|
|
119
|
+
|
|
120
|
+
# Database (PostgreSQL)
|
|
121
|
+
DB_HOST=cicore_global_postgres
|
|
122
|
+
DB_PORT=5432
|
|
123
|
+
DB_NAME=${name.replace(/-/g, '_')}
|
|
124
|
+
DB_USER=postgres
|
|
125
|
+
DB_PASS=your_secure_password_here
|
|
126
|
+
|
|
127
|
+
# Redis Cache
|
|
128
|
+
REDIS_HOST=cicore_global_redis
|
|
129
|
+
REDIS_PORT=6379
|
|
130
|
+
REDIS_DB=0
|
|
131
|
+
|
|
132
|
+
# Application
|
|
133
|
+
APP_ENV=production
|
|
134
|
+
APP_DEBUG=false
|
|
135
|
+
APP_KEY=
|
|
136
|
+
|
|
137
|
+
# Addon Security
|
|
138
|
+
ENFORCE_ADDON_SIGNATURES=true
|
|
139
|
+
ADDON_SIGNATURE_STRICT=true
|
|
140
|
+
|
|
141
|
+
# CDN (Cloudflare R2)
|
|
142
|
+
CDN_URL=https://cdn.cicore.com.tr
|
|
143
|
+
CDN_API_URL=https://cdn-api.cicore.com.tr
|
|
144
|
+
CDN_API_KEY=
|
|
145
|
+
|
|
146
|
+
# Logging
|
|
147
|
+
LOG_LEVEL=info
|
|
148
|
+
LOG_CHANNEL=file
|
|
149
|
+
`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Generate README content
|
|
153
|
+
*/
|
|
154
|
+
function generateReadmeContent(name, domain) {
|
|
155
|
+
return `# ciCore Core: ${name}
|
|
156
|
+
|
|
157
|
+
**Domain:** ${domain}
|
|
158
|
+
**Created:** ${new Date().toISOString()}
|
|
159
|
+
|
|
160
|
+
## Directory Structure
|
|
161
|
+
|
|
162
|
+
\`\`\`
|
|
163
|
+
${name}/
|
|
164
|
+
├── .env # Environment configuration
|
|
165
|
+
├── addons/ # Installed addons
|
|
166
|
+
├── shared/ # Shared libraries
|
|
167
|
+
│ └── vendor/ # Vendor dependencies
|
|
168
|
+
└── storage/ # Storage directories
|
|
169
|
+
├── logs/ # Application logs
|
|
170
|
+
├── cache/ # Cache files
|
|
171
|
+
├── temp/ # Temporary files
|
|
172
|
+
└── filestorage/ # User uploads
|
|
173
|
+
\`\`\`
|
|
174
|
+
|
|
175
|
+
## Commands
|
|
176
|
+
|
|
177
|
+
\`\`\`bash
|
|
178
|
+
# List installed addons
|
|
179
|
+
vu addon:list ${name}
|
|
180
|
+
|
|
181
|
+
# Install an addon
|
|
182
|
+
vu addon:install MyAddon ${name}
|
|
183
|
+
|
|
184
|
+
# Rebuild containers
|
|
185
|
+
vu core:rebuild ${name}
|
|
186
|
+
|
|
187
|
+
# View logs
|
|
188
|
+
vu logs ${name}
|
|
189
|
+
|
|
190
|
+
# Health check
|
|
191
|
+
vu health ${name}
|
|
192
|
+
\`\`\`
|
|
193
|
+
|
|
194
|
+
## Configuration
|
|
195
|
+
|
|
196
|
+
Edit \`.env\` file to configure:
|
|
197
|
+
- Database connection
|
|
198
|
+
- Redis cache
|
|
199
|
+
- CDN settings
|
|
200
|
+
- Addon security
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
Generated by CiCore CLI
|
|
204
|
+
`;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/core/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu core:delete <name>
|
|
3
|
+
*
|
|
4
|
+
* Deletes a core instance (with double confirmation)
|
|
5
|
+
*/
|
|
6
|
+
interface DeleteOptions {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function deleteCore(name: string, options: DeleteOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/core/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEpF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu core:delete <name>
|
|
3
|
+
*
|
|
4
|
+
* Deletes a core instance (with double confirmation)
|
|
5
|
+
*/
|
|
6
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
7
|
+
import { ssh } from '../../lib/shell.js';
|
|
8
|
+
import { getEnv } from '../../lib/config.js';
|
|
9
|
+
import { dangerConfirm } from '../../lib/prompts.js';
|
|
10
|
+
export async function deleteCore(name, options) {
|
|
11
|
+
const env = getEnv();
|
|
12
|
+
if (env === 'dev') {
|
|
13
|
+
log.warn('DEV mode: Core deletion is a server-only operation');
|
|
14
|
+
log.info('Run with --env prod to delete core on server');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
log.title(`Delete Core: ${name}`);
|
|
18
|
+
// Check if core exists
|
|
19
|
+
const checkResult = await ssh(`test -d /home/cores/${name} && echo "exists"`, { silent: true });
|
|
20
|
+
if (!checkResult.stdout.includes('exists')) {
|
|
21
|
+
log.error(`Core "${name}" does not exist`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Get core info
|
|
25
|
+
const envResult = await ssh(`grep "^DOMAIN=" /home/cores/${name}/.env 2>/dev/null | cut -d= -f2`, { silent: true });
|
|
26
|
+
const domain = envResult.stdout.trim() || 'Unknown';
|
|
27
|
+
const addonResult = await ssh(`ls -1 /home/cores/${name}/addons/ 2>/dev/null`, { silent: true });
|
|
28
|
+
const addons = addonResult.stdout.trim().split('\n').filter(Boolean);
|
|
29
|
+
// Show what will be deleted
|
|
30
|
+
log.blank();
|
|
31
|
+
log.warn('The following will be permanently deleted:');
|
|
32
|
+
log.item(`Core: ${name}`);
|
|
33
|
+
log.item(`Domain: ${domain}`);
|
|
34
|
+
log.item(`Path: /home/cores/${name}`);
|
|
35
|
+
if (addons.length > 0) {
|
|
36
|
+
log.item(`Addons: ${addons.join(', ')}`);
|
|
37
|
+
}
|
|
38
|
+
log.blank();
|
|
39
|
+
// Confirmation
|
|
40
|
+
if (!options.force) {
|
|
41
|
+
const confirmed = await dangerConfirm(`Are you sure you want to delete core "${name}"?`, name.toUpperCase());
|
|
42
|
+
if (!confirmed) {
|
|
43
|
+
log.info('Cancelled');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Delete core
|
|
48
|
+
const deleteSpinner = spinner('Deleting core...').start();
|
|
49
|
+
const deleteResult = await ssh(`rm -rf /home/cores/${name}`, { silent: true });
|
|
50
|
+
if (!deleteResult.success) {
|
|
51
|
+
deleteSpinner.fail('Failed to delete core');
|
|
52
|
+
log.error(deleteResult.stderr);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
deleteSpinner.succeed(`Core "${name}" deleted`);
|
|
56
|
+
log.blank();
|
|
57
|
+
log.success('Core deleted successfully');
|
|
58
|
+
log.blank();
|
|
59
|
+
log.info('Remember to:');
|
|
60
|
+
log.item('Remove domain from Nginx configuration');
|
|
61
|
+
log.item('Drop database if no longer needed');
|
|
62
|
+
log.item('Clear Redis cache for this core');
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/core/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu core:env <name>
|
|
3
|
+
*
|
|
4
|
+
* View or edit core environment configuration
|
|
5
|
+
*/
|
|
6
|
+
interface EnvOptions {
|
|
7
|
+
show?: boolean;
|
|
8
|
+
set?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function editEnv(name: string, options: EnvOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/commands/core/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwG9E"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu core:env <name>
|
|
3
|
+
*
|
|
4
|
+
* View or edit core environment configuration
|
|
5
|
+
*/
|
|
6
|
+
import { log } from '../../lib/logger.js';
|
|
7
|
+
import { ssh } from '../../lib/shell.js';
|
|
8
|
+
import { getEnv } from '../../lib/config.js';
|
|
9
|
+
import { input, confirm } from '../../lib/prompts.js';
|
|
10
|
+
export async function editEnv(name, options) {
|
|
11
|
+
const env = getEnv();
|
|
12
|
+
if (env === 'dev') {
|
|
13
|
+
log.warn('DEV mode: Core env editing is a server-only operation');
|
|
14
|
+
log.info('Run with --env prod to edit core env on server');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const envPath = `/home/cores/${name}/.env`;
|
|
18
|
+
// Check if core exists
|
|
19
|
+
const checkResult = await ssh(`test -f ${envPath} && echo "exists"`, { silent: true });
|
|
20
|
+
if (!checkResult.stdout.includes('exists')) {
|
|
21
|
+
log.error(`Core "${name}" does not exist or has no .env file`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Show current env
|
|
25
|
+
if (options.show) {
|
|
26
|
+
log.title(`Environment: ${name}`);
|
|
27
|
+
const result = await ssh(`cat ${envPath}`, { silent: true });
|
|
28
|
+
console.log(result.stdout);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Set specific variable
|
|
32
|
+
if (options.set) {
|
|
33
|
+
const [key, ...valueParts] = options.set.split('=');
|
|
34
|
+
const value = valueParts.join('=');
|
|
35
|
+
if (!key || value === undefined) {
|
|
36
|
+
log.error('Invalid format. Use: --set KEY=value');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// Check if key exists
|
|
40
|
+
const grepResult = await ssh(`grep "^${key}=" ${envPath}`, { silent: true });
|
|
41
|
+
if (grepResult.success) {
|
|
42
|
+
// Update existing
|
|
43
|
+
await ssh(`sed -i "s|^${key}=.*|${key}=${value}|" ${envPath}`, { silent: true });
|
|
44
|
+
log.success(`Updated: ${key}=${value}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Add new
|
|
48
|
+
await ssh(`echo "${key}=${value}" >> ${envPath}`, { silent: true });
|
|
49
|
+
log.success(`Added: ${key}=${value}`);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Interactive mode - show current values and allow editing
|
|
54
|
+
log.title(`Edit Environment: ${name}`);
|
|
55
|
+
const result = await ssh(`cat ${envPath}`, { silent: true });
|
|
56
|
+
const lines = result.stdout.split('\n');
|
|
57
|
+
const envVars = {};
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
if (line.startsWith('#') || !line.includes('='))
|
|
60
|
+
continue;
|
|
61
|
+
const [key, ...valueParts] = line.split('=');
|
|
62
|
+
envVars[key] = valueParts.join('=');
|
|
63
|
+
}
|
|
64
|
+
// Show editable variables
|
|
65
|
+
const editableKeys = ['DOMAIN', 'DB_NAME', 'DB_USER', 'DB_PASS', 'REDIS_DB', 'APP_DEBUG', 'LOG_LEVEL'];
|
|
66
|
+
log.blank();
|
|
67
|
+
log.info('Current configuration:');
|
|
68
|
+
for (const key of editableKeys) {
|
|
69
|
+
if (envVars[key] !== undefined) {
|
|
70
|
+
const displayValue = key.includes('PASS') ? '********' : envVars[key];
|
|
71
|
+
log.kv(key, displayValue);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
log.blank();
|
|
75
|
+
const shouldEdit = await confirm('Would you like to edit any values?', false);
|
|
76
|
+
if (!shouldEdit) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Edit each value
|
|
80
|
+
for (const key of editableKeys) {
|
|
81
|
+
if (envVars[key] === undefined)
|
|
82
|
+
continue;
|
|
83
|
+
const currentValue = key.includes('PASS') ? '' : envVars[key];
|
|
84
|
+
const newValue = await input(`${key}:`, currentValue);
|
|
85
|
+
if (newValue !== envVars[key]) {
|
|
86
|
+
await ssh(`sed -i "s|^${key}=.*|${key}=${newValue}|" ${envPath}`, { silent: true });
|
|
87
|
+
log.success(`Updated: ${key}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
log.blank();
|
|
91
|
+
log.success('Environment updated');
|
|
92
|
+
log.info('Restart containers for changes to take effect:');
|
|
93
|
+
log.item(`vu core:rebuild ${name}`);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/core/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI - Core Health & Clone Commands
|
|
3
|
+
*/
|
|
4
|
+
export declare function healthCore(name: string, options: any): Promise<void>;
|
|
5
|
+
export declare function cloneCore(source: string, target: string, options: any): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/commands/core/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H1E;AAsBD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAgF3F"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI - Core Health & Clone Commands
|
|
3
|
+
*/
|
|
4
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
5
|
+
import { exec } from '../../lib/shell.js';
|
|
6
|
+
import { confirm } from '../../lib/prompts.js';
|
|
7
|
+
import { getSSHHost, buildSSHCommand } from '../../lib/ssh-config.js';
|
|
8
|
+
// ============================================
|
|
9
|
+
// CORE HEALTH CHECK
|
|
10
|
+
// ============================================
|
|
11
|
+
export async function healthCore(name, options) {
|
|
12
|
+
log.title(`🏥 Core Health Check: ${name}`);
|
|
13
|
+
log.blank();
|
|
14
|
+
const host = await getSSHHost(options.host);
|
|
15
|
+
if (!host) {
|
|
16
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const checks = [];
|
|
20
|
+
// Check 1: Core directory exists
|
|
21
|
+
const dirSpinner = spinner('Checking core directory...').start();
|
|
22
|
+
const dirCmd = `test -d /home/cores/${name} && echo "OK" || echo "FAIL"`;
|
|
23
|
+
const dirArgs = buildSSHCommand(host, dirCmd);
|
|
24
|
+
const dirResult = await exec('ssh', dirArgs, { silent: true });
|
|
25
|
+
if (dirResult.stdout.trim() === 'OK') {
|
|
26
|
+
dirSpinner.succeed(`Core directory: OK`);
|
|
27
|
+
checks.push({ name: 'Core Directory', status: 'ok', message: `/home/cores/${name}` });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
dirSpinner.fail(`Core directory: NOT FOUND`);
|
|
31
|
+
checks.push({ name: 'Core Directory', status: 'fail', message: 'Not found' });
|
|
32
|
+
printHealthSummary(checks);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Check 2: .env file
|
|
36
|
+
const envSpinner = spinner('Checking .env file...').start();
|
|
37
|
+
const envCmd = `test -f /home/cores/${name}/.env && echo "OK" || echo "FAIL"`;
|
|
38
|
+
const envArgs = buildSSHCommand(host, envCmd);
|
|
39
|
+
const envResult = await exec('ssh', envArgs, { silent: true });
|
|
40
|
+
if (envResult.stdout.trim() === 'OK') {
|
|
41
|
+
envSpinner.succeed(`.env file: OK`);
|
|
42
|
+
checks.push({ name: '.env File', status: 'ok', message: 'Present' });
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
envSpinner.fail(`.env file: MISSING`);
|
|
46
|
+
checks.push({ name: '.env File', status: 'fail', message: 'Missing' });
|
|
47
|
+
}
|
|
48
|
+
// Check 3: Addons directory
|
|
49
|
+
const addonsSpinner = spinner('Checking addons...').start();
|
|
50
|
+
const addonsCmd = `ls -1 /home/cores/${name}/addons 2>/dev/null | wc -l`;
|
|
51
|
+
const addonsArgs = buildSSHCommand(host, addonsCmd);
|
|
52
|
+
const addonsResult = await exec('ssh', addonsArgs, { silent: true });
|
|
53
|
+
const addonCount = parseInt(addonsResult.stdout.trim()) || 0;
|
|
54
|
+
addonsSpinner.succeed(`Addons: ${addonCount} installed`);
|
|
55
|
+
checks.push({ name: 'Addons', status: 'ok', message: `${addonCount} installed` });
|
|
56
|
+
// Check 4: Nuxt container
|
|
57
|
+
const nuxtSpinner = spinner('Checking Nuxt container...').start();
|
|
58
|
+
const nuxtCmd = `docker ps --filter "name=cicore_nuxt" --format "{{.Status}}" | head -1`;
|
|
59
|
+
const nuxtArgs = buildSSHCommand(host, nuxtCmd);
|
|
60
|
+
const nuxtResult = await exec('ssh', nuxtArgs, { silent: true });
|
|
61
|
+
if (nuxtResult.stdout.includes('Up')) {
|
|
62
|
+
nuxtSpinner.succeed(`Nuxt: Running`);
|
|
63
|
+
checks.push({ name: 'Nuxt Container', status: 'ok', message: 'Running' });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
nuxtSpinner.fail(`Nuxt: Not running`);
|
|
67
|
+
checks.push({ name: 'Nuxt Container', status: 'fail', message: 'Not running' });
|
|
68
|
+
}
|
|
69
|
+
// Check 5: PHP container
|
|
70
|
+
const phpSpinner = spinner('Checking PHP container...').start();
|
|
71
|
+
const phpCmd = `docker ps --filter "name=cicore_php" --format "{{.Status}}" | head -1`;
|
|
72
|
+
const phpArgs = buildSSHCommand(host, phpCmd);
|
|
73
|
+
const phpResult = await exec('ssh', phpArgs, { silent: true });
|
|
74
|
+
if (phpResult.stdout.includes('Up')) {
|
|
75
|
+
phpSpinner.succeed(`PHP: Running`);
|
|
76
|
+
checks.push({ name: 'PHP Container', status: 'ok', message: 'Running' });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
phpSpinner.fail(`PHP: Not running`);
|
|
80
|
+
checks.push({ name: 'PHP Container', status: 'fail', message: 'Not running' });
|
|
81
|
+
}
|
|
82
|
+
// Check 6: PostgreSQL
|
|
83
|
+
const pgSpinner = spinner('Checking PostgreSQL...').start();
|
|
84
|
+
const pgCmd = `docker ps --filter "name=cicore_global_postgres" --format "{{.Status}}" | head -1`;
|
|
85
|
+
const pgArgs = buildSSHCommand(host, pgCmd);
|
|
86
|
+
const pgResult = await exec('ssh', pgArgs, { silent: true });
|
|
87
|
+
if (pgResult.stdout.includes('Up')) {
|
|
88
|
+
pgSpinner.succeed(`PostgreSQL: Running`);
|
|
89
|
+
checks.push({ name: 'PostgreSQL', status: 'ok', message: 'Running' });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
pgSpinner.fail(`PostgreSQL: Not running`);
|
|
93
|
+
checks.push({ name: 'PostgreSQL', status: 'fail', message: 'Not running' });
|
|
94
|
+
}
|
|
95
|
+
// Check 7: Redis
|
|
96
|
+
const redisSpinner = spinner('Checking Redis...').start();
|
|
97
|
+
const redisCmd = `docker ps --filter "name=cicore_global_redis" --format "{{.Status}}" | head -1`;
|
|
98
|
+
const redisArgs = buildSSHCommand(host, redisCmd);
|
|
99
|
+
const redisResult = await exec('ssh', redisArgs, { silent: true });
|
|
100
|
+
if (redisResult.stdout.includes('Up')) {
|
|
101
|
+
redisSpinner.succeed(`Redis: Running`);
|
|
102
|
+
checks.push({ name: 'Redis', status: 'ok', message: 'Running' });
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
redisSpinner.fail(`Redis: Not running`);
|
|
106
|
+
checks.push({ name: 'Redis', status: 'fail', message: 'Not running' });
|
|
107
|
+
}
|
|
108
|
+
// Check 8: Nginx mapping
|
|
109
|
+
const nginxSpinner = spinner('Checking Nginx mapping...').start();
|
|
110
|
+
const nginxCmd = `grep -c "${name}" /home/services/nginx/conf.d/vucore-global-router.conf 2>/dev/null || echo "0"`;
|
|
111
|
+
const nginxArgs = buildSSHCommand(host, nginxCmd);
|
|
112
|
+
const nginxResult = await exec('ssh', nginxArgs, { silent: true });
|
|
113
|
+
const mappingCount = parseInt(nginxResult.stdout.trim()) || 0;
|
|
114
|
+
if (mappingCount > 0) {
|
|
115
|
+
nginxSpinner.succeed(`Nginx mapping: ${mappingCount} entries`);
|
|
116
|
+
checks.push({ name: 'Nginx Mapping', status: 'ok', message: `${mappingCount} entries` });
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
nginxSpinner.warn(`Nginx mapping: No entries`);
|
|
120
|
+
checks.push({ name: 'Nginx Mapping', status: 'warn', message: 'No entries found' });
|
|
121
|
+
}
|
|
122
|
+
// Print summary
|
|
123
|
+
printHealthSummary(checks);
|
|
124
|
+
}
|
|
125
|
+
function printHealthSummary(checks) {
|
|
126
|
+
const ok = checks.filter(c => c.status === 'ok').length;
|
|
127
|
+
const warn = checks.filter(c => c.status === 'warn').length;
|
|
128
|
+
const fail = checks.filter(c => c.status === 'fail').length;
|
|
129
|
+
log.blank();
|
|
130
|
+
log.info('=== Health Summary ===');
|
|
131
|
+
if (fail === 0 && warn === 0) {
|
|
132
|
+
log.success(`✅ All ${ok} checks passed`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
if (fail > 0)
|
|
136
|
+
log.error(`❌ ${fail} failed`);
|
|
137
|
+
if (warn > 0)
|
|
138
|
+
log.warn(`⚠️ ${warn} warnings`);
|
|
139
|
+
if (ok > 0)
|
|
140
|
+
log.success(`✅ ${ok} passed`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ============================================
|
|
144
|
+
// CLONE CORE
|
|
145
|
+
// ============================================
|
|
146
|
+
export async function cloneCore(source, target, options) {
|
|
147
|
+
log.title(`📋 Clone Core: ${source} → ${target}`);
|
|
148
|
+
log.blank();
|
|
149
|
+
const host = await getSSHHost(options.host);
|
|
150
|
+
if (!host) {
|
|
151
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Check source exists
|
|
155
|
+
const checkSpinner = spinner('Checking source core...').start();
|
|
156
|
+
const checkCmd = `test -d /home/cores/${source} && echo "OK" || echo "FAIL"`;
|
|
157
|
+
const checkArgs = buildSSHCommand(host, checkCmd);
|
|
158
|
+
const checkResult = await exec('ssh', checkArgs, { silent: true });
|
|
159
|
+
if (checkResult.stdout.trim() !== 'OK') {
|
|
160
|
+
checkSpinner.fail(`Source core "${source}" not found`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
checkSpinner.succeed(`Source core found`);
|
|
164
|
+
// Check target doesn't exist
|
|
165
|
+
const targetCheckCmd = `test -d /home/cores/${target} && echo "EXISTS" || echo "OK"`;
|
|
166
|
+
const targetCheckArgs = buildSSHCommand(host, targetCheckCmd);
|
|
167
|
+
const targetCheckResult = await exec('ssh', targetCheckArgs, { silent: true });
|
|
168
|
+
if (targetCheckResult.stdout.trim() === 'EXISTS') {
|
|
169
|
+
log.error(`Target core "${target}" already exists`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const confirmed = await confirm(`Clone ${source} to ${target}?`, true);
|
|
173
|
+
if (!confirmed) {
|
|
174
|
+
log.info('Cancelled');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const startTime = Date.now();
|
|
178
|
+
// Step 1: Copy directory
|
|
179
|
+
const copySpinner = spinner('Copying core directory...').start();
|
|
180
|
+
const copyCmd = `cp -r /home/cores/${source} /home/cores/${target}`;
|
|
181
|
+
const copyArgs = buildSSHCommand(host, copyCmd);
|
|
182
|
+
await exec('ssh', copyArgs, { silent: true });
|
|
183
|
+
copySpinner.succeed('Core directory copied');
|
|
184
|
+
// Step 2: Clear domain from .env
|
|
185
|
+
const envSpinner = spinner('Updating .env file...').start();
|
|
186
|
+
const envCmd = `
|
|
187
|
+
ENV_FILE="/home/cores/${target}/.env"
|
|
188
|
+
if [ -f "$ENV_FILE" ]; then
|
|
189
|
+
sed -i "s/^CORE_NAME=.*/CORE_NAME=${target}/" "$ENV_FILE"
|
|
190
|
+
sed -i "s/^DOMAIN=.*/DOMAIN=/" "$ENV_FILE"
|
|
191
|
+
fi
|
|
192
|
+
`;
|
|
193
|
+
const envArgs = buildSSHCommand(host, envCmd);
|
|
194
|
+
await exec('ssh', envArgs, { silent: true });
|
|
195
|
+
envSpinner.succeed('.env file updated');
|
|
196
|
+
// Step 3: Clear addons (optional - keep structure)
|
|
197
|
+
const addonsSpinner = spinner('Preparing addons directory...').start();
|
|
198
|
+
// Keep addons but clear any cache
|
|
199
|
+
const addonsCmd = `rm -rf /home/cores/${target}/addons/*/ui/.cache 2>/dev/null || true`;
|
|
200
|
+
const addonsArgs = buildSSHCommand(host, addonsCmd);
|
|
201
|
+
await exec('ssh', addonsArgs, { silent: true });
|
|
202
|
+
addonsSpinner.succeed('Addons directory prepared');
|
|
203
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
204
|
+
log.blank();
|
|
205
|
+
log.box('✅ Core Cloned', [
|
|
206
|
+
`Source: ${source}`,
|
|
207
|
+
`Target: ${target}`,
|
|
208
|
+
`Duration: ${elapsed}s`,
|
|
209
|
+
'',
|
|
210
|
+
'Next steps:',
|
|
211
|
+
` 1. Attach a domain: vu domain attach ${target} yourdomain.com`,
|
|
212
|
+
` 2. Check health: vu core health ${target}`,
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=health.js.map
|