Browse Source

feat: Adds feathers server to docker setup

Owen Diffey 3 months ago
parent
commit
28fa00264f
14 changed files with 207 additions and 9 deletions
  1. 1 0
      .dockerignore
  2. 6 0
      .env.example
  3. 14 1
      .vscode/launch.json
  4. 29 0
      Dockerfile
  5. 20 0
      Dockerfile.dev
  6. 8 0
      compose.dev.yml
  7. 5 0
      compose.local.yml
  8. 41 0
      compose.yml
  9. 14 0
      frontend/nginx.dev.conf
  10. 14 0
      frontend/nginx.prod.conf
  11. 25 7
      musare.sh
  12. 22 0
      server/entrypoint.dev.sh
  13. 7 0
      server/nodemon.json
  14. 1 1
      server/package.json

+ 1 - 0
.dockerignore

@@ -5,6 +5,7 @@
 !.git/refs/
 
 !types/
+!server/
 !backend/
 !frontend/
 

+ 6 - 0
.env.example

@@ -4,6 +4,12 @@ CONTAINER_MODE=production
 
 APP_ENV=production
 
+SERVER_DEBUG=false
+SERVER_DEBUG_PORT=9228
+
+POSTGRES_USERNAME=musare
+POSTGRES_PASSWORD=PASSWORD
+
 BACKEND_DEBUG=false
 BACKEND_DEBUG_PORT=9229
 

+ 14 - 1
.vscode/launch.json

