Browse Source

refactor(webapp,www): compile webapp statically into www image

Peter Thomassen 3 years ago
parent
commit
ef688c410e
94 changed files with 47 additions and 38 deletions
  1. 0 4
      .github/workflows/main.yml
  2. 12 3
      docker-compose.dev.yml
  3. 8 23
      docker-compose.yml
  4. 0 6
      webapp/Dockerfile
  5. 27 1
      www/Dockerfile
  6. 0 0
      www/webapp/.browserslistrc
  7. 0 0
      www/webapp/.eslintrc.js
  8. 0 1
      www/webapp/.gitignore
  9. 0 0
      www/webapp/README.md
  10. 0 0
      www/webapp/babel.config.js
  11. 0 0
      www/webapp/cypress.json
  12. 0 0
      www/webapp/package.json
  13. 0 0
      www/webapp/postcss.config.js
  14. 0 0
      www/webapp/public/favicon.ico
  15. 0 0
      www/webapp/public/index.html
  16. 0 0
      www/webapp/src/App.vue
  17. 0 0
      www/webapp/src/assets/anycast.worldmap.svg
  18. 0 0
      www/webapp/src/assets/logo.notext.svg
  19. 0 0
      www/webapp/src/assets/logo.svg
  20. 0 0
      www/webapp/src/assets/logo.text.svg
  21. 0 0
      www/webapp/src/assets/mapmarker.svg
  22. 0 0
      www/webapp/src/assets/non-free/hanssonit.logo.png
  23. 0 0
      www/webapp/src/assets/non-free/nextcloud-logo-inverted.svg
  24. 0 0
      www/webapp/src/assets/non-free/sse.logo.png
  25. 0 0
      www/webapp/src/assets/paypal-qrcode.png
  26. 0 0
      www/webapp/src/components/ActivateAccountActionHandler.vue
  27. 0 0
      www/webapp/src/components/DonateDirectDebitForm.vue
  28. 0 0
      www/webapp/src/components/Field/Checkbox.vue
  29. 0 0
      www/webapp/src/components/Field/Code.vue
  30. 0 0
      www/webapp/src/components/Field/GenericText.vue
  31. 0 0
      www/webapp/src/components/Field/RRSetType.vue
  32. 0 0
      www/webapp/src/components/Field/Record.vue
  33. 0 0
      www/webapp/src/components/Field/Record/A.vue
  34. 0 0
      www/webapp/src/components/Field/Record/AAAA.vue
  35. 0 0
      www/webapp/src/components/Field/Record/CAA.vue
  36. 0 0
      www/webapp/src/components/Field/Record/CDNSKEY.vue
  37. 0 0
      www/webapp/src/components/Field/Record/CDS.vue
  38. 0 0
      www/webapp/src/components/Field/Record/CNAME.vue
  39. 0 0
      www/webapp/src/components/Field/Record/DNSKEY.vue
  40. 0 0
      www/webapp/src/components/Field/Record/DS.vue
  41. 0 0
      www/webapp/src/components/Field/Record/HTTPS.vue
  42. 0 0
      www/webapp/src/components/Field/Record/MX.vue
  43. 0 0
      www/webapp/src/components/Field/Record/NS.vue
  44. 0 0
      www/webapp/src/components/Field/Record/OPENPGPKEY.vue
  45. 0 0
      www/webapp/src/components/Field/Record/PTR.vue
  46. 0 0
      www/webapp/src/components/Field/Record/SMIMEA.vue
  47. 0 0
      www/webapp/src/components/Field/Record/SRV.vue
  48. 0 0
      www/webapp/src/components/Field/Record/SVCB.vue
  49. 0 0
      www/webapp/src/components/Field/Record/Subnet.vue
  50. 0 0
      www/webapp/src/components/Field/Record/TLSA.vue
  51. 0 0
      www/webapp/src/components/Field/Record/TXT.vue
  52. 0 0
      www/webapp/src/components/Field/RecordList.vue
  53. 0 0
      www/webapp/src/components/Field/Switchbox.vue
  54. 0 0
      www/webapp/src/components/Field/TTL.vue
  55. 0 0
      www/webapp/src/components/Field/TimeAgo.vue
  56. 0 0
      www/webapp/src/components/GenericActionHandler.vue
  57. 0 0
      www/webapp/src/components/LegacyConfirmation.vue
  58. 0 0
      www/webapp/src/components/ResetPasswordActionHandler.vue
  59. 0 0
      www/webapp/src/main.js
  60. 0 0
      www/webapp/src/plugins/vuetify.js
  61. 0 0
      www/webapp/src/router/index.js
  62. 0 0
      www/webapp/src/store/index.js
  63. 0 0
      www/webapp/src/utils.js
  64. 0 0
      www/webapp/src/validation.js
  65. 0 0
      www/webapp/src/views/About.vue
  66. 0 0
      www/webapp/src/views/ChangeEmail.vue
  67. 0 0
      www/webapp/src/views/Confirmation.vue
  68. 0 0
      www/webapp/src/views/Console/Confirmation.vue
  69. 0 0
      www/webapp/src/views/Console/DomainSetupDialog.vue
  70. 0 0
      www/webapp/src/views/CrudList.vue
  71. 0 0
      www/webapp/src/views/DeleteAccount.vue
  72. 0 0
      www/webapp/src/views/Domain/CrudDomain.vue
  73. 0 0
      www/webapp/src/views/DomainList.vue
  74. 0 0
      www/webapp/src/views/DomainSetup.vue
  75. 0 0
      www/webapp/src/views/DomainSetupPage.vue
  76. 0 0
      www/webapp/src/views/Donate.vue
  77. 0 0
      www/webapp/src/views/DynSetup.vue
  78. 0 0
      www/webapp/src/views/Home.vue
  79. 0 0
      www/webapp/src/views/Impressum.vue
  80. 0 0
      www/webapp/src/views/Login.vue
  81. 0 0
      www/webapp/src/views/PrivacyPolicy.vue
  82. 0 0
      www/webapp/src/views/ResetPassword.vue
  83. 0 0
      www/webapp/src/views/SignUp.vue
  84. 0 0
      www/webapp/src/views/Terms.vue
  85. 0 0
      www/webapp/src/views/TokenList.vue
  86. 0 0
      www/webapp/src/views/Welcome.vue
  87. 0 0
      www/webapp/tests/e2e/.eslintrc.js
  88. 0 0
      www/webapp/tests/e2e/plugins/index.js
  89. 0 0
      www/webapp/tests/e2e/specs/test.js
  90. 0 0
      www/webapp/tests/e2e/support/commands.js
  91. 0 0
      www/webapp/tests/e2e/support/index.js
  92. 0 0
      www/webapp/tests/unit/.eslintrc.js
  93. 0 0
      www/webapp/tests/unit/example.spec.js
  94. 0 0
      www/webapp/vue.config.js

