@simplens/onboard 1.0.0 → 1.0.2
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 +331 -214
- package/dist/__tests__/env-config.test.d.ts +2 -0
- package/dist/__tests__/env-config.test.d.ts.map +1 -0
- package/dist/__tests__/env-config.test.js +23 -0
- package/dist/__tests__/env-config.test.js.map +1 -0
- package/dist/__tests__/infra-prompts.test.d.ts +2 -0
- package/dist/__tests__/infra-prompts.test.d.ts.map +1 -0
- package/dist/__tests__/infra-prompts.test.js +43 -0
- package/dist/__tests__/infra-prompts.test.js.map +1 -0
- package/dist/__tests__/infra.test.d.ts +2 -0
- package/dist/__tests__/infra.test.d.ts.map +1 -0
- package/dist/__tests__/infra.test.js +14 -0
- package/dist/__tests__/infra.test.js.map +1 -0
- package/dist/__tests__/nginx.test.d.ts +2 -0
- package/dist/__tests__/nginx.test.d.ts.map +1 -0
- package/dist/__tests__/nginx.test.js +16 -0
- package/dist/__tests__/nginx.test.js.map +1 -0
- package/dist/env-config.d.ts +27 -12
- package/dist/env-config.d.ts.map +1 -1
- package/dist/env-config.js +258 -141
- package/dist/env-config.js.map +1 -1
- package/dist/index.js +341 -71
- package/dist/index.js.map +1 -1
- package/dist/infra.d.ts +17 -14
- package/dist/infra.d.ts.map +1 -1
- package/dist/infra.js +265 -176
- package/dist/infra.js.map +1 -1
- package/dist/plugins.d.ts +5 -10
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +75 -44
- package/dist/plugins.js.map +1 -1
- package/dist/services.d.ts +1 -23
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +47 -62
- package/dist/services.js.map +1 -1
- package/dist/templates.d.ts +3 -2
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +203 -198
- package/dist/templates.js.map +1 -1
- package/dist/types/domain.d.ts +2 -0
- package/dist/types/domain.d.ts.map +1 -1
- package/dist/ui.d.ts +45 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +93 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +32 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +66 -2
- package/dist/utils.js.map +1 -1
- package/dist/validators.d.ts +1 -52
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +10 -57
- package/dist/validators.js.map +1 -1
- package/package.json +3 -5
- package/src/__tests__/env-config.test.ts +28 -0
- package/src/__tests__/errors.test.ts +187 -187
- package/src/__tests__/infra-prompts.test.ts +54 -0
- package/src/__tests__/infra.test.ts +15 -0
- package/src/__tests__/utils.test.ts +142 -142
- package/src/__tests__/validators.test.ts +195 -195
- package/src/config/constants.ts +86 -86
- package/src/config/index.ts +1 -1
- package/src/env-config.ts +455 -320
- package/src/index.ts +534 -203
- package/src/infra.ts +404 -300
- package/src/plugins.ts +221 -190
- package/src/services.ts +175 -190
- package/src/templates.ts +209 -203
- package/src/types/domain.ts +129 -127
- package/src/types/errors.ts +173 -173
- package/src/types/index.ts +2 -2
- package/src/ui.ts +91 -0
- package/src/utils/index.ts +1 -1
- package/src/utils/logger.ts +144 -118
- package/src/utils.ts +183 -105
- package/src/validators.ts +145 -192
- package/tsconfig.json +18 -18
- package/vitest.config.ts +22 -20
package/dist/plugins.js
CHANGED
|
@@ -1,26 +1,18 @@
|
|
|
1
|
-
import inquirer from 'inquirer';
|
|
2
1
|
import { execa } from 'execa';
|
|
3
2
|
import yaml from 'js-yaml';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { readFile, logInfo, logSuccess, logWarning } from './utils.js';
|
|
5
|
+
import { multiselect, text, password } from '@clack/prompts';
|
|
6
|
+
import { handleCancel, spinner } from './ui.js';
|
|
6
7
|
/**
|
|
7
8
|
* Fetches available SimpleNS plugins using the config-gen CLI tool.
|
|
8
9
|
* Falls back to default plugins if fetching fails.
|
|
9
10
|
*
|
|
10
11
|
* @returns Array of available plugin information
|
|
11
|
-
*
|
|
12
|
-
* @remarks
|
|
13
|
-
* Uses `npx @simplens/config-gen list --official` to fetch plugins.
|
|
14
|
-
* Default fallback plugins: mock, nodemailer-gmail, resend
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```ts
|
|
18
|
-
* const plugins = await fetchAvailablePlugins();
|
|
19
|
-
* // Returns: [{ package: '@simplens/mock', name: 'Mock Provider', ... }, ...]
|
|
20
|
-
* ```
|
|
21
12
|
*/
|
|
22
13
|
export async function fetchAvailablePlugins() {
|
|
23
|
-
|
|
14
|
+
const s = spinner();
|
|
15
|
+
s.start('Fetching available plugins...');
|
|
24
16
|
try {
|
|
25
17
|
// Execute config-gen list command
|
|
26
18
|
const { stdout } = await execa('npx', ['@simplens/config-gen', 'list', '--official'], {
|
|
@@ -44,11 +36,12 @@ export async function fetchAvailablePlugins() {
|
|
|
44
36
|
});
|
|
45
37
|
}
|
|
46
38
|
}
|
|
47
|
-
|
|
39
|
+
s.stop(`Found ${plugins.length} available plugins`);
|
|
48
40
|
return plugins;
|
|
49
41
|
}
|
|
50
42
|
catch (error) {
|
|
51
|
-
|
|
43
|
+
s.stop('Could not fetch plugins list. Using defaults.');
|
|
44
|
+
logWarning('Falling back to default plugin list.');
|
|
52
45
|
// Return default plugins as fallback
|
|
53
46
|
return [
|
|
54
47
|
{ package: '@simplens/mock', name: 'Mock Provider', description: 'Mock notification provider for testing' },
|
|
@@ -65,19 +58,20 @@ export async function promptPluginSelection(availablePlugins) {
|
|
|
65
58
|
logWarning('No plugins available to select.');
|
|
66
59
|
return [];
|
|
67
60
|
}
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
61
|
+
const selected = await multiselect({
|
|
62
|
+
message: 'Select plugins to install (Space to select, Enter to confirm):',
|
|
63
|
+
options: availablePlugins.map(p => ({
|
|
64
|
+
value: p.package,
|
|
65
|
+
label: `${p.name} (${p.package})`,
|
|
66
|
+
hint: p.description,
|
|
67
|
+
})),
|
|
68
|
+
initialValues: availablePlugins
|
|
69
|
+
.filter(p => p.package === '@simplens/mock')
|
|
70
|
+
.map(p => p.package),
|
|
71
|
+
withGuide: true,
|
|
72
|
+
});
|
|
73
|
+
handleCancel(selected);
|
|
74
|
+
return selected;
|
|
81
75
|
}
|
|
82
76
|
/**
|
|
83
77
|
* Generate plugin configuration using config-gen
|
|
@@ -87,16 +81,16 @@ export async function generatePluginConfig(targetDir, selectedPlugins) {
|
|
|
87
81
|
logInfo('No plugins selected, skipping config generation.');
|
|
88
82
|
return;
|
|
89
83
|
}
|
|
90
|
-
|
|
84
|
+
const s = spinner();
|
|
85
|
+
s.start(`Generating configuration for ${selectedPlugins.length} plugin(s)...`);
|
|
91
86
|
try {
|
|
92
|
-
const configPath = path.join(targetDir, 'simplens.config.yaml');
|
|
93
87
|
// Execute config-gen for all selected plugins
|
|
94
88
|
// Use relative path to avoid WSL path issues when npx runs Windows binaries
|
|
95
|
-
await execa('npx', ['@simplens/config-gen', 'gen', ...selectedPlugins, '-o', 'simplens.config.yaml'], { cwd: targetDir, stdio: '
|
|
96
|
-
|
|
89
|
+
await execa('npx', ['@simplens/config-gen', 'gen', ...selectedPlugins, '-o', 'simplens.config.yaml'], { cwd: targetDir, stdio: 'pipe' });
|
|
90
|
+
s.stop('Generated simplens.config.yaml');
|
|
97
91
|
}
|
|
98
92
|
catch (error) {
|
|
99
|
-
|
|
93
|
+
s.error('Failed to generate plugin configuration');
|
|
100
94
|
throw error;
|
|
101
95
|
}
|
|
102
96
|
}
|
|
@@ -130,6 +124,33 @@ export async function parseConfigCredentials(configPath) {
|
|
|
130
124
|
return [];
|
|
131
125
|
}
|
|
132
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Generate default placeholder values for plugin credentials
|
|
129
|
+
* Used in --full mode for non-interactive setup
|
|
130
|
+
*/
|
|
131
|
+
export function generateDefaultPluginCredentials(credentialKeys) {
|
|
132
|
+
const result = new Map();
|
|
133
|
+
for (const key of credentialKeys) {
|
|
134
|
+
// Generate placeholder values based on key name patterns
|
|
135
|
+
if (key.toLowerCase().includes('password') || key.toLowerCase().includes('secret')) {
|
|
136
|
+
result.set(key, crypto.randomBytes(16).toString('base64'));
|
|
137
|
+
}
|
|
138
|
+
else if (key.toLowerCase().includes('apikey') || key.toLowerCase().includes('api_key')) {
|
|
139
|
+
result.set(key, `sk_${crypto.randomBytes(24).toString('base64').slice(0, 32)}`);
|
|
140
|
+
}
|
|
141
|
+
else if (key.toLowerCase().includes('token')) {
|
|
142
|
+
result.set(key, crypto.randomBytes(32).toString('hex'));
|
|
143
|
+
}
|
|
144
|
+
else if (key.toLowerCase().includes('email') || key.toLowerCase().includes('user')) {
|
|
145
|
+
result.set(key, 'CHANGE_ME@example.com');
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Generic placeholder
|
|
149
|
+
result.set(key, 'CHANGE_ME');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
133
154
|
/**
|
|
134
155
|
* Prompt for plugin-specific credentials
|
|
135
156
|
*/
|
|
@@ -141,22 +162,32 @@ export async function promptPluginCredentials(credentialKeys) {
|
|
|
141
162
|
logInfo('Configuring plugin credentials...');
|
|
142
163
|
const result = new Map();
|
|
143
164
|
for (const key of credentialKeys) {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
: 'input',
|
|
149
|
-
name: 'value',
|
|
165
|
+
const isSecret = key.toLowerCase().includes('password') || key.toLowerCase().includes('key');
|
|
166
|
+
let answer;
|
|
167
|
+
if (isSecret) {
|
|
168
|
+
answer = await password({
|
|
150
169
|
message: `${key}:`,
|
|
151
170
|
validate: (input) => {
|
|
152
171
|
if (!input || input.trim().length === 0) {
|
|
153
172
|
return `${key} is required`;
|
|
154
173
|
}
|
|
155
|
-
return
|
|
174
|
+
return undefined;
|
|
156
175
|
},
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
answer = await text({
|
|
180
|
+
message: `${key}:`,
|
|
181
|
+
validate: (input) => {
|
|
182
|
+
if (!input || input.trim().length === 0) {
|
|
183
|
+
return `${key} is required`;
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
handleCancel(answer);
|
|
190
|
+
result.set(key, answer);
|
|
160
191
|
}
|
|
161
192
|
logSuccess('Plugin credentials configured');
|
|
162
193
|
return result;
|
package/dist/plugins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/services.d.ts
CHANGED
|
@@ -2,13 +2,6 @@
|
|
|
2
2
|
* Prompts user whether to start the services immediately after setup.
|
|
3
3
|
*
|
|
4
4
|
* @returns `true` if user wants to start services, `false` otherwise
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```ts
|
|
8
|
-
* if (await promptStartServices()) {
|
|
9
|
-
* await startInfraServices(targetDir);
|
|
10
|
-
* }
|
|
11
|
-
* ```
|
|
12
5
|
*/
|
|
13
6
|
export declare function promptStartServices(): Promise<boolean>;
|
|
14
7
|
/**
|
|
@@ -17,28 +10,13 @@ export declare function promptStartServices(): Promise<boolean>;
|
|
|
17
10
|
*
|
|
18
11
|
* @param targetDir - Directory containing docker-compose.infra.yaml
|
|
19
12
|
* @throws Error if docker-compose command fails
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```ts
|
|
23
|
-
* await startInfraServices('/opt/simplens');
|
|
24
|
-
* ```
|
|
25
13
|
*/
|
|
26
14
|
export declare function startInfraServices(targetDir: string): Promise<void>;
|
|
27
15
|
/**
|
|
28
16
|
* Waits for infrastructure services to become healthy.
|
|
29
|
-
* Polls Docker health checks for up to 60 seconds (30 retries
|
|
17
|
+
* Polls Docker health checks for up to 60 seconds (30 retries x 2s).
|
|
30
18
|
*
|
|
31
19
|
* @param targetDir - Directory where services are running
|
|
32
|
-
*
|
|
33
|
-
* @remarks
|
|
34
|
-
* Checks for healthy containers running MongoDB or Redis.
|
|
35
|
-
* Configuration: 30 max retries, 2000ms delay between retries.
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```ts
|
|
39
|
-
* await startInfraServices(targetDir);
|
|
40
|
-
* await waitForInfraHealth(targetDir); // Wait for services to be ready
|
|
41
|
-
* ```
|
|
42
20
|
*/
|
|
43
21
|
export declare function waitForInfraHealth(targetDir: string): Promise<void>;
|
|
44
22
|
/**
|
package/dist/services.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAOA
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;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,CAiBvE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D"}
|
package/dist/services.js
CHANGED
|
@@ -1,31 +1,22 @@
|
|
|
1
|
-
import inquirer from 'inquirer';
|
|
2
1
|
import { execa } from 'execa';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { logInfo, logWarning } from './utils.js';
|
|
5
2
|
import chalk from 'chalk';
|
|
3
|
+
import { logInfo, logWarning, divider, printSummaryCard, printCommandHints } from './utils.js';
|
|
4
|
+
import { confirm } from '@clack/prompts';
|
|
5
|
+
import { handleCancel, spinner } from './ui.js';
|
|
6
6
|
import { HEALTH_CHECK, getServiceURL } from './config/constants.js';
|
|
7
7
|
/**
|
|
8
8
|
* Prompts user whether to start the services immediately after setup.
|
|
9
9
|
*
|
|
10
10
|
* @returns `true` if user wants to start services, `false` otherwise
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```ts
|
|
14
|
-
* if (await promptStartServices()) {
|
|
15
|
-
* await startInfraServices(targetDir);
|
|
16
|
-
* }
|
|
17
|
-
* ```
|
|
18
11
|
*/
|
|
19
12
|
export async function promptStartServices() {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
]);
|
|
28
|
-
return answer.start;
|
|
13
|
+
const shouldStart = await confirm({
|
|
14
|
+
message: 'Start services now after setup?',
|
|
15
|
+
initialValue: true,
|
|
16
|
+
withGuide: true,
|
|
17
|
+
});
|
|
18
|
+
handleCancel(shouldStart);
|
|
19
|
+
return shouldStart;
|
|
29
20
|
}
|
|
30
21
|
/**
|
|
31
22
|
* Starts infrastructure services using docker-compose.
|
|
@@ -33,43 +24,30 @@ export async function promptStartServices() {
|
|
|
33
24
|
*
|
|
34
25
|
* @param targetDir - Directory containing docker-compose.infra.yaml
|
|
35
26
|
* @throws Error if docker-compose command fails
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```ts
|
|
39
|
-
* await startInfraServices('/opt/simplens');
|
|
40
|
-
* ```
|
|
41
27
|
*/
|
|
42
28
|
export async function startInfraServices(targetDir) {
|
|
43
29
|
logInfo('Starting infrastructure services...');
|
|
44
|
-
const
|
|
30
|
+
const s = spinner();
|
|
31
|
+
s.start('Starting docker-compose.infra.yaml...');
|
|
45
32
|
try {
|
|
46
33
|
await execa('docker-compose', ['-f', 'docker-compose.infra.yaml', 'up', '-d'], { cwd: targetDir });
|
|
47
|
-
|
|
34
|
+
s.stop('Infrastructure services started');
|
|
48
35
|
}
|
|
49
36
|
catch (error) {
|
|
50
|
-
|
|
37
|
+
s.error('Failed to start infrastructure services');
|
|
51
38
|
throw error;
|
|
52
39
|
}
|
|
53
40
|
}
|
|
54
41
|
/**
|
|
55
42
|
* Waits for infrastructure services to become healthy.
|
|
56
|
-
* Polls Docker health checks for up to 60 seconds (30 retries
|
|
43
|
+
* Polls Docker health checks for up to 60 seconds (30 retries x 2s).
|
|
57
44
|
*
|
|
58
45
|
* @param targetDir - Directory where services are running
|
|
59
|
-
*
|
|
60
|
-
* @remarks
|
|
61
|
-
* Checks for healthy containers running MongoDB or Redis.
|
|
62
|
-
* Configuration: 30 max retries, 2000ms delay between retries.
|
|
63
|
-
*
|
|
64
|
-
* @example
|
|
65
|
-
* ```ts
|
|
66
|
-
* await startInfraServices(targetDir);
|
|
67
|
-
* await waitForInfraHealth(targetDir); // Wait for services to be ready
|
|
68
|
-
* ```
|
|
69
46
|
*/
|
|
70
47
|
export async function waitForInfraHealth(targetDir) {
|
|
71
48
|
logInfo('Waiting for infrastructure services to be healthy...');
|
|
72
|
-
const
|
|
49
|
+
const s = spinner();
|
|
50
|
+
s.start('Checking service health...');
|
|
73
51
|
// Wait for mongo, redis health checks
|
|
74
52
|
const maxRetries = HEALTH_CHECK.MAX_RETRIES;
|
|
75
53
|
const retryDelay = HEALTH_CHECK.RETRY_DELAY_MS;
|
|
@@ -81,18 +59,18 @@ export async function waitForInfraHealth(targetDir) {
|
|
|
81
59
|
// Check for critical services
|
|
82
60
|
const hasMongoOrRedis = healthyContainers.some(name => name.includes('mongo') || name.includes('redis'));
|
|
83
61
|
if (hasMongoOrRedis) {
|
|
84
|
-
|
|
62
|
+
s.stop('Infrastructure services are healthy');
|
|
85
63
|
return;
|
|
86
64
|
}
|
|
87
|
-
|
|
65
|
+
s.message(`Waiting for services... (${i + 1}/${maxRetries})`);
|
|
88
66
|
await sleep(retryDelay);
|
|
89
67
|
}
|
|
90
68
|
catch (error) {
|
|
91
|
-
|
|
69
|
+
s.message(`Checking health... (${i + 1}/${maxRetries})`);
|
|
92
70
|
await sleep(retryDelay);
|
|
93
71
|
}
|
|
94
72
|
}
|
|
95
|
-
|
|
73
|
+
s.stop('Health check timed out, but services may still be starting');
|
|
96
74
|
logWarning('You may need to wait a bit longer for all services to be ready.');
|
|
97
75
|
}
|
|
98
76
|
/**
|
|
@@ -100,13 +78,14 @@ export async function waitForInfraHealth(targetDir) {
|
|
|
100
78
|
*/
|
|
101
79
|
export async function startAppServices(targetDir) {
|
|
102
80
|
logInfo('Starting application services...');
|
|
103
|
-
const
|
|
81
|
+
const s = spinner();
|
|
82
|
+
s.start('Starting docker-compose.yaml...');
|
|
104
83
|
try {
|
|
105
84
|
await execa('docker-compose', ['up', '-d'], { cwd: targetDir });
|
|
106
|
-
|
|
85
|
+
s.stop('Application services started');
|
|
107
86
|
}
|
|
108
87
|
catch (error) {
|
|
109
|
-
|
|
88
|
+
s.error('Failed to start application services');
|
|
110
89
|
throw error;
|
|
111
90
|
}
|
|
112
91
|
}
|
|
@@ -114,36 +93,42 @@ export async function startAppServices(targetDir) {
|
|
|
114
93
|
* Display service status and URLs
|
|
115
94
|
*/
|
|
116
95
|
export async function displayServiceStatus() {
|
|
117
|
-
console.log(
|
|
118
|
-
console.log(chalk.
|
|
119
|
-
console.log(
|
|
96
|
+
console.log(`\n${divider('green', '═')}`);
|
|
97
|
+
console.log(chalk.greenBright(chalk.bold('Services Started')));
|
|
98
|
+
console.log(divider('green', '═'));
|
|
120
99
|
try {
|
|
121
100
|
// Get running containers
|
|
122
101
|
const { stdout } = await execa('docker', ['ps', '--format', '{{.Names}}']);
|
|
123
|
-
const containers = stdout.split('\n').filter(Boolean);
|
|
124
|
-
|
|
102
|
+
const containers = stdout.split('\n').filter(Boolean).sort();
|
|
103
|
+
const accessRows = [];
|
|
125
104
|
// Display URLs for known services
|
|
126
105
|
if (containers.some(c => c.includes('api'))) {
|
|
127
|
-
|
|
128
|
-
|
|
106
|
+
accessRows.push({ label: 'API Server', value: getServiceURL('API') });
|
|
107
|
+
accessRows.push({ label: 'API Health', value: `${getServiceURL('API')}/health` });
|
|
129
108
|
}
|
|
130
109
|
if (containers.some(c => c.includes('dashboard'))) {
|
|
131
|
-
|
|
110
|
+
accessRows.push({ label: 'Dashboard', value: getServiceURL('DASHBOARD') });
|
|
132
111
|
}
|
|
133
112
|
if (containers.some(c => c.includes('kafka-ui'))) {
|
|
134
|
-
|
|
113
|
+
accessRows.push({ label: 'Kafka UI', value: getServiceURL('KAFKA_UI') });
|
|
135
114
|
}
|
|
136
115
|
if (containers.some(c => c.includes('grafana'))) {
|
|
137
|
-
|
|
138
|
-
|
|
116
|
+
accessRows.push({ label: 'Grafana', value: `${getServiceURL('GRAFANA')} (admin/admin)` });
|
|
117
|
+
}
|
|
118
|
+
if (accessRows.length > 0) {
|
|
119
|
+
printSummaryCard('Access URLs', accessRows);
|
|
139
120
|
}
|
|
140
|
-
console.log(chalk.
|
|
121
|
+
console.log(chalk.cyanBright('Running Containers'));
|
|
122
|
+
console.log(divider());
|
|
141
123
|
for (const container of containers) {
|
|
142
|
-
console.log(` ${chalk.
|
|
124
|
+
console.log(` ${chalk.greenBright('•')} ${container}`);
|
|
143
125
|
}
|
|
144
|
-
console.log('
|
|
145
|
-
|
|
146
|
-
|
|
126
|
+
console.log('');
|
|
127
|
+
printCommandHints('Helpful commands', [
|
|
128
|
+
'docker-compose logs -f',
|
|
129
|
+
'docker-compose down',
|
|
130
|
+
]);
|
|
131
|
+
console.log(`${divider('green', '═')}\n`);
|
|
147
132
|
}
|
|
148
133
|
catch (error) {
|
|
149
134
|
logWarning('Could not fetch container status');
|
package/dist/services.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
package/dist/templates.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export declare const INFRA_COMPOSE_TEMPLATE = "
|
|
2
|
-
export declare const APP_COMPOSE_TEMPLATE = "services:\n api:\n image: ghcr.io/simplenotificationsystem/simplens-core
|
|
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 NEXT_PUBLIC_BASE_PATH: ${BASE_PATH:-}\n restart: unless-stopped\n\nvolumes:\n plugin-data:\n\nnetworks:\n default:\n name: simplens\n";
|
|
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";
|
|
3
4
|
//# 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,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,02GAqHlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,yvEA2EhC,CAAC;AAEF,eAAO,MAAM,0BAA0B,wPAUX,CAAC"}
|