@@ -5,7 +5,20 @@
     "version": "0.2.0",
     "configurations": [
         {
-            "name": "Docker: Attach to Node",
+            "name": "Docker: Attach to server",
+            "type": "node",
+            "request": "attach",
+            "port": 9228,
+            "address": "localhost",
+            "localRoot": "${workspaceFolder}/server",
+            "remoteRoot": "/opt/app/",
+            "autoAttachChildProcesses": true,
+            "restart": true,
+            "continueOnAttach": true,
+            "smartStep": true
+        },
+        {
+            "name": "Docker: Attach to backend",
             "type": "node",
             "request": "attach",
             "port": 9229,

+ 29 - 0
Dockerfile

@@ -16,6 +16,35 @@ WORKDIR /opt/app
 
 USER musare
 
+# Server node modules
+FROM common_base AS server_node_modules
+
+COPY --chown=musare:musare --link server/package.json server/package-lock.json /opt/app/
+
+RUN npm install
+
+# Server build
+FROM common_base AS server_build
+
+ENV APP_ENV=production
+
+COPY --chown=musare:musare --link .git /opt/.git
+COPY --chown=musare:musare --link server /opt/app
+COPY --chown=musare:musare --link --from=server_node_modules /opt/app/node_modules node_modules
+
+RUN npm run compile
+
+# Server production image
+FROM common_base AS server
+
+COPY --from=server_build --link /opt/app /opt/app
+COPY --from=server_node_modules --link /opt/app/node_modules node_modules
+COPY --from=server_node_modules --link /opt/app/package.json /opt/app/package-lock.json /opt/app/
+
+ENTRYPOINT npm run migrate && npm run start
+
+EXPOSE 8080
+
 # Backend node modules
 FROM common_base AS backend_node_modules
 

+ 20 - 0
Dockerfile.dev

@@ -16,6 +16,26 @@ WORKDIR /opt/app
 
 USER musare
 
+# Server node modules
+FROM common_base AS server_node_modules
+
+COPY --chown=musare:musare --link server/package.json server/package-lock.json /opt/app/
+
+RUN npm install
+
+# Server development image
+FROM common_base AS server
+
+ENV APP_ENV=development
+
+COPY --chown=musare:musare --link .git /opt/.git
+COPY --chown=musare:musare --link server /opt/app
+COPY --chown=musare:musare --link --from=server_node_modules /opt/app/node_modules node_modules
+
+ENTRYPOINT sh /opt/app/entrypoint.dev.sh
+
+EXPOSE 8080
+
 # Backend node modules
 FROM common_base AS backend_node_modules
 

+ 8 - 0
compose.dev.yml

@@ -1,4 +1,12 @@
 services:
+  server:
+    build:
+      dockerfile: ./Dockerfile.dev
+    environment:
+      - APP_ENV=${APP_ENV:-development}
+      - SERVER_DEBUG=${SERVER_DEBUG:-false}
+      - SERVER_DEBUG_PORT=${SERVER_DEBUG_PORT:-9228}
+
   backend:
     build:
       dockerfile: ./Dockerfile.dev

+ 5 - 0
compose.local.yml

@@ -1,4 +1,9 @@
 services:
+  server:
+    volumes:
+      - ./.git:/opt/.git:ro
+      - ./server:/opt/app
+
   backend:
     volumes:
       - ./.git:/opt/.git:ro

+ 41 - 0
compose.yml

@@ -1,4 +1,43 @@
 services:
+  server:
+    build:
+      context: .
+      dockerfile: ./Dockerfile
+      target: server
+    restart: unless-stopped
+    volumes:
+      - ./server/config:/opt/app/config
+    environment:
+      - MUSARE_SITENAME=${MUSARE_SITENAME:-Musare}
+      - MUSARE_PRIMARY_COLOR=${MUSARE_PRIMARY_COLOR:-#03a9f4}
+      - MUSARE_DEBUG_VERSION=${MUSARE_DEBUG_VERSION:-true}
+      - MUSARE_DEBUG_GIT_REMOTE=${MUSARE_DEBUG_GIT_REMOTE:-false}
+      - MUSARE_DEBUG_GIT_REMOTE_URL=${MUSARE_DEBUG_GIT_REMOTE_URL:-false}
+      - MUSARE_DEBUG_GIT_BRANCH=${MUSARE_DEBUG_GIT_BRANCH:-true}
+      - MUSARE_DEBUG_GIT_LATEST_COMMIT=${MUSARE_DEBUG_GIT_LATEST_COMMIT:-true}
+      - MUSARE_DEBUG_GIT_LATEST_COMMIT_SHORT=${MUSARE_DEBUG_GIT_LATEST_COMMIT_SHORT:-true}
+      - POSTGRES_USERNAME=${POSTGRES_USERNAME}
+      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
+    links:
+      - postgres
+    networks:
+      - backend
+      - proxy
+    stdin_open: true
+    tty: true
+
+  postgres:
+    image: postgres
+    restart: unless-stopped
+    networks:
+      - backend
+    environment:
+      - POSTGRES_DB=musare
+      - POSTGRES_USER=${POSTGRES_USERNAME}
+      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
+    volumes:
+      - pgdata:/var/lib/postgresql/data 
+
   backend:
     build:
       context: .
@@ -80,6 +119,8 @@ networks:
   backend:
 
 volumes:
+  pgdata:
+
   database:
 
   cache:

+ 14 - 0
frontend/nginx.dev.conf

@@ -28,4 +28,18 @@ server {
         rewrite ^/backend/?(.*) /$1 break;
         proxy_pass http://backend:8080; 
     }
+
+    location /api {
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr;
+        proxy_set_header Host $host;
+
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+        proxy_redirect off;
+
+        rewrite ^/api/?(.*) /$1 break;
+        proxy_pass http://server:3030; 
+    }
 }

+ 14 - 0
frontend/nginx.prod.conf

@@ -21,4 +21,18 @@ server {
         rewrite ^/backend/?(.*) /$1 break;
         proxy_pass http://backend:8080; 
     }
+
+    location /api {
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr;
+        proxy_set_header Host $host;
+
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+        proxy_redirect off;
+
+        rewrite ^/api/?(.*) /$1 break;
+        proxy_pass http://server:3030; 
+    }
 }

+ 25 - 7
musare.sh

@@ -122,20 +122,28 @@ runDockerCommand()
         throw "Error: Invalid runDockerCommand input"
     fi
 
-    servicesString=$(handleServices "backend frontend mongo redis" "${@:3}")
+    servicesString=$(handleServices "server postgres backend frontend mongo redis" "${@:3}")
     if [[ ${servicesString:0:1} != 1 ]]; then
-        throw "${servicesString:2}\n${YELLOW}Usage: ${1} [backend, frontend, mongo, redis]"
+        throw "${servicesString:2}\n${YELLOW}Usage: ${1} [server, postgres, backend, frontend, mongo, redis]"
     fi
 
     if [[ ${servicesString:2:4} == "all" ]]; then
         servicesString=""
-        pullServices="mongo redis"
-        buildServices="backend frontend"
+        pullServices="postgres mongo redis"
+        buildServices="server backend frontend"
     else
         servicesString=${servicesString:2}
         pullArray=()
         buildArray=()
 
+        if [[ "${servicesString}" == *server* ]]; then
+            buildArray+=("server")
+        fi
+
+        if [[ "${servicesString}" == *postgres* ]]; then
+            pullArray+=("postgres")
+        fi
+
         if [[ "${servicesString}" == *mongo* ]]; then
             pullArray+=("mongo")
         fi
@@ -198,9 +206,9 @@ getContainerId()
 # Reset services
 handleReset()
 {
-    servicesString=$(handleServices "backend frontend mongo redis" "${@:2}")
+    servicesString=$(handleServices "server postgres backend frontend mongo redis" "${@:2}")
     if [[ ${servicesString:0:1} != 1 ]]; then
-        throw "${servicesString:2}\n${YELLOW}Usage: ${1} [backend, frontend, mongo, redis]"
+        throw "${servicesString:2}\n${YELLOW}Usage: ${1} [server, postgres, backend, frontend, mongo, redis]"
     fi
 
     confirmMessage="${GREEN}Are you sure you want to reset all data"
@@ -234,6 +242,16 @@ attachContainer()
     fi
 
     case $2 in
+        server)
+            echo -e "${YELLOW}Detach with CTRL+P+Q${NC}"
+            ${docker} attach "$containerId"
+            ;;
+
+        postgres)
+            echo -e "${YELLOW}Detach with CTRL+D${NC}"
+            PGPASSWORD="${POSTGRES_PASSWORD}" ${dockerCompose} exec postgres psql "${POSTGRES_USERNAME}" musare
+            ;;
+
         backend)
             echo -e "${YELLOW}Detach with CTRL+P+Q${NC}"
             ${docker} attach "$containerId"