+ 0 - 4
.github/workflows/main.yml

@@ -81,7 +81,3 @@ jobs:
         grep 'desec/' /var/log/syslog
         docker-compose -f docker-compose.yml -f docker-compose.test-api.yml down -v
         docker-compose down -v
-
-    - name: Webapp dependency installation check
-      run: |
-        docker-compose run webapp npm install

+ 12 - 3
docker-compose.dev.yml

@@ -1,4 +1,4 @@
-version: '2.2'
+version: '2.3'
 
 # mostly extending from main .yml
 services:
@@ -68,12 +68,21 @@ services:
       driver: "json-file"
 
   webapp:
+    build:
+      context: www
+      target: webapp
     volumes:
-    - ./webapp/:/usr/src/app/
+    - ./www/webapp/:/usr/src/app/
     working_dir: /usr/src/app/
-    command: "npm run serve --fix"
+    command: bash -c "npm install && npm run serve --fix"
     environment:
     - CODESANDBOX_SSE=1  # so that ws: protocol ends up as auto: in node_modules/@vue/cli-service/lib/commands/serve.js
+    - CYPRESS_CACHE_FOLDER=/tmp/.cache  # https://github.com/cypress-io/cypress/issues/1281#issuecomment-404823001
+    - VUE_APP_DESECSTACK_NS=${DESECSTACK_NS}
+    - VUE_APP_DESECSTACK_API_SEPA_CREDITOR_ID=${DESECSTACK_API_SEPA_CREDITOR_ID}
+    - VUE_APP_DESECSTACK_API_SEPA_CREDITOR_NAME=${DESECSTACK_API_SEPA_CREDITOR_NAME}
+    - VUE_APP_LOCAL_PUBLIC_SUFFIXES=dedyn.${DESECSTACK_DOMAIN}
+    - VUE_APP_EMAIL=support@desec.${DESECSTACK_DOMAIN}
     networks:
     - rearwebapp
     logging:

