From 8f9dc0d9ce8468401384f015ebf4fcc77bbf3087 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Fri, 26 Jun 2020 02:23:06 +0200 Subject: [PATCH] Deploy .. --- .env.dist | 5 +- Caddyfile | 86 ++- Dockerfile.api | 4 +- Dockerfile.caddy | 19 - api/resources/application.prod.yaml | 2 +- api/src/NotesApplication.kt | 6 +- api/src/features/ConfigurationFeature.kt | 2 - docker-compose.prod.yml | 14 - frontend/Caddyfile | 20 - .../fonts/roboto-v20-latin-regular.woff2 | Bin frontend/assets/main.css | 3 +- frontend/components/Navbar.vue | 4 - frontend/nuxt.config.js | 48 +- frontend/package.json | 3 +- frontend/pages/notes/index.vue | 2 +- .../fonts/roboto-v20-latin-regular.woff | Bin 20268 -> 0 bytes frontend/yarn.lock | 612 +++++++++++------- start-prod.sh | 1 - 18 files changed, 469 insertions(+), 362 deletions(-) delete mode 100644 Dockerfile.caddy delete mode 100644 frontend/Caddyfile rename frontend/{static => assets}/fonts/roboto-v20-latin-regular.woff2 (100%) delete mode 100644 frontend/static/fonts/roboto-v20-latin-regular.woff diff --git a/.env.dist b/.env.dist index 24fa0d0..e6dd9fe 100644 --- a/.env.dist +++ b/.env.dist @@ -1,6 +1,9 @@ MYSQL_ROOT_PASSWORD= +MYSQL_HOST=db MYSQL_DATABASE= MYSQL_USER= MYSQL_PASSWORD= JWT_SECRET= -CORS=false \ No newline at end of file +JWT_REFRESH_SECRET= +CORS=false +PORT=8081 diff --git a/Caddyfile b/Caddyfile index 8a4566b..10e21e2 100644 --- a/Caddyfile +++ b/Caddyfile @@ -4,7 +4,7 @@ -Date Strict-Transport-Security "max-age=31536000; includeSubDomains" - Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr none;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;" + Feature-Policy "geolocation none; midi none; notifications none; push none; sync-xhr none; microphone none; camera none; magnetometer none; gyroscope none; speaker self; vibrate none; fullscreen self; payment none" X-Content-Type-Options "nosniff" X-Frame-Options "DENY" X-XSS-Protection "1; mode=block" @@ -12,45 +12,56 @@ } } -simplenotes.be { - @static { - path *.css *.js - file +(common) { + @ignore { + path *.php + } + respond @ignore "no" 404 + + encode gzip +} + +(nuxt) { + @nuxt { + path /_nuxt/* } - @fonts { - path *.woff *.woff2 - file - } + header @nuxt Cache-Control "public, max-age=31536000" # 1 year +} + +simplenotes.be { + import security + import nuxt + import common @404 { expression {http.error.status_code} == 404 } - route /* { - file_server - } - handle_errors { rewrite @404 /404.html file_server import security } - route /api/* { - uri strip_prefix /api - reverse_proxy http://api:8081 + route /* { + file_server + } + + route /api/* { + uri strip_prefix /api + reverse_proxy http://localhost:8081 } - header @static Cache-Control "public, max-age=31536000" # 1 year - header @fonts Cache-Control "public, max-age=604800" # 7 days header Content-Security-Policy "default-src 'self' 'unsafe-inline';" - encode gzip - root * /site - log + root * /var/www/simplenotes.be + + log { + output file /var/log/www/simplenotes.be.json + format json + } - import security } www.simplenotes.be { @@ -58,9 +69,36 @@ www.simplenotes.be { } docs.simplenotes.be { - file_server - root * /docs import security + import common + + file_server + + root * /var/www/docs.simplenotes.be + + log { + output file /var/log/www/docs.simplenotes.be.json + format json + } header Content-Security-Policy "default-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net;" } + +portfolio.simplenotes.be { + import security + import common + import nuxt + + file_server + root * /var/www/portfolio.simplenotes.be + + log { + output file /var/log/www/portfolio.simplenotes.be.json + format json + } + + header @static Cache-Control "public, max-age=31536000" # 1 year + + # header Content-Security-Policy "default-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net;" + +} diff --git a/Dockerfile.api b/Dockerfile.api index b69b39b..8004d6d 100644 --- a/Dockerfile.api +++ b/Dockerfile.api @@ -10,7 +10,7 @@ COPY api/resources resources COPY api/src src COPY api/test test -RUN mvn package +RUN mvn package -DskipTests FROM openjdk:14-alpine @@ -25,4 +25,4 @@ USER $APPLICATION_USER COPY --from=builder /tmp/target/api-*-jar-with-dependencies.jar /app/notes-api.jar WORKDIR /app -CMD ["java", "-server", "-XX:+UnlockExperimentalVMOptions", "-XX:InitialRAMFraction=2", "-XX:MinRAMFraction=2", "-XX:MaxRAMFraction=2", "-XX:+UseG1GC", "-XX:MaxGCPauseMillis=100", "-XX:+UseStringDeduplication", "-jar", "notes-api.jar"] \ No newline at end of file +CMD ["java", "-server", "-XX:+UnlockExperimentalVMOptions", "-XX:InitialRAMFraction=2", "-XX:MinRAMFraction=2", "-XX:MaxRAMFraction=2", "-XX:+UseG1GC", "-XX:MaxGCPauseMillis=100", "-XX:+UseStringDeduplication", "-jar", "notes-api.jar"] diff --git a/Dockerfile.caddy b/Dockerfile.caddy deleted file mode 100644 index 9b362e8..0000000 --- a/Dockerfile.caddy +++ /dev/null @@ -1,19 +0,0 @@ -## Docker multi-stage build - -## Generate api documentation -FROM quay.io/bukalapak/snowboard AS docbuilder -RUN mkdir /out -COPY api-doc /doc -RUN /app/packages/snowboard/bin/run html api.apib -o /out - -## Generate website -FROM node:latest AS builder -COPY frontend /app -WORKDIR /app -RUN yarn install && yarn run generate - -## Main image -FROM caddy:2.0.0 -COPY Caddyfile /etc/caddy/Caddyfile -COPY --from=docbuilder /out /docs -COPY --from=builder /app/dist /site \ No newline at end of file diff --git a/api/resources/application.prod.yaml b/api/resources/application.prod.yaml index 936ab0e..9b1d5b7 100644 --- a/api/resources/application.prod.yaml +++ b/api/resources/application.prod.yaml @@ -7,7 +7,7 @@ database: server: host: 0.0.0.0 - port: 8081 + port: ${PORT:-8081} cors: ${CORS:-true} jwt: diff --git a/api/src/NotesApplication.kt b/api/src/NotesApplication.kt index fdbe62b..e9b109d 100644 --- a/api/src/NotesApplication.kt +++ b/api/src/NotesApplication.kt @@ -6,23 +6,23 @@ import be.vandewalleh.migrations.Migration import be.vandewalleh.routing.noteRoutes import be.vandewalleh.routing.tagsRoute import be.vandewalleh.routing.userRoutes -import com.sksamuel.hoplite.fp.valid import io.ktor.application.* import io.ktor.auth.* import io.ktor.routing.* import io.ktor.server.engine.* import io.ktor.server.netty.* -import me.liuwj.ktorm.database.* import org.kodein.di.Kodein import org.kodein.di.description import org.kodein.di.generic.instance +import org.kodein.di.generic.with import org.slf4j.Logger -fun main() { +fun main(args: Array) { val kodein = Kodein{ import(mainModule) + constant("config file") with "/application.prod.yaml" // FIXME } val config by kodein.instance() diff --git a/api/src/features/ConfigurationFeature.kt b/api/src/features/ConfigurationFeature.kt index ea3fb7f..80c8a7a 100644 --- a/api/src/features/ConfigurationFeature.kt +++ b/api/src/features/ConfigurationFeature.kt @@ -9,7 +9,6 @@ import org.kodein.di.Kodein import org.kodein.di.generic.bind import org.kodein.di.generic.instance import org.kodein.di.generic.singleton -import org.kodein.di.generic.with import java.util.concurrent.TimeUnit import javax.sql.DataSource @@ -17,7 +16,6 @@ import javax.sql.DataSource * [Kodein] controller module containing the app configuration */ val configurationModule = Kodein.Module(name = "Configuration") { - constant("config file") with "/application.dev.yaml" // FIXME bind() from singleton { val configFile by this.kodein.instance(tag = "config file") ConfigLoader().loadConfigOrThrow(configFile) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 33cabac..e4b2a0b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -2,20 +2,6 @@ version: '2.2' services: - caddy: - build: - dockerfile: Dockerfile.caddy - context: . - container_name: notes-caddy - environment: - - TZ=Europe/Brussels - volumes: - - notes-caddy-data:/data - - notes-caddy-config:/config - ports: - - 80:80 - - 443:443 - api: build: dockerfile: Dockerfile.api diff --git a/frontend/Caddyfile b/frontend/Caddyfile deleted file mode 100644 index 97a814d..0000000 --- a/frontend/Caddyfile +++ /dev/null @@ -1,20 +0,0 @@ -:8080 -root dist -file_server { - # If we visit /404.html directly we receive a 404 response, and not a 200. - hide 404.html -} -encode gzip - -handle_errors { - @404 { - expression {http.error.status_code} == 404 - } - rewrite @404 /404.html - file_server -} - -log { - format single_field common_log -} - diff --git a/frontend/static/fonts/roboto-v20-latin-regular.woff2 b/frontend/assets/fonts/roboto-v20-latin-regular.woff2 similarity index 100% rename from frontend/static/fonts/roboto-v20-latin-regular.woff2 rename to frontend/assets/fonts/roboto-v20-latin-regular.woff2 diff --git a/frontend/assets/main.css b/frontend/assets/main.css index f518264..d81c5df 100644 --- a/frontend/assets/main.css +++ b/frontend/assets/main.css @@ -5,8 +5,7 @@ font-weight: 400; font-display: swap; src: local('Roboto'), local('Roboto-Regular'), - url('/fonts/roboto-v20-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('/fonts/roboto-v20-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('./fonts/roboto-v20-latin-regular.woff2') format('woff2') } diff --git a/frontend/components/Navbar.vue b/frontend/components/Navbar.vue index 2a571a2..90da22e 100644 --- a/frontend/components/Navbar.vue +++ b/frontend/components/Navbar.vue @@ -116,10 +116,6 @@ export default { this.$vuetify.theme.dark = !this.$vuetify.theme.dark const theme = this.$vuetify.theme.dark ? 'dark' : 'light' localStorage.setItem('theme', theme) - this.$cookies.set('theme', theme, { - path: '/', - maxAge: 60 * 60 * 24 * 7, - }) }, }, } diff --git a/frontend/nuxt.config.js b/frontend/nuxt.config.js index 26216f3..796f800 100644 --- a/frontend/nuxt.config.js +++ b/frontend/nuxt.config.js @@ -1,9 +1,4 @@ -import colors from 'vuetify/es5/util/colors' -import { config } from 'dotenv' - -const env = config().parsed - -export default { +export default ({ command }) => ({ mode: 'universal', /* ** Headers of the page @@ -26,16 +21,7 @@ export default { content: process.env.npm_package_description || '', }, ], - link: [ - { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }, - { - rel: 'preload', - href: '/fonts/roboto-v20-latin-regular.woff2', - as: 'font', - type: 'font/woff2', - crossorigin: 'anonymous', - }, - ], + link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }], }, /* ** Customize the progress-bar color @@ -64,9 +50,9 @@ export default { // Doc: https://axios.nuxtjs.org/usage '@nuxtjs/axios', // Doc: https://github.com/nuxt-community/dotenv-module - '@nuxtjs/dotenv', '@nuxtjs/auth', - 'cookie-universal-nuxt', + // Doc: https://github.com/nuxt-community/robots-module + '@nuxtjs/robots', ], /* ** Axios module configuration @@ -74,8 +60,8 @@ export default { */ axios: {}, - env: { - API_HOST: env.API_HOST, + publicRuntimeConfig: { + API_HOST: process.env.API_HOST, }, auth: { @@ -85,12 +71,7 @@ export default { home: '/notes', }, watchLoggedIn: true, - cookie: { - prefix: 'auth.', - options: { - path: '/', - }, - }, + cookie: !command.includes('generate'), strategies: { _scheme: 'local', _name: 'local', @@ -190,4 +171,17 @@ export default { components: true, telemetry: false, -} + + robots: { + UserAgent: '*', + Disallow: '/', + }, + + render: { + bundleRenderer: { + shouldPrefetch: () => false, + shouldPreload: (_, asType) => + ['font', 'script', 'style'].includes(asType), + }, + }, +}) diff --git a/frontend/package.json b/frontend/package.json index 7d4670c..f461505 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,9 +15,8 @@ "dependencies": { "@nuxtjs/auth": "^4.9.1", "@nuxtjs/axios": "^5.3.6", - "@nuxtjs/dotenv": "^1.4.0", + "@nuxtjs/robots": "^2.4.2", "@starptech/prettyhtml-hast-to-html": "^0.10.0", - "cookie-universal-nuxt": "^2.1.4", "nuxt": "^2.13.0", "remark": "^12.0.0", "remark-breaks": "^1.0.5", diff --git a/frontend/pages/notes/index.vue b/frontend/pages/notes/index.vue index 9e6804e..734d07a 100644 --- a/frontend/pages/notes/index.vue +++ b/frontend/pages/notes/index.vue @@ -43,7 +43,7 @@ export default { ...mapGetters('notes', ['isEmpty']), }, mounted() { - if (!this.initialized) this.load() + if (!this.isInitialized) this.load() }, methods: { ...mapActions('notes', ['load']), diff --git a/frontend/static/fonts/roboto-v20-latin-regular.woff b/frontend/static/fonts/roboto-v20-latin-regular.woff deleted file mode 100644 index 69c88254051499539452130e33c36a20e9469e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20268 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