diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 5d4f4a7..89e33ac 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -69,6 +69,7 @@ jobs: - name: Publish if: fromJSON(steps.builder.outputs.run) run: pnpm publish --no-git-checks + continue-on-error: true - name: Build container if: fromJSON(steps.builder.outputs.run) diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..a20a286 --- /dev/null +++ b/Containerfile @@ -0,0 +1,6 @@ +FROM docker.io/library/nginx:alpine + +EXPOSE 80 + +COPY nginx.conf /etc/nginx/nginx.conf +COPY dist/gisaf/browser /usr/share/nginx/html diff --git a/angular.json b/angular.json index cdd62db..fa44636 100644 --- a/angular.json +++ b/angular.json @@ -1,34 +1,49 @@ { + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { - "gisaf-app": { - "root": "", + "gisaf": { "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + }, + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { - "outputPath": "dist", + "outputPath": { + "base": "dist/gisaf" + }, "index": "src/index.html", - "main": "src/main.ts", - "tsConfig": "src/tsconfig.app.json", - "polyfills": "src/polyfills.ts", + "polyfills": [ + "src/polyfills.ts" + ], + "tsConfig": "tsconfig.json", + "inlineStyleLanguage": "scss", "assets": [ { "glob": "**/*", - "input": "src/assets", - "output": "/assets" + "input": "src/assets/", + "output": "/assets/" }, { "glob": "favicon.ico", - "input": "src", + "input": "src/", "output": "/" }, { "glob": "**/*", - "input": "src/undefined", - "output": "/" + "input": "src/data/", + "output": "/data/" } ], "styles": [ @@ -62,9 +77,8 @@ "maplibre-gl", "@mapbox/point-geometry" ], - "vendorChunk": true, + "browser": "src/main.ts", "extractLicenses": false, - "buildOptimizer": false, "sourceMap": true, "optimization": false, "namedChunks": true @@ -78,20 +92,25 @@ } ], "optimization": true, - "outputHashing": "all", "sourceMap": false, "namedChunks": false, "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, "fileReplacements": [ { - "src": "src/environments/environment.ts", - "replaceWith": "src/environments/environment.prod.ts" + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" } - ] + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true } - } + }, + "defaultConfiguration": "production" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", @@ -101,23 +120,27 @@ }, "configurations": { "production": { - "buildTarget": "gisaf-app:build:production" + "buildTarget": "gisaf:build:production" + }, + "development": { + "buildTarget": "gisaf:build:development" } - } + }, + "defaultConfiguration": "development" }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "buildTarget": "gisaf-app:build" + "buildTarget": "gisaf:build" } }, "test": { "builder": "@angular-devkit/build-angular:karma", "options": { "main": "src/test.ts", - "karmaConfig": "./karma.conf.js", "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", "scripts": [], "styles": [ { @@ -180,6 +203,7 @@ } }, "cli": { - "analytics": false + "analytics": false, + "packageManager": "pnpm" } } diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..04c70b4 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,167 @@ +upstream aiohttp { + # fail_timeout=0 means we always retry an upstream even if it failed + # to return a good HTTP response + + # Unix domain servers + # server unix:/tmp/aiohttp-gisaf-1.sock fail_timeout=0; + + server 127.0.0.1:5000 fail_timeout=0; +} + +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} +# +#upstream websocket { +# server localhost:8080; +#} + + +server { + listen 8899; + + gzip on; + gzip_types text/plain application/xml; + gzip_proxied no-cache no-store private expired auth; + gzip_min_length 1000; + + server_name localhost; + charset utf-8; + + client_max_body_size 4G; + + root /usr/share/nginx/html; + + location /tiles/ { + # proxy_pass http://localhost:8080/; + #proxy_pass http://127.0.0.1:3000/; + proxy_pass http://aiohttp; + } + + location /api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location /graphql { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location /gj/live { + proxy_pass http://aiohttp; + proxy_http_version 1.1; + proxy_set_header Upgrade "websocket"; + proxy_set_header Connection "Upgrade"; + proxy_buffering off; + } + + location /_sched { + proxy_pass http://localhost:8080; + proxy_http_version 1.1; + proxy_set_header Upgrade "websocket"; + proxy_set_header Connection "Upgrade"; + proxy_buffering off; + } + + location /graphql_sched/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://localhost:8080/graphql_sched; + } + + location /gj/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location /auth { + ## POST requests for JWT + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + +# location /admin { +# proxy_set_header Host $http_host; +# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +# proxy_http_version 1.1; +# proxy_buffering off; +# proxy_pass http://aiohttp; +# } + + location /import/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location /download/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location /upload/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location /embed/ { + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_buffering off; + proxy_pass http://aiohttp; + } + + location = /index.html { + root /usr/share/nginx/html; + } + + location / { + try_files $uri /index.html; + } + + location /dashboard-attachment { + alias /home/phil/gisaf_misc/notebooks; + } + + location = /favicon.ico { + root /usr/share/nginx/html; + } + +# location /terrain { +# proxy_pass https://stamen-tiles-a.a.ssl.fastly.net/terrain; +# #proxy_set_header Host $host; +# proxy_buffering on; +# proxy_cache STAMEN; +# proxy_cache_valid 200 1d; +# proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; +# } + +# location "/download/attachment/formidable:trees/Picture/" { +# alias /home/phil/formidable_src/local_data/; +# } +}