+ 8 - 23
docker-compose.yml

@@ -1,8 +1,14 @@
-version: '2.2'
+version: '2.3'
 
 services:
   www:
-    build: www
+    build:
+      context: www
+      args:
+      - DESECSTACK_API_SEPA_CREDITOR_ID=${DESECSTACK_API_SEPA_CREDITOR_ID}
+      - DESECSTACK_API_SEPA_CREDITOR_NAME=${DESECSTACK_API_SEPA_CREDITOR_NAME}
+      - DESECSTACK_DOMAIN=${DESECSTACK_DOMAIN}
+      - DESECSTACK_NS=${DESECSTACK_NS}
     image: desec/dedyn-www:latest
     init: true
     cap_add:
@@ -12,7 +18,6 @@ services:
     - "443:443"
     volumes:
     - ${DESECSTACK_WWW_CERTS}:/etc/ssl/private:ro
-    - webapp_dist:/usr/share/nginx/html:ro
     - ./www/html:/var/www/html:ro
     environment:
     - DESECSTACK_DOMAIN
@@ -215,25 +220,6 @@ services:
         tag: "desec/nsmaster"
     restart: unless-stopped
 
-  webapp:
-    build: webapp
-    environment:
-    - CYPRESS_INSTALL_BINARY=0  # workaround as Cypress otherwise needs write access to /root/.cache/
-    - VUE_APP_DESECSTACK_NS=${DESECSTACK_NS}
-    - VUE_APP_DESECSTACK_API_SEPA_CREDITOR_ID=${DESECSTACK_API_SEPA_CREDITOR_ID}
-    - VUE_APP_DESECSTACK_API_SEPA_CREDITOR_NAME=${DESECSTACK_API_SEPA_CREDITOR_NAME}
-    - VUE_APP_LOCAL_PUBLIC_SUFFIXES=dedyn.${DESECSTACK_DOMAIN}
-    - VUE_APP_EMAIL=support@desec.${DESECSTACK_DOMAIN}
-    volumes:
-    - ./webapp/:/usr/src/app/
-    - webapp_dist:/usr/src/app/dist
-    working_dir: /usr/src/app/
-    command: bash -c "npm install && npm run build -- --no-clean"
-    logging:
-      driver: "syslog"
-      options:
-        tag: "desec/webapp"
-
   rabbitmq:
     image: rabbitmq:3.8-alpine
     init: true
@@ -435,7 +421,6 @@ volumes:
   openvpn-server_logs:
   prometheus:
   rabbitmq_data:
-  webapp_dist:
   zones:
   celerybeat:
   gitzones_keys:

+ 0 - 6
webapp/Dockerfile

