@kodus/cli 0.0.11 → 0.1.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.
Files changed (150) hide show
  1. package/README.md +387 -0
  2. package/dist/cli.d.ts +4 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +26 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth/index.d.ts +3 -0
  7. package/dist/commands/auth/index.d.ts.map +1 -0
  8. package/dist/commands/auth/index.js +36 -0
  9. package/dist/commands/auth/index.js.map +1 -0
  10. package/dist/commands/auth/login.d.ts +7 -0
  11. package/dist/commands/auth/login.d.ts.map +1 -0
  12. package/dist/commands/auth/login.js +97 -0
  13. package/dist/commands/auth/login.js.map +1 -0
  14. package/dist/commands/auth/logout.d.ts +2 -0
  15. package/dist/commands/auth/logout.d.ts.map +1 -0
  16. package/dist/commands/auth/logout.js +24 -0
  17. package/dist/commands/auth/logout.js.map +1 -0
  18. package/dist/commands/auth/signup.d.ts +2 -0
  19. package/dist/commands/auth/signup.d.ts.map +1 -0
  20. package/dist/commands/auth/signup.js +74 -0
  21. package/dist/commands/auth/signup.js.map +1 -0
  22. package/dist/commands/auth/status.d.ts +2 -0
  23. package/dist/commands/auth/status.d.ts.map +1 -0
  24. package/dist/commands/auth/status.js +91 -0
  25. package/dist/commands/auth/status.js.map +1 -0
  26. package/dist/commands/auth/team-key.d.ts +5 -0
  27. package/dist/commands/auth/team-key.d.ts.map +1 -0
  28. package/dist/commands/auth/team-key.js +59 -0
  29. package/dist/commands/auth/team-key.js.map +1 -0
  30. package/dist/commands/auth/token.d.ts +2 -0
  31. package/dist/commands/auth/token.d.ts.map +1 -0
  32. package/dist/commands/auth/token.js +31 -0
  33. package/dist/commands/auth/token.js.map +1 -0
  34. package/dist/commands/config.d.ts +3 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +47 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/pr.d.ts +3 -0
  39. package/dist/commands/pr.d.ts.map +1 -0
  40. package/dist/commands/pr.js +75 -0
  41. package/dist/commands/pr.js.map +1 -0
  42. package/dist/commands/review.d.ts +3 -0
  43. package/dist/commands/review.d.ts.map +1 -0
  44. package/dist/commands/review.js +245 -0
  45. package/dist/commands/review.js.map +1 -0
  46. package/dist/commands/telemetry.d.ts +3 -0
  47. package/dist/commands/telemetry.d.ts.map +1 -0
  48. package/dist/commands/telemetry.js +76 -0
  49. package/dist/commands/telemetry.js.map +1 -0
  50. package/dist/commands/upgrade.d.ts +3 -0
  51. package/dist/commands/upgrade.d.ts.map +1 -0
  52. package/dist/commands/upgrade.js +35 -0
  53. package/dist/commands/upgrade.js.map +1 -0
  54. package/dist/constants.d.ts +3 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +3 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/formatters/json.d.ts +7 -0
  59. package/dist/formatters/json.d.ts.map +1 -0
  60. package/dist/formatters/json.js +7 -0
  61. package/dist/formatters/json.js.map +1 -0
  62. package/dist/formatters/markdown.d.ts +7 -0
  63. package/dist/formatters/markdown.d.ts.map +1 -0
  64. package/dist/formatters/markdown.js +93 -0
  65. package/dist/formatters/markdown.js.map +1 -0
  66. package/dist/formatters/prompt.d.ts +12 -0
  67. package/dist/formatters/prompt.d.ts.map +1 -0
  68. package/dist/formatters/prompt.js +90 -0
  69. package/dist/formatters/prompt.js.map +1 -0
  70. package/dist/formatters/terminal.d.ts +7 -0
  71. package/dist/formatters/terminal.d.ts.map +1 -0
  72. package/dist/formatters/terminal.js +127 -0
  73. package/dist/formatters/terminal.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +4 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/services/api/api.interface.d.ts +46 -0
  79. package/dist/services/api/api.interface.d.ts.map +1 -0
  80. package/dist/services/api/api.interface.js +2 -0
  81. package/dist/services/api/api.interface.js.map +1 -0
  82. package/dist/services/api/api.mock.d.ts +8 -0
  83. package/dist/services/api/api.mock.d.ts.map +1 -0
  84. package/dist/services/api/api.mock.js +249 -0
  85. package/dist/services/api/api.mock.js.map +1 -0
  86. package/dist/services/api/api.real.d.ts +8 -0
  87. package/dist/services/api/api.real.d.ts.map +1 -0
  88. package/dist/services/api/api.real.js +253 -0
  89. package/dist/services/api/api.real.js.map +1 -0
  90. package/dist/services/api/index.d.ts +4 -0
  91. package/dist/services/api/index.d.ts.map +1 -0
  92. package/dist/services/api/index.js +9 -0
  93. package/dist/services/api/index.js.map +1 -0
  94. package/dist/services/auth.service.d.ts +19 -0
  95. package/dist/services/auth.service.d.ts.map +1 -0
  96. package/dist/services/auth.service.js +90 -0
  97. package/dist/services/auth.service.js.map +1 -0
  98. package/dist/services/context.service.d.ts +22 -0
  99. package/dist/services/context.service.d.ts.map +1 -0
  100. package/dist/services/context.service.js +104 -0
  101. package/dist/services/context.service.js.map +1 -0
  102. package/dist/services/fix.service.d.ts +31 -0
  103. package/dist/services/fix.service.d.ts.map +1 -0
  104. package/dist/services/fix.service.js +120 -0
  105. package/dist/services/fix.service.js.map +1 -0
  106. package/dist/services/git.service.d.ts +32 -0
  107. package/dist/services/git.service.d.ts.map +1 -0
  108. package/dist/services/git.service.js +261 -0
  109. package/dist/services/git.service.js.map +1 -0
  110. package/dist/services/review.service.d.ts +26 -0
  111. package/dist/services/review.service.d.ts.map +1 -0
  112. package/dist/services/review.service.js +82 -0
  113. package/dist/services/review.service.js.map +1 -0
  114. package/dist/services/telemetry.service.d.ts +73 -0
  115. package/dist/services/telemetry.service.d.ts.map +1 -0
  116. package/dist/services/telemetry.service.js +229 -0
  117. package/dist/services/telemetry.service.js.map +1 -0
  118. package/dist/types/index.d.ts +143 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/index.js +15 -0
  121. package/dist/types/index.js.map +1 -0
  122. package/dist/ui/interactive.d.ts +26 -0
  123. package/dist/ui/interactive.d.ts.map +1 -0
  124. package/dist/ui/interactive.js +365 -0
  125. package/dist/ui/interactive.js.map +1 -0
  126. package/dist/utils/config.d.ts +10 -0
  127. package/dist/utils/config.d.ts.map +1 -0
  128. package/dist/utils/config.js +54 -0
  129. package/dist/utils/config.js.map +1 -0
  130. package/dist/utils/credentials.d.ts +6 -0
  131. package/dist/utils/credentials.d.ts.map +1 -0
  132. package/dist/utils/credentials.js +54 -0
  133. package/dist/utils/credentials.js.map +1 -0
  134. package/dist/utils/rate-limit.d.ts +5 -0
  135. package/dist/utils/rate-limit.d.ts.map +1 -0
  136. package/dist/utils/rate-limit.js +47 -0
  137. package/dist/utils/rate-limit.js.map +1 -0
  138. package/dist/utils/review-loading.d.ts +19 -0
  139. package/dist/utils/review-loading.d.ts.map +1 -0
  140. package/dist/utils/review-loading.js +140 -0
  141. package/dist/utils/review-loading.js.map +1 -0
  142. package/package.json +39 -33
  143. package/index.js +0 -17
  144. package/license.md +0 -21
  145. package/readme.md +0 -128
  146. package/scripts/setup-db.sh +0 -77
  147. package/src/commands/install.js +0 -324
  148. package/src/config/default.js +0 -66
  149. package/src/utils/helpers.js +0 -118
  150. package/templates/docker-compose.yml +0 -139
