@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,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI - Nginx Domain Management Commands
|
|
3
|
+
*
|
|
4
|
+
* Manage nginx configuration for multi-domain setup:
|
|
5
|
+
* - Add/remove domains
|
|
6
|
+
* - Upload SSL certificates
|
|
7
|
+
* - Reload nginx
|
|
8
|
+
*/
|
|
9
|
+
import { log, spinner, formatTable } from '../../lib/logger.js';
|
|
10
|
+
import { confirm, select } from '../../lib/prompts.js';
|
|
11
|
+
import { exec } from '../../lib/shell.js';
|
|
12
|
+
import { getSSHHost, listSSHHosts, buildSSHCommand } from '../../lib/ssh-config.js';
|
|
13
|
+
import { getCloudflareToken, createOriginCertificate, setupDomainForVuCore } from '../../lib/cloudflare.js';
|
|
14
|
+
import { listDomainsFromConfig, addDomainToConfig, removeDomainFromConfig, validateNginxConfig, } from '../../lib/nginx-config.js';
|
|
15
|
+
export function registerNginxCommands(program) {
|
|
16
|
+
const nginx = program
|
|
17
|
+
.command('nginx')
|
|
18
|
+
.description('Nginx domain and SSL management');
|
|
19
|
+
// vu nginx domain:list
|
|
20
|
+
nginx
|
|
21
|
+
.command('domain:list')
|
|
22
|
+
.alias('domains')
|
|
23
|
+
.description('List configured domains')
|
|
24
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
await listDomains(options);
|
|
27
|
+
});
|
|
28
|
+
// vu nginx domain:add
|
|
29
|
+
nginx
|
|
30
|
+
.command('domain:add')
|
|
31
|
+
.description('Add a new domain to nginx config')
|
|
32
|
+
.argument('<domain>', 'Domain name (e.g., example.com)')
|
|
33
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
34
|
+
.option('-c, --core <core>', 'Core name', 'core1')
|
|
35
|
+
.option('--ssl-cert <name>', 'SSL certificate name')
|
|
36
|
+
.option('--use-cloudflare', 'Create SSL via Cloudflare')
|
|
37
|
+
.action(async (domain, options) => {
|
|
38
|
+
await addDomain(domain, options);
|
|
39
|
+
});
|
|
40
|
+
// vu nginx domain:remove
|
|
41
|
+
nginx
|
|
42
|
+
.command('domain:remove')
|
|
43
|
+
.description('Remove a domain from nginx config')
|
|
44
|
+
.argument('<domain>', 'Domain name')
|
|
45
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
46
|
+
.action(async (domain, options) => {
|
|
47
|
+
await removeDomain(domain, options);
|
|
48
|
+
});
|
|
49
|
+
// vu nginx ssl:upload
|
|
50
|
+
nginx
|
|
51
|
+
.command('ssl:upload')
|
|
52
|
+
.description('Upload SSL certificate to server')
|
|
53
|
+
.argument('<domain>', 'Domain name')
|
|
54
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
55
|
+
.option('--cert <path>', 'Path to certificate file')
|
|
56
|
+
.option('--key <path>', 'Path to private key file')
|
|
57
|
+
.option('--use-cloudflare', 'Generate via Cloudflare Origin Certificate')
|
|
58
|
+
.action(async (domain, options) => {
|
|
59
|
+
await uploadSSL(domain, options);
|
|
60
|
+
});
|
|
61
|
+
// vu nginx ssl:list
|
|
62
|
+
nginx
|
|
63
|
+
.command('ssl:list')
|
|
64
|
+
.description('List SSL certificates on server')
|
|
65
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
66
|
+
.action(async (options) => {
|
|
67
|
+
await listSSLCerts(options);
|
|
68
|
+
});
|
|
69
|
+
// vu nginx reload
|
|
70
|
+
nginx
|
|
71
|
+
.command('reload')
|
|
72
|
+
.description('Reload nginx configuration')
|
|
73
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
74
|
+
.action(async (options) => {
|
|
75
|
+
await reloadNginx(options);
|
|
76
|
+
});
|
|
77
|
+
// vu nginx test
|
|
78
|
+
nginx
|
|
79
|
+
.command('test')
|
|
80
|
+
.description('Test nginx configuration')
|
|
81
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
82
|
+
.action(async (options) => {
|
|
83
|
+
await testNginx(options);
|
|
84
|
+
});
|
|
85
|
+
// vu nginx config:show
|
|
86
|
+
nginx
|
|
87
|
+
.command('config:show')
|
|
88
|
+
.description('Show current nginx config')
|
|
89
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
90
|
+
.action(async (options) => {
|
|
91
|
+
await showConfig(options);
|
|
92
|
+
});
|
|
93
|
+
// vu nginx config:backup
|
|
94
|
+
nginx
|
|
95
|
+
.command('config:backup')
|
|
96
|
+
.description('Backup nginx config')
|
|
97
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
98
|
+
.action(async (options) => {
|
|
99
|
+
await backupConfig(options);
|
|
100
|
+
});
|
|
101
|
+
// vu nginx setup
|
|
102
|
+
nginx
|
|
103
|
+
.command('setup')
|
|
104
|
+
.description('Full domain setup (DNS + SSL + Nginx)')
|
|
105
|
+
.argument('<domain>', 'Domain name')
|
|
106
|
+
.option('-h, --host <host>', 'SSH host name')
|
|
107
|
+
.option('-c, --core <core>', 'Core name', 'core1')
|
|
108
|
+
.action(async (domain, options) => {
|
|
109
|
+
await fullDomainSetup(domain, options);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ============================================
|
|
113
|
+
// HELPERS
|
|
114
|
+
// ============================================
|
|
115
|
+
async function getHost(hostName) {
|
|
116
|
+
if (hostName) {
|
|
117
|
+
return await getSSHHost(hostName);
|
|
118
|
+
}
|
|
119
|
+
const hosts = await listSSHHosts();
|
|
120
|
+
if (hosts.length === 0) {
|
|
121
|
+
log.error('No SSH hosts found in ~/.ssh/config');
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
if (hosts.length === 1) {
|
|
125
|
+
return hosts[0];
|
|
126
|
+
}
|
|
127
|
+
const selected = await select('Select SSH host:', hosts.map(h => ({ name: h.name, message: `${h.name} (${h.hostname})` })));
|
|
128
|
+
return await getSSHHost(selected);
|
|
129
|
+
}
|
|
130
|
+
async function runSSH(host, command) {
|
|
131
|
+
const args = buildSSHCommand(host, command);
|
|
132
|
+
return await exec('ssh', args, { silent: true });
|
|
133
|
+
}
|
|
134
|
+
async function getNginxConfig(host) {
|
|
135
|
+
const result = await runSSH(host, 'cat /home/services/nginx/conf.d/vucore-global-router.conf');
|
|
136
|
+
if (!result.success) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return result.stdout;
|
|
140
|
+
}
|
|
141
|
+
async function saveNginxConfig(host, config) {
|
|
142
|
+
// Escape for bash
|
|
143
|
+
const escapedConfig = config.replace(/'/g, "'\\''");
|
|
144
|
+
const result = await runSSH(host, `cat > /home/services/nginx/conf.d/vucore-global-router.conf << 'NGINX_EOF'
|
|
145
|
+
${config}
|
|
146
|
+
NGINX_EOF`);
|
|
147
|
+
return result.success;
|
|
148
|
+
}
|
|
149
|
+
// ============================================
|
|
150
|
+
// LIST DOMAINS
|
|
151
|
+
// ============================================
|
|
152
|
+
async function listDomains(options) {
|
|
153
|
+
log.title('📋 Configured Domains');
|
|
154
|
+
log.blank();
|
|
155
|
+
const host = await getHost(options.host);
|
|
156
|
+
if (!host)
|
|
157
|
+
return;
|
|
158
|
+
const configSpinner = spinner('Fetching nginx config...').start();
|
|
159
|
+
const config = await getNginxConfig(host);
|
|
160
|
+
if (!config) {
|
|
161
|
+
configSpinner.fail('Failed to read nginx config');
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
configSpinner.stop();
|
|
165
|
+
const domains = listDomainsFromConfig(config);
|
|
166
|
+
if (domains.length === 0) {
|
|
167
|
+
log.info('No domains configured');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
formatTable(['Domain', 'Core', 'SSL'], domains.map(d => [d.domain, d.core, '✅']));
|
|
171
|
+
}
|
|
172
|
+
// ============================================
|
|
173
|
+
// ADD DOMAIN
|
|
174
|
+
// ============================================
|
|
175
|
+
async function addDomain(domain, options) {
|
|
176
|
+
log.title(`➕ Add Domain: ${domain}`);
|
|
177
|
+
log.blank();
|
|
178
|
+
const host = await getHost(options.host);
|
|
179
|
+
if (!host)
|
|
180
|
+
return;
|
|
181
|
+
const coreName = options.core || 'core1';
|
|
182
|
+
const useCloudflare = options.useCloudflare || await getCloudflareToken();
|
|
183
|
+
log.kv('Domain', domain);
|
|
184
|
+
log.kv('Core', coreName);
|
|
185
|
+
log.kv('Server', `${host.name} (${host.hostname})`);
|
|
186
|
+
log.blank();
|
|
187
|
+
// Step 1: Get current config
|
|
188
|
+
const configSpinner = spinner('Reading current nginx config...').start();
|
|
189
|
+
const currentConfig = await getNginxConfig(host);
|
|
190
|
+
if (!currentConfig) {
|
|
191
|
+
configSpinner.fail('Failed to read nginx config');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Check if domain already exists
|
|
195
|
+
const existingDomains = listDomainsFromConfig(currentConfig);
|
|
196
|
+
if (existingDomains.some(d => d.domain === domain)) {
|
|
197
|
+
configSpinner.fail(`Domain ${domain} already configured`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
configSpinner.succeed('Current config loaded');
|
|
201
|
+
// Step 2: Setup SSL
|
|
202
|
+
let sslCertName = options.sslCert || domain.split('.')[0];
|
|
203
|
+
if (useCloudflare) {
|
|
204
|
+
const cfSpinner = spinner('Creating Cloudflare Origin Certificate...').start();
|
|
205
|
+
const cfToken = await getCloudflareToken();
|
|
206
|
+
if (!cfToken) {
|
|
207
|
+
cfSpinner.warn('Cloudflare token not configured');
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Setup DNS
|
|
211
|
+
cfSpinner.text = 'Setting up DNS records...';
|
|
212
|
+
const cfResult = await setupDomainForVuCore(domain, host.hostname, {
|
|
213
|
+
createWildcard: true,
|
|
214
|
+
createApiSubdomain: true,
|
|
215
|
+
sslMode: 'strict',
|
|
216
|
+
});
|
|
217
|
+
if (cfResult.success && cfResult.certificate) {
|
|
218
|
+
cfSpinner.text = 'Uploading certificate...';
|
|
219
|
+
// Upload certificate
|
|
220
|
+
await runSSH(host, `mkdir -p /home/services/nginx/ssl`);
|
|
221
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${sslCertName}.crt << 'CERT_EOF'
|
|
222
|
+
${cfResult.certificate.certificate}
|
|
223
|
+
CERT_EOF`);
|
|
224
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${sslCertName}.key << 'KEY_EOF'
|
|
225
|
+
${cfResult.certificate.private_key}
|
|
226
|
+
KEY_EOF`);
|
|
227
|
+
await runSSH(host, `chmod 600 /home/services/nginx/ssl/${sslCertName}.*`);
|
|
228
|
+
cfSpinner.succeed('Cloudflare SSL configured');
|
|
229
|
+
log.kv('Certificate', `/home/services/nginx/ssl/${sslCertName}.crt`);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
cfSpinner.fail('Cloudflare setup failed');
|
|
233
|
+
log.error(cfResult.error || 'Unknown error');
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Step 3: Update nginx config
|
|
239
|
+
const updateSpinner = spinner('Updating nginx config...').start();
|
|
240
|
+
const newConfig = addDomainToConfig(currentConfig, domain, coreName, sslCertName);
|
|
241
|
+
// Validate
|
|
242
|
+
const validation = validateNginxConfig(newConfig);
|
|
243
|
+
if (!validation.valid) {
|
|
244
|
+
updateSpinner.fail('Config validation failed');
|
|
245
|
+
validation.errors.forEach(e => log.error(e));
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
// Backup current config
|
|
249
|
+
await runSSH(host, 'cp /home/services/nginx/conf.d/vucore-global-router.conf /home/services/nginx/conf.d/vucore-global-router.conf.bak');
|
|
250
|
+
// Save new config
|
|
251
|
+
const saved = await saveNginxConfig(host, newConfig);
|
|
252
|
+
if (!saved) {
|
|
253
|
+
updateSpinner.fail('Failed to save config');
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
updateSpinner.succeed('Nginx config updated');
|
|
257
|
+
// Step 4: Test and reload nginx
|
|
258
|
+
const reloadSpinner = spinner('Testing and reloading nginx...').start();
|
|
259
|
+
const testResult = await runSSH(host, 'docker exec cicore_nginx nginx -t');
|
|
260
|
+
if (!testResult.success) {
|
|
261
|
+
reloadSpinner.fail('Nginx config test failed');
|
|
262
|
+
log.error(testResult.stderr);
|
|
263
|
+
// Restore backup
|
|
264
|
+
await runSSH(host, 'cp /home/services/nginx/conf.d/vucore-global-router.conf.bak /home/services/nginx/conf.d/vucore-global-router.conf');
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
await runSSH(host, 'docker exec cicore_nginx nginx -s reload');
|
|
268
|
+
reloadSpinner.succeed('Nginx reloaded');
|
|
269
|
+
// Summary
|
|
270
|
+
log.blank();
|
|
271
|
+
log.box(`✅ Domain Added: ${domain}`, [
|
|
272
|
+
`Core: ${coreName}`,
|
|
273
|
+
`SSL: ${sslCertName}.crt`,
|
|
274
|
+
`Server: ${host.name}`,
|
|
275
|
+
]);
|
|
276
|
+
}
|
|
277
|
+
// ============================================
|
|
278
|
+
// REMOVE DOMAIN
|
|
279
|
+
// ============================================
|
|
280
|
+
async function removeDomain(domain, options) {
|
|
281
|
+
log.title(`➖ Remove Domain: ${domain}`);
|
|
282
|
+
log.blank();
|
|
283
|
+
const host = await getHost(options.host);
|
|
284
|
+
if (!host)
|
|
285
|
+
return;
|
|
286
|
+
// Confirm
|
|
287
|
+
const confirmed = await confirm(`Remove domain ${domain} from nginx config?`);
|
|
288
|
+
if (!confirmed) {
|
|
289
|
+
log.info('Cancelled');
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// Get current config
|
|
293
|
+
const configSpinner = spinner('Reading nginx config...').start();
|
|
294
|
+
const currentConfig = await getNginxConfig(host);
|
|
295
|
+
if (!currentConfig) {
|
|
296
|
+
configSpinner.fail('Failed to read nginx config');
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
// Check if domain exists
|
|
300
|
+
const existingDomains = listDomainsFromConfig(currentConfig);
|
|
301
|
+
if (!existingDomains.some(d => d.domain === domain)) {
|
|
302
|
+
configSpinner.fail(`Domain ${domain} not found in config`);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
// Don't allow removing the last domain
|
|
306
|
+
if (existingDomains.length === 1) {
|
|
307
|
+
configSpinner.fail('Cannot remove the last domain');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
configSpinner.succeed('Config loaded');
|
|
311
|
+
// Update config
|
|
312
|
+
const updateSpinner = spinner('Removing domain from config...').start();
|
|
313
|
+
const newConfig = removeDomainFromConfig(currentConfig, domain);
|
|
314
|
+
// Backup and save
|
|
315
|
+
await runSSH(host, 'cp /home/services/nginx/conf.d/vucore-global-router.conf /home/services/nginx/conf.d/vucore-global-router.conf.bak');
|
|
316
|
+
const saved = await saveNginxConfig(host, newConfig);
|
|
317
|
+
if (!saved) {
|
|
318
|
+
updateSpinner.fail('Failed to save config');
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
updateSpinner.succeed('Domain removed');
|
|
322
|
+
// Test and reload
|
|
323
|
+
const reloadSpinner = spinner('Reloading nginx...').start();
|
|
324
|
+
const testResult = await runSSH(host, 'docker exec cicore_nginx nginx -t');
|
|
325
|
+
if (!testResult.success) {
|
|
326
|
+
reloadSpinner.fail('Nginx config test failed - restoring backup');
|
|
327
|
+
await runSSH(host, 'cp /home/services/nginx/conf.d/vucore-global-router.conf.bak /home/services/nginx/conf.d/vucore-global-router.conf');
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
await runSSH(host, 'docker exec cicore_nginx nginx -s reload');
|
|
331
|
+
reloadSpinner.succeed('Nginx reloaded');
|
|
332
|
+
log.blank();
|
|
333
|
+
log.success(`Domain ${domain} removed`);
|
|
334
|
+
}
|
|
335
|
+
// ============================================
|
|
336
|
+
// UPLOAD SSL
|
|
337
|
+
// ============================================
|
|
338
|
+
async function uploadSSL(domain, options) {
|
|
339
|
+
log.title(`🔒 Upload SSL: ${domain}`);
|
|
340
|
+
log.blank();
|
|
341
|
+
const host = await getHost(options.host);
|
|
342
|
+
if (!host)
|
|
343
|
+
return;
|
|
344
|
+
const certName = domain.split('.')[0];
|
|
345
|
+
if (options.useCloudflare) {
|
|
346
|
+
// Generate via Cloudflare
|
|
347
|
+
const cfSpinner = spinner('Creating Cloudflare Origin Certificate...').start();
|
|
348
|
+
const cfToken = await getCloudflareToken();
|
|
349
|
+
if (!cfToken) {
|
|
350
|
+
cfSpinner.fail('Cloudflare token not configured. Run: vu cloudflare auth');
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const hostnames = [domain, `*.${domain}`];
|
|
354
|
+
const cert = await createOriginCertificate(hostnames);
|
|
355
|
+
if (!cert) {
|
|
356
|
+
cfSpinner.fail('Failed to create certificate');
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
cfSpinner.text = 'Uploading to server...';
|
|
360
|
+
await runSSH(host, `mkdir -p /home/services/nginx/ssl`);
|
|
361
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${certName}.crt << 'CERT_EOF'
|
|
362
|
+
${cert.certificate}
|
|
363
|
+
CERT_EOF`);
|
|
364
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${certName}.key << 'KEY_EOF'
|
|
365
|
+
${cert.private_key}
|
|
366
|
+
KEY_EOF`);
|
|
367
|
+
await runSSH(host, `chmod 600 /home/services/nginx/ssl/${certName}.*`);
|
|
368
|
+
cfSpinner.succeed('SSL certificate uploaded');
|
|
369
|
+
log.kv('Certificate', `/home/services/nginx/ssl/${certName}.crt`);
|
|
370
|
+
log.kv('Private Key', `/home/services/nginx/ssl/${certName}.key`);
|
|
371
|
+
log.kv('Expires', cert.expires_on);
|
|
372
|
+
}
|
|
373
|
+
else if (options.cert && options.key) {
|
|
374
|
+
// Upload from local files
|
|
375
|
+
const uploadSpinner = spinner('Uploading certificate files...').start();
|
|
376
|
+
// Read local files and upload
|
|
377
|
+
const fs = await import('fs-extra');
|
|
378
|
+
const certContent = await fs.default.readFile(options.cert, 'utf-8');
|
|
379
|
+
const keyContent = await fs.default.readFile(options.key, 'utf-8');
|
|
380
|
+
await runSSH(host, `mkdir -p /home/services/nginx/ssl`);
|
|
381
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${certName}.crt << 'CERT_EOF'
|
|
382
|
+
${certContent}
|
|
383
|
+
CERT_EOF`);
|
|
384
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${certName}.key << 'KEY_EOF'
|
|
385
|
+
${keyContent}
|
|
386
|
+
KEY_EOF`);
|
|
387
|
+
await runSSH(host, `chmod 600 /home/services/nginx/ssl/${certName}.*`);
|
|
388
|
+
uploadSpinner.succeed('SSL certificate uploaded');
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
log.error('Specify --use-cloudflare or --cert and --key options');
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
// Offer to reload nginx
|
|
395
|
+
const reload = await confirm('Reload nginx to apply changes?');
|
|
396
|
+
if (reload) {
|
|
397
|
+
await runSSH(host, 'docker exec cicore_nginx nginx -s reload');
|
|
398
|
+
log.success('Nginx reloaded');
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// ============================================
|
|
402
|
+
// LIST SSL CERTS
|
|
403
|
+
// ============================================
|
|
404
|
+
async function listSSLCerts(options) {
|
|
405
|
+
log.title('🔒 SSL Certificates');
|
|
406
|
+
log.blank();
|
|
407
|
+
const host = await getHost(options.host);
|
|
408
|
+
if (!host)
|
|
409
|
+
return;
|
|
410
|
+
const listSpinner = spinner('Listing certificates...').start();
|
|
411
|
+
const result = await runSSH(host, 'ls -la /home/services/nginx/ssl/ 2>/dev/null || echo "No certificates found"');
|
|
412
|
+
listSpinner.stop();
|
|
413
|
+
if (result.stdout.includes('No certificates found')) {
|
|
414
|
+
log.info('No SSL certificates found');
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
console.log(result.stdout);
|
|
418
|
+
}
|
|
419
|
+
// ============================================
|
|
420
|
+
// RELOAD NGINX
|
|
421
|
+
// ============================================
|
|
422
|
+
async function reloadNginx(options) {
|
|
423
|
+
const host = await getHost(options.host);
|
|
424
|
+
if (!host)
|
|
425
|
+
return;
|
|
426
|
+
const reloadSpinner = spinner('Reloading nginx...').start();
|
|
427
|
+
// Test first
|
|
428
|
+
const testResult = await runSSH(host, 'docker exec cicore_nginx nginx -t');
|
|
429
|
+
if (!testResult.success) {
|
|
430
|
+
reloadSpinner.fail('Nginx config test failed');
|
|
431
|
+
log.error(testResult.stderr);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
// Reload
|
|
435
|
+
const reloadResult = await runSSH(host, 'docker exec cicore_nginx nginx -s reload');
|
|
436
|
+
if (reloadResult.success) {
|
|
437
|
+
reloadSpinner.succeed('Nginx reloaded');
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
reloadSpinner.fail('Reload failed');
|
|
441
|
+
log.error(reloadResult.stderr);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
// ============================================
|
|
445
|
+
// TEST NGINX
|
|
446
|
+
// ============================================
|
|
447
|
+
async function testNginx(options) {
|
|
448
|
+
const host = await getHost(options.host);
|
|
449
|
+
if (!host)
|
|
450
|
+
return;
|
|
451
|
+
const testSpinner = spinner('Testing nginx config...').start();
|
|
452
|
+
const result = await runSSH(host, 'docker exec cicore_nginx nginx -t');
|
|
453
|
+
if (result.success) {
|
|
454
|
+
testSpinner.succeed('Nginx config is valid');
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
testSpinner.fail('Nginx config has errors');
|
|
458
|
+
console.log(result.stderr);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
// ============================================
|
|
462
|
+
// SHOW CONFIG
|
|
463
|
+
// ============================================
|
|
464
|
+
async function showConfig(options) {
|
|
465
|
+
const host = await getHost(options.host);
|
|
466
|
+
if (!host)
|
|
467
|
+
return;
|
|
468
|
+
const config = await getNginxConfig(host);
|
|
469
|
+
if (!config) {
|
|
470
|
+
log.error('Failed to read nginx config');
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
console.log(config);
|
|
474
|
+
}
|
|
475
|
+
// ============================================
|
|
476
|
+
// BACKUP CONFIG
|
|
477
|
+
// ============================================
|
|
478
|
+
async function backupConfig(options) {
|
|
479
|
+
const host = await getHost(options.host);
|
|
480
|
+
if (!host)
|
|
481
|
+
return;
|
|
482
|
+
const backupSpinner = spinner('Creating backup...').start();
|
|
483
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
484
|
+
const backupPath = `/home/services/nginx/conf.d/vucore-global-router.conf.backup-${timestamp}`;
|
|
485
|
+
const result = await runSSH(host, `cp /home/services/nginx/conf.d/vucore-global-router.conf ${backupPath}`);
|
|
486
|
+
if (result.success) {
|
|
487
|
+
backupSpinner.succeed(`Backup created: ${backupPath}`);
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
backupSpinner.fail('Backup failed');
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
// ============================================
|
|
494
|
+
// FULL DOMAIN SETUP
|
|
495
|
+
// ============================================
|
|
496
|
+
async function fullDomainSetup(domain, options) {
|
|
497
|
+
log.title(`🚀 Full Domain Setup: ${domain}`);
|
|
498
|
+
log.blank();
|
|
499
|
+
const host = await getHost(options.host);
|
|
500
|
+
if (!host)
|
|
501
|
+
return;
|
|
502
|
+
const coreName = options.core || 'core1';
|
|
503
|
+
log.kv('Domain', domain);
|
|
504
|
+
log.kv('Core', coreName);
|
|
505
|
+
log.kv('Server', `${host.name} (${host.hostname})`);
|
|
506
|
+
log.blank();
|
|
507
|
+
// Step 1: Cloudflare DNS + SSL
|
|
508
|
+
const cfToken = await getCloudflareToken();
|
|
509
|
+
if (!cfToken) {
|
|
510
|
+
log.error('Cloudflare token required. Run: vu cloudflare auth');
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const cfSpinner = spinner('Setting up Cloudflare DNS and SSL...').start();
|
|
514
|
+
const cfResult = await setupDomainForVuCore(domain, host.hostname, {
|
|
515
|
+
createWildcard: true,
|
|
516
|
+
createApiSubdomain: true,
|
|
517
|
+
sslMode: 'strict',
|
|
518
|
+
});
|
|
519
|
+
if (!cfResult.success) {
|
|
520
|
+
cfSpinner.fail('Cloudflare setup failed');
|
|
521
|
+
log.error(cfResult.error || 'Unknown error');
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
cfSpinner.succeed('Cloudflare DNS configured');
|
|
525
|
+
log.kv('DNS Records', `${cfResult.dnsRecords?.length || 0} created`);
|
|
526
|
+
// Step 2: Upload SSL certificate
|
|
527
|
+
if (cfResult.certificate) {
|
|
528
|
+
const sslSpinner = spinner('Uploading SSL certificate...').start();
|
|
529
|
+
const certName = domain.split('.')[0];
|
|
530
|
+
await runSSH(host, `mkdir -p /home/services/nginx/ssl`);
|
|
531
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${certName}.crt << 'CERT_EOF'
|
|
532
|
+
${cfResult.certificate.certificate}
|
|
533
|
+
CERT_EOF`);
|
|
534
|
+
await runSSH(host, `cat > /home/services/nginx/ssl/${certName}.key << 'KEY_EOF'
|
|
535
|
+
${cfResult.certificate.private_key}
|
|
536
|
+
KEY_EOF`);
|
|
537
|
+
await runSSH(host, `chmod 600 /home/services/nginx/ssl/${certName}.*`);
|
|
538
|
+
sslSpinner.succeed('SSL certificate uploaded');
|
|
539
|
+
}
|
|
540
|
+
// Step 3: Update nginx config
|
|
541
|
+
const nginxSpinner = spinner('Updating nginx config...').start();
|
|
542
|
+
const currentConfig = await getNginxConfig(host);
|
|
543
|
+
if (!currentConfig) {
|
|
544
|
+
nginxSpinner.fail('Failed to read nginx config');
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
const certName = domain.split('.')[0];
|
|
548
|
+
const newConfig = addDomainToConfig(currentConfig, domain, coreName, certName);
|
|
549
|
+
// Backup
|
|
550
|
+
await runSSH(host, 'cp /home/services/nginx/conf.d/vucore-global-router.conf /home/services/nginx/conf.d/vucore-global-router.conf.bak');
|
|
551
|
+
// Save
|
|
552
|
+
await saveNginxConfig(host, newConfig);
|
|
553
|
+
nginxSpinner.succeed('Nginx config updated');
|
|
554
|
+
// Step 4: Test and reload
|
|
555
|
+
const reloadSpinner = spinner('Testing and reloading nginx...').start();
|
|
556
|
+
const testResult = await runSSH(host, 'docker exec cicore_nginx nginx -t');
|
|
557
|
+
if (!testResult.success) {
|
|
558
|
+
reloadSpinner.fail('Nginx test failed - restoring backup');
|
|
559
|
+
await runSSH(host, 'cp /home/services/nginx/conf.d/vucore-global-router.conf.bak /home/services/nginx/conf.d/vucore-global-router.conf');
|
|
560
|
+
log.error(testResult.stderr);
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
await runSSH(host, 'docker exec cicore_nginx nginx -s reload');
|
|
564
|
+
reloadSpinner.succeed('Nginx reloaded');
|
|
565
|
+
// Summary
|
|
566
|
+
log.blank();
|
|
567
|
+
log.box(`✅ Domain Setup Complete: ${domain}`, [
|
|
568
|
+
`Core: ${coreName}`,
|
|
569
|
+
`DNS: Cloudflare (${cfResult.dnsRecords?.length || 0} records)`,
|
|
570
|
+
`SSL: Origin Certificate (15 years)`,
|
|
571
|
+
`Nginx: Configured and reloaded`,
|
|
572
|
+
]);
|
|
573
|
+
log.blank();
|
|
574
|
+
log.info('Your domain is now accessible at:');
|
|
575
|
+
log.item(`https://${domain}`);
|
|
576
|
+
log.item(`https://www.${domain}`);
|
|
577
|
+
log.item(`https://api.${domain}`);
|
|
578
|
+
log.item(`https://*.${domain} (tenant subdomains)`);
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/nginx/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ci server bootstrap — sıfır-sunucu → boş-cicore
|
|
3
|
+
*
|
|
4
|
+
* Adımlar:
|
|
5
|
+
* 1. root/sudo kontrolü
|
|
6
|
+
* 2. apt-get update + temel bağımlılıklar
|
|
7
|
+
* 3. Docker yok → get.docker.com ile kur + systemctl enable/start
|
|
8
|
+
* 4. /opt/cicore dizin iskeleti oluştur
|
|
9
|
+
* 5. docker-compose.yml + .env yaz (secret otomatik üretilir)
|
|
10
|
+
* 6. docker compose pull (image-only; kaynak kodu ASLA inmez)
|
|
11
|
+
* 7. docker compose up -d
|
|
12
|
+
* 8. IP:port healthcheck loop (120s / 5s aralık)
|
|
13
|
+
*
|
|
14
|
+
* Sonraki adım: tarayıcıdan /setup/install wizard'ı veya `ci install`
|
|
15
|
+
*/
|
|
16
|
+
export interface BootstrapOptions {
|
|
17
|
+
dir?: string;
|
|
18
|
+
tag?: string;
|
|
19
|
+
registry?: string;
|
|
20
|
+
port?: string;
|
|
21
|
+
skipDockerInstall?: boolean;
|
|
22
|
+
yes?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function runBootstrap(options: BootstrapOptions): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/commands/server/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgEH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiN3E"}
|