From b314dd76e5c712bdf50c86f4d5f0aa8b58ac3564 Mon Sep 17 00:00:00 2001 From: Carter Date: Tue, 22 Apr 2025 11:22:02 -0600 Subject: [PATCH] added docker-compose for production --- .gitlab-ci.yml | 35 +---------------------------------- docker-compose.prod.yml | 33 +++++++++++++++++++++++++++++++++ package.json | 4 ++-- src/app/App.tsx | 14 +++----------- 4 files changed, 39 insertions(+), 47 deletions(-) create mode 100644 docker-compose.prod.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0a8c51..dd34bc9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -97,7 +97,7 @@ deploy:production: - ssh -o StrictHostKeyChecking=no ${DEPLOY_TARGET} script: - docker login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - - docker stack deploy --with-registry-auth -c docker-compose.yml webui + - docker stack deploy --with-registry-auth -c docker-compose.prod.yml webui when: manual allow_failure: false @@ -205,7 +205,6 @@ staging:deploy: before_script: &staging_tunnel - "apk --update add openssh-client" - "eval $(ssh-agent -s)" - - "echo ${#STAGING_SSH_PRIV_KEY}" - "echo \"$STAGING_SSH_PRIV_KEY\" | tr -d '\r' | ssh-add - " # - "ssh -Mo StrictHostKeyChecking=no -S deploy-ctrl-socket -fnNTL /var/run/docker.sock:/var/run/docker.sock ${DEPLOY_TARGET}" # - "ssh -S deploy-ctrl-socket -O check ${DEPLOY_TARGET}" @@ -217,38 +216,6 @@ staging:deploy: - docker stack deploy --with-registry-auth -c docker-compose.staging.yml webui when: manual allow_failure: false - -# deploy:development: -# image: docker:20.10.21 -# stage: deploy -# variables: -# DOCKER_DRIVER: overlay2 -# DEPLOY_IMAGE: ${CI_REGISTRY}/brandx/bxt-app/production:development -# DOCKER_HOST: ssh://deploy@bxt-dev.adaptiveagriculture.ca -# DEPLOY_TARGET: deploy@bxt-dev.adaptiveagriculture.ca -# only: -# - dev_environment -# environment: -# name: Development -# url: https://bxt-dev.adaptiveagriculture.ca -# before_script: &dev_tunnel -# - "apk --update add openssh-client" -# - "eval $(ssh-agent -s)" -# - ssh -V -# - cat /etc/os-release -# - "echo DEPLOY_TARGET=${DEPLOY_TARGET}" -# - "echo DOCKER_HOST=${DOCKER_HOST}" -# - "echo \"$DEVELOPMENT_SSH_PRIV_KEY\" | tr -d '\r' | ssh-add - " -# # - "ssh -Mo StrictHostKeyChecking=no -S deploy-ctrl-socket -fnNTL /var/run/docker.sock:/var/run/docker.sock ${DEPLOY_TARGET}" -# # - "ssh -S deploy-ctrl-socket -O check ${DEPLOY_TARGET}" -# - mkdir -p ~/.ssh -# - chmod 700 ~/.ssh -# - ssh -o StrictHostKeyChecking=no ${DEPLOY_TARGET} -# script: -# - docker login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY} -# - docker stack deploy --with-registry-auth -c docker-compose.dev.yml webui -# when: manual -# allow_failure: false dependencies:development: image: node:$NODE_VERSION diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..afc477b --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,33 @@ +version: "3.6" + +services: + webui: + image: ${DEPLOY_IMAGE} + networks: + - backend + stop_signal: SIGQUIT + deploy: + update_config: + order: start-first + healthcheck: + test: ["CMD", "curl", "localhost:8080/health"] + interval: 1m + timeout: 10s + retries: 3 + start_period: 30s + labels: + com.datadoghq.ad.logs: '[{"source": "nginx", "service": "webui"}]' + traefik.docker.network: "backend" + traefik.enable: "true" + traefik.http.routers.webui.rule: "Host(`dashboard.adaptiveagriculture.ca`)" + traefik.frontend.redirect.regex: "^https?://dashboard.adaptiveagriculture.ca/(.*)" + traefik.frontend.redirect.replacement: "https://dashboard.adaptiveagriculture.ca/$${1}" + traefik.backend: "www" + traefik.http.services.webui.loadbalancer.server.port: "80" + traefik.protocol: "http" + dns: + - 69.27.101.6 + +networks: + backend: + external: true diff --git a/package.json b/package.json index d2fdfbd..d465087 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,13 @@ "scripts": { "start": "vite", "start-local": "VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_APP_API_URL=http://localhost:50052/v1 VITE_APP_WS_URL=ws://localhost:50052/v1/live VITE_APP_BILLING_URL=http://localhost:50053/v1 VITE_APP_RECLUSE_URL=http://localhost:50054/v1 VITE_APP_GITLAB_URL=http://localhost:50055/v1 vite", - "start-dev": "VITE_APP_API_URL=https://bxt-dev.api.adaptiveagriculture.ca/v1 VITE_AUTH0_CLIENT_DOMAIN=brandxtech.auth0.com VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_AUTH0_DEV_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 vite", + "start-dev": "VITE_AUTH0_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 VITE_APP_API_URL=https://bxt-dev.api.adaptiveagriculture.ca/v1 VITE_AUTH0_CLIENT_DOMAIN=brandxtech.auth0.com VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_AUTH0_DEV_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 vite", "start-staging": "VITE_AUTH0_CLIENT_ID=3ib460VvLwdeyse5iUSQfxkVdQaUmphP VITE_AUTH0_AUDIENCE=stagingapi.brandxtech.ca VITE_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_APP_API_URL=https://stagingapi.brandxtech.ca/v1 VITE_APP_WS_URL=ws://stagingapi.brandxtech.ca/v1/live VITE_APP_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_APP_AUTH0_AUDIENCE=stagingapi.brandxtech.ca vite", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", "build:staging": "VITE_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_AUTH0_AUDIENCE=stagingapi.brandxtech.ca VITE_AUTH0_CLIENT_ID=3ib460VvLwdeyse5iUSQfxkVdQaUmphP VITE_APP_API_URL=https://stagingapi.brandxtech.ca/v1 VITE_APP_WS_URL=wss://stagingapi.brandxtech.ca/v1/live NODE_OPTIONS=--max_old_space_size=4096 VITE_APP_GOOGLE_API_KEY=${GOOGLE_API_KEY} VITE_APP_STRIPE_PUBLIC_KEY=${STRIPE_PUBLIC_KEY_STAGING} VITE_APP_MAPBOX_ACCESS_TOKEN=${MAPBOX_ACCESS_TOKEN} VITE_APP_CNHI_CLIENT_ID=${CNHI_CLIENT_ID} VITE_APP_CNHI_AUTHORIZE_URL=${CNHI_AUTHORIZE_URL} VITE_APP_CNHI_REDIRECT_URI=${CNHI_REDIRECT_URI} VITE_APP_CNHI_SCOPES=${CNHI_SCOPES} VITE_APP_CNHI_CONNECTION=${CNHI_CONNECTION} VITE_APP_CNHI_AUDIENCE=${CNHI_AUDIENCE} VITE_APP_IMAGE4IO_USERNAME=${IMAGE4IO_USERNAME} VITE_APP_IMAGE4IO_PASSWORD=${IMAGE4IO_PASSWORD} VITE_APP_JD_CLIENT_ID=${JD_CLIENT_ID} VITE_APP_JD_AUTHORIZE_URL=${JD_AUTHORIZE_URL} VITE_APP_JD_REDIRECT_URI=${JD_REDIRECT_URI} VITE_APP_JD_SCOPES=${JD_SCOPES} VITE_APP_JD_STATE=${JD_STATE} vite build", - "build:development": "VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_APP_API_URL=https://bxt-dev.api.adaptiveagriculture.ca/v1 NODE_OPTIONS=--max_old_space_size=4096 VITE_APP_GOOGLE_API_KEY=${GOOGLE_API_KEY} VITE_APP_STRIPE_PUBLIC_KEY=${STRIPE_PUBLIC_KEY_DEVELOPMENT} VITE_APP_MAPBOX_ACCESS_TOKEN=${MAPBOX_ACCESS_TOKEN} VITE_APP_CNHI_CLIENT_ID=${CNHI_CLIENT_ID} VITE_APP_CNHI_AUTHORIZE_URL=${CNHI_AUTHORIZE_URL} VITE_APP_CNHI_REDIRECT_URI=${CNHI_REDIRECT_URI} VITE_APP_CNHI_SCOPES=${CNHI_SCOPES} VITE_APP_CNHI_CONNECTION=${CNHI_CONNECTION} VITE_APP_CNHI_AUDIENCE=${CNHI_AUDIENCE} VITE_APP_IMAGE4IO_USERNAME=${IMAGE4IO_USERNAME} VITE_APP_IMAGE4IO_PASSWORD=${IMAGE4IO_PASSWORD} VITE_APP_JD_CLIENT_ID=${JD_CLIENT_ID} VITE_APP_JD_AUTHORIZE_URL=${JD_AUTHORIZE_URL} VITE_APP_JD_REDIRECT_URI=${JD_REDIRECT_URI} VITE_APP_JD_SCOPES=${JD_SCOPES} VITE_APP_JD_STATE=${JD_STATE} vite build", + "build:development": "VITE_AUTH0_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_APP_API_URL=https://bxt-dev.api.adaptiveagriculture.ca/v1 NODE_OPTIONS=--max_old_space_size=4096 VITE_APP_GOOGLE_API_KEY=${GOOGLE_API_KEY} VITE_APP_STRIPE_PUBLIC_KEY=${STRIPE_PUBLIC_KEY_DEVELOPMENT} VITE_APP_MAPBOX_ACCESS_TOKEN=${MAPBOX_ACCESS_TOKEN} VITE_APP_CNHI_CLIENT_ID=${CNHI_CLIENT_ID} VITE_APP_CNHI_AUTHORIZE_URL=${CNHI_AUTHORIZE_URL} VITE_APP_CNHI_REDIRECT_URI=${CNHI_REDIRECT_URI} VITE_APP_CNHI_SCOPES=${CNHI_SCOPES} VITE_APP_CNHI_CONNECTION=${CNHI_CONNECTION} VITE_APP_CNHI_AUDIENCE=${CNHI_AUDIENCE} VITE_APP_IMAGE4IO_USERNAME=${IMAGE4IO_USERNAME} VITE_APP_IMAGE4IO_PASSWORD=${IMAGE4IO_PASSWORD} VITE_APP_JD_CLIENT_ID=${JD_CLIENT_ID} VITE_APP_JD_AUTHORIZE_URL=${JD_AUTHORIZE_URL} VITE_APP_JD_REDIRECT_URI=${JD_REDIRECT_URI} VITE_APP_JD_SCOPES=${JD_SCOPES} VITE_APP_JD_STATE=${JD_STATE} vite build", "build:production": "NODE_OPTIONS=--max_old_space_size=4096 VITE_APP_GOOGLE_API_KEY=${GOOGLE_API_KEY} VITE_APP_STRIPE_PUBLIC_KEY=${STRIPE_PUBLIC_KEY_PRODUCTION} VITE_APP_MAPBOX_ACCESS_TOKEN=${MAPBOX_ACCESS_TOKEN} VITE_APP_CNHI_CLIENT_ID=${CNHI_CLIENT_ID} VITE_APP_CNHI_AUTHORIZE_URL=${CNHI_AUTHORIZE_URL} VITE_APP_CNHI_REDIRECT_URI=${CNHI_REDIRECT_URI} VITE_APP_CNHI_SCOPES=${CNHI_SCOPES} VITE_APP_CNHI_CONNECTION=${CNHI_CONNECTION} VITE_APP_CNHI_AUDIENCE=${CNHI_AUDIENCE} VITE_APP_IMAGE4IO_USERNAME=${IMAGE4IO_USERNAME} VITE_APP_IMAGE4IO_PASSWORD=${IMAGE4IO_PASSWORD} VITE_APP_JD_CLIENT_ID=${JD_CLIENT_ID} VITE_APP_JD_AUTHORIZE_URL=${JD_AUTHORIZE_URL} VITE_APP_JD_REDIRECT_URI=${JD_REDIRECT_URI} VITE_APP_JD_SCOPES=${JD_SCOPES} VITE_APP_JD_STATE=${JD_STATE} vite build", "build:offline": "npx env-cmd offline,whitelabel npm run build", "test": "vitest" diff --git a/src/app/App.tsx b/src/app/App.tsx index 8b0d10e..dbbcab1 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -10,7 +10,6 @@ import { AppThemeProvider } from 'theme/AppThemeProvider' function App() { const [token, setToken] = useState(undefined) - // const [palette, setPalette] = useState(CreateTheme(getThemeType())); const whiteLabel = getWhitelabel() const manifestPath = "/" + whiteLabel.name.replace(/\s/g, "") + "/manifest.json" @@ -28,8 +27,6 @@ function App() { // Set favicon const faviconDocument = document.getElementById("favicon-link") as HTMLLinkElement; const faviconPath = `/${whiteLabel.name.replace(/\s/g, "")}/favicon.ico`; - console.log("Favicon Document: ", faviconDocument) - console.log("Favicon Path: ", faviconPath) fetch(faviconPath).then(response => { if (response.ok && faviconDocument) { faviconDocument.href = faviconPath; @@ -43,14 +40,9 @@ function App() { let domain: string | undefined = import.meta.env.VITE_AUTH0_CLIENT_DOMAIN; let audience: string | undefined = import.meta.env.VITE_AUTH0_AUDIENCE; - let client_id = whiteLabel.auth0ClientId - if (!client_id) client_id = import.meta.env.VITE_AUTH0_STAGING_CLIENT_ID; - // let client_id = import.meta.env.VITE_AUTH0_CLIENT_ID; - - console.log("Domain: " + domain) - console.log("Audience: " + audience) - console.log("Client ID: " + client_id) - console.log("API URL: " + import.meta.env.VITE_APP_API_URL) + // let client_id = whiteLabel.auth0ClientId + let client_id = import.meta.env.VITE_AUTH0_CLIENT_ID; + // if (!client_id) client_id = import.meta.env.VITE_AUTH0_CLIENT_ID; return (