@@ -1,324 +0,0 @@
1
- import inquirer from "inquirer";
2
- import chalk from "chalk";
3
- import ora from "ora";
4
- import fs from "fs-extra";
5
- import path from "path";
6
- import { execSync } from "child_process";
7
- import { DEFAULT_CONFIG, DOCKER_NETWORKS, CRITICAL_ERRORS } from "../config/default.js";
8
- import {
9
- generateSecretKey,
10
- generateDbPassword,
11
- copyTemplates,
12
- createDockerNetworks,
13
- } from "../utils/helpers.js";
14
- import { fileURLToPath } from 'url';
15
- import { dirname } from 'path';
16
-
17
- const __filename = fileURLToPath(import.meta.url);
18
- const __dirname = dirname(__filename);
19
-
20
- const maxAttempts = 30; // 5 minutes with 10 second intervals
21
-
22
- const waitForService = async (serviceName, successMessage, errorMessage) => {
23
- const spinner = ora(`Waiting for ${serviceName} to be ready`).start();
24
- let isReady = false;
25
- let attempts = 0;
26
-
27
- while (!isReady && attempts < maxAttempts) {
28
- try {
29
- const logs = execSync(`docker-compose logs ${serviceName}`, { stdio: "pipe" }).toString();
30
-
31
- if (logs.includes(successMessage)) {
32
- isReady = true;
33
- spinner.succeed(`${serviceName} is ready`);
34
- } else {
35
- attempts++;
36
- await new Promise(resolve => setTimeout(resolve, 10000));
37
- }
38
- } catch (error) {
39
- attempts++;
40
- await new Promise(resolve => setTimeout(resolve, 10000));
41
- }
42
- }
43
-
44
- if (!isReady) {
45
- spinner.fail(errorMessage);
46
- console.error(chalk.yellow("\nTroubleshooting steps:"));
47
- console.error(chalk.white(`1. Check ${serviceName} logs: docker-compose logs ${serviceName}`));
48
- console.error(chalk.white(`2. Verify ${serviceName} container is running: docker-compose ps ${serviceName}`));
49
- process.exit(1);
50
- }
51
- };
52
-
53
- export const setupEnvironment = async () => {
54
- try {
55
- // Check prerequisites
56
- console.log(chalk.blue("\n🔍 Checking prerequisites..."));
57
- const spinner = ora("Checking Docker installation").start();
58
-
59
- try {
60
- execSync("docker --version", { stdio: "ignore" });
61
- spinner.succeed("Docker is installed");
62
- } catch (error) {
63
- spinner.fail("Docker is not installed");
64
- console.error(
65
- chalk.red(
66
- "\nPlease install Docker first: https://docs.docker.com/get-docker/"
67
- )
68
- );
69
- process.exit(1);
70
- }
71
-
72
- // Copy template files
73
- const templateSpinner = ora("Copying template files").start();
74
- try {
75
- copyTemplates(process.cwd());
76
- templateSpinner.succeed("Template files copied");
77
- } catch (error) {
78
- templateSpinner.fail("Failed to copy template files");
79
- console.error(chalk.red("\nError details:"));
80
- console.error(chalk.white(error.message));
81
- process.exit(1);
82
- }
83
-
84
- // Environment type selection
85
- const { envType } = await inquirer.prompt([
86
- {
87
- type: "list",
88
- name: "envType",
89
- message: "What type of environment are you setting up?",
90
- choices: [
91
- { name: "Local (localhost)", value: "local" },
92
- { name: "External (with public URL)", value: "external" },
93
- ],
94
- default: "local",
95
- },
96
- ]);
97
-
98
- let baseUrl = "http://localhost:3000";
99
- if (envType === "external") {
100
- const { url } = await inquirer.prompt([
101
- {
102
- type: "input",
103
- name: "url",
104
- message: "Enter your public URL (e.g., https://kodus.yourdomain.com):",
105
- validate: (input) => {
106
- try {
107
- const url = new URL(input);
108
- if (!url.protocol.startsWith('http')) {
109
- return "URL must start with http:// or https://";
110
- }
111
- if (!url.hostname.includes('.')) {
112
- return "URL must include a valid domain name";
113
- }
114
- return true;
115
- } catch (e) {
116
- return "Please enter a valid URL (e.g., https://kodus.yourdomain.com)";
117
- }
118
- },
119
- },
120
- ]);
121
- baseUrl = url;
122
- }
123
-
124
- // Git service selection
125
- const { gitService } = await inquirer.prompt([
126
- {
127
- type: "list",
128
- name: "gitService",
129
- message: "Which Git service will you use?",
130
- choices: [
131
- { name: "GitHub", value: "github" },
132
- { name: "GitLab", value: "gitlab" },
133
- { name: "Bitbucket", value: "bitbucket" },
134
- ],
135
- },
136
- ]);
137
-
138
- // Git service configuration
139
- let gitConfig = {};
140
-
141
- if (envType === "local") {
142
- console.log(chalk.yellow("\n⚠️ IMPORTANT: If you're using a cloud Git service (GitHub, GitLab, Bitbucket), you'll need to configure the webhook manually."));
143
- console.log(chalk.yellow("For local or self-hosted Git instances, no additional configuration is needed."));
144
- console.log(chalk.yellow("The webhook URL will be:"));
145
- console.log(chalk.white(`${baseUrl}/api/webhook/${gitService}`));
146
- }
147
-
148
- // Configure webhook URL based on the selected Git service
149
- if (gitService === "github") {
150
- gitConfig = {
151
- API_GITHUB_CODE_MANAGEMENT_WEBHOOK: `${baseUrl}/api/webhook/${gitService}`,
152
- };
153
- } else if (gitService === "gitlab") {
154
- gitConfig = {
155
- API_GITLAB_CODE_MANAGEMENT_WEBHOOK: `${baseUrl}/api/webhook/${gitService}`,
156
- };
157
- } else if (gitService === "bitbucket") {
158
- gitConfig = {
159
- GLOBAL_BITBUCKET_CODE_MANAGEMENT_WEBHOOK: `${baseUrl}/api/webhook/${gitService}`,
160
- };
161
- }
162
-
163
- // Database configuration
164
- const { useDefaultDb } = await inquirer.prompt([
165
- {
166
- type: "confirm",
167
- name: "useDefaultDb",
168
- message: "Would you like to use default database configurations?",
169
- default: true,
170
- },
171
- ]);
172
-
173
- // LLM API Keys configuration
174
- console.log(chalk.blue("\n🔑 Configuring LLM API Keys..."));
175
- const llmKeys = await inquirer.prompt([
176
- {
177
- type: "input",
178
- name: "openAiKey",
179
- message: "Enter your OpenAI API key (optional):",
180
- default: "",
181
- },
182
- {
183
- type: "input",
184
- name: "googleAiKey",
185
- message: "Enter your Google AI API key (optional):",
186
- default: "",
187
- },
188
- {
189
- type: "input",
190
- name: "anthropicKey",
191
- message: "Enter your Anthropic API key (optional):",
192
- default: "",
193
- },
194
- {
195
- type: "input",
196
- name: "novitaKey",
197
- message: "Enter your Novita AI API key (optional):",
198
- default: "",
199
- },
200
- {
201
- type: "input",
202
- name: "vertexKey",
203
- message: "Enter your Vertex AI API key (optional):",
204
- default: "",
205
- },
206
- ]);
207
-
208
- // Generate .env content
209
- const envContent = {
210
- ...DEFAULT_CONFIG,
211
- WEB_NEXTAUTH_SECRET: generateSecretKey(),
212
- WEB_JWT_SECRET_KEY: generateSecretKey(),
213
- API_JWT_SECRET: generateSecretKey(),
214
- API_JWT_REFRESHSECRET: generateSecretKey(),
215
- API_PG_DB_PASSWORD: generateDbPassword(),
216
- API_MG_DB_PASSWORD: generateDbPassword(),
217
- RABBITMQ_DEFAULT_PASS: generateDbPassword(),
218
- GRAFANA_ADMIN_PASSWORD: generateDbPassword(),
219
- API_OPEN_AI_APIKEY: llmKeys.openAiKey,
220
- API_GOOGLE_AI_API_KEY: llmKeys.googleAiKey,
221
- API_ANTHROPIC_API_KEY: llmKeys.anthropicKey,
222
- API_NOVITA_AI_API_KEY: llmKeys.novitaKey,
223
- API_VERTEX_AI_API_KEY: llmKeys.vertexKey,
224
- ...gitConfig,
225
- };
226
-
227
- // Create .env file
228
- const envSpinner = ora("Creating .env file").start();
229
- const envContentString = Object.entries(envContent)
230
- .map(([key, value]) => `${key}=${value}`)
231
- .join("\n");
232
-
233
- const envPath = path.join(process.cwd(), '.env');
234
- fs.writeFileSync(envPath, envContentString);
235
- envSpinner.succeed("Created .env file");
236
-
237
- // Create Docker networks
238
- createDockerNetworks(DOCKER_NETWORKS);
239
-
240
- // Start containers
241
- const dockerSpinner = ora("Starting containers").start();
242
- try {
243
- execSync("docker-compose up -d", { stdio: "pipe" });
244
- dockerSpinner.succeed("Containers started");
245
- } catch (error) {
246
- dockerSpinner.fail("Failed to start containers");
247
- console.error(chalk.red("\nError details:"));
248
- console.error(chalk.white(error.stdout?.toString() || error.message));
249
- process.exit(1);
250
- }
251
-
252
- // Wait for services to be ready
253
- await waitForService(
254
- "db_kodus_postgres",
255
- "database system is ready to accept connections",
256
- "PostgreSQL failed to start"
257
- );
258
-
259
- await waitForService(
260
- "db_kodus_mongodb",
261
- "Waiting for connections",
262
- "MongoDB failed to start"
263
- );
264
-
265
- // Setup database
266
- const dbSpinner = ora("Setting up database").start();
267
- try {
268
- const moduleRoot = dirname(dirname(__dirname)); // Sobe 2 níveis: commands -> src -> root
269
- const scriptPath = path.join(moduleRoot, 'scripts', 'setup-db.sh');
270
-
271
- if (!fs.existsSync(scriptPath)) {
272
- dbSpinner.fail('setup-db.sh script not found!');
273
- console.error(chalk.red(`\nScript expected at: ${scriptPath}`));
274
- process.exit(1);
275
- }
276
-
277
- execSync(`sh ${scriptPath}`, { stdio: "pipe" });
278
- dbSpinner.succeed("Database setup completed");
279
- } catch (error) {
280
- dbSpinner.fail("Failed to setup database");
281
- console.error(chalk.red("\nError details:"));
282
- console.error(chalk.white(error.stdout?.toString() || error.message));
283
- process.exit(1);
284
- }
285
-
286
- // Installation complete
287
- console.log(chalk.green("\n✨ Installation completed successfully!"));
288
-
289
- console.log(chalk.blue("\n📝 Installation Summary:"));
290
- console.log(chalk.white(` - Environment: ${envType === "local" ? "Local" : "External"}`));
291
- if (envType === "external") {
292
- console.log(chalk.white(` - Base URL: ${baseUrl}`));
293
- }
294
- console.log(chalk.white(` - Git Service: ${gitService.charAt(0).toUpperCase() + gitService.slice(1)}`));
295
- console.log(chalk.white(` - Database: ${useDefaultDb ? "Default configuration" : "Custom configuration"}`));
296
-
297
- console.log(chalk.blue("\n🔗 Access URLs:"));
298
- console.log(chalk.white(` - Web Interface: ${baseUrl}`));
299
- console.log(chalk.white(" - Grafana Dashboard: http://localhost:3001"));
300
- console.log(chalk.white(" - RabbitMQ Management: http://localhost:15672"));
301
-
302
- console.log(chalk.blue("\n📚 Next Steps:"));
303
- console.log(chalk.white(" 1. Access the web interface"));
304
- console.log(chalk.white(" 2. Set up your first user"));
305
- console.log(chalk.white(" 3. Start using Kodus!"));
306
-
307
- const { startServices } = await inquirer.prompt([
308
- {
309
- type: "confirm",
310
- name: "startServices",
311
- message: "Would you like to start the services now?",
312
- default: true,
313
- },
314
- ]);
315
-
316
- if (startServices) {
317
- execSync("docker-compose up -d", { stdio: "ignore" });
318
- console.log(chalk.green("\nServices started successfully!"));
319
- }
320
- } catch (error) {
321
- console.error(chalk.red("\n❌ Installation failed:"), error.message);
322
- process.exit(1);
323
- }
324
- };
@@ -1,66 +0,0 @@
1
- export const DEFAULT_CONFIG = {
2
- // Base configuration
3
- WEB_NODE_ENV: "development",
4
- WEB_HOSTNAME_API: "localhost",
5
- WEB_PORT_API: "3001",
6
- WEB_PORT: "3000",
7
- WEB_NEXTAUTH_URL: "http://localhost:3000",
8
-
9
- API_NODE_ENV: "development",
10
- API_LOG_LEVEL: "error",
11
- API_LOG_PRETTY: "true",
12
- API_HOST: "0.0.0.0",
13
- API_PORT: "3001",
14
- API_RATE_MAX_REQUEST: "100",
15
- API_RATE_INTERVAL: "1000",
16
- API_JWT_EXPIRES_IN: "365d",
17
- API_JWT_REFRESH_EXPIRES_IN: "7d",
18
-
19
- GLOBAL_API_CONTAINER_NAME: "kodus-orchestrator-prod",
20
-
21
- // Database
22
- API_DATABASE_ENV: "development",
23
- API_PG_DB_USERNAME: "kodusdev",
24
- API_PG_DB_DATABASE: "kodus_db",
25
- API_PG_DB_HOST: "db_kodus_postgres",
26
- API_PG_DB_PORT: "5432",
27
-
28
- API_MG_DB_USERNAME: "kodusdev",
29
- API_MG_DB_DATABASE: "kodus_db",
30
- API_MG_DB_HOST: "db_kodus_mongodb",
31
- API_MG_DB_PORT: "27017",
32
- API_MG_DB_PRODUCTION_CONFIG: "",
33
-
34
- // LLM Models
35
- API_LLM_MODEL_CHATGPT_3_5_TURBO: "gpt-4o-mini",
36
- API_LLM_MODEL_CHATGPT_3_5_TURBO_16K: "gpt-4o-mini",
37
- API_LLM_MODEL_CHATGPT_4: "gpt-4o-mini",
38
- API_LLM_MODEL_CHATGPT_4_TURBO: "gpt-4o-mini",
39
- API_LLM_MODEL_CHATGPT_4_ALL: "gpt-4o",
40
- API_LLM_MODEL_CHATGPT_4_ALL_MINI: "gpt-4o-mini",
41
- API_LLM_MODEL_CLAUDE_3_5_SONNET: "claude-3-5-sonnet-20241022",
42
- API_LLM_MODEL_CLAUDE_3_5_SONNET_20241022: "claude-3-5-sonnet-20241022",
43
- API_LLM_MODEL_GEMINI_1_5_PRO: "gpt-4o-mini",
44
- API_LLM_MODEL_GEMINI_1_5_PRO_EXP: "gpt-4o-mini",
45
-
46
- // Ports
47
- WEB_PORT: "3000",
48
- API_PORT: "3001",
49
-
50
- // RabbitMQ
51
- RABBITMQ_DEFAULT_USER: "kodus",
52
- };
53
-
54
- export const DOCKER_NETWORKS = [
55
- 'shared-network',
56
- 'monitoring-network',
57
- 'kodus-backend-services'
58
- ];
59
-
60
- export const CRITICAL_ERRORS = [
61
- "password authentication failed",
62
- "Unable to connect to the database",
63
- "FATAL:",
64
- "MongoServerError:",
65
- "connection refused"
66
- ];
@@ -1,118 +0,0 @@
1
- import crypto from 'crypto';
2
- import fs from 'fs-extra';
3
- import path from 'path';
4
- import { execSync } from 'child_process';
5
- import ora from 'ora';
6
- import chalk from 'chalk';
7
- import { fileURLToPath } from 'url';
8
- import { dirname } from 'path';
9
-
10
- const __filename = fileURLToPath(import.meta.url);
11
- const __dirname = dirname(__filename);
12
-
13
- export const generateSecretKey = () => crypto.randomBytes(32).toString("base64");
14
-
15
- export const generateDbPassword = () =>
16
- crypto
17
- .randomBytes(16)
18
- .toString("base64")
19
- .replace(/[^a-zA-Z0-9]/g, "")
20
- .slice(0, 16);
21
-
22
- export const copyTemplates = (targetDir) => {
23
- try {
24
- const moduleDir = dirname(dirname(dirname(__filename))); // Sobe 3 níveis: utils -> src -> root
25
- const templatesDir = path.join(moduleDir, 'templates');
26
-
27
- if (!fs.existsSync(templatesDir)) {
28
- console.error(chalk.red(`Templates directory not found at: ${templatesDir}`));
29
- console.error(chalk.yellow('Current directory structure:'));
30
- console.error(chalk.white(fs.readdirSync(moduleDir)));
31
- throw new Error('Templates directory not found');
32
- }
33
-
34
- const sourceFile = path.join(templatesDir, 'docker-compose.yml');
35
- const targetFile = path.join(targetDir, 'docker-compose.yml');
36
-
37
- if (!fs.existsSync(sourceFile)) {
38
- console.error(chalk.red(`Template file not found at: ${sourceFile}`));
39
- console.error(chalk.yellow('Files in templates directory:'));
40
- console.error(chalk.white(fs.readdirSync(templatesDir)));
41
- throw new Error('Template file not found');
42
- }
43
-
44
- fs.copySync(sourceFile, targetFile);
45
- } catch (error) {
46
- console.error(chalk.red('Error copying templates:'), error);
47
- throw error;
48
- }
49
- };
50
-
51
- export const backupEnv = () => {
52
- const envPath = path.join(process.cwd(), '.env');
53
- if (fs.existsSync(envPath)) {
54
- const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
55
- const backupPath = path.join(process.cwd(), `.env.backup.${timestamp}`);
56
- fs.copySync(envPath, backupPath);
57
- return true;
58
- }
59
- return false;
60
- };
61
-
62
- export const restoreEnv = (backupFile) => {
63
- const backupPath = path.join(process.cwd(), backupFile);
64
- if (fs.existsSync(backupPath)) {
65
- const envPath = path.join(process.cwd(), '.env');
66
- fs.copySync(backupPath, envPath);
67
- return true;
68
- }
69
- return false;
70
- };
71
-
72
- export const getLatestVersion = () => {
73
- try {
74
- const result = execSync("git describe --tags --abbrev=0", { stdio: "pipe" })
75
- .toString()
76
- .trim();
77
- return result;
78
- } catch (error) {
79
- return null;
80
- }
81
- };
82
-
83
- export const getCurrentVersion = () => {
84
- try {
85
- const result = execSync("git rev-parse --abbrev-ref HEAD", {
86
- stdio: "pipe",
87
- })
88
- .toString()
89
- .trim();
90
- return result;
91
- } catch (error) {
92
- return null;
93
- }
94
- };
95
-
96
- export const createDockerNetworks = (networks) => {
97
- const networkSpinner = ora("Creating Docker networks").start();
98
-
99
- for (const network of networks) {
100
- try {
101
- // Check if network exists
102
- execSync(`docker network inspect ${network}`, { stdio: 'ignore' });
103
- } catch (error) {
104
- // Network doesn't exist, create it
105
- try {
106
- execSync(`docker network create ${network}`, { stdio: 'pipe' });
107
- console.log(chalk.green(`\nCreated network: ${network}`));
108
- } catch (createError) {
109
- networkSpinner.fail(`Failed to create network: ${network}`);
110
- console.error(chalk.red("\nError details:"));
111
- console.error(chalk.white(createError.stdout?.toString() || createError.message));
112
- process.exit(1);
113
- }
114
- }
115
- }
116
-
117
- networkSpinner.succeed("Docker networks created");
118
- };
@@ -1,139 +0,0 @@
1
- services:
2
- kodus-web:
3
- image: ghcr.io/kodustech/kodus-web:latest
4
- container_name: kodus-web-prod
5
- ports:
6
- - "${WEB_PORT}:${WEB_PORT}"
7
- networks:
8
- - shared-network
9
- - kodus-backend-services
10
- restart: unless-stopped
11
- env_file:
12
- - .env
13
-
14
- kodus-orchestrator:
15
- image: ghcr.io/kodustech/kodus-ai:latest
16
- platform: linux/amd64
17
- container_name: ${GLOBAL_API_CONTAINER_NAME}
18
- volumes:
19
- - log_volume:/app/logs
20
- logging:
21
- options:
22
- max-size: "200m"
23
- max-file: "10"
24
- ports:
25
- - "3001:3001"
26
- - "9229:9229"
27
- environment:
28
- - ENV=production
29
- - NODE_ENV=production
30
- networks:
31
- - shared-network
32
- - kodus-backend-services
33
- restart: unless-stopped
34
- env_file:
35
- - .env
36
-
37
- rabbitmq:
38
- image: rabbitmq:3.13.4-management-alpine
39
- container_name: rabbitmq-prod
40
- hostname: rabbitmq
41
- ports:
42
- - "5672:5672"
43
- - "15672:15672"
44
- networks:
45
- - monitoring-network
46
- - shared-network
47
- environment:
48
- - RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbit heartbeat 60
49
- restart: unless-stopped
50
- env_file:
51
- - .env
52
-
53
- db_kodus_postgres:
54
- image: pgvector/pgvector:pg16
55
- container_name: db_kodus_postgres
56
- ports:
57
- - "5432:5432"
58
- environment:
59
- POSTGRES_USER: ${API_PG_DB_USERNAME}
60
- POSTGRES_PASSWORD: ${API_PG_DB_PASSWORD}
61
- POSTGRES_DB: ${API_PG_DB_DATABASE}
62
- volumes:
63
- - pgdata:/var/lib/postgresql/data
64
- - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
65
- networks:
66
- - kodus-backend-services
67
-
68
- db_kodus_mongodb:
69
- image: mongo:8
70
- container_name: db_kodus_mongodb
71
- ports:
72
- - "27017:27017"
73
- volumes:
74
- - mongodbdata:/data/db
75
- environment:
76
- # These variables must be defined in the .env file
77
- MONGO_INITDB_ROOT_USERNAME: ${API_MG_DB_USERNAME}
78
- MONGO_INITDB_ROOT_PASSWORD: ${API_MG_DB_PASSWORD}
79
- MONGO_INITDB_DATABASE: ${API_MG_DB_DATABASE}
80
- networks:
81
- - kodus-backend-services
82
-
83
- migration:
84
- image: ghcr.io/kodustech/kodus-ai:latest
85
- platform: linux/amd64
86
- container_name: migration
87
- depends_on:
88
- - db_kodus_postgres
89
- environment:
90
- - ENV=${API_DATABASE_ENV}
91
- - NODE_ENV=${API_NODE_ENV}
92
- - API_PG_DB_HOST=${API_PG_DB_HOST}
93
- - API_PG_DB_PORT=${API_PG_DB_PORT}
94
- - API_PG_DB_USERNAME=${API_PG_DB_USERNAME}
95
- - API_PG_DB_PASSWORD=${API_PG_DB_PASSWORD}
96
- - API_PG_DB_DATABASE=${API_PG_DB_DATABASE}
97
- - PGSSLMODE=disable
98
- command: >
99
- sh -c '
100
- echo "Debug: Printing environment variables..." &&
101
- echo "API_PG_DB_HOST=" $$API_PG_DB_HOST &&
102
- echo "Creating temporary datasource file..." &&
103
- echo "const { DataSource } = require(\"typeorm\");
104
- module.exports = new DataSource({
105
- type: \"postgres\",
106
- host: \"db_kodus_postgres\",
107
- port: 5432,
108
- username: \"$$API_PG_DB_USERNAME\",
109
- password: \"$$API_PG_DB_PASSWORD\",
110
- database: \"$$API_PG_DB_DATABASE\",
111
- ssl: false,
112
- entities: [\"./dist/modules/**/infra/typeorm/entities/*.js\"],
113
- migrations: [\"./dist/config/database/typeorm/migrations/*.js\"]
114
- });" > datasource.js &&
115
- yarn typeorm migration:run -d datasource.js
116
- '
117
- networks:
118
- - kodus-backend-services
119
- env_file:
120
- - .env
121
-
122
- volumes:
123
- log_volume:
124
- rabbitmq-data-prod:
125
- name: rabbitmq-data-prod
126
- pgdata:
127
- mongodbdata:
128
-
129
- networks:
130
- shared-network:
131
- external: true
132
- monitoring-network:
133
- driver: bridge
134
- name: monitoring-network
135
- external: true
136
- kodus-backend-services:
137
- driver: bridge
138
- name: kodus-backend-services
139
- external: true