@@ -255,7 +273,7 @@ attachContainer()
             ;;
 
         *)
-            throw "Invalid service ${2}\n${YELLOW}Usage: ${1} [backend, mongo, redis]"
+            throw "Invalid service ${2}\n${YELLOW}Usage: ${1} [postgres, server, backend, mongo, redis]"
             ;;
     esac
 }

+ 22 - 0
server/entrypoint.dev.sh

@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -e
+
+# Install node modules if not found
+if [ ! -d node_modules ]; then
+    npm install
+fi
+
+if [ "${SERVER_DEBUG}" = "true" ]; then
+    export INSPECT_BRK="--inspect-brk=0.0.0.0:${SERVER_DEBUG_PORT:-9228}"
+else
+    export INSPECT_BRK=""
+fi
+
+if [ "${APP_ENV}" = "development" ]; then
+    npm run dev
+else
+    npm run compile
+    npm run migrate
+    npm start
+fi

+ 7 - 0
server/nodemon.json

@@ -0,0 +1,7 @@
+{
+    "ext": "ts,js,json",
+	"stdin": true,
+	"stdout": true,
+	"signal": "SIGUSR2",
+	"exec": "node --require ts-node/register -i ${INSPECT_BRK} src/index.ts"
+}

+ 1 - 1
server/package.json

@@ -35,7 +35,7 @@
   ],
   "main": "lib/client",
   "scripts": {
-    "dev": "nodemon -x ts-node src/index.ts",
+    "dev": "nodemon",
     "compile": "shx rm -rf lib/ && tsc",
     "start": "node lib/",
     "prettier": "npx prettier \"**/*.ts\" --write",