go-duck-cli 1.3.38 → 1.3.41
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/generators/devops.js +25 -18
- package/generators/swagger.js +1 -1
- package/package.json +1 -1
package/generators/devops.js
CHANGED
|
@@ -13,7 +13,12 @@ export const generateDeploymentArtifacts = async (config, projectRootDir) => {
|
|
|
13
13
|
await fs.ensureDir(keycloakDir);
|
|
14
14
|
await fs.ensureDir(githubDir);
|
|
15
15
|
|
|
16
|
+
const toKebabCase = (str) => {
|
|
17
|
+
if (!str) return '';
|
|
18
|
+
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
19
|
+
};
|
|
16
20
|
const appName = config.name || 'go-duck';
|
|
21
|
+
const k8sAppName = toKebabCase(appName);
|
|
17
22
|
const parts = appName.split(/[-_]/);
|
|
18
23
|
const shortName = (parts.length > 1 ? parts.map(w => w[0]).join('') : appName).substring(0, 10).toLowerCase() || 'goduck';
|
|
19
24
|
const appPort = config.server?.rest?.port || 8080;
|
|
@@ -75,9 +80,11 @@ FROM gcr.io/distroless/static-debian12
|
|
|
75
80
|
WORKDIR /app
|
|
76
81
|
|
|
77
82
|
COPY --from=builder /app/server .
|
|
83
|
+
|
|
78
84
|
COPY --from=builder /app/application.yml .
|
|
79
85
|
COPY --from=builder /app/application-dev.yml .
|
|
80
86
|
COPY --from=builder /app/application-prod.yml .
|
|
87
|
+
COPY --from=builder /app/docs/ /app/docs/
|
|
81
88
|
|
|
82
89
|
EXPOSE ${appPort}
|
|
83
90
|
ENV GO_PROFILE=prod
|
|
@@ -468,21 +475,21 @@ echo "========================================="
|
|
|
468
475
|
const k8sAppYaml = `apiVersion: apps/v1
|
|
469
476
|
kind: Deployment
|
|
470
477
|
metadata:
|
|
471
|
-
name: ${
|
|
478
|
+
name: ${k8sAppName}
|
|
472
479
|
labels:
|
|
473
|
-
app: ${
|
|
480
|
+
app: ${k8sAppName}
|
|
474
481
|
spec:
|
|
475
482
|
replicas: 1
|
|
476
483
|
selector:
|
|
477
484
|
matchLabels:
|
|
478
|
-
app: ${
|
|
485
|
+
app: ${k8sAppName}
|
|
479
486
|
template:
|
|
480
487
|
metadata:
|
|
481
488
|
labels:
|
|
482
|
-
app: ${
|
|
489
|
+
app: ${k8sAppName}
|
|
483
490
|
spec:
|
|
484
491
|
containers:
|
|
485
|
-
- name: ${
|
|
492
|
+
- name: ${k8sAppName}
|
|
486
493
|
image: ${appName}:latest
|
|
487
494
|
env:
|
|
488
495
|
- name: GO_PROFILE
|
|
@@ -490,7 +497,7 @@ spec:
|
|
|
490
497
|
- name: GO_DUCK_SERVER_REST_PORT
|
|
491
498
|
value: "${appPort}"
|
|
492
499
|
- name: GO_DUCK_DATASOURCE_HOST
|
|
493
|
-
value: postgres.${
|
|
500
|
+
value: postgres.${k8sAppName}-postgres-k8s.svc.cluster.local
|
|
494
501
|
- name: GO_DUCK_DATASOURCE_USERNAME
|
|
495
502
|
value: "${config.datasource?.username || 'postgres'}"
|
|
496
503
|
- name: GO_DUCK_DATASOURCE_PASSWORD
|
|
@@ -502,31 +509,31 @@ spec:
|
|
|
502
509
|
- name: GO_DUCK_DATASOURCE_MONGODB_ENABLED
|
|
503
510
|
value: "${config.datasource?.mongodb?.enabled ? 'true' : 'false'}"
|
|
504
511
|
- name: GO_DUCK_DATASOURCE_MONGODB_URI
|
|
505
|
-
value: mongodb://mongodb.${
|
|
512
|
+
value: mongodb://mongodb.${k8sAppName}-mongodb-k8s.svc.cluster.local:27017
|
|
506
513
|
- name: GO_DUCK_DATASOURCE_MONGODB_DATABASE
|
|
507
514
|
value: "${config.datasource?.mongodb?.database || 'goduck_document_store'}"
|
|
508
515
|
- name: GO_DUCK_CACHE_REDIS_HOST
|
|
509
|
-
value: redis.${
|
|
516
|
+
value: redis.${k8sAppName}-redis-k8s.svc.cluster.local:6379
|
|
510
517
|
- name: GO_DUCK_CACHE_REDIS_PASSWORD
|
|
511
518
|
value: "${config.cache?.redis?.password || ''}"
|
|
512
519
|
- name: GO_DUCK_MESSAGING_MQTT_BROKER
|
|
513
|
-
value: tcp://mosquitto.${
|
|
520
|
+
value: tcp://mosquitto.${k8sAppName}-mosquitto-k8s.svc.cluster.local:1883
|
|
514
521
|
- name: GO_DUCK_MESSAGING_MQTT_USERNAME
|
|
515
522
|
value: "${config.messaging?.mqtt?.username || 'dev_user'}"
|
|
516
523
|
- name: GO_DUCK_MESSAGING_MQTT_PASSWORD
|
|
517
524
|
value: "${config.messaging?.mqtt?.password || 'dev_password'}"
|
|
518
525
|
- name: GO_DUCK_MESSAGING_NATS_URL
|
|
519
|
-
value: nats://nats.${
|
|
526
|
+
value: nats://nats.${k8sAppName}-nats-k8s.svc.cluster.local:4222
|
|
520
527
|
- name: GO_DUCK_TELEMETRY_OTEL_ENDPOINT
|
|
521
|
-
value: otel-collector.${
|
|
528
|
+
value: otel-collector.${k8sAppName}-otel-collector-k8s.svc.cluster.local:4317
|
|
522
529
|
- name: GO_DUCK_ELASTICSEARCH_ADDRESSES
|
|
523
|
-
value: http://elasticsearch.${
|
|
530
|
+
value: http://elasticsearch.${k8sAppName}-elasticsearch-k8s.svc.cluster.local:9200
|
|
524
531
|
- name: GO_DUCK_ELASTICSEARCH_USERNAME
|
|
525
532
|
value: "${config.elasticsearch?.username || 'elastic'}"
|
|
526
533
|
- name: GO_DUCK_ELASTICSEARCH_PASSWORD
|
|
527
534
|
value: "${config.elasticsearch?.password || 'changeme'}"
|
|
528
535
|
- name: GO_DUCK_SECURITY_KEYCLOAK_HOST
|
|
529
|
-
value: http://keycloak.${
|
|
536
|
+
value: http://keycloak.${k8sAppName}-keycloak-k8s.svc.cluster.local:8080
|
|
530
537
|
- name: GO_DUCK_SECURITY_KEYCLOAK_REALM
|
|
531
538
|
value: "${config.security?.['keycloak-realm'] || 'go-duck-realm'}"
|
|
532
539
|
- name: GO_DUCK_SECURITY_KEYCLOAK_APP_CLIENT_ID
|
|
@@ -536,7 +543,7 @@ spec:
|
|
|
536
543
|
- name: GO_DUCK_SECURITY_KEYCLOAK_SERVICE_SECRET
|
|
537
544
|
value: "${config.security?.['keycloak-service-secret'] || 'service-secret-123'}"
|
|
538
545
|
- name: GO_DUCK_STORAGE_MINIO_ENDPOINT
|
|
539
|
-
value: "http://minio.${
|
|
546
|
+
value: "http://minio.${k8sAppName}-minio-k8s.svc.cluster.local:9000"
|
|
540
547
|
- name: GO_DUCK_STORAGE_MINIO_ACCESS_KEY
|
|
541
548
|
value: "${config.storage?.minio?.['access-key'] || 'minioadmin'}"
|
|
542
549
|
- name: GO_DUCK_STORAGE_MINIO_SECRET_KEY
|
|
@@ -550,7 +557,7 @@ spec:
|
|
|
550
557
|
apiVersion: v1
|
|
551
558
|
kind: Service
|
|
552
559
|
metadata:
|
|
553
|
-
name: ${
|
|
560
|
+
name: ${k8sAppName}
|
|
554
561
|
spec:
|
|
555
562
|
type: NodePort
|
|
556
563
|
ports:
|
|
@@ -563,7 +570,7 @@ spec:
|
|
|
563
570
|
targetPort: grpc
|
|
564
571
|
nodePort: 30090
|
|
565
572
|
selector:
|
|
566
|
-
app: ${
|
|
573
|
+
app: ${k8sAppName}
|
|
567
574
|
`;
|
|
568
575
|
|
|
569
576
|
const k8sPostgresYaml = `apiVersion: v1
|
|
@@ -1001,7 +1008,7 @@ spec:
|
|
|
1001
1008
|
await fs.writeFile(path.join(k8sDir, 'mosquitto.conf'), mosquittoConf);
|
|
1002
1009
|
// Namespace calculation: unique namespace per service
|
|
1003
1010
|
const applyNs = (yamlString, serviceName) => {
|
|
1004
|
-
const nsName = `${
|
|
1011
|
+
const nsName = `${k8sAppName}-${serviceName}-k8s`;
|
|
1005
1012
|
const nsBlock = `apiVersion: v1\nkind: Namespace\nmetadata:\n name: ${nsName}\n---\n`;
|
|
1006
1013
|
return nsBlock + yamlString.replace(/^metadata:$/gm, `metadata:\n namespace: ${nsName}`);
|
|
1007
1014
|
};
|
|
@@ -1012,7 +1019,7 @@ spec:
|
|
|
1012
1019
|
// We conditionally add minio if storage is enabled (or any blob provider), but for safety we'll just generate its namespace always.
|
|
1013
1020
|
servicesList.push('minio');
|
|
1014
1021
|
|
|
1015
|
-
const k8sNamespaceYaml = servicesList.map(svc => `apiVersion: v1\nkind: Namespace\nmetadata:\n name: ${
|
|
1022
|
+
const k8sNamespaceYaml = servicesList.map(svc => `apiVersion: v1\nkind: Namespace\nmetadata:\n name: ${k8sAppName}-${svc}-k8s`).join('\n---\n');
|
|
1016
1023
|
|
|
1017
1024
|
await fs.writeFile(path.join(k8sDir, 'namespace.yaml'), k8sNamespaceYaml);
|
|
1018
1025
|
|
package/generators/swagger.js
CHANGED
|
@@ -17,7 +17,7 @@ export const generateSwaggerDocs = async (config, entities, outputDir, openEntit
|
|
|
17
17
|
description: `Generated documentation for ${config.name} microservice`
|
|
18
18
|
},
|
|
19
19
|
servers: [
|
|
20
|
-
{ url:
|
|
20
|
+
{ url: "/", description: "Current Host" }
|
|
21
21
|
],
|
|
22
22
|
paths: {},
|
|
23
23
|
components: {
|