diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..5c41dc1 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,18 @@ +name: Docker Image CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Build the Frontend Docker image + run: docker build . --file packages/frontend/Dockerfile --tag otto-frontend:$(date +%s) \ No newline at end of file diff --git a/Tiltfile b/Tiltfile new file mode 100644 index 0000000..481aa11 --- /dev/null +++ b/Tiltfile @@ -0,0 +1,20 @@ +load('ext://helm_resource', 'helm_resource', 'helm_repo') +helm_repo('bitnami', 'https://charts.bitnami.com/bitnami') +helm_resource('db', + 'bitnami/postgresql', + namespace="otto", + flags=['--values=./helm/dev-db-config.yaml'] + ) +yaml = helm('./helm/otto', + name='otto', + namespace='otto' +) +k8s_yaml(yaml) + +k8s_resource("otto-frontend", port_forwards='3000:80') +k8s_resource("otto-backend",port_forwards="8080") + +docker_build('ghcr.io/mayflower/otto-frontend','.',dockerfile='packages/frontend/Dockerfile', only=['packages/frontend','packages/api-spec']) +custom_build('ghcr.io/mayflower/otto-backend', +'./mvnw compile jib:dockerBuild -pl packages/backend -Dimage=$EXPECTED_REF', +deps=['packages/backend'], ignore=['bin','target']) \ No newline at end of file diff --git a/flake.nix b/flake.nix index 46af63f..c1e8573 100644 --- a/flake.nix +++ b/flake.nix @@ -23,12 +23,13 @@ pkgs.skaffold pkgs.openjdk_headless pkgs.nodejs-18_x - pkgs.buildpack pkgs.kubernetes-helm + pkgs.k9s + pkgs.tilt ]; }; overlays.default = (final: prev: { skaffold = pkgs-unstable.skaffold; }); }); -} \ No newline at end of file +} diff --git a/helm/otto/templates/_helpers.tpl b/helm/otto/templates/_helpers.tpl index 2823e1a..d631607 100644 --- a/helm/otto/templates/_helpers.tpl +++ b/helm/otto/templates/_helpers.tpl @@ -49,6 +49,10 @@ Selector labels app.kubernetes.io/name: {{ include "otto.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end }} +{{- define "otto.selectorLabelsFrontend" -}} +app.kubernetes.io/name: {{ include "otto.name" . }}-frontend +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} {{/* Create the name of the service account to use diff --git a/helm/otto/templates/deployment.yaml b/helm/otto/templates/backend-deployment.yaml similarity index 97% rename from helm/otto/templates/deployment.yaml rename to helm/otto/templates/backend-deployment.yaml index 1d70f5b..6ffa64b 100644 --- a/helm/otto/templates/deployment.yaml +++ b/helm/otto/templates/backend-deployment.yaml @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "otto.fullname" . }} + name: {{ include "otto.fullname" . }}-backend labels: {{- include "otto.labels" . | nindent 4 }} spec: diff --git a/helm/otto/templates/service.yaml b/helm/otto/templates/backend-service.yaml similarity index 100% rename from helm/otto/templates/service.yaml rename to helm/otto/templates/backend-service.yaml diff --git a/helm/otto/templates/frontend-deployment.yaml b/helm/otto/templates/frontend-deployment.yaml new file mode 100644 index 0000000..912ae9b --- /dev/null +++ b/helm/otto/templates/frontend-deployment.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "otto.fullname" . }}-frontend + labels: + {{- include "otto.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.frontend.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "otto.selectorLabelsFrontend" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "otto.selectorLabelsFrontend" . | nindent 8 }} + spec: + serviceAccountName: {{ include "otto.serviceAccountName" . }} + containers: + - name: {{ .Chart.Name }}-frontend + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.frontend.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.frontend.service.port }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + diff --git a/helm/otto/templates/frontend-service.yaml b/helm/otto/templates/frontend-service.yaml new file mode 100644 index 0000000..9b30d30 --- /dev/null +++ b/helm/otto/templates/frontend-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "otto.fullname" . }}-frontend + labels: + {{- include "otto.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.frontend.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "otto.selectorLabelsFrontend" . | nindent 4 }} diff --git a/helm/otto/values.yaml b/helm/otto/values.yaml index 1162e18..18ffdd0 100644 --- a/helm/otto/values.yaml +++ b/helm/otto/values.yaml @@ -22,7 +22,7 @@ global: replicaCount: 1 image: - repository: backend + repository: ghcr.io/mayflower/otto-backend pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. # tag: "" @@ -31,7 +31,7 @@ spring: config: dbEndpoint: "db-postgresql.otto" defaultDB: "otto" - wait: true + wait: false minReadySeconds: 30 @@ -65,14 +65,27 @@ service: type: ClusterIP port: 8080 +frontend: + service: + port: 80 + replicaCount: 1 + image: + repository: ghcr.io/mayflower/otto-frontend + pullPolicy: IfNotPresent + ingress: - enabled: false - className: "" - annotations: {} + enabled: true + className: "alb" + annotations: + alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]' + alb.ingress.kubernetes.io/ssl-redirect: '443' + alb.ingress.kubernetes.io/scheme: internet-facing + alb.ingress.kubernetes.io/tags: "Environment=dev,Team=oTTo" + alb.ingress.kubernetes.io/target-type: ip # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - - host: chart-example.local + - host: otto-backend.playground.workshop.mayflower.tech paths: - path: / pathType: ImplementationSpecific diff --git a/infra-todos.md b/infra-todos.md new file mode 100644 index 0000000..e0ea218 --- /dev/null +++ b/infra-todos.md @@ -0,0 +1,27 @@ +todos + +frontend: +- build: + - openapi anders? + buildpacks? + direkt docker? + über maven? +deploy + nginx prod vs dev container? + - postgres: wir stellen code für dev bereit, den leute optional für prod hernehmen könnten, wir rechnen aber nicht damit + +setup + - minikube (1.02 GB) durch kind/k3s ersetzen? (Install-Größe und Performanz) + - Findings: + - Kind ist unwesentlich kleiner (823 MB), und es ist deutlich umständlicher, ein Kubernetes-Dashboard zum laufen zu bekommen + - k3s läuft nicht auf MacOS + - k3d wesentlich kleiner in images: 161 + 39 + 18 MB, schnell + -> k3d könnte sich lohnen, wenn aufsetzen reibungslos geht + +skaffold-zeug: + - FileSync, damit nicht immer neu gebaut werden muss + + backend: +- Warum funktionieren probes nicht? +- liquibase in initcontainer +- https://redhat-scholars.github.io/spring-boot-k8s-tutorial/spring-boot-tutorial/03-kubernetes.html diff --git a/packages/frontend/.dockerignore b/packages/frontend/.dockerignore new file mode 100644 index 0000000..954c1db --- /dev/null +++ b/packages/frontend/.dockerignore @@ -0,0 +1,3 @@ +node_modules +generated-sources +dist diff --git a/packages/frontend/.gitignore b/packages/frontend/.gitignore index 613fecb..b3c58be 100644 --- a/packages/frontend/.gitignore +++ b/packages/frontend/.gitignore @@ -31,3 +31,5 @@ coverage test-results/ playwright-report/ + +target \ No newline at end of file diff --git a/packages/frontend/Dockerfile b/packages/frontend/Dockerfile new file mode 100644 index 0000000..3775dfd --- /dev/null +++ b/packages/frontend/Dockerfile @@ -0,0 +1,34 @@ +FROM openapitools/openapi-generator-cli:v6.4.0 AS openapigenerator_builder + +RUN mkdir -p /app/generated-sources/client +COPY packages/api-spec/openapi.yml /app/openapi.yml +WORKDIR /app/generated-sources/client +RUN /usr/local/bin/docker-entrypoint.sh \ + generate -i /app/openapi.yml -g typescript-axios -o . \ + --additional-properties=npmName=rest-client,withInterface=true,supportsES6=true + +# https://openapi-generator.tech/docs/generators/typescript-axios/ +# https://openapi-generator.tech/docs/installation#docker + +FROM node:alpine3.17 AS frontend_builder_prod + +RUN mkdir -p /app +WORKDIR /app + +# copy the generated openapi-client +COPY --from=openapigenerator_builder /app/generated-sources/client /app/generated-sources/client + +# install npm dependencies +COPY packages/frontend/package*.json ./ +RUN npm install + +# build frontend +WORKDIR /app +COPY packages/frontend ./ +RUN npm run build + + +FROM nginx:1.22-alpine as webserver_prod + +COPY --from=frontend_builder_prod /app/dist /usr/share/nginx/html +EXPOSE 80 diff --git a/packages/frontend/package-lock.json b/packages/frontend/package-lock.json index 0e8e7f3..68f8a46 100644 --- a/packages/frontend/package-lock.json +++ b/packages/frontend/package-lock.json @@ -61,7 +61,6 @@ "typescript": "^4.0" } }, - "generated-sources/client": {}, "node_modules/@babel/parser": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", @@ -1407,8 +1406,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { "version": "10.4.14", @@ -1455,6 +1453,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -1705,7 +1712,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1885,7 +1891,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -2636,6 +2641,25 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -2649,7 +2673,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3633,7 +3656,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -3642,7 +3664,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -4624,8 +4645,12 @@ } }, "node_modules/rest-client": { - "resolved": "generated-sources/client", - "link": true + "version": "8.19.3", + "resolved": "file:generated-sources/client", + "license": "Unlicense", + "dependencies": { + "axios": "^0.27.2" + } }, "node_modules/reusify": { "version": "1.0.4", @@ -6786,8 +6811,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "autoprefixer": { "version": "10.4.14", @@ -6809,6 +6833,15 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -6982,7 +7015,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -7114,8 +7146,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "detective": { "version": "5.2.1", @@ -7684,6 +7715,11 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7697,7 +7733,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8405,14 +8440,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -9087,7 +9120,10 @@ "dev": true }, "rest-client": { - "version": "file:generated-sources/client" + "version": "8.19.3", + "requires": { + "axios": "^0.27.2" + } }, "reusify": { "version": "1.0.4", diff --git a/packages/frontend/pom.xml b/packages/frontend/pom.xml index ec90334..268a915 100644 --- a/packages/frontend/pom.xml +++ b/packages/frontend/pom.xml @@ -1,101 +1,109 @@ - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - de.mayflower - frontend - 0.0.1 + de.mayflower + frontend + 0.0.1 - frontend - Frontend for oTTo + frontend + Frontend for oTTo - - - 6.4.0 - + + + 6.4.0 + + + otto/frontend + - - - - - - org.openapitools - openapi-generator-maven-plugin - ${plugins.openapi-generator.version} - - - - generate - - validate - - ${project.basedir}/../api-spec/openapi.yml - typescript-axios - - rest-client - true - 8.19.3 - true - - ${project.basedir}/generated-sources/client - - - - - - com.github.eirslett - frontend-maven-plugin - - 1.12.1 - - - - install node and npm - - install-node-and-npm - - - generate-resources - - - Build OpenAPI code - - npm - + + + + + + org.openapitools + openapi-generator-maven-plugin + ${plugins.openapi-generator.version} + + + + generate + + validate + + ${project.basedir}/../api-spec/openapi.yml + typescript-axios + + rest-client + true + 8.19.3 + true + + ${project.basedir}/generated-sources/client + + + + + + com.github.eirslett + frontend-maven-plugin + 1.12.1 + + + install node and npm + + install-node-and-npm + + + + Build OpenAPI code + + npm + + + ${project.basedir}/generated-sources/client + ${project.basedir} + + + + install dependencies + + npm + + + + build prod server + + npm + + + run build + + + + + v18.14.2 + + + + - - generate-resources - - - - install - ${project.basedir}/generated-sources/client - ${project.basedir} - - - - - - v18.14.2 - - - - - - - - org.openapitools - openapi-generator-maven-plugin - - - com.github.eirslett - frontend-maven-plugin - - - - + + + org.openapitools + openapi-generator-maven-plugin + + + com.github.eirslett + frontend-maven-plugin + + + com.google.cloud.tools + jib-maven-plugin + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 21f6895..96d0fac 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ - + 4.0.0 de.mayflower @@ -13,6 +13,5 @@ packages/backend - packages/frontend \ No newline at end of file diff --git a/skaffold.yaml b/skaffold.yaml index bd9b313..454f532 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -4,15 +4,20 @@ metadata: name: otto build: artifacts: - - image: backend + - image: ghcr.io/mayflower/otto-backend context: . jib: project: packages/backend type: maven + - image: ghcr.io/mayflower/otto-frontend + context: . + docker: + dockerfile: packages/frontend/Dockerfile + deploy: helm: releases: - - name: backend + - name: otto namespace: 'otto' createNamespace: true chartPath: 'helm/otto' @@ -26,8 +31,14 @@ deploy: repo: 'https://charts.bitnami.com/bitnami' valuesFiles: - "helm/dev-db-config.yaml" + version: 12.2.7 portForward: - resourceType: Service - resourceName: backend-otto + resourceName: otto + namespace: otto + port: 8080 + - resourceType: Service + resourceName: otto-frontend namespace: otto - port: 8080 \ No newline at end of file + port: 80 + localPort: 3000 \ No newline at end of file