diff --git a/Dockerfile b/Dockerfile index f823bfc..f30921b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,22 @@ # FROM node:alpine FROM node:22-alpine +# Build args +ARG NODE_ENV + +ENV NODE_VERSION 14.19.0 +ENV NODE_ENV=$NODE_ENV + +# install nginx +RUN apk update +RUN apk add nginx + WORKDIR /app +COPY nginx.conf ./ + +COPY run.sh ./ + COPY package.json . RUN npm install @@ -15,5 +29,7 @@ COPY . . # CMD [ "npm", "run", "preview" ] -CMD [ "npm", "run", "start" ,"--", "--host"] +##CMD [ "npm", "run", "start" ,"--", "--host"] + +CMD /bin/sh ./run.sh diff --git a/docker-compose.yml b/docker-compose.yml index bd47684..a4b0124 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,10 +5,13 @@ services: build: context: . dockerfile: Dockerfile + args: + - NODE_ENV=development restart: unless-stopped volumes: - ./:/app - '/app/node_modules' + - ./run.sh:/app/run.sh ports: - 8092:5173 expose: @@ -21,6 +24,7 @@ services: - socket.mermsemr.com:10.10.33.15 environment: - PORT=${DIGIFI_PORT} + - NODE_ENV=${NODE_ENV:-production} tty: true stdin_open: true volumes: diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..b9f717a --- /dev/null +++ b/nginx.conf @@ -0,0 +1,29 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + server { + gzip on; + listen 3000; + server_name localhost; + root /usr/src/app/build; + + include /etc/nginx/mime.types; + + location /nginx_status { + stub_status on; + access_log off; + } + + location / { + try_files $uri $uri/ /index.html; + } + } +} + diff --git a/package-lock.json b/package-lock.json index df4c015..3599027 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,13 @@ "dependencies": { "@reduxjs/toolkit": "^2.5.1", "@tanstack/react-query": "^5.66.0", + "apexcharts": "^4.5.0", "axios": "^1.7.9", "cra-template": "1.2.0", "formik": "^2.4.6", "react": "^19.0.0", + "react-apexcharts": "^1.7.0", + "react-countup": "^6.5.3", "react-dom": "^19.0.0", "react-icons": "^5.4.0", "react-redux": "^9.2.0", @@ -3255,6 +3258,62 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@svgdotjs/svg.draggable.js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz", + "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==", + "license": "MIT", + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@svgdotjs/svg.filter.js": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz", + "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@svgdotjs/svg.js": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz", + "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Fuzzyma" + } + }, + "node_modules/@svgdotjs/svg.resize.js": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.select.js": "^4.0.1" + } + }, + "node_modules/@svgdotjs/svg.select.js": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.3.tgz", + "integrity": "sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", @@ -4301,6 +4360,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -4562,6 +4627,20 @@ "node": ">= 8" } }, + "node_modules/apexcharts": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.7.0.tgz", + "integrity": "sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -5949,6 +6028,12 @@ "node": ">=10" } }, + "node_modules/countup.js": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.9.0.tgz", + "integrity": "sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg==", + "license": "MIT" + }, "node_modules/cra-template": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/cra-template/-/cra-template-1.2.0.tgz", @@ -13776,6 +13861,19 @@ "node": ">=0.10.0" } }, + "node_modules/react-apexcharts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.7.0.tgz", + "integrity": "sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "apexcharts": ">=4.0.0", + "react": ">=0.13" + } + }, "node_modules/react-app-polyfill": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", @@ -13799,6 +13897,18 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, + "node_modules/react-countup": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.3.tgz", + "integrity": "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==", + "license": "MIT", + "dependencies": { + "countup.js": "^2.8.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -16472,20 +16582,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..cfd8c18 --- /dev/null +++ b/run.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh +set -e +set -x + +export NODE_ENV="${NODE_ENV:-development}" + +if [ $NODE_ENV = "development" ]; then + # this runs webpack-dev-server with hot reloading + echo "Development build" + npm install --legacy-peer-deps + npm run start -- --host + # npm run build +elif [ $NODE_ENV = "qa" -o $NODE_ENV = "test" ]; then + echo "QA build" + export NODE_ENV="test" + npm install --legacy-peer-deps + npm run start -- --host +else + # build the app and serve it via nginx + echo "Production build" + npm install --legacy-peer-deps + npm run build + # Testing sometimes + # npm run start + nginx -g 'daemon off;' -c /usr/src/app/nginx.conf + nginx -c /usr/src/app/nginx.conf +fi +