From 6a50099849755e40750af6632650b218783915b5 Mon Sep 17 00:00:00 2001 From: boxi Date: Mon, 6 Jul 2026 19:27:13 +0200 Subject: [PATCH] update ProdBuild --- .gitea/workflows/build.yml | 43 +++++ .gitignore | 1 + CLAUDE.md | 80 +++++++++ deploy/prod/.env-template | 23 +++ deploy/prod/backend/application.properties | 37 ++++ deploy/prod/certbot/.gitignore | 1 - .../meta.json | 1 - .../private_key.json | 1 - .../regr.json | 1 - .../meta.json | 1 - .../private_key.json | 1 - .../regr.json | 1 - deploy/prod/certbot/etc/live/README | 14 -- .../prod/certbot/etc/live/app.boxi.ch/README | 14 -- .../prod/certbot/etc/renewal/app.boxi.ch.conf | 13 -- deploy/prod/config/frontend/app.boxi.ch.conf | 132 -------------- deploy/prod/config/frontend/id.boxi.ch.conf | 79 --------- deploy/prod/data/www/app/index.html | 23 --- deploy/prod/data/www/id/index.html | 23 --- deploy/prod/docker-compose.yml | 167 +++++++++++------- .../prod/{config => }/frontend/apache2.conf | 0 .../{config => }/frontend/apache2.conf-backup | 0 deploy/prod/frontend/app.boxi.ch.conf | 90 ++++++++++ .../keycloak/theme.v2/account/index.ftl | 0 .../account/messages/messages_ca.properties | 0 .../account/messages/messages_cs.properties | 0 .../account/messages/messages_da.properties | 0 .../account/messages/messages_de.properties | 0 .../account/messages/messages_en.properties | 0 .../account/messages/messages_es.properties | 0 .../account/messages/messages_fr.properties | 0 .../account/messages/messages_hu.properties | 0 .../account/messages/messages_it.properties | 0 .../account/messages/messages_ja.properties | 0 .../account/messages/messages_lt.properties | 0 .../account/messages/messages_nl.properties | 0 .../account/messages/messages_no.properties | 0 .../account/messages/messages_pl.properties | 0 .../messages/messages_pt_BR.properties | 0 .../account/messages/messages_ru.properties | 0 .../account/messages/messages_sk.properties | 0 .../account/messages/messages_sv.properties | 0 .../account/messages/messages_tr.properties | 0 .../messages/messages_zh_CN.properties | 0 .../theme.v2/account/resources/App.js | 0 .../theme.v2/account/resources/App.js.map | 0 .../account/resources/ContentPages.js | 0 .../account/resources/ContentPages.js.map | 0 .../theme.v2/account/resources/Main.js | 0 .../theme.v2/account/resources/Main.js.map | 0 .../theme.v2/account/resources/PageNav.js | 0 .../theme.v2/account/resources/PageNav.js.map | 0 .../theme.v2/account/resources/PageToolbar.js | 0 .../account/resources/PageToolbar.js.map | 0 .../account-service/AccountServiceContext.js | 0 .../AccountServiceContext.js.map | 0 .../account-service/account.service.js | 0 .../account-service/account.service.js.map | 0 .../account/resources/assets/Remachine.ttf | Bin .../account/resources/assets/darkGray.jpg | Bin .../account/resources/assets/gravatar.js | 0 .../theme.v2/account/resources/content.json | 0 .../account/resources/content/ContentAlert.js | 0 .../resources/content/ContentAlert.js.map | 0 .../account/resources/content/ContentPage.js | 0 .../resources/content/ContentPage.js.map | 0 .../content/account-page/AccountPage.js | 0 .../content/account-page/AccountPage.js.map | 0 .../aia-page/AppInitiatedActionPage.js | 0 .../aia-page/AppInitiatedActionPage.js.map | 0 .../applications-page/ApplicationsPage.js | 0 .../applications-page/ApplicationsPage.js.map | 0 .../authenticator-page/AuthenticatorPage.js | 0 .../AuthenticatorPage.js.map | 0 .../DeviceActivityPage.js | 0 .../DeviceActivityPage.js.map | 0 .../content/forbidden-page/ForbiddenPage.js | 0 .../forbidden-page/ForbiddenPage.js.map | 0 .../LinkedAccountsPage.js | 0 .../LinkedAccountsPage.js.map | 0 .../AbstractResourceTable.js | 0 .../AbstractResourceTable.js.map | 0 .../my-resources-page/EditTheResource.js | 0 .../my-resources-page/EditTheResource.js.map | 0 .../my-resources-page/MyResourcesPage.js | 0 .../my-resources-page/MyResourcesPage.js.map | 0 .../my-resources-page/PermissionRequest.js | 0 .../PermissionRequest.js.map | 0 .../my-resources-page/PermissionSelect.js | 0 .../my-resources-page/PermissionSelect.js.map | 0 .../my-resources-page/ResourcesTable.js | 0 .../my-resources-page/ResourcesTable.js.map | 0 .../my-resources-page/ShareTheResource.js | 0 .../my-resources-page/ShareTheResource.js.map | 0 .../my-resources-page/SharedResourcesTable.js | 0 .../SharedResourcesTable.js.map | 0 .../my-resources-page/resource-model.js | 0 .../my-resources-page/resource-model.js.map | 0 .../content/page-not-found/PageNotFound.js | 0 .../page-not-found/PageNotFound.js.map | 0 .../content/signingin-page/SigningInPage.js | 0 .../signingin-page/SigningInPage.js.map | 0 .../theme.v2/account/resources/css/boxit.css | 0 .../keycloak-service/KeycloakContext.js | 0 .../keycloak-service/KeycloakContext.js.map | 0 .../keycloak-service/keycloak.service.js | 0 .../keycloak-service/keycloak.service.js.map | 0 .../account/resources/public/favicon.ico | Bin .../account/resources/public/layout.css | 0 .../account/resources/public/logo.svg | 0 .../account/resources/util/AIACommand.js | 0 .../account/resources/util/AIACommand.js.map | 0 .../account/resources/util/ParseLink.js | 0 .../account/resources/util/ParseLink.js.map | 0 .../account/resources/util/RedirectUri.js | 0 .../account/resources/util/RedirectUri.js.map | 0 .../account/resources/util/TimeUtil.js | 0 .../account/resources/util/TimeUtil.js.map | 0 .../account/resources/welcome-page-scripts.js | 0 .../resources/widgets/ContinueCancelModal.js | 0 .../widgets/ContinueCancelModal.js.map | 0 .../resources/widgets/EmptyMessageState.js | 0 .../widgets/EmptyMessageState.js.map | 0 .../resources/widgets/LocaleSelectors.js | 0 .../resources/widgets/LocaleSelectors.js.map | 0 .../account/resources/widgets/Logout.js | 0 .../account/resources/widgets/Logout.js.map | 0 .../theme.v2/account/resources/widgets/Msg.js | 0 .../account/resources/widgets/Msg.js.map | 0 .../resources/widgets/ReferrerDropdownItem.js | 0 .../widgets/ReferrerDropdownItem.js.map | 0 .../account/resources/widgets/ReferrerLink.js | 0 .../resources/widgets/ReferrerLink.js.map | 0 .../account/resources/widgets/features.js | 0 .../account/resources/widgets/features.js.map | 0 .../theme.v2/account/theme.properties | 0 .../account/resources/assets/Remachine.ttf | Bin .../account/resources/assets/darkGray.jpg | Bin .../theme/account/resources/css/boxit.css | 0 .../resources/css/fontawesome/all.min.css | 0 .../resources/css/fontawesome/brands.min.css | 0 .../css/fontawesome/fontawesome.min.css | 0 .../resources/css/fontawesome/regular.min.css | 0 .../resources/css/fontawesome/solid.min.css | 0 .../css/fontawesome/svg-with-js.min.css | 0 .../css/fontawesome/v4-shims.min.css | 0 .../resources/css/webfonts/fa-brands-400.eot | Bin .../resources/css/webfonts/fa-brands-400.svg | 0 .../resources/css/webfonts/fa-brands-400.ttf | Bin .../resources/css/webfonts/fa-brands-400.woff | Bin .../css/webfonts/fa-brands-400.woff2 | Bin .../resources/css/webfonts/fa-regular-400.eot | Bin .../resources/css/webfonts/fa-regular-400.svg | 0 .../resources/css/webfonts/fa-regular-400.ttf | Bin .../css/webfonts/fa-regular-400.woff | Bin .../css/webfonts/fa-regular-400.woff2 | Bin .../resources/css/webfonts/fa-solid-900.eot | Bin .../resources/css/webfonts/fa-solid-900.svg | 0 .../resources/css/webfonts/fa-solid-900.ttf | Bin .../resources/css/webfonts/fa-solid-900.woff | Bin .../resources/css/webfonts/fa-solid-900.woff2 | Bin .../theme/account/resources/js/gravatar.js | 0 .../theme/account/resources/js/md5.js | 0 .../keycloak/theme/account/template.ftl | 0 .../keycloak/theme/account/theme.properties | 0 .../login/resources/assets/Remachine.ttf | Bin .../theme/login/resources/assets/darkGray.jpg | Bin .../theme/login/resources/css/boxit.css | 0 .../keycloak/theme/login/theme.properties | 0 deploy/prod/letsencrypt-init.sh | 9 - deploy/prod/letsencrypt-renew-testCert.sh | 10 -- deploy/prod/letsencrypt-renew.sh | 10 -- .../create-multiple-postgresql-databases.sh | 0 deploy/prod/tailscale/serve-apache.json | 13 ++ deploy/prod/tailscale/serve-id.json | 13 ++ frontend/Dockerfile | 2 +- 176 files changed, 408 insertions(+), 395 deletions(-) create mode 100644 CLAUDE.md create mode 100644 deploy/prod/.env-template create mode 100644 deploy/prod/backend/application.properties delete mode 100644 deploy/prod/certbot/.gitignore delete mode 100644 deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/meta.json delete mode 100644 deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/private_key.json delete mode 100644 deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/regr.json delete mode 100644 deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/meta.json delete mode 100644 deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/private_key.json delete mode 100644 deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/regr.json delete mode 100644 deploy/prod/certbot/etc/live/README delete mode 100644 deploy/prod/certbot/etc/live/app.boxi.ch/README delete mode 100644 deploy/prod/certbot/etc/renewal/app.boxi.ch.conf delete mode 100644 deploy/prod/config/frontend/app.boxi.ch.conf delete mode 100644 deploy/prod/config/frontend/id.boxi.ch.conf delete mode 100644 deploy/prod/data/www/app/index.html delete mode 100644 deploy/prod/data/www/id/index.html rename deploy/prod/{config => }/frontend/apache2.conf (100%) rename deploy/prod/{config => }/frontend/apache2.conf-backup (100%) create mode 100644 deploy/prod/frontend/app.boxi.ch.conf rename deploy/prod/{config => }/keycloak/theme.v2/account/index.ftl (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_ca.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_cs.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_da.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_de.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_en.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_es.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_fr.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_hu.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_it.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_ja.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_lt.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_nl.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_no.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_pl.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_pt_BR.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_ru.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_sk.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_sv.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_tr.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/messages/messages_zh_CN.properties (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/App.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/App.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/ContentPages.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/ContentPages.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/Main.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/Main.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/PageNav.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/PageNav.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/PageToolbar.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/PageToolbar.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/account-service/account.service.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/account-service/account.service.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/assets/Remachine.ttf (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/assets/darkGray.jpg (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/assets/gravatar.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content.json (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/ContentAlert.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/ContentAlert.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/ContentPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/ContentPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/css/boxit.css (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/public/favicon.ico (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/public/layout.css (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/public/logo.svg (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/AIACommand.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/AIACommand.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/ParseLink.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/ParseLink.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/RedirectUri.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/RedirectUri.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/TimeUtil.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/util/TimeUtil.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/welcome-page-scripts.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/Logout.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/Logout.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/Msg.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/Msg.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/features.js (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/resources/widgets/features.js.map (100%) rename deploy/prod/{config => }/keycloak/theme.v2/account/theme.properties (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/assets/Remachine.ttf (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/assets/darkGray.jpg (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/boxit.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/all.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/brands.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/fontawesome.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/regular.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/solid.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/svg-with-js.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/fontawesome/v4-shims.min.css (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-brands-400.eot (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-brands-400.svg (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-brands-400.ttf (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff2 (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-regular-400.eot (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-regular-400.svg (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-regular-400.ttf (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff2 (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-solid-900.eot (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-solid-900.svg (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-solid-900.ttf (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff2 (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/js/gravatar.js (100%) rename deploy/prod/{config => }/keycloak/theme/account/resources/js/md5.js (100%) rename deploy/prod/{config => }/keycloak/theme/account/template.ftl (100%) rename deploy/prod/{config => }/keycloak/theme/account/theme.properties (100%) rename deploy/prod/{config => }/keycloak/theme/login/resources/assets/Remachine.ttf (100%) rename deploy/prod/{config => }/keycloak/theme/login/resources/assets/darkGray.jpg (100%) rename deploy/prod/{config => }/keycloak/theme/login/resources/css/boxit.css (100%) rename deploy/prod/{config => }/keycloak/theme/login/theme.properties (100%) delete mode 100755 deploy/prod/letsencrypt-init.sh delete mode 100755 deploy/prod/letsencrypt-renew-testCert.sh delete mode 100755 deploy/prod/letsencrypt-renew.sh rename deploy/prod/{config => }/postgres/create-multiple-postgresql-databases.sh (100%) create mode 100644 deploy/prod/tailscale/serve-apache.json create mode 100644 deploy/prod/tailscale/serve-id.json diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index f8a920f..b65d924 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -58,6 +58,49 @@ jobs: echo "versioned: gitea.tail276105.ts.net/${REPOSITORY_LC}-backend:${GITHUB_RUN_NUMBER}" echo "latest: gitea.tail276105.ts.net/${REPOSITORY_LC}-backend:latest" + - name: Log out from Docker registry + if: always() + run: docker logout gitea.tail276105.ts.net + + Build-Remsly-Frontend: + runs-on: ubuntu-latest + container: + image: gitea.tail276105.ts.net/remsly/ci-image:5 + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Build FE + run: | + cd frontend + npm ci + npm run buildProd + - name: Login to Docker Registry + uses: docker/login-action@v2 + with: + registry: gitea.tail276105.ts.net + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_PASSWORD }} + - name: Build Docker + run: | + REPOSITORY_LC=$(echo "${{ gitea.repository }}" | tr '[:upper:]' '[:lower:]') + ( + cd frontend; + docker build -t gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:${GITHUB_RUN_NUMBER} .; + docker tag gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:${GITHUB_RUN_NUMBER} gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:latest + ) + + - name: Push Docker Images + run: | + REPOSITORY_LC=$(echo "${{ gitea.repository }}" | tr '[:upper:]' '[:lower:]') + docker push gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:${GITHUB_RUN_NUMBER} + docker push gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:latest + + - name: Docker imageTags + run: | + REPOSITORY_LC=$(echo "${{ gitea.repository }}" | tr '[:upper:]' '[:lower:]') + echo "versioned: gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:${GITHUB_RUN_NUMBER}" + echo "latest: gitea.tail276105.ts.net/${REPOSITORY_LC}-frontend:latest" + - name: Log out from Docker registry if: always() run: docker logout gitea.tail276105.ts.net \ No newline at end of file diff --git a/.gitignore b/.gitignore index 573095e..443e5da 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /frontend/build/ !gradle/wrapper/gradle-wrapper.jar http-client.private.env.json +deploy/prod/.env /backend/src/main/resources/*.properties src/gen diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..9dd8225 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,80 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Boxit (also called "Remsly" in CI) is a box/inventory management app: + +- **backend/** — Spring Boot 2.6 (Kotlin, Java 17, Jersey + Spring MVC), PostgreSQL via jOOQ, Elasticsearch for search, Keycloak for auth. Runs on port **5050**. +- **frontend/** — Angular 13 app (port **4200**), proxies `/api` to the backend via `proxy-conf.json`. +- **JooqHelper/** — small Gradle module providing `BoxitNamingStrategy` used by jOOQ code generation. +- **deploy/localDev/boxit/** — docker-compose for local infrastructure (Postgres on 6543, Keycloak on 8081, Apache OIDC proxy, Elasticsearch, Prometheus). +- **deploy/prod/** — production docker-compose + Let's Encrypt scripts. +- **clients/** — IntelliJ HTTP client files for the REST API, Keycloak, and Elasticsearch (env in `http-client.private.env.json`, template provided). + +## Commands + +### Backend (Gradle, from repo root) + +```bash +./gradlew build # build + tests (requires running Postgres, see below) +./gradlew test # tests only (JUnit 5; integration tests use Testcontainers) +./gradlew generateJooq # run Flyway migrations, then regenerate jOOQ classes +./gradlew lintKotlin # kotlinter lint +./gradlew formatKotlin # kotlinter autoformat +./gradlew bootRun # run the backend +``` + +Run a single test class: `./gradlew test --tests "ch.boxi.boxit.SomeTestClass"` + +DB connection for Flyway/jOOQ codegen is parameterized via Gradle properties +`-PDB_HOST_PORT -PDB_USER -PDB_PASSWD -PDB_NAME` (defaults: `localhost:6543`, `gradle`/`gradlepw`/`gradle` — matches the localDev docker-compose Postgres). + +### Frontend (from frontend/) + +```bash +npm start # dev server on :4200 with /api proxy to :5050 +npm run build # dev build +npm run buildProd # production build (also copies index.html -> 404.html) +npm test # Karma/Jasmine tests +npm run lint # ng lint +``` + +### Local infrastructure + +```bash +cd deploy/localDev/boxit && docker compose up -d +``` + +Provides Postgres (port 6543, multiple DBs: `boxit`, `keycloak`, `gradle`, `test`), Keycloak (8081), Apache OIDC proxy, and Elasticsearch. `backend/src/main/resources/application.properties` is not committed — create it from `application.properties-Template`. + +## Architecture + +### Backend data flow: Flyway → jOOQ codegen + +The DB schema is the source of truth. Migrations live in `backend/src/main/resources/db/migration` (Flyway, `V*.sql`). `generateJooq` depends on `flywayMigrate` and generates records/POJOs/DAOs into `backend/src/gen/java` (package `ch.boxi.boxit.gen`, deleted on `clean`, regenerated on compilation). Naming is customized by `JooqHelper`'s `BoxitNamingStrategy`. **After changing a migration, re-run `./gradlew generateJooq` against a running Postgres.** + +### Backend layers (`ch.boxi.boxit`) + +- `restapi/` — REST controllers, DTOs, mappers, pagination (`Paged`, `PaginationDto`, infinite scroll support). Organized by feature (folder, note, task, user, search). +- `domain/` — business logic per feature (attachment, folder, location, note, task, user). Uses a Visitor pattern (`Visitable`/`Visitor`) and `Augmentor` abstractions. +- `db/` — jOOQ-based repositories built on `SimpleCrudRepository` / `AbstractSimpleCrudRepositoryImpl` plus composable `JooqFilter` classes (`CombinedAndFilter`, `CombinedOrFilter`, ...). +- `searchindex/` — Elasticsearch index per feature (folder, note, task) with its own migration support; `db/elasticsearchSync` + `domain/elasticSearchSync` implement DB→ES synchronization. +- `clientapi/` — outbound HTTP clients (e.g. OpenStreetMap geocoding). +- `security/` — Keycloak/OIDC config and SSL client config (truststore at `backend/src/main/resources/truststore.jks`; Elasticsearch CA certs must be imported there — see readme.md). + +### Frontend layers (`frontend/src/app`) + +- `api/` — `boxit.api.ts` + DTOs + HTTP error interceptor (mirror of the backend REST API). +- `business/` — services/models per feature (item, attachment, location, user), notification and global error handling. +- `gui/` — components (header, page, search, filters, item, location, responsive helpers). +- `auth/` — `auth.service.ts` (Keycloak-based login). + +### Testing + +Backend integration tests (`BoxitIntegrationTest`) use Testcontainers. For container reuse, add `testcontainers.reuse.enabled=true` to `~/.testcontainers.properties`. + +### CI + +Gitea Actions (`.gitea/workflows/`) builds on push to `main`: Gradle build with a Postgres service container, then builds/pushes Docker images (`*-backend`, `*-frontend`) to `gitea.tail276105.ts.net` and triggers a prod compose redeploy. `bitbucket-pipelines.yml` and `.space.kts` are legacy. diff --git a/deploy/prod/.env-template b/deploy/prod/.env-template new file mode 100644 index 0000000..15fb08b --- /dev/null +++ b/deploy/prod/.env-template @@ -0,0 +1,23 @@ +# Template for deploy/prod/.env +# Copy to .env and fill in the values: cp .env-template .env +# The .env file itself is git-ignored (it holds secrets). + +# --- Database / Keycloak passwords --- +REMSLY_PSQL_PASSWORD= +KC_PSQL_PASSWORD= +KC_ADMIN_PASSWORD= + +# --- Tailscale --- +# Reusable, tag:server pre-authorized auth key from the Tailscale admin console. +TS_AUTHKEY= + +# --- Apache OIDC (mod_auth_openidc) --- +OIDC_CRYPTO_PASSPHRASE= +OIDC_CLIENT_SECRET= + +# --- Elasticsearch --- +ELASTIC_PASSWORD= + +# --- Backend --- +# Keycloak client id (resource) the bearer-only backend expects. +KEYCLOAK_RESOURCE= diff --git a/deploy/prod/backend/application.properties b/deploy/prod/backend/application.properties new file mode 100644 index 0000000..d8e2f5b --- /dev/null +++ b/deploy/prod/backend/application.properties @@ -0,0 +1,37 @@ +# Production config for the backend, mounted into the container and activated via +# SPRING_CONFIG_ADDITIONAL_LOCATION (see docker-compose.yml). Secrets are injected +# from the environment (.env) through ${...} placeholders, so this file is safe to commit. +spring.profiles.active=PROD + +server.port=5050 + +# Postgres runs as service "postgres" on remslyNet; db/user "remsly" (see POSTGRES_MULTIPLE_DATABASES). +spring.datasource.url=jdbc:postgresql://postgres:5432/remsly +spring.datasource.username=remsly +spring.datasource.password=${REMSLY_PSQL_PASSWORD} + +# Elasticsearch runs as service "elasticsearch" on remslyNet, plain HTTP on 9200. +boxit.elasticsearch.host=elasticsearch +boxit.elasticsearch.port=9200 +boxit.elasticsearch.user=elastic +boxit.elasticsearch.pass=${ELASTIC_PASSWORD} + +spring.jackson.date-format="yyyy-MM-dd HH:mm:ss" + +# SSLClientConfig overrides the JVM trust store unconditionally, so point it at the JDK +# default CA bundle. That keeps outbound HTTPS (e.g. fetching Keycloak's JWKS over the +# Let's Encrypt / tailscale cert) working without shipping a custom truststore. +boxit.server.ssl.trust-store=/opt/java/openjdk/lib/security/cacerts +boxit.server.ssl.trust-store-password=changeit + +management.endpoint.metrics.enabled=true +management.endpoints.web.exposure.include=* +management.endpoint.prometheus.enabled=true +management.metrics.export.prometheus.enabled=true + +logging.level.root=INFO + +keycloak.realm=remsly +keycloak.bearer-only=true +keycloak.auth-server-url=https://remsly-id.tail276105.ts.net +keycloak.resource=${KEYCLOAK_RESOURCE} diff --git a/deploy/prod/certbot/.gitignore b/deploy/prod/certbot/.gitignore deleted file mode 100644 index cfaad76..0000000 --- a/deploy/prod/certbot/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.pem diff --git a/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/meta.json b/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/meta.json deleted file mode 100644 index b2be8eb..0000000 --- a/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"creation_dt": "2023-03-24T14:43:02Z", "creation_host": "20e2283fb076"} \ No newline at end of file diff --git a/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/private_key.json b/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/private_key.json deleted file mode 100644 index 36eed69..0000000 --- a/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/private_key.json +++ /dev/null @@ -1 +0,0 @@ -{"n": "u6an4MsyALnC0Ik2b8tcVpikTwzWgtASLGEUg7wEs7_piMKI7wNwroRbCesHujhJu2Ha_hDMrJmCEvT0T2fO4JzoAt1bLE3zWM4sXnWEpTXCrWxayjXbGTblrJcTIQPb7cbiTvyoAQvcThApZcvQEBkKZrlOp3aB62thM2zSI6XFVcbmF3CRCVJdIYN2K3ioQjkkxiAFwQ0EUNWtHzaDvjwFBvwAD2iDDqZh0mHYWWnhwV0okuJ3FBX8fVUr2oskq5cHhc8t8r8l1Iob9lEcgwkRJE93hQ1CMxYT4RX_rbJtyIFbixVkxM99x16nlyJnAWlPzEZrTz_fdcdFeQHPrw", "e": "AQAB", "d": "F7GUUvL1LlhGO_SHVhhUYW7GmGCjmULSeJ4NbBDKezPJNgZyKdPCX5bAtADkKeQ_kxRpBVlzrnt3jBM34erWmU_Wj74JbA-voU_vFEI8bGvcV-9ti0i_kHB5EZDFzo5hL6XEH3sRb4hi2cx6narda5rt0EinoMd64hHd5RNheTSWsVcSbBwzgDqKNB-OTr2vGzK3O3ZmY-I6IE5nVTf1tLkkI3GlPwKOSix1nDFtwHvKV0QTazsBop9MkMDwrBNVYJB_0G6AEtC8RXn9z4FIBZc9BAk4G8bygATwixu3WfUuM5LI3qavwILmQVFzmBfojHHWYf-eQBXf-kwR4KeX2Q", "p": "7MgYLilx05H3tvpy0M5ty2R6i3cE9vzl-eiNPM_rBF-eu-cAjkCtLViKg6VTdr0I8qV4B-NCshPpnF50cuFupF6jTgWZJeAfiOoEWQC6mqNxngX4N98mxDm7lf_3QqRsdhh2cS_5IOJ4cpaJ5WlX89WZvpfAKbCISQ_nejSypQM", "q": "yuG2pUTwPi4QazqX6w3oMAb9C-R6kDoYMNhRm2qCkSMQ9jJlaW80sIypYNzeD2JbF6pAjhF2mN2ehorMwVs97flNrSjGTdMts63JMcI6-w5MOWHmI938knxrBn5ku88QsJpjMdY4f25Oynb5LG3YSiNqQVztc_aC3qElrJ4CvOU", "dp": "PbwBye9WVSImotdzngtkRvZgmQIkEj1nvJusT2GqVc6UdUtKMsycGkmOe7pcI4Yv0gvgWrYfCoz0iKd71wP9s-9Uxp_hCSYBMtJI5eexv2XD1r6Zs_-DfP_Mb9R35DE4ciX4o5QtcSx62O108JJhsxpK5o1sNbJoJhx2br9UoH8", "dq": "TBt6UetXmGvdWuxjGxlfdczZVoHCfKJeesxbaMr-6gVWkpT7OB8wi95ol96jKvBBrdH_X4wrilLw6hXdk9dvlvtD6WZ3ZbCH33SdGh5707xcWdZg6CmZWzZzS79UeKPH5gg0l_h9v0gZJJiXBtS6I62_aX-70Bm0pGGdaXDpJAU", "qi": "L4HAI6WvpBjiwvGGH9IAoxsxqlnCton8uUUf2IQwpZMKe-d9LXPsOdWsyaZneCnc2C_AQsgLkpZIWd47koybwch4vTkbmLrNwtaaazVk53Axdg3ksFT-uWad4YTiqCH-hIt_2xXxvensMqHwRvIk44MHk0kq485nPfGx4E9zvDE", "kty": "RSA"} \ No newline at end of file diff --git a/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/regr.json b/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/regr.json deleted file mode 100644 index 89ea752..0000000 --- a/deploy/prod/certbot/etc/accounts/acme-staging-v02.api.letsencrypt.org/directory/7c61f088b3e0963101cb5ba67fce7b9e/regr.json +++ /dev/null @@ -1 +0,0 @@ -{"body": {}, "uri": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/94925864"} \ No newline at end of file diff --git a/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/meta.json b/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/meta.json deleted file mode 100644 index 2a1554c..0000000 --- a/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"creation_dt": "2023-03-24T14:44:14Z", "creation_host": "ed2dd2431723"} \ No newline at end of file diff --git a/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/private_key.json b/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/private_key.json deleted file mode 100644 index 25f6dcb..0000000 --- a/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/private_key.json +++ /dev/null @@ -1 +0,0 @@ -{"n": "5JoKajoOVE7y5Bcchd4KPlVarooN-XLHtEbFRy0zrFG4mAY_Qf-H1eZkmHvPQwv-tDEPFRlabrxXqC3uWoy9uOmqXea7rbnOqQHYRSAhIiW8I0JbuzGHga-ZwujShQDj85eimjBXRKhjD6r3zRElchTWXyeT0_dRrOZ099zAE0qNCnVRxel6IXdFEKz9YrBvIqvEzJC2DBWwF0W6ZBlpiM8RXq1guBU22k0XkoDHE8d_LL6AMrhtXSCPwiL9YOxiyvSTgLHciy4c-WP1-mypy65oK5YLCiVagX4kM8qbxW_0nmFtdYCdhhEBrHktxofHUaps4cPGK_XDkbz5mti9vQ", "e": "AQAB", "d": "D53KSllu8yl1hElj5G03q-xuxm-d5sWFiPYwsd0Po5ztjE0Y8yw-nkkf5B7JGN5v5uVXD2zs9ZWeM1n3522n5ELqJYIGniaMTJVYrdg1Cz0irhHxbEdE54IUcfEvuHBIIjLgo8HbpFAQfFiElxitwy5TOqrceWVyyenwYaJN6MNU6h5_TReay7Smye1NQYnv3E63jDX3Od_rQyrLBV0UE3Y7BOPLGmqHTeeEaDo8zut0HgXIS0ecRrfTt8RkDpv_Xc9AAVzZaPXLNo4Kxo7YWCpoi32oLwUhsBELS6G3i2rQxPTveMnkeU0-1qo6hfoGZFMKpAivl4QX86_D_41tzQ", "p": "_dmRjJn2dVbPNOgvXeencRykjCHk5aRDYDCJ6BKYEsXpOdOZCGH2HlX-43Loh1w5qHcCXlSCX5T1GsOv-EAye2T9Eg-xfpkPHUJ9JlKRk1Oiy6FjFfBr_ObUzK_rC-WyHzcIaU50hyzwoKDhICRdbQvfJnOp02tE1Hlxm15qO28", "q": "5om5xnQAv6RRzkCdsO4Sk2yFXwoTvpL8KS9LG1RqcPoAvy1ey5oEPJLIUyFUmf8-hr5RW2OBgEwGCR3HQgaXXiyxeCSdoM0roEJaEcerk2i8JW_w_S52evvigJb4mOajzjY--WsSa12LpJTTKvSlf-9eWNaNeb7vv9GT1atWs5M", "dp": "lL_gFTbG_909kDAaSXmMWbDCD0dxPMuzm3L17KKwsBd-4h7HBu14bjBQKvHTpjX5p2kNXz9AIkhEFEnlHKBptHrp_KJrjNadz7R9Z25s1Zrlw1Mvn9SBQvH0cnkHT7JqXPY_nI2XpPpFiqqbIN2OTW7udTbDphque58qXjPGJks", "dq": "hP4o1Mpw8B1sL-7oyXvd7XwqSJR4pXUH0P5-doqxSPGAYslaqVv1W7hVpldRBfHQcUzzhCQYPhodVT7_hyBkTCi-TI_a-zvBEheU_DLS0RwXhgVY4cXfBb2vgf0V9qb_EmQK2johixyRBWXxmBNAMli1dcx4GybCCkdt4FKSls8", "qi": "Y_CRKqA-X8fnYAU9WIBVB2mH08m5y_3UhcmzJpcDAeaPygrh4hItYKdBSk9R9IBRiME84nIDW2Xor9c_GPpXcEItsHAHYHiF12hZtZHcEXyp9fFsJzprTWhXr1JRohlsPzCK6pzcB1Hk2ZwUvc0G4wkcaeOfo9LTVQj5eWRlnWQ", "kty": "RSA"} \ No newline at end of file diff --git a/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/regr.json b/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/regr.json deleted file mode 100644 index 91e56b6..0000000 --- a/deploy/prod/certbot/etc/accounts/acme-v02.api.letsencrypt.org/directory/ea5cf7614a600d23b821c0af24b17a1d/regr.json +++ /dev/null @@ -1 +0,0 @@ -{"body": {}, "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/1025448747"} \ No newline at end of file diff --git a/deploy/prod/certbot/etc/live/README b/deploy/prod/certbot/etc/live/README deleted file mode 100644 index 00b733c..0000000 --- a/deploy/prod/certbot/etc/live/README +++ /dev/null @@ -1,14 +0,0 @@ -This directory contains your keys and certificates. - -`[cert name]/privkey.pem` : the private key for your certificate. -`[cert name]/fullchain.pem`: the certificate file used in most server software. -`[cert name]/chain.pem` : used for OCSP stapling in Nginx >=1.3.7. -`[cert name]/cert.pem` : will break many server configurations, and should not be used - without reading further documentation (see link below). - -WARNING: DO NOT MOVE OR RENAME THESE FILES! - Certbot expects these files to remain in this location in order - to function properly! - -We recommend not moving these files. For more information, see the Certbot -User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates. diff --git a/deploy/prod/certbot/etc/live/app.boxi.ch/README b/deploy/prod/certbot/etc/live/app.boxi.ch/README deleted file mode 100644 index 5050078..0000000 --- a/deploy/prod/certbot/etc/live/app.boxi.ch/README +++ /dev/null @@ -1,14 +0,0 @@ -This directory contains your keys and certificates. - -`privkey.pem` : the private key for your certificate. -`fullchain.pem`: the certificate file used in most server software. -`chain.pem` : used for OCSP stapling in Nginx >=1.3.7. -`cert.pem` : will break many server configurations, and should not be used - without reading further documentation (see link below). - -WARNING: DO NOT MOVE OR RENAME THESE FILES! - Certbot expects these files to remain in this location in order - to function properly! - -We recommend not moving these files. For more information, see the Certbot -User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates. diff --git a/deploy/prod/certbot/etc/renewal/app.boxi.ch.conf b/deploy/prod/certbot/etc/renewal/app.boxi.ch.conf deleted file mode 100644 index b71c88d..0000000 --- a/deploy/prod/certbot/etc/renewal/app.boxi.ch.conf +++ /dev/null @@ -1,13 +0,0 @@ -# renew_before_expiry = 30 days -version = 0.40.1 -archive_dir = /etc/letsencrypt/archive/app.boxi.ch -cert = /etc/letsencrypt/live/app.boxi.ch/cert.pem -privkey = /etc/letsencrypt/live/app.boxi.ch/privkey.pem -chain = /etc/letsencrypt/live/app.boxi.ch/chain.pem -fullchain = /etc/letsencrypt/live/app.boxi.ch/fullchain.pem - -# Options used in the renewal process -[renewalparams] -account = ea5cf7614a600d23b821c0af24b17a1d -authenticator = standalone -server = https://acme-v02.api.letsencrypt.org/directory diff --git a/deploy/prod/config/frontend/app.boxi.ch.conf b/deploy/prod/config/frontend/app.boxi.ch.conf deleted file mode 100644 index a65f670..0000000 --- a/deploy/prod/config/frontend/app.boxi.ch.conf +++ /dev/null @@ -1,132 +0,0 @@ - - DocumentRoot "/var/www/app" - ServerName app.boxi.ch - # ServerAlias www.${server_name} - - ErrorLog /var/log/apache2/error.log - CustomLog /var/log/apache2/access.log combined - LogLevel debug - - - AllowOverride none - Options -Indexes -Includes - Require all granted - - deny from all - - - - - AllowOverride None - Options -Indexes -Includes - Require all granted - - - - SetHandler server-status - - - - Redirect / https://app.boxi.ch/ - - - - - - DocumentRoot "/var/www/app" - ServerName app.boxi.ch - #ServerAlias www.${server_name} - - LogLevel info - - Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" - Header always set Content-Security-Policy "default-src 'self' ; \ - script-src 'self' 'unsafe-inline' 'unsafe-eval'; \ - style-src 'self' use.fontawesome.com 'unsafe-inline'; \ - font-src 'self' data: use.fontawesome.com; \ - base-uri 'self'; \ - form-action 'self'; \ - frame-ancestors 'none'; \ - img-src 'self' data:; \ - upgrade-insecure-requests" "expr=%{CONTENT_TYPE} =~ m#text\/(html|javascript)|application\/pdf|xml#i" - Header always append X-Frame-Options SAMEORIGIN - Header always set X-Content-Type-Options nosniff - Header always set Referrer-Policy "same-origin" - # this feature is not yet used and must be extended if needed, currently only a sample config - Header always set Feature-Policy "payment 'none';" - - - AllowOverride none - Options -Indexes -Includes - Require all granted - - deny from all - - - - - AllowOverride None - Options -Indexes -Includes - Require all granted - - - - SetHandler server-status - - - RequestHeader set X-Forwarded-User expr=%{REMOTE_USER} - RequestHeader set Authorization "Bearer %{oidc_access_token}e" - Header set User-Details "%{REMOTE_USER}e %{oidc_claim_email}e" - - OIDCProviderMetadataURL ${KC_ADDR}/realms/${KC_REALM}/.well-known/openid-configuration - OIDCClientID ${OIDC_CLIENT_ID} - OIDCClientSecret ${OIDC_CLIENT_SECRET} - OIDCRefreshAccessTokenBeforeExpiry 10 - OIDCRedirectURI ${OIDC_REDIRECT_URI} - OIDCCryptoPassphrase ${OIDC_CRYPTO_PASSPHRASE} - OIDCInfoHook ${OIDC_INFO_HOOK} - OIDCDefaultLoggedOutURL ${KC_ADDR}/realms/${KC_REALM}/protocol/openid-connect/logout?redirect_uri=https%3A%2F%2Fapp.boxi.ch - OIDCRemoteUserClaim preferred_username - OIDCStateMaxNumberOfCookies 3 true - - - SetHandler server-status - - - - AuthType openid-connect - Require valid-user - - - # If the browser is allowed to cache index.html, it starts loading assets/scripts/images before apache had a chance - # to check whether or not the user is even authenticated, leading to many failed requests. - # Disabling cache for index.html forces the browser to fetch it first, and therefore ensures that the full - # authentication mechanic is being run. - # See also https://github.com/zmartzone/mod_auth_openidc/issues/113 - - FileETag None - Header unset ETag - Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" - Header set Pragma "no-cache" - Header set Expires "Mon, 21 Mar 1983 14:10:00 UTC" - - - #ProxyPass /ws ${FRONTEND_WS_URL}:${FRONTEND_PORT}/ws retry=0 timeout=86400 - #ProxyPassReverse /ws ws://${FRONTEND_URL}:${FRONTEND_PORT}/ws - - #ProxyPass /api/ ${BACKEND_URL}:${BACKEND_PORT}/api/ retry=0 - #ProxyPassReverse /api/ ${BACKEND_URL}:${BACKEND_PORT}/api/ - - #ProxyPass / ${FRONTEND_URL}:${FRONTEND_PORT}/ retry=0 - #ProxyPassReverse / ${FRONTEND_URL}:${FRONTEND_PORT} - - SSLEngine On - # SSLUseStapling On - SSLProtocol -all +TLSv1.2 - SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS - SSLHonorCipherOrder on - SSLCertificateFile /etc/letsencrypt/live/app.boxi.ch/cert.pem - SSLCertificateKeyFile /etc/letsencrypt/live/app.boxi.ch/privkey.pem - SSLCertificateChainFile /etc/letsencrypt/live/app.boxi.ch/fullchain.pem - - diff --git a/deploy/prod/config/frontend/id.boxi.ch.conf b/deploy/prod/config/frontend/id.boxi.ch.conf deleted file mode 100644 index 1b3975a..0000000 --- a/deploy/prod/config/frontend/id.boxi.ch.conf +++ /dev/null @@ -1,79 +0,0 @@ - - DocumentRoot "/var/www/id" - ServerName id.boxi.ch - # ServerAlias www.${server_name} - ErrorLog /var/log/apache2/error.log - CustomLog /var/log/apache2/access.log combined - LogLevel info - - AllowOverride none - Options -Indexes -Includes - Require all granted - - deny from all - - - - AllowOverride None - Options -Indexes -Includes - Require all granted - - - SetHandler server-status - - - Redirect / https://id.boxi.ch/ - - - - - - DocumentRoot "/var/www/id" - ServerName id.boxi.ch - #ServerAlias www.${server_name} - - LogLevel info - - Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" - Header always set Content-Security-Policy "default-src 'self' ; \ - style-src 'self' 'unsafe-inline'; \ - script-src 'self' 'unsafe-inline'; \ - img-src 'self'; \ - connect-src 'self'; \ - form-action 'self'; \ - frame-src http:; \ - frame-ancestors 'self'; \ - object-src 'none'; \ - upgrade-insecure-requests;" - - #ProxyRequests Off - #ProxyPreserveHost On - #ProxyAddHeaders On - - #SSLProxyEngine On - #SSLProxyVerify none - #SSLProxyCheckPeerName off - #SSLProxyCheckPeerCN off - #SSLProxyCheckPeerName off - #SSLProxyCheckPeerExpire off - - #RequestHeader set X-Forwarded-Proto "https" - #RequestHeader set X-Forwarded-Port "443" - #RequestHeader set X-Forwarded-Host "id.boxi.ch" - - #ProxyPass / http://keycloak:8080/ retry=0 - #ProxyPassReverse / http://keycloak:8080 - - - Redirect / https://id.boxi.ch:8443/ - - - SSLEngine On - SSLProtocol -all +TLSv1.2 - SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS - SSLHonorCipherOrder on - SSLCertificateFile /etc/letsencrypt/live/app.boxi.ch/cert.pem - SSLCertificateKeyFile /etc/letsencrypt/live/app.boxi.ch/privkey.pem - SSLCertificateChainFile /etc/letsencrypt/live/app.boxi.ch/fullchain.pem - - diff --git a/deploy/prod/data/www/app/index.html b/deploy/prod/data/www/app/index.html deleted file mode 100644 index e72e95c..0000000 --- a/deploy/prod/data/www/app/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Boxi the APP - - - -

This is the webserver for app.boxi.ch

- - diff --git a/deploy/prod/data/www/id/index.html b/deploy/prod/data/www/id/index.html deleted file mode 100644 index 78134ab..0000000 --- a/deploy/prod/data/www/id/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Boxi the ID - - - -

This is the webserver for id.boxi.ch

- - diff --git a/deploy/prod/docker-compose.yml b/deploy/prod/docker-compose.yml index 1e874ba..bdb54db 100644 --- a/deploy/prod/docker-compose.yml +++ b/deploy/prod/docker-compose.yml @@ -1,98 +1,145 @@ -version: '3' +volumes: + postgres: + driver: local + elasticsearch: + driver: local + tailscale-id: + driver: local + tailscale-apache: + driver: local + +networks: + remslyNet: + name: remslyNet + external: false services: postgres: image: postgres:14-alpine restart: always networks: - boxitNet: - ipv4_address: 10.5.1.1 + - remslyNet environment: - POSTGRES_USER: 'boxitadmin' - POSTGRES_PASSWORD: 'kQsQKCQoa.yf.XiGCh.3' + POSTGRES_USER: 'remsly' + POSTGRES_PASSWORD: ${REMSLY_PSQL_PASSWORD} PGDATA: '/var/lib/postgresql/data/pgdata' - POSTGRES_MULTIPLE_DATABASES: 'boxit:q_VpgQaeXcjns9PqPmGj:boxit,keycloak:roraJK_ds3KDiHkMRLqf:keycloak' + POSTGRES_MULTIPLE_DATABASES: 'remsly:${REMSLY_PSQL_PASSWORD}:remsly,keycloak:${KC_PSQL_PASSWORD}:keycloak' volumes: - - ./data/postgres:/var/lib/postgresql/data/pgdata - - ./config/postgres/create-multiple-postgresql-databases.sh:/docker-entrypoint-initdb.d/create-multiple-postgresql-databases.sh - + - postgres:/var/lib/postgresql/data/pgdata + - ./postgres/create-multiple-postgresql-databases.sh:/docker-entrypoint-initdb.d/create-multiple-postgresql-databases.sh keycloak: image: gitea.tail276105.ts.net/remsly/keycloak:4 - networks: - boxitNet: - ipv4_address: 10.5.0.20 restart: always environment: KC_BOOTSTRAP_ADMIN_USERNAME: 'admin' - KC_BOOTSTRAP_ADMIN_PASSWORD: 'dzVTry4QhwKBnmM8X2PWZRZA' - KC_HTTPS_CERTIFICATE_FILE: '/opt/keycloak/certs/fullchain.pem' - KC_HTTPS_CERTIFICATE_KEY_FILE: '/opt/keycloak/certs/privkey.pem' + KC_BOOTSTRAP_ADMIN_PASSWORD: ${KC_ADMIN_PASSWORD} + KC_HTTP_ENABLED: 'true' KC_DB: postgres KC_DB_URL: 'jdbc:postgresql://postgres:5432/keycloak' KC_DB_USERNAME: 'keycloak' - KC_DB_PASSWORD: 'roraJK_ds3KDiHkMRLqf' - KC_HOSTNAME: 'id.boxi.ch' - # KC_HOSTNAME_STRICT: 'false' - # KC_PROXY_HEADERS: xforwarded - # KC_HTTP_ENABLED: 'true' - # KC_PROXY: edge + KC_DB_PASSWORD: ${KC_PSQL_PASSWORD} + # TLS is terminated by the tailscale-id sidecar; Keycloak runs plain HTTP (8080) behind it + KC_HOSTNAME: 'https://remsly-id.tail276105.ts.net' + KC_HOSTNAME_URL: 'https://remsly-id.tail276105.ts.net' + KC_HOSTNAME_ADMIN_URL: 'https://remsly-id.tail276105.ts.net' command: - start - '--optimized' - # - '--hostname-debug=true' # https://id.boxi.ch:8443/realms/master/hostname-debug + # - '--hostname-debug=true' #https://remsly-id.tail276105.ts.net/realms/master/hostname-debug volumes: - - ./config/keycloak/theme:/opt/keycloak/themes/boxit - - ./config/keycloak/theme.v2:/opt/keycloak/themes/boxit.v2 - - ./certbot/etc/live/app.boxi.ch/fullchain.pem:/opt/keycloak/certs/fullchain.pem:ro - - ./certbot/etc/live/app.boxi.ch/privkey.pem:/opt/keycloak/certs/privkey.pem:ro - ports: - - '8443:8443' + - ./keycloak/theme:/opt/keycloak/themes/boxit + - ./keycloak/theme.v2:/opt/keycloak/themes/boxit.v2 + network_mode: service:tailscale-id depends_on: - postgres + - tailscale-id apache-oidc: image: gitea.tail276105.ts.net/remsly/apacheoidc:3 restart: always - networks: - boxitNet: - ipv4_address: 10.5.0.30 environment: - OIDC_CRYPTO_PASSPHRASE: '39938b0a-1bd2-4352-937d-3cf1e2023727' - KC_ADDR: 'https://id.boxi.ch:8443' - KC_REALM: 'boxit' + OIDC_CRYPTO_PASSPHRASE: ${OIDC_CRYPTO_PASSPHRASE} + KC_ADDR: 'https://remsly-id.tail276105.ts.net' + KC_REALM: 'remsly' OIDC_CLIENT_ID: 'apacheOIDC' - OIDC_CLIENT_SECRET: 'Ymye3T55SnH1YfssvZZi6tRIIZ0PJTsK' - OIDC_REDIRECT_URI: 'https://app.boxi.ch/openidc' + OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET} + OIDC_REDIRECT_URI: 'https://remsly.tail276105.ts.net/openidc' APACHE_DEBUG_LEVEL: 'warn' BACKEND_URL: 'backend' BACKEND_PORT: '5050' volumes: - - ./config/frontend/apache2.conf:/etc/apache2/apache2.conf - - ./certbot/etc:/etc/letsencrypt - - ./data/www:/var/www - - ./config/frontend/app.boxi.ch.conf:/etc/apache2/sites-enabled/app.boxi.ch.conf - - ./config/frontend/id.boxi.ch.conf:/etc/apache2/sites-enabled/id.boxi.ch.conf - ports: - - '80:80' - - '443:443' + - ./frontend/apache2.conf:/etc/apache2/apache2.conf + - ./frontend/app.boxi.ch.conf:/etc/apache2/sites-enabled/app.boxi.ch.conf + network_mode: service:tailscale-apache depends_on: - keycloak + - tailscale-apache - #backend: - #image: boxi.registry.jetbrains.space/p/boxit/containers/boxit-backend:2023.1.36 - # restart: always - # networks: - # boxitNet: - # ipv4_address: 10.5.0.40 - # depends_on: - # - postgres - # - keycloak + backend: + image: gitea.tail276105.ts.net/remsly/remsly-backend:3 + restart: always + networks: + - remslyNet + environment: + # The CI-built image ships no application.properties, so mount one and activate it. + SPRING_CONFIG_ADDITIONAL_LOCATION: 'file:/config/application.properties' + # Secrets referenced as ${...} placeholders inside the mounted properties file. + REMSLY_PSQL_PASSWORD: ${REMSLY_PSQL_PASSWORD} + ELASTIC_PASSWORD: ${ELASTIC_PASSWORD} + KEYCLOAK_RESOURCE: ${KEYCLOAK_RESOURCE} + volumes: + - ./backend/application.properties:/config/application.properties:ro + depends_on: + - postgres + - elasticsearch + - tailscale-id -networks: - boxitNet: - driver: bridge - ipam: - driver: default - config: - - subnet: 10.5.0.0/16 + elasticsearch: + image: gitea.tail276105.ts.net/remsly/elasticsearch:3 + restart: always + volumes: + - elasticsearch:/usr/share/elasticsearch/data + networks: + - remslyNet + environment: + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - discovery.type=single-node + - xpack.license.self_generated.type=basic + + tailscale-id: + image: tailscale/tailscale:latest + hostname: remsly-id + environment: + TS_AUTHKEY: ${TS_AUTHKEY} + TS_USERSPACE: "true" + TS_STATE_DIR: /var/lib/tailscale + TS_SERVE_CONFIG: /config/serve.json + TS_EXTRA_ARGS: --advertise-tags=tag:server + volumes: + - tailscale-id:/var/lib/tailscale + - ./tailscale/serve-id.json:/config/serve.json + networks: + remslyNet: + # Let the backend reach Keycloak via its external URL over the internal network: + # the FQDN resolves to this sidecar, hits tailscale serve on :443 (valid LE cert) + # and is proxied to Keycloak. Keeps the token issuer == auth-server-url. + aliases: + - remsly-id.tail276105.ts.net + restart: unless-stopped + + tailscale-apache: + image: tailscale/tailscale:latest + hostname: remsly + environment: + TS_AUTHKEY: ${TS_AUTHKEY} + TS_USERSPACE: "true" + TS_STATE_DIR: /var/lib/tailscale + TS_SERVE_CONFIG: /config/serve.json + TS_EXTRA_ARGS: --advertise-tags=tag:server + volumes: + - tailscale-apache:/var/lib/tailscale + - ./tailscale/serve-apache.json:/config/serve.json + networks: + - remslyNet + restart: unless-stopped diff --git a/deploy/prod/config/frontend/apache2.conf b/deploy/prod/frontend/apache2.conf similarity index 100% rename from deploy/prod/config/frontend/apache2.conf rename to deploy/prod/frontend/apache2.conf diff --git a/deploy/prod/config/frontend/apache2.conf-backup b/deploy/prod/frontend/apache2.conf-backup similarity index 100% rename from deploy/prod/config/frontend/apache2.conf-backup rename to deploy/prod/frontend/apache2.conf-backup diff --git a/deploy/prod/frontend/app.boxi.ch.conf b/deploy/prod/frontend/app.boxi.ch.conf new file mode 100644 index 0000000..7a3e4bc --- /dev/null +++ b/deploy/prod/frontend/app.boxi.ch.conf @@ -0,0 +1,90 @@ + + DocumentRoot "/var/www/app" + ServerName remsly.tail276105.ts.net + # ServerAlias www.${server_name} + + ErrorLog /var/log/apache2/error.log + CustomLog /var/log/apache2/access.log combined + LogLevel info + + # TLS is terminated by the tailscale sidecar; make mod_auth_openidc and the + # app aware that the external scheme is https. + RequestHeader set X-Forwarded-Proto "https" + + Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" + Header always set Content-Security-Policy "default-src 'self' ; \ + script-src 'self' 'unsafe-inline' 'unsafe-eval'; \ + style-src 'self' use.fontawesome.com 'unsafe-inline'; \ + font-src 'self' data: use.fontawesome.com; \ + base-uri 'self'; \ + form-action 'self'; \ + frame-ancestors 'none'; \ + img-src 'self' data:; \ + upgrade-insecure-requests" "expr=%{CONTENT_TYPE} =~ m#text\/(html|javascript)|application\/pdf|xml#i" + Header always append X-Frame-Options SAMEORIGIN + Header always set X-Content-Type-Options nosniff + Header always set Referrer-Policy "same-origin" + # this feature is not yet used and must be extended if needed, currently only a sample config + Header always set Feature-Policy "payment 'none';" + + + AllowOverride none + Options -Indexes -Includes + Require all granted + + deny from all + + + + + AllowOverride None + Options -Indexes -Includes + Require all granted + + + RequestHeader set X-Forwarded-User expr=%{REMOTE_USER} + RequestHeader set Authorization "Bearer %{oidc_access_token}e" + Header set User-Details "%{REMOTE_USER}e %{oidc_claim_email}e" + + OIDCProviderMetadataURL ${KC_ADDR}/realms/${KC_REALM}/.well-known/openid-configuration + OIDCClientID ${OIDC_CLIENT_ID} + OIDCClientSecret ${OIDC_CLIENT_SECRET} + OIDCRefreshAccessTokenBeforeExpiry 10 + OIDCRedirectURI ${OIDC_REDIRECT_URI} + OIDCCryptoPassphrase ${OIDC_CRYPTO_PASSPHRASE} + OIDCInfoHook ${OIDC_INFO_HOOK} + OIDCDefaultLoggedOutURL ${KC_ADDR}/realms/${KC_REALM}/protocol/openid-connect/logout?redirect_uri=https%3A%2F%2Fremsly.tail276105.ts.net + OIDCRemoteUserClaim preferred_username + OIDCStateMaxNumberOfCookies 3 true + + + SetHandler server-status + + + + AuthType openid-connect + Require valid-user + + + # If the browser is allowed to cache index.html, it starts loading assets/scripts/images before apache had a chance + # to check whether or not the user is even authenticated, leading to many failed requests. + # Disabling cache for index.html forces the browser to fetch it first, and therefore ensures that the full + # authentication mechanic is being run. + # See also https://github.com/zmartzone/mod_auth_openidc/issues/113 + + FileETag None + Header unset ETag + Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" + Header set Pragma "no-cache" + Header set Expires "Mon, 21 Mar 1983 14:10:00 UTC" + + + #ProxyPass /ws ${FRONTEND_WS_URL}:${FRONTEND_PORT}/ws retry=0 timeout=86400 + #ProxyPassReverse /ws ws://${FRONTEND_URL}:${FRONTEND_PORT}/ws + + #ProxyPass /api/ ${BACKEND_URL}:${BACKEND_PORT}/api/ retry=0 + #ProxyPassReverse /api/ ${BACKEND_URL}:${BACKEND_PORT}/api/ + + #ProxyPass / ${FRONTEND_URL}:${FRONTEND_PORT}/ retry=0 + #ProxyPassReverse / ${FRONTEND_URL}:${FRONTEND_PORT} + diff --git a/deploy/prod/config/keycloak/theme.v2/account/index.ftl b/deploy/prod/keycloak/theme.v2/account/index.ftl similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/index.ftl rename to deploy/prod/keycloak/theme.v2/account/index.ftl diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_ca.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_ca.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_ca.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_ca.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_cs.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_cs.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_cs.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_cs.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_da.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_da.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_da.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_da.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_de.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_de.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_de.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_de.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_en.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_en.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_en.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_en.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_es.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_es.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_es.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_es.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_fr.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_fr.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_fr.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_fr.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_hu.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_hu.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_hu.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_hu.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_it.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_it.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_it.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_it.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_ja.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_ja.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_ja.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_ja.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_lt.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_lt.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_lt.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_lt.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_nl.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_nl.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_nl.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_nl.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_no.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_no.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_no.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_no.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_pl.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_pl.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_pl.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_pl.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_pt_BR.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_pt_BR.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_pt_BR.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_pt_BR.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_ru.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_ru.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_ru.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_ru.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_sk.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_sk.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_sk.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_sk.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_sv.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_sv.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_sv.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_sv.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_tr.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_tr.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_tr.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_tr.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/messages/messages_zh_CN.properties b/deploy/prod/keycloak/theme.v2/account/messages/messages_zh_CN.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/messages/messages_zh_CN.properties rename to deploy/prod/keycloak/theme.v2/account/messages/messages_zh_CN.properties diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/App.js b/deploy/prod/keycloak/theme.v2/account/resources/App.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/App.js rename to deploy/prod/keycloak/theme.v2/account/resources/App.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/App.js.map b/deploy/prod/keycloak/theme.v2/account/resources/App.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/App.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/App.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/ContentPages.js b/deploy/prod/keycloak/theme.v2/account/resources/ContentPages.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/ContentPages.js rename to deploy/prod/keycloak/theme.v2/account/resources/ContentPages.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/ContentPages.js.map b/deploy/prod/keycloak/theme.v2/account/resources/ContentPages.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/ContentPages.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/ContentPages.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/Main.js b/deploy/prod/keycloak/theme.v2/account/resources/Main.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/Main.js rename to deploy/prod/keycloak/theme.v2/account/resources/Main.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/Main.js.map b/deploy/prod/keycloak/theme.v2/account/resources/Main.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/Main.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/Main.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/PageNav.js b/deploy/prod/keycloak/theme.v2/account/resources/PageNav.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/PageNav.js rename to deploy/prod/keycloak/theme.v2/account/resources/PageNav.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/PageNav.js.map b/deploy/prod/keycloak/theme.v2/account/resources/PageNav.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/PageNav.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/PageNav.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/PageToolbar.js b/deploy/prod/keycloak/theme.v2/account/resources/PageToolbar.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/PageToolbar.js rename to deploy/prod/keycloak/theme.v2/account/resources/PageToolbar.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/PageToolbar.js.map b/deploy/prod/keycloak/theme.v2/account/resources/PageToolbar.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/PageToolbar.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/PageToolbar.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js b/deploy/prod/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js rename to deploy/prod/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js.map b/deploy/prod/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/account-service/AccountServiceContext.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/account-service/account.service.js b/deploy/prod/keycloak/theme.v2/account/resources/account-service/account.service.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/account-service/account.service.js rename to deploy/prod/keycloak/theme.v2/account/resources/account-service/account.service.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/account-service/account.service.js.map b/deploy/prod/keycloak/theme.v2/account/resources/account-service/account.service.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/account-service/account.service.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/account-service/account.service.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/assets/Remachine.ttf b/deploy/prod/keycloak/theme.v2/account/resources/assets/Remachine.ttf similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/assets/Remachine.ttf rename to deploy/prod/keycloak/theme.v2/account/resources/assets/Remachine.ttf diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/assets/darkGray.jpg b/deploy/prod/keycloak/theme.v2/account/resources/assets/darkGray.jpg similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/assets/darkGray.jpg rename to deploy/prod/keycloak/theme.v2/account/resources/assets/darkGray.jpg diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/assets/gravatar.js b/deploy/prod/keycloak/theme.v2/account/resources/assets/gravatar.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/assets/gravatar.js rename to deploy/prod/keycloak/theme.v2/account/resources/assets/gravatar.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content.json b/deploy/prod/keycloak/theme.v2/account/resources/content.json similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content.json rename to deploy/prod/keycloak/theme.v2/account/resources/content.json diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentAlert.js b/deploy/prod/keycloak/theme.v2/account/resources/content/ContentAlert.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentAlert.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/ContentAlert.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentAlert.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/ContentAlert.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentAlert.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/ContentAlert.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/ContentPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/ContentPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/ContentPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/ContentPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/ContentPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/account-page/AccountPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/aia-page/AppInitiatedActionPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/applications-page/ApplicationsPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/authenticator-page/AuthenticatorPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/device-activity-page/DeviceActivityPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/forbidden-page/ForbiddenPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/linked-accounts-page/LinkedAccountsPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/AbstractResourceTable.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/EditTheResource.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/MyResourcesPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionRequest.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/PermissionSelect.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ResourcesTable.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/ShareTheResource.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/SharedResourcesTable.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/my-resources-page/resource-model.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js b/deploy/prod/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/page-not-found/PageNotFound.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js b/deploy/prod/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js rename to deploy/prod/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js.map b/deploy/prod/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/content/signingin-page/SigningInPage.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/css/boxit.css b/deploy/prod/keycloak/theme.v2/account/resources/css/boxit.css similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/css/boxit.css rename to deploy/prod/keycloak/theme.v2/account/resources/css/boxit.css diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js b/deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js rename to deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js.map b/deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/KeycloakContext.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js b/deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js rename to deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js.map b/deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/keycloak-service/keycloak.service.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/public/favicon.ico b/deploy/prod/keycloak/theme.v2/account/resources/public/favicon.ico similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/public/favicon.ico rename to deploy/prod/keycloak/theme.v2/account/resources/public/favicon.ico diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/public/layout.css b/deploy/prod/keycloak/theme.v2/account/resources/public/layout.css similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/public/layout.css rename to deploy/prod/keycloak/theme.v2/account/resources/public/layout.css diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/public/logo.svg b/deploy/prod/keycloak/theme.v2/account/resources/public/logo.svg similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/public/logo.svg rename to deploy/prod/keycloak/theme.v2/account/resources/public/logo.svg diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/AIACommand.js b/deploy/prod/keycloak/theme.v2/account/resources/util/AIACommand.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/AIACommand.js rename to deploy/prod/keycloak/theme.v2/account/resources/util/AIACommand.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/AIACommand.js.map b/deploy/prod/keycloak/theme.v2/account/resources/util/AIACommand.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/AIACommand.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/util/AIACommand.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/ParseLink.js b/deploy/prod/keycloak/theme.v2/account/resources/util/ParseLink.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/ParseLink.js rename to deploy/prod/keycloak/theme.v2/account/resources/util/ParseLink.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/ParseLink.js.map b/deploy/prod/keycloak/theme.v2/account/resources/util/ParseLink.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/ParseLink.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/util/ParseLink.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/RedirectUri.js b/deploy/prod/keycloak/theme.v2/account/resources/util/RedirectUri.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/RedirectUri.js rename to deploy/prod/keycloak/theme.v2/account/resources/util/RedirectUri.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/RedirectUri.js.map b/deploy/prod/keycloak/theme.v2/account/resources/util/RedirectUri.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/RedirectUri.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/util/RedirectUri.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/TimeUtil.js b/deploy/prod/keycloak/theme.v2/account/resources/util/TimeUtil.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/TimeUtil.js rename to deploy/prod/keycloak/theme.v2/account/resources/util/TimeUtil.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/util/TimeUtil.js.map b/deploy/prod/keycloak/theme.v2/account/resources/util/TimeUtil.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/util/TimeUtil.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/util/TimeUtil.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/welcome-page-scripts.js b/deploy/prod/keycloak/theme.v2/account/resources/welcome-page-scripts.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/welcome-page-scripts.js rename to deploy/prod/keycloak/theme.v2/account/resources/welcome-page-scripts.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/ContinueCancelModal.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/EmptyMessageState.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/LocaleSelectors.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Logout.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/Logout.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Logout.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/Logout.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Logout.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/Logout.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Logout.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/Logout.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Msg.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/Msg.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Msg.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/Msg.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Msg.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/Msg.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/Msg.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/Msg.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerDropdownItem.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/ReferrerLink.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/features.js b/deploy/prod/keycloak/theme.v2/account/resources/widgets/features.js similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/features.js rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/features.js diff --git a/deploy/prod/config/keycloak/theme.v2/account/resources/widgets/features.js.map b/deploy/prod/keycloak/theme.v2/account/resources/widgets/features.js.map similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/resources/widgets/features.js.map rename to deploy/prod/keycloak/theme.v2/account/resources/widgets/features.js.map diff --git a/deploy/prod/config/keycloak/theme.v2/account/theme.properties b/deploy/prod/keycloak/theme.v2/account/theme.properties similarity index 100% rename from deploy/prod/config/keycloak/theme.v2/account/theme.properties rename to deploy/prod/keycloak/theme.v2/account/theme.properties diff --git a/deploy/prod/config/keycloak/theme/account/resources/assets/Remachine.ttf b/deploy/prod/keycloak/theme/account/resources/assets/Remachine.ttf similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/assets/Remachine.ttf rename to deploy/prod/keycloak/theme/account/resources/assets/Remachine.ttf diff --git a/deploy/prod/config/keycloak/theme/account/resources/assets/darkGray.jpg b/deploy/prod/keycloak/theme/account/resources/assets/darkGray.jpg similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/assets/darkGray.jpg rename to deploy/prod/keycloak/theme/account/resources/assets/darkGray.jpg diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/boxit.css b/deploy/prod/keycloak/theme/account/resources/css/boxit.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/boxit.css rename to deploy/prod/keycloak/theme/account/resources/css/boxit.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/all.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/all.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/all.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/all.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/brands.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/brands.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/brands.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/brands.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/fontawesome.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/fontawesome.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/fontawesome.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/fontawesome.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/regular.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/regular.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/regular.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/regular.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/solid.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/solid.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/solid.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/solid.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/svg-with-js.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/svg-with-js.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/svg-with-js.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/svg-with-js.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/v4-shims.min.css b/deploy/prod/keycloak/theme/account/resources/css/fontawesome/v4-shims.min.css similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/fontawesome/v4-shims.min.css rename to deploy/prod/keycloak/theme/account/resources/css/fontawesome/v4-shims.min.css diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.eot b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.eot similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.eot rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.eot diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.svg b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.svg similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.svg rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.svg diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.ttf b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.ttf similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.ttf rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.ttf diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff2 b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff2 similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff2 rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-brands-400.woff2 diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.eot b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.eot similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.eot rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.eot diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.svg b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.svg similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.svg rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.svg diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.ttf b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.ttf similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.ttf rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.ttf diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff2 b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff2 similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff2 rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-regular-400.woff2 diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.eot b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.eot similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.eot rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.eot diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.svg b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.svg similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.svg rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.svg diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.ttf b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.ttf similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.ttf rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.ttf diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff diff --git a/deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff2 b/deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff2 similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff2 rename to deploy/prod/keycloak/theme/account/resources/css/webfonts/fa-solid-900.woff2 diff --git a/deploy/prod/config/keycloak/theme/account/resources/js/gravatar.js b/deploy/prod/keycloak/theme/account/resources/js/gravatar.js similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/js/gravatar.js rename to deploy/prod/keycloak/theme/account/resources/js/gravatar.js diff --git a/deploy/prod/config/keycloak/theme/account/resources/js/md5.js b/deploy/prod/keycloak/theme/account/resources/js/md5.js similarity index 100% rename from deploy/prod/config/keycloak/theme/account/resources/js/md5.js rename to deploy/prod/keycloak/theme/account/resources/js/md5.js diff --git a/deploy/prod/config/keycloak/theme/account/template.ftl b/deploy/prod/keycloak/theme/account/template.ftl similarity index 100% rename from deploy/prod/config/keycloak/theme/account/template.ftl rename to deploy/prod/keycloak/theme/account/template.ftl diff --git a/deploy/prod/config/keycloak/theme/account/theme.properties b/deploy/prod/keycloak/theme/account/theme.properties similarity index 100% rename from deploy/prod/config/keycloak/theme/account/theme.properties rename to deploy/prod/keycloak/theme/account/theme.properties diff --git a/deploy/prod/config/keycloak/theme/login/resources/assets/Remachine.ttf b/deploy/prod/keycloak/theme/login/resources/assets/Remachine.ttf similarity index 100% rename from deploy/prod/config/keycloak/theme/login/resources/assets/Remachine.ttf rename to deploy/prod/keycloak/theme/login/resources/assets/Remachine.ttf diff --git a/deploy/prod/config/keycloak/theme/login/resources/assets/darkGray.jpg b/deploy/prod/keycloak/theme/login/resources/assets/darkGray.jpg similarity index 100% rename from deploy/prod/config/keycloak/theme/login/resources/assets/darkGray.jpg rename to deploy/prod/keycloak/theme/login/resources/assets/darkGray.jpg diff --git a/deploy/prod/config/keycloak/theme/login/resources/css/boxit.css b/deploy/prod/keycloak/theme/login/resources/css/boxit.css similarity index 100% rename from deploy/prod/config/keycloak/theme/login/resources/css/boxit.css rename to deploy/prod/keycloak/theme/login/resources/css/boxit.css diff --git a/deploy/prod/config/keycloak/theme/login/theme.properties b/deploy/prod/keycloak/theme/login/theme.properties similarity index 100% rename from deploy/prod/config/keycloak/theme/login/theme.properties rename to deploy/prod/keycloak/theme/login/theme.properties diff --git a/deploy/prod/letsencrypt-init.sh b/deploy/prod/letsencrypt-init.sh deleted file mode 100755 index bf76752..0000000 --- a/deploy/prod/letsencrypt-init.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -docker run -it --rm --name certbot \ - -v "/remsly/certbot/etc:/etc/letsencrypt" \ - -v "/remsly/certbot/lib:/var/lib/letsencrypt" \ - -p 80:80 \ - -p 443:443 \ - certbot/certbot \ - certonly --standalone -d app.boxi.ch,id.boxi.ch -n --agree-tos -m online@boxi.ch -chmod 644 /remsly/certbot/etc/archive/app.boxi.ch/priv* diff --git a/deploy/prod/letsencrypt-renew-testCert.sh b/deploy/prod/letsencrypt-renew-testCert.sh deleted file mode 100755 index 52cab0b..0000000 --- a/deploy/prod/letsencrypt-renew-testCert.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -docker run -it --rm --name certbot \ - -v "/remsly/certbot/etc:/etc/letsencrypt" \ - -v "/remsly/certbot/lib:/var/lib/letsencrypt" \ - -p 80:80 \ - -p 443:443 \ - certbot/certbot \ - renew --test-cert --standalone -chmod 644 /remsly/certbot/etc/archive/app.boxi.ch/priv* - diff --git a/deploy/prod/letsencrypt-renew.sh b/deploy/prod/letsencrypt-renew.sh deleted file mode 100755 index c56392f..0000000 --- a/deploy/prod/letsencrypt-renew.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -docker run -it --rm --name certbot \ - -v "/remsly/certbot/etc:/etc/letsencrypt" \ - -v "/remsly/certbot/lib:/var/lib/letsencrypt" \ - -p 80:80 \ - -p 443:443 \ - certbot/certbot \ - renew --standalone -chmod 644 /remsly/certbot/etc/archive/app.boxi.ch/priv* - diff --git a/deploy/prod/config/postgres/create-multiple-postgresql-databases.sh b/deploy/prod/postgres/create-multiple-postgresql-databases.sh similarity index 100% rename from deploy/prod/config/postgres/create-multiple-postgresql-databases.sh rename to deploy/prod/postgres/create-multiple-postgresql-databases.sh diff --git a/deploy/prod/tailscale/serve-apache.json b/deploy/prod/tailscale/serve-apache.json new file mode 100644 index 0000000..9b2de64 --- /dev/null +++ b/deploy/prod/tailscale/serve-apache.json @@ -0,0 +1,13 @@ +{ + "TCP": { + "443": { "HTTPS": true } + }, + "Web": { + "${TS_CERT_DOMAIN}:443": { + "Handlers": { + "/": { "Proxy": "http://127.0.0.1:80" } + } + } + }, + "AllowFunnel": { "${TS_CERT_DOMAIN}:443": false } +} \ No newline at end of file diff --git a/deploy/prod/tailscale/serve-id.json b/deploy/prod/tailscale/serve-id.json new file mode 100644 index 0000000..0b07f11 --- /dev/null +++ b/deploy/prod/tailscale/serve-id.json @@ -0,0 +1,13 @@ +{ + "TCP": { + "443": { "HTTPS": true } + }, + "Web": { + "${TS_CERT_DOMAIN}:443": { + "Handlers": { + "/": { "Proxy": "http://127.0.0.1:8080" } + } + } + }, + "AllowFunnel": { "${TS_CERT_DOMAIN}:443": false } +} \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 3383d7b..cdd3666 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,2 +1,2 @@ -FROM gitea.tail276105.ts.net/remslydev/apacheoidc:2 +FROM gitea.tail276105.ts.net/remsly/apacheoidc:3 ADD dist/frontend /var/www/html/app