@@ -1,6 +0,0 @@
-FROM node:lts
-RUN \
-  apt-get update \
-  && apt-get -y install gettext-base \
-  && apt-get clean \
-  && rm -rf /var/lib/apt/lists/*

+ 27 - 1
www/Dockerfile

@@ -1,3 +1,29 @@
+FROM node:lts AS webapp
+RUN \
+  apt-get update \
+  && apt-get -y install gettext-base \
+  && apt-get clean \
+  && rm -rf /var/lib/apt/lists/*
+
+WORKDIR /usr/src/app
+
+COPY webapp/package.json /usr/src/app/
+RUN npm install
+
+ARG DESECSTACK_API_SEPA_CREDITOR_ID
+ARG DESECSTACK_API_SEPA_CREDITOR_NAME
+ARG DESECSTACK_DOMAIN
+ARG DESECSTACK_NS
+ENV VUE_APP_DESECSTACK_NS=${DESECSTACK_NS} \
+    VUE_APP_DESECSTACK_API_SEPA_CREDITOR_ID=${DESECSTACK_API_SEPA_CREDITOR_ID} \
+    VUE_APP_DESECSTACK_API_SEPA_CREDITOR_NAME=${DESECSTACK_API_SEPA_CREDITOR_NAME} \
+    VUE_APP_LOCAL_PUBLIC_SUFFIXES=dedyn.${DESECSTACK_DOMAIN} \
+    VUE_APP_EMAIL=support@desec.${DESECSTACK_DOMAIN}
+
+COPY webapp/ /usr/src/app/
+RUN npm run build -- --no-clean
+
+
 FROM nginx:mainline-alpine
 
 # Add dependencies for our scripts
@@ -17,6 +43,6 @@ VOLUME /var/www/html
 # mountable content for web app (remove default stuff in there)
 RUN rm /usr/share/nginx/html/*
 COPY html/503.html /usr/share/nginx/html
-VOLUME /usr/share/nginx/html
+COPY --from=webapp /usr/src/app/dist /usr/share/nginx/html
 
 CMD ["./entrypoint.sh"]

+ 0 - 0
webapp/.browserslistrc → www/webapp/.browserslistrc


+ 0 - 0
webapp/.eslintrc.js → www/webapp/.eslintrc.js


+ 0 - 1
webapp/.gitignore → www/webapp/.gitignore

@@ -1,6 +1,5 @@
 .DS_Store
 node_modules
-/dist
 
 /tests/e2e/videos/
 /tests/e2e/screenshots/

+ 0 - 0
webapp/README.md → www/webapp/README.md


+ 0 - 0
webapp/babel.config.js → www/webapp/babel.config.js


+ 0 - 0
webapp/cypress.json → www/webapp/cypress.json


+ 0 - 0
webapp/package.json → www/webapp/package.json


+ 0 - 0
webapp/postcss.config.js → www/webapp/postcss.config.js


+ 0 - 0
webapp/public/favicon.ico → www/webapp/public/favicon.ico


+ 0 - 0
webapp/public/index.html → www/webapp/public/index.html


+ 0 - 0
webapp/src/App.vue → www/webapp/src/App.vue


+ 0 - 0
webapp/src/assets/anycast.worldmap.svg → www/webapp/src/assets/anycast.worldmap.svg


+ 0 - 0
webapp/src/assets/logo.notext.svg → www/webapp/src/assets/logo.notext.svg


+ 0 - 0
webapp/src/assets/logo.svg → www/webapp/src/assets/logo.svg


+ 0 - 0
webapp/src/assets/logo.text.svg → www/webapp/src/assets/logo.text.svg


+ 0 - 0
webapp/src/assets/mapmarker.svg → www/webapp/src/assets/mapmarker.svg


+ 0 - 0
webapp/src/assets/non-free/hanssonit.logo.png → www/webapp/src/assets/non-free/hanssonit.logo.png


+ 0 - 0
webapp/src/assets/non-free/nextcloud-logo-inverted.svg → www/webapp/src/assets/non-free/nextcloud-logo-inverted.svg


+ 0 - 0
webapp/src/assets/non-free/sse.logo.png → www/webapp/src/assets/non-free/sse.logo.png


+ 0 - 0
webapp/src/assets/paypal-qrcode.png → www/webapp/src/assets/paypal-qrcode.png


+ 0 - 0
webapp/src/components/ActivateAccountActionHandler.vue → www/webapp/src/components/ActivateAccountActionHandler.vue


+ 0 - 0
webapp/src/components/DonateDirectDebitForm.vue → www/webapp/src/components/DonateDirectDebitForm.vue


+ 0 - 0
webapp/src/components/Field/Checkbox.vue → www/webapp/src/components/Field/Checkbox.vue


+ 0 - 0
webapp/src/components/Field/Code.vue → www/webapp/src/components/Field/Code.vue


+ 0 - 0
webapp/src/components/Field/GenericText.vue → www/webapp/src/components/Field/GenericText.vue


+ 0 - 0
webapp/src/components/Field/RRSetType.vue → www/webapp/src/components/Field/RRSetType.vue


+ 0 - 0
webapp/src/components/Field/Record.vue → www/webapp/src/components/Field/Record.vue


+ 0 - 0
webapp/src/components/Field/Record/A.vue → www/webapp/src/components/Field/Record/A.vue


+ 0 - 0
webapp/src/components/Field/Record/AAAA.vue → www/webapp/src/components/Field/Record/AAAA.vue


+ 0 - 0
webapp/src/components/Field/Record/CAA.vue → www/webapp/src/components/Field/Record/CAA.vue


+ 0 - 0
webapp/src/components/Field/Record/CDNSKEY.vue → www/webapp/src/components/Field/Record/CDNSKEY.vue


+ 0 - 0
webapp/src/components/Field/Record/CDS.vue → www/webapp/src/components/Field/Record/CDS.vue


+ 0 - 0
webapp/src/components/Field/Record/CNAME.vue → www/webapp/src/components/Field/Record/CNAME.vue


+ 0 - 0
webapp/src/components/Field/Record/DNSKEY.vue → www/webapp/src/components/Field/Record/DNSKEY.vue


+ 0 - 0
webapp/src/components/Field/Record/DS.vue → www/webapp/src/components/Field/Record/DS.vue


+ 0 - 0
webapp/src/components/Field/Record/HTTPS.vue → www/webapp/src/components/Field/Record/HTTPS.vue


+ 0 - 0
webapp/src/components/Field/Record/MX.vue → www/webapp/src/components/Field/Record/MX.vue


+ 0 - 0
webapp/src/components/Field/Record/NS.vue → www/webapp/src/components/Field/Record/NS.vue


+ 0 - 0
webapp/src/components/Field/Record/OPENPGPKEY.vue → www/webapp/src/components/Field/Record/OPENPGPKEY.vue


+ 0 - 0
webapp/src/components/Field/Record/PTR.vue → www/webapp/src/components/Field/Record/PTR.vue


+ 0 - 0
webapp/src/components/Field/Record/SMIMEA.vue → www/webapp/src/components/Field/Record/SMIMEA.vue


+ 0 - 0
webapp/src/components/Field/Record/SRV.vue → www/webapp/src/components/Field/Record/SRV.vue


+ 0 - 0
webapp/src/components/Field/Record/SVCB.vue → www/webapp/src/components/Field/Record/SVCB.vue


+ 0 - 0
webapp/src/components/Field/Record/Subnet.vue → www/webapp/src/components/Field/Record/Subnet.vue


+ 0 - 0
webapp/src/components/Field/Record/TLSA.vue → www/webapp/src/components/Field/Record/TLSA.vue


+ 0 - 0
webapp/src/components/Field/Record/TXT.vue → www/webapp/src/components/Field/Record/TXT.vue


+ 0 - 0
webapp/src/components/Field/RecordList.vue → www/webapp/src/components/Field/RecordList.vue


+ 0 - 0
webapp/src/components/Field/Switchbox.vue → www/webapp/src/components/Field/Switchbox.vue


+ 0 - 0
webapp/src/components/Field/TTL.vue → www/webapp/src/components/Field/TTL.vue


+ 0 - 0
webapp/src/components/Field/TimeAgo.vue → www/webapp/src/components/Field/TimeAgo.vue


+ 0 - 0
webapp/src/components/GenericActionHandler.vue → www/webapp/src/components/GenericActionHandler.vue


+ 0 - 0
webapp/src/components/LegacyConfirmation.vue → www/webapp/src/components/LegacyConfirmation.vue


+ 0 - 0
webapp/src/components/ResetPasswordActionHandler.vue → www/webapp/src/components/ResetPasswordActionHandler.vue


+ 0 - 0
webapp/src/main.js → www/webapp/src/main.js


+ 0 - 0
webapp/src/plugins/vuetify.js → www/webapp/src/plugins/vuetify.js


+ 0 - 0
webapp/src/router/index.js → www/webapp/src/router/index.js


+ 0 - 0
webapp/src/store/index.js → www/webapp/src/store/index.js


+ 0 - 0
webapp/src/utils.js → www/webapp/src/utils.js


+ 0 - 0
webapp/src/validation.js → www/webapp/src/validation.js


+ 0 - 0
webapp/src/views/About.vue → www/webapp/src/views/About.vue


+ 0 - 0
webapp/src/views/ChangeEmail.vue → www/webapp/src/views/ChangeEmail.vue


+ 0 - 0
webapp/src/views/Confirmation.vue → www/webapp/src/views/Confirmation.vue


+ 0 - 0
webapp/src/views/Console/Confirmation.vue → www/webapp/src/views/Console/Confirmation.vue


+ 0 - 0
webapp/src/views/Console/DomainSetupDialog.vue → www/webapp/src/views/Console/DomainSetupDialog.vue


+ 0 - 0
webapp/src/views/CrudList.vue → www/webapp/src/views/CrudList.vue


+ 0 - 0
webapp/src/views/DeleteAccount.vue → www/webapp/src/views/DeleteAccount.vue


+ 0 - 0
webapp/src/views/Domain/CrudDomain.vue → www/webapp/src/views/Domain/CrudDomain.vue


+ 0 - 0
webapp/src/views/DomainList.vue → www/webapp/src/views/DomainList.vue


+ 0 - 0
webapp/src/views/DomainSetup.vue → www/webapp/src/views/DomainSetup.vue


+ 0 - 0
webapp/src/views/DomainSetupPage.vue → www/webapp/src/views/DomainSetupPage.vue


+ 0 - 0
webapp/src/views/Donate.vue → www/webapp/src/views/Donate.vue


+ 0 - 0
webapp/src/views/DynSetup.vue → www/webapp/src/views/DynSetup.vue


+ 0 - 0
webapp/src/views/Home.vue → www/webapp/src/views/Home.vue


+ 0 - 0
webapp/src/views/Impressum.vue → www/webapp/src/views/Impressum.vue


+ 0 - 0
webapp/src/views/Login.vue → www/webapp/src/views/Login.vue


+ 0 - 0
webapp/src/views/PrivacyPolicy.vue → www/webapp/src/views/PrivacyPolicy.vue


+ 0 - 0
webapp/src/views/ResetPassword.vue → www/webapp/src/views/ResetPassword.vue


+ 0 - 0
webapp/src/views/SignUp.vue → www/webapp/src/views/SignUp.vue


+ 0 - 0
webapp/src/views/Terms.vue → www/webapp/src/views/Terms.vue


+ 0 - 0
webapp/src/views/TokenList.vue → www/webapp/src/views/TokenList.vue


+ 0 - 0
webapp/src/views/Welcome.vue → www/webapp/src/views/Welcome.vue


+ 0 - 0
webapp/tests/e2e/.eslintrc.js → www/webapp/tests/e2e/.eslintrc.js


+ 0 - 0
webapp/tests/e2e/plugins/index.js → www/webapp/tests/e2e/plugins/index.js


+ 0 - 0
webapp/tests/e2e/specs/test.js → www/webapp/tests/e2e/specs/test.js


+ 0 - 0
webapp/tests/e2e/support/commands.js → www/webapp/tests/e2e/support/commands.js


+ 0 - 0
webapp/tests/e2e/support/index.js → www/webapp/tests/e2e/support/index.js


+ 0 - 0
webapp/tests/unit/.eslintrc.js → www/webapp/tests/unit/.eslintrc.js


+ 0 - 0
webapp/tests/unit/example.spec.js → www/webapp/tests/unit/example.spec.js


+ 0 - 0
webapp/vue.config.js → www/webapp/vue.config.js