diff --git a/webapp/Dockerfile b/webapp/Dockerfile new file mode 100644 index 00000000..e0ab5202 --- /dev/null +++ b/webapp/Dockerfile @@ -0,0 +1,23 @@ +FROM node:latest as build + +WORKDIR /app + +COPY ./ /app/ + +# Fix buggy replacement of COOLIFY_URL in .env +RUN COOLIFY_URL_VALUE=$(grep '^COOLIFY_URL=' .env | cut -d '=' -f2) && \ + sed -i "s|\$COOLIFY_URL|$COOLIFY_URL_VALUE|g" .env + +# Set serverUrl in environment.ts +RUN APPLICATION_SERVER_URL=$(grep '^APPLICATION_SERVER_URL=' .env | cut -d '=' -f2) && \ + echo "Replacing serverUrl in environment.ts with: $APPLICATION_SERVER_URL" && \ + sed -i "s|serverUrl: '[^']*'|serverUrl: '$APPLICATION_SERVER_URL'|g" src/environments/environment.ts + +RUN npm install +RUN npm run build + +FROM nginx:latest + +COPY --from=build /app/dist/webapp/browser /usr/share/nginx/html + +EXPOSE 80 diff --git a/webapp/angular.json b/webapp/angular.json index 392187e4..ee6da47f 100644 --- a/webapp/angular.json +++ b/webapp/angular.json @@ -140,4 +140,4 @@ } } } -} \ No newline at end of file +} diff --git a/webapp/package-lock.json b/webapp/package-lock.json index cae385c1..84048994 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -3695,6 +3695,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/checkbox/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/confirm": { "version": "3.1.11", "dev": true, @@ -3730,6 +3740,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/editor": { "version": "2.1.14", "dev": true, @@ -3766,6 +3786,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/editor/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/expand": { "version": "2.1.14", "dev": true, @@ -3802,6 +3832,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/expand/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/figures": { "version": "1.0.3", "dev": true, @@ -3845,6 +3885,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/input/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/password": { "version": "2.1.14", "dev": true, @@ -3881,6 +3931,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/password/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/prompts": { "version": "5.0.7", "dev": true, @@ -3935,6 +3995,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/rawlist/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/select": { "version": "2.3.10", "dev": true, @@ -3973,6 +4043,16 @@ "node": ">=18" } }, + "node_modules/@inquirer/select/node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@inquirer/type": { "version": "1.4.0", "dev": true, @@ -6374,11 +6454,13 @@ } }, "node_modules/@types/node": { - "version": "20.14.10", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", + "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.13.0" } }, "node_modules/@types/node-forge": { @@ -6389,6 +6471,13 @@ "@types/node": "*" } }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", diff --git a/webapp/src/app/app.config.ts b/webapp/src/app/app.config.ts index 515151a9..cc2a747b 100644 --- a/webapp/src/app/app.config.ts +++ b/webapp/src/app/app.config.ts @@ -4,17 +4,18 @@ import { provideAnimationsAsync } from '@angular/platform-browser/animations/asy import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { provideAngularQuery, QueryClient } from '@tanstack/angular-query-experimental'; import { LucideAngularModule, Home, Sun, Moon, Hammer } from 'lucide-angular'; -import { routes } from './app.routes'; -import { BASE_PATH } from './core/modules/openapi'; +import { environment } from 'environments/environment'; +import { BASE_PATH } from 'app/core/modules/openapi'; +import { routes } from 'app/app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideExperimentalZonelessChangeDetection(), provideRouter(routes), provideAngularQuery(new QueryClient()), - { provide: BASE_PATH, useValue: 'http://localhost:8080' }, provideHttpClient(withInterceptorsFromDi()), provideAnimationsAsync(), - importProvidersFrom(LucideAngularModule.pick({ Home, Sun, Moon, Hammer })) + importProvidersFrom(LucideAngularModule.pick({ Home, Sun, Moon, Hammer })), + { provide: BASE_PATH, useValue: environment.serverUrl } ] }; diff --git a/webapp/src/environments/environment.ts b/webapp/src/environments/environment.ts new file mode 100644 index 00000000..c150e65b --- /dev/null +++ b/webapp/src/environments/environment.ts @@ -0,0 +1,3 @@ +export const environment = { + serverUrl: 'http://localhost:8080' +};