From 179d8e98f35ffb4dd4a574b25b16db7c92b2be24 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Fri, 20 Jan 2023 13:47:37 -0800 Subject: [PATCH] Restructured Dockerfile so it can build DEVELOPMENT and PRODUCTION modes Signed-off-by: James Ketrenos --- .dockerignore | 8 +++--- Dockerfile | 69 ++++++++++++++++++++++++--------------------- package.json | 40 +++++--------------------- server/package.json | 56 ++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 69 deletions(-) create mode 100644 server/package.json diff --git a/.dockerignore b/.dockerignore index e15713b..fe218a2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,18 +6,18 @@ !*.sh !*.md !config +!client +client/node_modules !frontend +frontend/bower_modules !server +server/node_modules !scanner !src !util !ketrface -!client !scripts !Dockerfile !entrypoint.sh node_modules -frontend/bower_modules -client/node_modules -server/node_modules diff --git a/Dockerfile b/Dockerfile index 98bc45f..0b2cb93 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,8 @@ ARG DEVELOPMENT= +# +# Base Ubuntu image with nodejs installed +# FROM ubuntu:jammy AS base RUN apt-get update \ @@ -17,6 +20,10 @@ RUN DEBIAN_FRONTEND=NONINTERACTIVE apt-get install -y \ # Install the latest npm and npx RUN npm install --global npm@latest +# +# 'production' is used as a COPY source when building +# DEVELOPMENT mode (via website1 image) +# FROM base AS production RUN DEBIAN_FRONTEND=NONINTERACTIVE apt-get install -y \ @@ -28,8 +35,8 @@ RUN npm upgrade && npm install COPY /.babelrc /*.html /*.js /website/ COPY /src /website/src COPY /frontend /website/frontend +RUN cat package.json RUN npm run build -RUN ls -altr /website WORKDIR /website/client COPY /client/*.json /website/client/ @@ -38,20 +45,12 @@ COPY /client/*.js /website/client/ COPY /client/public /website/client/public COPY /client/src /website/client/src RUN npm run build -RUN ls -altr /website/client - -RUN echo $DEVELOPMENT - -FROM base AS runtime1 -ONBUILD COPY --from=production /website/dist /website/dist -ONBUILD COPY --from=production /website/*.html /website/ -ONBUILD COPY --from=production /website/client/*.html /website/client/ -ONBUILD COPY --from=production /website/client/dist /website/client/dist +# +# 'runtime' is the bulk of the DeepFace infrastructure +# FROM base AS runtime -FROM runtime${DEVELOPMENT} - RUN DEBIAN_FRONTEND=NONINTERACTIVE apt-get install -y \ pip \ libgl1 \ @@ -82,33 +81,39 @@ COPY /server /website/server WORKDIR /website/server RUN npm install -COPY /config/default.json /website/config/default.json +# Copy the Python face management scripts COPY /ketrface /website/ketrface +# +# 'website' is used if DEVELOPMENT is not set (PRODUCTION) +# +FROM runtime AS website +RUN "Building PRODUCTION" +COPY /server/production.location /etc/nginx/snippets/active.location +COPY --from=production /website/dist /website/dist +COPY --from=production /website/*.html /website/ +COPY --from=production /website/client/build /website/client/build + +# +# 'website1' is used if DEVELOPMENT=1 +# +FROM runtime AS website1 +RUN echo "Building DEVELOPMENT" +COPY /server/development.location /etc/nginx/snippets/active.location + +# +# This is the final image stage pulling together 'runtime' and the +# appropriate website build (website or website1) +# +FROM website${DEVELOPMENT} AS final + +COPY /config/default.json /website/config/default.json + # Switch to bash instead of sh SHELL [ "/bin/bash", "-c" ] RUN cp /website/server/nginx.conf /etc/nginx/sites-enabled/default -# If not DEVELOPMENT mode, copy production config, else development -RUN \ - if [[ -z "${DEVELOPMENT}" ]]; then \ - echo "Building PRODUCTION" ; \ - cp /website/server/production.location \ - /etc/nginx/snippets/active.location ; \ - else \ - echo "Building DEVELOPMENT" ; \ - cp /website/server/development.location \ - /etc/nginx/snippets/active.location ; \ - fi - -# If not DEVELOPMENT mode, then locally build project -RUN \ - if [[ -z "${DEVELOPMENT}" ]]; then \ - cd /website/client ; \ - npm run build ; \ - fi - COPY /scripts /opt/scripts ENV PATH="${PATH}:/opt/scripts" diff --git a/package.json b/package.json index e66f6f9..a4b17b6 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,13 @@ { - "name": "photos.ketr", + "name": "ketr-photos-frontend", "version": "1.0.0", - "description": "Self hosting photo", - "main": "server/app.js", + "description": "ketr-photos frontend", "scripts": { - "start": "node ./server/app.js", "start-devel": "concurrently \"npm:server\" \"npm:dev\"", - "server": "node ./server/app.js", - "faces": "node ./server/face-recognizer.js", "dev": "webpack-dev-server --mode development --host 0.0.0.0 --config webpack.dev.js", "build": "webpack --config webpack.prod.js", "debug": "node --inspect --debug-brk ./server/app.js", - "commit-build": "./commit-build.sh", - "watch": "webpack --config webpack.prod.js --watch", - "update": "./update.sh", - "backend": "NODE_CONFIG_ENV='production' node server/app.js" + "watch": "webpack --config webpack.prod.js --watch" }, "repository": { "type": "git", @@ -22,39 +15,20 @@ }, "author": "James Ketrenos", "license": "Apache-2.0", - "unused": { - "face-recognition": "^0.9.4" - }, "dependencies": { - "bluebird": "^3.7.2", - "body-parser": "^1.20.1", - "bootstrap": "^4.4.1", + "bootstrap": "^5.2.3", "concurrently": "^5.1.0", "config": "^3.3.8", - "connect-sqlite3": "^0.9.13", - "cookie-parser": "^1.4.4", - "core-js": "^3.2.1", - "exif-reader": "github:paras20xx/exif-reader", - "express": "^4.18.2", - "express-session": "^1.17.0", "file-loader": "^6.2.0", - "googleapis": "^110.0.0", - "handlebars": "^4.7.7", - "ldapauth-fork": "=4.2.0", - "ldapjs": "^1.0.2", "moment": "^2.29.4", "moment-holiday": "^1.5.1", - "morgan": "^1.9.1", - "mustache": "^3.2.1", "node-fetch": "^2.6.7", "node-gzip": "^1.1.2", "nodemailer": "^6.8.0", "react-app-polyfill": "^3.0.0", - "react-bootstrap": "^1.0.0-beta.16", + "react-bootstrap": "^1.6.6", "react-date-range": "^1.0.0-beta", - "react-router-dom": "^5.0.1", - "sequelize": "^6.0", - "sharp": "^0.31.3" + "react-router-dom": "^5.0.1" }, "devDependencies": { "@babel/cli": "^7.20.7", @@ -78,4 +52,4 @@ "esversion": 6, "node": true } -} +} \ No newline at end of file diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..ae6dd5b --- /dev/null +++ b/server/package.json @@ -0,0 +1,56 @@ +{ + "name": "ketr-photos-server", + "version": "1.0.0", + "description": "Self hosting photo", + "main": "server/app.js", + "scripts": { + "start": "node .app.js", + "start-devel": "concurrently \"npm:server\" \"npm:dev\"", + "server": "node ./app.js", + "debug": "node --inspect --debug-brk ./app.js", + "backend": "NODE_CONFIG_ENV='production' node app.js" + }, + "repository": { + "type": "git", + "url": "git@nuc:jketreno/photos.ketr.git" + }, + "author": "James Ketrenos", + "license": "Apache-2.0", + "dependencies": { + "bluebird": "^3.7.2", + "body-parser": "^1.20.1", + "bootstrap": "^4.4.1", + "concurrently": "^5.1.0", + "config": "^3.3.8", + "connect-sqlite3": "^0.9.13", + "cookie-parser": "^1.4.4", + "core-js": "^3.2.1", + "exif-reader": "github:paras20xx/exif-reader", + "express": "^4.18.2", + "express-session": "^1.17.0", + "file-loader": "^6.2.0", + "googleapis": "^110.0.0", + "handlebars": "^4.7.7", + "ldapauth-fork": "=4.2.0", + "ldapjs": "^1.0.2", + "moment": "^2.29.4", + "moment-holiday": "^1.5.1", + "morgan": "^1.9.1", + "mustache": "^3.2.1", + "node-fetch": "^2.6.7", + "node-gzip": "^1.1.2", + "nodemailer": "^6.8.0", + "react-app-polyfill": "^3.0.0", + "react-bootstrap": "^1.0.0-beta.16", + "react-date-range": "^1.0.0-beta", + "react-router-dom": "^5.0.1", + "sequelize": "^6.0", + "sharp": "^0.31.3" + }, + "jshintConfig": { + "undef": true, + "unused": true, + "esversion": 6, + "node": true + } +}