@simplens/onboard 1.0.4 → 1.0.6
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/README.md +43 -9
- package/dist/__tests__/infra-prompts.test.js +3 -1
- package/dist/__tests__/infra-prompts.test.js.map +1 -1
- package/dist/__tests__/infra.test.js +13 -0
- package/dist/__tests__/infra.test.js.map +1 -1
- package/dist/__tests__/validators.test.js +21 -1
- package/dist/__tests__/validators.test.js.map +1 -1
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +0 -1
- package/dist/config/constants.js.map +1 -1
- package/dist/env-config.d.ts +1 -1
- package/dist/env-config.d.ts.map +1 -1
- package/dist/env-config.js +46 -6
- package/dist/env-config.js.map +1 -1
- package/dist/index.js +135 -19
- package/dist/index.js.map +1 -1
- package/dist/infra.d.ts +12 -3
- package/dist/infra.d.ts.map +1 -1
- package/dist/infra.js +95 -23
- package/dist/infra.js.map +1 -1
- package/dist/services.d.ts +12 -0
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +50 -0
- package/dist/services.js.map +1 -1
- package/dist/templates.d.ts +5 -1
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +66 -1
- package/dist/templates.js.map +1 -1
- package/dist/types/domain.d.ts +6 -0
- package/dist/types/domain.d.ts.map +1 -1
- package/dist/validators.d.ts +9 -0
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +38 -0
- package/dist/validators.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/infra-prompts.test.ts +3 -1
- package/src/__tests__/infra.test.ts +15 -0
- package/src/__tests__/validators.test.ts +27 -1
- package/src/config/constants.ts +0 -1
- package/src/env-config.ts +51 -6
- package/src/index.ts +145 -18
- package/src/infra.ts +120 -24
- package/src/services.ts +72 -0
- package/src/templates.ts +70 -1
- package/src/types/domain.ts +6 -0
- package/src/validators.ts +51 -0
package/dist/services.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D"}
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAqBA,KAAK,WAAW,GAAG,qBAAqB,GAAG,2BAA2B,CAAC;AASvE;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,EAAE,CAWX;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IACnE,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D"}
|
package/dist/services.js
CHANGED
|
@@ -18,6 +18,12 @@ async function execDockerCompose(args, cwd) {
|
|
|
18
18
|
await execa('docker-compose', args, { cwd });
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
+
function withComposeFile(args, composeFile) {
|
|
22
|
+
if (!composeFile) {
|
|
23
|
+
return args;
|
|
24
|
+
}
|
|
25
|
+
return ['-f', composeFile, ...args];
|
|
26
|
+
}
|
|
21
27
|
/**
|
|
22
28
|
* Prompts user whether to start the services immediately after setup.
|
|
23
29
|
*
|
|
@@ -103,6 +109,50 @@ export async function startAppServices(targetDir) {
|
|
|
103
109
|
throw error;
|
|
104
110
|
}
|
|
105
111
|
}
|
|
112
|
+
export function getSslManualCommands(options) {
|
|
113
|
+
const composeFlag = options.composeFile === 'docker-compose.infra.yaml'
|
|
114
|
+
? '-f docker-compose.infra.yaml '
|
|
115
|
+
: '';
|
|
116
|
+
return [
|
|
117
|
+
`docker compose ${composeFlag}up -d nginx certbot certbot-renew`,
|
|
118
|
+
`docker compose ${composeFlag}exec -T certbot certbot certonly --webroot -w /var/www/certbot --email ${options.email} --agree-tos --no-eff-email -d ${options.domain} --non-interactive`,
|
|
119
|
+
`docker compose ${composeFlag}exec -T nginx nginx -s reload`,
|
|
120
|
+
`docker compose ${composeFlag}up -d certbot-renew`,
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
export async function setupSslCertificates(targetDir, options) {
|
|
124
|
+
logInfo(`Setting up SSL certificate for ${options.domain}...`);
|
|
125
|
+
const s = spinner();
|
|
126
|
+
const composeArgs = (args) => withComposeFile(args, options.composeFile);
|
|
127
|
+
s.start('Ensuring nginx/certbot services are running...');
|
|
128
|
+
await execDockerCompose(composeArgs(['up', '-d', 'nginx', 'certbot']), targetDir);
|
|
129
|
+
s.stop('Nginx and certbot services are running');
|
|
130
|
+
s.start('Requesting initial certificate from Let\'s Encrypt...');
|
|
131
|
+
await execDockerCompose(composeArgs([
|
|
132
|
+
'exec',
|
|
133
|
+
'-T',
|
|
134
|
+
'certbot',
|
|
135
|
+
'certbot',
|
|
136
|
+
'certonly',
|
|
137
|
+
'--webroot',
|
|
138
|
+
'-w',
|
|
139
|
+
'/var/www/certbot',
|
|
140
|
+
'--email',
|
|
141
|
+
options.email,
|
|
142
|
+
'--agree-tos',
|
|
143
|
+
'--no-eff-email',
|
|
144
|
+
'-d',
|
|
145
|
+
options.domain,
|
|
146
|
+
'--non-interactive',
|
|
147
|
+
]), targetDir);
|
|
148
|
+
s.stop('Initial certificate issued');
|
|
149
|
+
s.start('Reloading nginx to apply certificates...');
|
|
150
|
+
await execDockerCompose(composeArgs(['exec', '-T', 'nginx', 'nginx', '-s', 'reload']), targetDir);
|
|
151
|
+
s.stop('Nginx reloaded');
|
|
152
|
+
s.start('Starting automatic certificate renewal service...');
|
|
153
|
+
await execDockerCompose(composeArgs(['up', '-d', 'certbot-renew']), targetDir);
|
|
154
|
+
s.stop('Certificate auto-renewal service started');
|
|
155
|
+
}
|
|
106
156
|
/**
|
|
107
157
|
* Display service status and URLs
|
|
108
158
|
*/
|
package/dist/services.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
package/dist/templates.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export declare const INFRA_COMPOSE_TEMPLATE = "\nservices:\n # ============================================\n # Infrastructure Services\n # ============================================\n mongo:\n image: mongo:7.0\n container_name: mongo\n command: [ \"--replSet\", \"rs0\", \"--bind_ip_all\", \"--port\", \"27017\" ]\n ports:\n - 27017:27017\n healthcheck:\n test: echo \"try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'mongo:27017'}]}) }\" | mongosh --port 27017 --quiet\n interval: 5s\n timeout: 30s\n start_period: 0s\n start_interval: 1s\n retries: 30\n volumes:\n - \"mongo_data:/data/db\"\n - \"mongo_config:/data/configdb\"\n\n kafka:\n image: apache/kafka-native\n container_name: kafka\n ports:\n - \"9092:9092\"\n environment:\n # Configure listeners for both docker and host communication\n KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093\n KAFKA_ADVERTISED_LISTENERS: HOST://kafka:9092,DOCKER://kafka:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT\n\n # Settings required for KRaft mode\n KAFKA_NODE_ID: 1\n KAFKA_PROCESS_ROLES: broker,controller\n KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER\n KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091\n\n # Listener to use for broker-to-broker communication\n KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER\n\n # Required for a single node cluster\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n # Disable auto-topic creation - API server will create topics with correct partitions\n KAFKA_AUTO_CREATE_TOPICS_ENABLE: \"false\"\n volumes:\n - \"kafka_data:/var/lib/kafka/data\"\n\n kafka-ui:\n image: kafbat/kafka-ui:main\n container_name: kafka-ui\n ports:\n - 8080:8080\n environment:\n DYNAMIC_CONFIG_ENABLED: \"true\"\n KAFKA_CLUSTERS_0_NAME: local\n KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093\n depends_on:\n - kafka\n\n redis:\n image: redis:7-alpine\n container_name: redis\n ports:\n - \"6379:6379\"\n command: redis-server --appendonly yes\n volumes:\n - \"redis_data:/data\"\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 5s\n timeout: 3s\n retries: 5\n\n # ============================================\n # Observability Services\n # ============================================\n\n loki:\n image: grafana/loki:2.9.0\n container_name: loki\n ports:\n - \"3100:3100\"\n command: -config.file=/etc/loki/local-config.yaml\n volumes:\n - \"loki_data:/loki\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n grafana:\n image: grafana/grafana:10.2.0\n container_name: grafana\n ports:\n - \"3001:3000\"\n environment:\n - GF_PATHS_PROVISIONING=/etc/grafana/provisioning\n - GF_AUTH_ANONYMOUS_ENABLED=true\n - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n - GF_SECURITY_ADMIN_PASSWORD=admin\n volumes:\n - \"grafana_data:/var/lib/grafana\"\n depends_on:\n loki:\n condition: service_healthy\n\nvolumes:\n mongo_data:\n mongo_config:\n kafka_data:\n redis_data:\n loki_data:\n grafana_data:\n";
|
|
2
|
-
export declare const APP_COMPOSE_TEMPLATE = "services:\n api:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n container_name: api\n ports:\n - 3000:3000\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/api/server.js\" ]\n restart: unless-stopped\n healthcheck:\n test: [ \"CMD\", \"node\", \"-e\", \"require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\" ]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 10s\n\n worker:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/worker.js\" ]\n restart: unless-stopped\n\n notification_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/processors/unified/unified.processor.js\" ]\n depends_on:\n api:\n condition: service_healthy\n restart: unless-stopped\n\n delayed_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n command: [ \"node\", \"dist/processors/delayed/delayed.processor.js\" ]\n restart: unless-stopped\n\n recovery:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/recovery/recovery.service.js\" ]\n restart: unless-stopped\n\n dashboard:\n image: ghcr.io/simplenotificationsystem/simplens-dashboard:${DASHBOARD_VERSION:-latest}\n ports:\n - 3002:3002\n container_name: dashboard\n env_file:\n - .env\n environment:\n PORT: ${DASHBOARD_PORT:-3002}\n API_BASE_URL: http://api:${PORT:-3000}\n WEBHOOK_HOST: dashboard\n WEBHOOK_PORT: ${DASHBOARD_PORT:-3002}\n
|
|
2
|
+
export declare const APP_COMPOSE_TEMPLATE = "services:\n api:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n container_name: api\n ports:\n - 3000:3000\n env_file:\n - .env\n environment:\n SIMPLENS_CONFIG_PATH: ${SIMPLENS_CONFIG_PATH:-/app/simplens.config.yaml}\n volumes:\n - plugin-data:/app/.plugins\n - logs-data:/app/logs\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/api/server.js\" ]\n restart: unless-stopped\n healthcheck:\n test: [ \"CMD\", \"node\", \"-e\", \"require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\" ]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 10s\n\n worker:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n volumes:\n - logs-data:/app/logs\n command: [ \"node\", \"dist/workers/worker.js\" ]\n restart: unless-stopped\n\n notification_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n environment:\n SIMPLENS_CONFIG_PATH: ${SIMPLENS_CONFIG_PATH:-/app/simplens.config.yaml}\n volumes:\n - plugin-data:/app/.plugins\n - logs-data:/app/logs\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/processors/unified/unified.processor.js\" ]\n depends_on:\n api:\n condition: service_healthy\n restart: unless-stopped\n\n delayed_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n volumes:\n - logs-data:/app/logs\n command: [ \"node\", \"dist/processors/delayed/delayed.processor.js\" ]\n restart: unless-stopped\n\n recovery:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n volumes:\n - logs-data:/app/logs\n command: [ \"node\", \"dist/workers/recovery/recovery.service.js\" ]\n restart: unless-stopped\n\n dashboard:\n image: ghcr.io/simplenotificationsystem/simplens-dashboard:${DASHBOARD_VERSION:-latest}\n ports:\n - 3002:3002\n container_name: dashboard\n env_file:\n - .env\n environment:\n PORT: ${DASHBOARD_PORT:-3002}\n API_BASE_URL: http://api:${PORT:-3000}\n WEBHOOK_HOST: dashboard\n WEBHOOK_PORT: ${DASHBOARD_PORT:-3002}\n restart: unless-stopped\n\nvolumes:\n plugin-data:\n logs-data:\n\nnetworks:\n default:\n name: simplens\n";
|
|
3
3
|
export declare const APP_NGINX_SERVICE_TEMPLATE = " nginx:\n image: nginx:alpine\n container_name: nginx\n ports:\n - \"80:80\"\n volumes:\n - \"./nginx.conf:/etc/nginx/conf.d/default.conf:ro\"\n depends_on:\n - api\n - dashboard\n restart: unless-stopped";
|
|
4
|
+
export declare const APP_NGINX_SSL_SERVICE_TEMPLATE = " nginx:\n image: nginx:alpine\n container_name: nginx\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - \"./nginx.conf:/etc/nginx/conf.d/default.conf:ro\"\n - certbot-etc:/etc/letsencrypt\n - certbot-www:/var/www/certbot\n depends_on:\n - api\n - dashboard\n restart: unless-stopped";
|
|
5
|
+
export declare const APP_CERTBOT_SERVICES_TEMPLATE = " certbot:\n image: certbot/certbot:latest\n container_name: certbot\n volumes:\n - certbot-etc:/etc/letsencrypt\n - certbot-www:/var/www/certbot\n command: sh -c \"trap exit TERM; while :; do sleep 86400; done\"\n restart: unless-stopped\n\n certbot-renew:\n image: docker:cli\n container_name: certbot-renew\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n depends_on:\n - certbot\n - nginx\n command: sh -c \"while :; do sleep 12h; docker exec certbot certbot renew --webroot -w /var/www/certbot --quiet && docker exec nginx nginx -s reload || true; done\"\n restart: unless-stopped";
|
|
6
|
+
export declare const INFRA_CERTBOT_SERVICES_TEMPLATE = " certbot:\n image: certbot/certbot:latest\n container_name: certbot\n volumes:\n - certbot-etc:/etc/letsencrypt\n - certbot-www:/var/www/certbot\n command: sh -c \"trap exit TERM; while :; do sleep 86400; done\"\n restart: unless-stopped\n\n certbot-renew:\n image: docker:cli\n container_name: certbot-renew\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n depends_on:\n - certbot\n - nginx\n command: sh -c \"while :; do sleep 12h; docker exec certbot certbot renew --webroot -w /var/www/certbot --quiet && docker exec nginx nginx -s reload || true; done\"\n restart: unless-stopped";
|
|
7
|
+
export declare const INFRA_CERTBOT_VOLUMES: readonly ["certbot-etc", "certbot-www"];
|
|
4
8
|
//# sourceMappingURL=templates.d.ts.map
|
package/dist/templates.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,02GAqHlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,02GAqHlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,ylFAuFhC,CAAC;AAEF,eAAO,MAAM,0BAA0B,wPAUX,CAAC;AAE7B,eAAO,MAAM,8BAA8B,yVAaf,CAAC;AAE7B,eAAO,MAAM,6BAA6B,mpBAkBd,CAAC;AAE7B,eAAO,MAAM,+BAA+B,mpBAkBhB,CAAC;AAE7B,eAAO,MAAM,qBAAqB,yCAA0C,CAAC"}
|
package/dist/templates.js
CHANGED
|
@@ -125,8 +125,11 @@ export const APP_COMPOSE_TEMPLATE = `services:
|
|
|
125
125
|
- 3000:3000
|
|
126
126
|
env_file:
|
|
127
127
|
- .env
|
|
128
|
+
environment:
|
|
129
|
+
SIMPLENS_CONFIG_PATH: \${SIMPLENS_CONFIG_PATH:-/app/simplens.config.yaml}
|
|
128
130
|
volumes:
|
|
129
131
|
- plugin-data:/app/.plugins
|
|
132
|
+
- logs-data:/app/logs
|
|
130
133
|
- ./simplens.config.yaml:/app/simplens.config.yaml:ro
|
|
131
134
|
command: [ "node", "dist/api/server.js" ]
|
|
132
135
|
restart: unless-stopped
|
|
@@ -141,6 +144,8 @@ export const APP_COMPOSE_TEMPLATE = `services:
|
|
|
141
144
|
image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
|
|
142
145
|
env_file:
|
|
143
146
|
- .env
|
|
147
|
+
volumes:
|
|
148
|
+
- logs-data:/app/logs
|
|
144
149
|
command: [ "node", "dist/workers/worker.js" ]
|
|
145
150
|
restart: unless-stopped
|
|
146
151
|
|
|
@@ -148,8 +153,11 @@ export const APP_COMPOSE_TEMPLATE = `services:
|
|
|
148
153
|
image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
|
|
149
154
|
env_file:
|
|
150
155
|
- .env
|
|
156
|
+
environment:
|
|
157
|
+
SIMPLENS_CONFIG_PATH: \${SIMPLENS_CONFIG_PATH:-/app/simplens.config.yaml}
|
|
151
158
|
volumes:
|
|
152
159
|
- plugin-data:/app/.plugins
|
|
160
|
+
- logs-data:/app/logs
|
|
153
161
|
- ./simplens.config.yaml:/app/simplens.config.yaml:ro
|
|
154
162
|
command: [ "node", "dist/processors/unified/unified.processor.js" ]
|
|
155
163
|
depends_on:
|
|
@@ -161,6 +169,8 @@ export const APP_COMPOSE_TEMPLATE = `services:
|
|
|
161
169
|
image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
|
|
162
170
|
env_file:
|
|
163
171
|
- .env
|
|
172
|
+
volumes:
|
|
173
|
+
- logs-data:/app/logs
|
|
164
174
|
command: [ "node", "dist/processors/delayed/delayed.processor.js" ]
|
|
165
175
|
restart: unless-stopped
|
|
166
176
|
|
|
@@ -168,6 +178,8 @@ export const APP_COMPOSE_TEMPLATE = `services:
|
|
|
168
178
|
image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
|
|
169
179
|
env_file:
|
|
170
180
|
- .env
|
|
181
|
+
volumes:
|
|
182
|
+
- logs-data:/app/logs
|
|
171
183
|
command: [ "node", "dist/workers/recovery/recovery.service.js" ]
|
|
172
184
|
restart: unless-stopped
|
|
173
185
|
|
|
@@ -183,11 +195,11 @@ export const APP_COMPOSE_TEMPLATE = `services:
|
|
|
183
195
|
API_BASE_URL: http://api:\${PORT:-3000}
|
|
184
196
|
WEBHOOK_HOST: dashboard
|
|
185
197
|
WEBHOOK_PORT: \${DASHBOARD_PORT:-3002}
|
|
186
|
-
NEXT_PUBLIC_BASE_PATH: \${BASE_PATH:-}
|
|
187
198
|
restart: unless-stopped
|
|
188
199
|
|
|
189
200
|
volumes:
|
|
190
201
|
plugin-data:
|
|
202
|
+
logs-data:
|
|
191
203
|
|
|
192
204
|
networks:
|
|
193
205
|
default:
|
|
@@ -204,4 +216,57 @@ export const APP_NGINX_SERVICE_TEMPLATE = ` nginx:
|
|
|
204
216
|
- api
|
|
205
217
|
- dashboard
|
|
206
218
|
restart: unless-stopped`;
|
|
219
|
+
export const APP_NGINX_SSL_SERVICE_TEMPLATE = ` nginx:
|
|
220
|
+
image: nginx:alpine
|
|
221
|
+
container_name: nginx
|
|
222
|
+
ports:
|
|
223
|
+
- "80:80"
|
|
224
|
+
- "443:443"
|
|
225
|
+
volumes:
|
|
226
|
+
- "./nginx.conf:/etc/nginx/conf.d/default.conf:ro"
|
|
227
|
+
- certbot-etc:/etc/letsencrypt
|
|
228
|
+
- certbot-www:/var/www/certbot
|
|
229
|
+
depends_on:
|
|
230
|
+
- api
|
|
231
|
+
- dashboard
|
|
232
|
+
restart: unless-stopped`;
|
|
233
|
+
export const APP_CERTBOT_SERVICES_TEMPLATE = ` certbot:
|
|
234
|
+
image: certbot/certbot:latest
|
|
235
|
+
container_name: certbot
|
|
236
|
+
volumes:
|
|
237
|
+
- certbot-etc:/etc/letsencrypt
|
|
238
|
+
- certbot-www:/var/www/certbot
|
|
239
|
+
command: sh -c "trap exit TERM; while :; do sleep 86400; done"
|
|
240
|
+
restart: unless-stopped
|
|
241
|
+
|
|
242
|
+
certbot-renew:
|
|
243
|
+
image: docker:cli
|
|
244
|
+
container_name: certbot-renew
|
|
245
|
+
volumes:
|
|
246
|
+
- /var/run/docker.sock:/var/run/docker.sock
|
|
247
|
+
depends_on:
|
|
248
|
+
- certbot
|
|
249
|
+
- nginx
|
|
250
|
+
command: sh -c "while :; do sleep 12h; docker exec certbot certbot renew --webroot -w /var/www/certbot --quiet && docker exec nginx nginx -s reload || true; done"
|
|
251
|
+
restart: unless-stopped`;
|
|
252
|
+
export const INFRA_CERTBOT_SERVICES_TEMPLATE = ` certbot:
|
|
253
|
+
image: certbot/certbot:latest
|
|
254
|
+
container_name: certbot
|
|
255
|
+
volumes:
|
|
256
|
+
- certbot-etc:/etc/letsencrypt
|
|
257
|
+
- certbot-www:/var/www/certbot
|
|
258
|
+
command: sh -c "trap exit TERM; while :; do sleep 86400; done"
|
|
259
|
+
restart: unless-stopped
|
|
260
|
+
|
|
261
|
+
certbot-renew:
|
|
262
|
+
image: docker:cli
|
|
263
|
+
container_name: certbot-renew
|
|
264
|
+
volumes:
|
|
265
|
+
- /var/run/docker.sock:/var/run/docker.sock
|
|
266
|
+
depends_on:
|
|
267
|
+
- certbot
|
|
268
|
+
- nginx
|
|
269
|
+
command: sh -c "while :; do sleep 12h; docker exec certbot certbot renew --webroot -w /var/www/certbot --quiet && docker exec nginx nginx -s reload || true; done"
|
|
270
|
+
restart: unless-stopped`;
|
|
271
|
+
export const INFRA_CERTBOT_VOLUMES = ['certbot-etc', 'certbot-www'];
|
|
207
272
|
//# sourceMappingURL=templates.js.map
|
package/dist/templates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqHrC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqHrC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFnC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;4BAUd,CAAC;AAE7B,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;4BAalB,CAAC;AAE7B,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;4BAkBjB,CAAC;AAE7B,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;4BAkBnB,CAAC;AAE7B,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,aAAa,CAAU,CAAC"}
|
package/dist/types/domain.d.ts
CHANGED
|
@@ -48,6 +48,12 @@ export interface SetupOptions {
|
|
|
48
48
|
targetDir: string;
|
|
49
49
|
/** Dashboard base path (empty string means root) */
|
|
50
50
|
basePath: string;
|
|
51
|
+
/** Whether SSL automation with Certbot is enabled */
|
|
52
|
+
enableSsl?: boolean;
|
|
53
|
+
/** Public domain for SSL certificate */
|
|
54
|
+
sslDomain?: string;
|
|
55
|
+
/** Registration email for Let's Encrypt */
|
|
56
|
+
sslEmail?: string;
|
|
51
57
|
}
|
|
52
58
|
/**
|
|
53
59
|
* Service definition for docker-compose generation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,+CAA+C;IAC/C,KAAK,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,SAAS,GAAG,aAAa,CAAC;IACnC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"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"}
|
package/dist/validators.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
export type OSType = 'windows' | 'linux' | 'darwin';
|
|
2
|
+
/**
|
|
3
|
+
* Validate a public domain used for ACME/Certbot.
|
|
4
|
+
* Accepts FQDN only (no protocol, path, query, port, or wildcard).
|
|
5
|
+
*/
|
|
6
|
+
export declare function validatePublicDomain(input: string): true | string;
|
|
7
|
+
/**
|
|
8
|
+
* Validate email format for Let's Encrypt registration.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateEmailAddress(input: string): true | string;
|
|
2
11
|
/**
|
|
3
12
|
* Checks if Docker is installed on the system by running `docker --version`.
|
|
4
13
|
*
|
package/dist/validators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBxD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAMjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B3D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA6BpE"}
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CA2BjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAajE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBxD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAMjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B3D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA6BpE"}
|
package/dist/validators.js
CHANGED
|
@@ -3,6 +3,44 @@ import { logSuccess, logWarning } from './utils.js';
|
|
|
3
3
|
import { spinner } from './ui.js';
|
|
4
4
|
import { DockerNotInstalledError, DockerNotRunningError, DockerPermissionError, } from './types/errors.js';
|
|
5
5
|
import { VALIDATION } from './config/constants.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validate a public domain used for ACME/Certbot.
|
|
8
|
+
* Accepts FQDN only (no protocol, path, query, port, or wildcard).
|
|
9
|
+
*/
|
|
10
|
+
export function validatePublicDomain(input) {
|
|
11
|
+
const value = input.trim().toLowerCase();
|
|
12
|
+
if (!value) {
|
|
13
|
+
return 'Domain is required';
|
|
14
|
+
}
|
|
15
|
+
if (value.includes('://') ||
|
|
16
|
+
value.includes('/') ||
|
|
17
|
+
value.includes('?') ||
|
|
18
|
+
value.includes('#') ||
|
|
19
|
+
value.includes(':') ||
|
|
20
|
+
value.includes('*')) {
|
|
21
|
+
return 'Enter only a domain name (example: app.example.com)';
|
|
22
|
+
}
|
|
23
|
+
// RFC-ish practical FQDN validation
|
|
24
|
+
const domainRegex = /^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/;
|
|
25
|
+
if (!domainRegex.test(value)) {
|
|
26
|
+
return 'Invalid domain format (example: app.example.com)';
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate email format for Let's Encrypt registration.
|
|
32
|
+
*/
|
|
33
|
+
export function validateEmailAddress(input) {
|
|
34
|
+
const value = input.trim();
|
|
35
|
+
if (!value) {
|
|
36
|
+
return 'Email is required';
|
|
37
|
+
}
|
|
38
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
39
|
+
if (!emailRegex.test(value)) {
|
|
40
|
+
return 'Invalid email format (example: admin@example.com)';
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
6
44
|
/**
|
|
7
45
|
* Checks if Docker is installed on the system by running `docker --version`.
|
|
8
46
|
*
|
package/dist/validators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -28,12 +28,14 @@ describe('promptInfraServicesWithBasePath', () => {
|
|
|
28
28
|
const mockMultiselect = vi.mocked(multiselect);
|
|
29
29
|
mockMultiselect.mockResolvedValue(['mongo', 'redis', 'nginx']);
|
|
30
30
|
|
|
31
|
-
const result = await promptInfraServicesWithBasePath({ allowNginx: true });
|
|
31
|
+
const result = await promptInfraServicesWithBasePath({ allowNginx: true, defaultNginx: true });
|
|
32
32
|
|
|
33
33
|
// Should include nginx in options
|
|
34
34
|
const callArgs = mockMultiselect.mock.calls[0][0] as any;
|
|
35
35
|
const values = callArgs.options.map((o: any) => o.value);
|
|
36
36
|
expect(values).toContain('nginx');
|
|
37
|
+
expect(callArgs.initialValues).toContain('nginx');
|
|
38
|
+
expect(callArgs.initialValues).not.toContain('kafka-ui');
|
|
37
39
|
|
|
38
40
|
expect(result).toContain('nginx');
|
|
39
41
|
});
|
|
@@ -12,4 +12,19 @@ describe('infra app compose generation', () => {
|
|
|
12
12
|
expect(compose).toContain(' nginx:');
|
|
13
13
|
expect(compose).toContain('./nginx.conf:/etc/nginx/conf.d/default.conf:ro');
|
|
14
14
|
});
|
|
15
|
+
|
|
16
|
+
it('does not include certbot services when ssl is disabled', () => {
|
|
17
|
+
const compose = buildAppComposeContent(true, { includeSsl: false });
|
|
18
|
+
expect(compose).not.toContain(' certbot:');
|
|
19
|
+
expect(compose).not.toContain(' certbot-renew:');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('includes certbot services and volumes when ssl is enabled', () => {
|
|
23
|
+
const compose = buildAppComposeContent(false, { includeSsl: true });
|
|
24
|
+
expect(compose).toContain(' nginx:');
|
|
25
|
+
expect(compose).toContain(' certbot:');
|
|
26
|
+
expect(compose).toContain(' certbot-renew:');
|
|
27
|
+
expect(compose).toContain('certbot-etc:');
|
|
28
|
+
expect(compose).toContain('certbot-www:');
|
|
29
|
+
});
|
|
15
30
|
});
|
|
@@ -4,7 +4,9 @@ import {
|
|
|
4
4
|
checkDockerRunning,
|
|
5
5
|
detectOS,
|
|
6
6
|
validatePrerequisites,
|
|
7
|
-
validateEnvValue
|
|
7
|
+
validateEnvValue,
|
|
8
|
+
validatePublicDomain,
|
|
9
|
+
validateEmailAddress
|
|
8
10
|
} from '../validators.js';
|
|
9
11
|
import {
|
|
10
12
|
DockerNotInstalledError,
|
|
@@ -192,4 +194,28 @@ describe('validators', () => {
|
|
|
192
194
|
});
|
|
193
195
|
});
|
|
194
196
|
});
|
|
197
|
+
|
|
198
|
+
describe('validatePublicDomain', () => {
|
|
199
|
+
it('accepts valid public domains', () => {
|
|
200
|
+
expect(validatePublicDomain('example.com')).toBe(true);
|
|
201
|
+
expect(validatePublicDomain('app.example.com')).toBe(true);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('rejects urls or malformed values', () => {
|
|
205
|
+
expect(validatePublicDomain('https://example.com')).not.toBe(true);
|
|
206
|
+
expect(validatePublicDomain('example')).not.toBe(true);
|
|
207
|
+
expect(validatePublicDomain('example.com/path')).not.toBe(true);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe('validateEmailAddress', () => {
|
|
212
|
+
it('accepts valid email addresses', () => {
|
|
213
|
+
expect(validateEmailAddress('admin@example.com')).toBe(true);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('rejects invalid email values', () => {
|
|
217
|
+
expect(validateEmailAddress('admin@')).not.toBe(true);
|
|
218
|
+
expect(validateEmailAddress('not-an-email')).not.toBe(true);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
195
221
|
});
|
package/src/config/constants.ts
CHANGED
package/src/env-config.ts
CHANGED
|
@@ -7,6 +7,19 @@ import { CRITICAL_ENV_KEYS } from './config/constants.js';
|
|
|
7
7
|
import type { EnvVariable } from './types/domain.js';
|
|
8
8
|
|
|
9
9
|
export const DEFAULT_BASE_PATH = '';
|
|
10
|
+
const AUTO_GENERATE_ON_EMPTY_KEYS = ['NS_API_KEY', 'AUTH_SECRET', 'CORE_VERSION', 'DASHBOARD_VERSION'] as const;
|
|
11
|
+
|
|
12
|
+
function shouldAutoGenerateOnEmpty(key: string, fullMode: boolean): boolean {
|
|
13
|
+
return !fullMode && AUTO_GENERATE_ON_EMPTY_KEYS.includes(key as (typeof AUTO_GENERATE_ON_EMPTY_KEYS)[number]);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function resolveEnvAnswer(key: string, answer: string | symbol, fullMode: boolean): string {
|
|
17
|
+
const value = typeof answer === 'string' ? answer : '';
|
|
18
|
+
if (!value.trim() && shouldAutoGenerateOnEmpty(key, fullMode)) {
|
|
19
|
+
return generateDefaultValue(key);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
10
23
|
|
|
11
24
|
/**
|
|
12
25
|
* Generate a secure random string for credentials
|
|
@@ -20,7 +33,7 @@ export function generateSecureRandom(length: number = 32): string {
|
|
|
20
33
|
*/
|
|
21
34
|
export function generateDefaultValue(key: string): string {
|
|
22
35
|
if (key === 'NS_API_KEY') {
|
|
23
|
-
return `
|
|
36
|
+
return `ns_${generateSecureRandom(48)}`;
|
|
24
37
|
}
|
|
25
38
|
if (key === 'AUTH_SECRET') {
|
|
26
39
|
return generateSecureRandom(64);
|
|
@@ -28,6 +41,9 @@ export function generateDefaultValue(key: string): string {
|
|
|
28
41
|
if (key === 'ADMIN_PASSWORD') {
|
|
29
42
|
return `Admin${generateSecureRandom(16)}`;
|
|
30
43
|
}
|
|
44
|
+
if (key === 'CORE_VERSION' || key ==='DASHBOARD_VERSION') {
|
|
45
|
+
return `latest`;
|
|
46
|
+
}
|
|
31
47
|
return '';
|
|
32
48
|
}
|
|
33
49
|
|
|
@@ -245,7 +261,8 @@ export async function promptEnvVariables(
|
|
|
245
261
|
mode: 'default' | 'interactive',
|
|
246
262
|
infraServices: string[],
|
|
247
263
|
basePath: string = DEFAULT_BASE_PATH,
|
|
248
|
-
fullMode: boolean = false
|
|
264
|
+
fullMode: boolean = false,
|
|
265
|
+
envOverrides: Partial<Record<'CORE_VERSION' | 'DASHBOARD_VERSION', string>> = {}
|
|
249
266
|
): Promise<Map<string, string>> {
|
|
250
267
|
logInfo('Configuring environment variables...');
|
|
251
268
|
|
|
@@ -274,6 +291,14 @@ export async function promptEnvVariables(
|
|
|
274
291
|
if (mode === 'default') {
|
|
275
292
|
// Use defaults, only prompt for critical values
|
|
276
293
|
for (const envVar of envVars) {
|
|
294
|
+
if (fullMode && envVar.key in envOverrides) {
|
|
295
|
+
const overrideValue = envOverrides[envVar.key as keyof typeof envOverrides];
|
|
296
|
+
if (overrideValue) {
|
|
297
|
+
result.set(envVar.key, overrideValue);
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
277
302
|
// Use auto-filled infra URLs
|
|
278
303
|
if (autoInfraUrls[envVar.key]) {
|
|
279
304
|
result.set(envVar.key, autoInfraUrls[envVar.key]);
|
|
@@ -314,6 +339,9 @@ export async function promptEnvVariables(
|
|
|
314
339
|
answer = await password({
|
|
315
340
|
message: promptMessage,
|
|
316
341
|
validate: (input: string | undefined) => {
|
|
342
|
+
if (shouldAutoGenerateOnEmpty(envVar.key, fullMode) && !input) {
|
|
343
|
+
return undefined;
|
|
344
|
+
}
|
|
317
345
|
if (!input && envVar.required) {
|
|
318
346
|
return `${envVar.key} is required`;
|
|
319
347
|
}
|
|
@@ -324,8 +352,11 @@ export async function promptEnvVariables(
|
|
|
324
352
|
answer = await text({
|
|
325
353
|
message: promptMessage,
|
|
326
354
|
placeholder: getSuggestedValue(envVar.key) || undefined,
|
|
327
|
-
defaultValue:
|
|
355
|
+
defaultValue: generateDefaultValue(envVar.key) || undefined,
|
|
328
356
|
validate: (input: string | undefined) => {
|
|
357
|
+
if (shouldAutoGenerateOnEmpty(envVar.key, fullMode) && !input) {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
329
360
|
if (!input && envVar.required) {
|
|
330
361
|
return `${envVar.key} is required`;
|
|
331
362
|
}
|
|
@@ -335,7 +366,7 @@ export async function promptEnvVariables(
|
|
|
335
366
|
}
|
|
336
367
|
|
|
337
368
|
handleCancel(answer);
|
|
338
|
-
result.set(envVar.key, answer
|
|
369
|
+
result.set(envVar.key, resolveEnvAnswer(envVar.key, answer, fullMode));
|
|
339
370
|
}
|
|
340
371
|
}
|
|
341
372
|
}
|
|
@@ -344,6 +375,14 @@ export async function promptEnvVariables(
|
|
|
344
375
|
logInfo('Interactive mode: You will be prompted for each environment variable.');
|
|
345
376
|
|
|
346
377
|
for (const envVar of envVars) {
|
|
378
|
+
if (fullMode && envVar.key in envOverrides) {
|
|
379
|
+
const overrideValue = envOverrides[envVar.key as keyof typeof envOverrides];
|
|
380
|
+
if (overrideValue) {
|
|
381
|
+
result.set(envVar.key, overrideValue);
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
347
386
|
const defaultValue = autoInfraUrls[envVar.key] || envVar.value || getSuggestedValue(envVar.key);
|
|
348
387
|
|
|
349
388
|
// BASE_PATH is collected upfront in onboarding flow
|
|
@@ -365,6 +404,9 @@ export async function promptEnvVariables(
|
|
|
365
404
|
answer = await password({
|
|
366
405
|
message: promptMessage,
|
|
367
406
|
validate: (input: string | undefined) => {
|
|
407
|
+
if (shouldAutoGenerateOnEmpty(envVar.key, fullMode) && !input) {
|
|
408
|
+
return undefined;
|
|
409
|
+
}
|
|
368
410
|
if (!input && envVar.required) {
|
|
369
411
|
return `${envVar.key} is required`;
|
|
370
412
|
}
|
|
@@ -377,6 +419,9 @@ export async function promptEnvVariables(
|
|
|
377
419
|
placeholder: defaultValue || undefined,
|
|
378
420
|
defaultValue: defaultValue || undefined,
|
|
379
421
|
validate: (input: string | undefined) => {
|
|
422
|
+
if (shouldAutoGenerateOnEmpty(envVar.key, fullMode) && !input) {
|
|
423
|
+
return undefined;
|
|
424
|
+
}
|
|
380
425
|
if (!input && envVar.required) {
|
|
381
426
|
return `${envVar.key} is required`;
|
|
382
427
|
}
|
|
@@ -386,7 +431,7 @@ export async function promptEnvVariables(
|
|
|
386
431
|
}
|
|
387
432
|
|
|
388
433
|
handleCancel(answer);
|
|
389
|
-
result.set(envVar.key, answer
|
|
434
|
+
result.set(envVar.key, resolveEnvAnswer(envVar.key, answer, fullMode));
|
|
390
435
|
}
|
|
391
436
|
}
|
|
392
437
|
|
|
@@ -399,7 +444,7 @@ export async function promptEnvVariables(
|
|
|
399
444
|
*/
|
|
400
445
|
function getSuggestedValue(key: string): string {
|
|
401
446
|
if (key === 'NS_API_KEY' || key === 'AUTH_SECRET') {
|
|
402
|
-
return `Replace with: openssl rand -base64 32`;
|
|
447
|
+
return `Replace with: openssl rand -base64 32 (or) Press <Enter> to auto-generate value`;
|
|
403
448
|
}
|
|
404
449
|
if (key === 'NODE_ENV') {
|
|
405
450
|
return 'production';
|