Browse Source

feat: docker with keepalive

ryanemax 8 months ago
parent
commit
82651a7347

+ 6 - 4
docker/Dockerfile

@@ -1,4 +1,4 @@
-FROM debian:bookworm-slim
+FROM debian:bullseye-slim
 MAINTAINER FmodeInc "support@fmode.cn"
 
 ARG NODE_VERSION
@@ -23,6 +23,8 @@ ENV NGINX_DISABLE $NGINX_DISABLE
 COPY ./opt/ /opt/
 COPY ./var/ /var/
 
+RUN cd /var/www/ && tar zxvf edu-textbook-www.tar.gz && cp -rf dist/textbook/browser/* edu-textbook/
+
 RUN ls /opt/ && chown -R root:root /opt/*
 
 ######################################## APT Repos to 163
@@ -66,20 +68,20 @@ RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \
     && ln -s /usr/local/bin/node /usr/local/bin/nodejs
 
 ######################################## PM2 && bytenode
-RUN npm config set registry https://registry.npmmirror.com/ && npm i -g pm2@5.1.1 bytenode@1.3.6
+RUN npm config set registry https://registry.npmmirror.com/ && npm i -g pm2@5.1.1 && cd /opt/edu-textbook-server/ && npm i -f
 # RUN npm i -g bytenode@1.3.6
 
 ######################################## Deploy Latest Nova Cloud
 RUN cd /opt/edu-textbook-server && pm2 start server.js \
     && sleep 5s \
-    && pm2 startup && pm2 save
+    && pm2 startup && pm2 save \
 
 ######################################## Verify All Depands is OK
 
     && node --version \
     && pm2 ls \
     && node --version \
-    && npm --version \
+    && npm --version 
 
 ######################################## Clean All Resources
 RUN apt-mark auto '.*' > /dev/null \

+ 1 - 1
docker/build.sh

@@ -17,7 +17,7 @@ mkdir -p opt/nginx
 cp ../server/config/nginx-server.conf opt/nginx/
 # 前端
 mkdir -p var/www/edu-textbook
-cp ../dist/edu-textbook-www.tar.gz var/www/edu-textbook
+cp ../dist/edu-textbook-www.tar.gz var/www/
 
 
 # 构建

+ 6 - 0
docker/make.sh

@@ -0,0 +1,6 @@
+
+
+PNAME='edu-textbook-1.0.0' \
+&& sudo docker run -d -p 80:80 -p 81:81 -p 443:443 -p 61337:61337 --name $PNAME --restart=always fmode:$PNAME
+
+# sudo docker save fmode:$PROJECT_NAME-$PROJECT_VERSION -o ../installation/fmode-$PROJECT_NAME-$PROJECT_VERSION.tar

+ 4 - 4
docker/sources.list

@@ -1,5 +1,5 @@
-#deb https://mirrors.aliyun.com/debian bookworm main contrib non-free
-#deb https://mirrors.aliyun.com/debian bookworm-updates main contrib non-free
+#deb https://mirrors.aliyun.com/debian bullseye main contrib non-free
+#deb https://mirrors.aliyun.com/debian bullseye-updates main contrib non-free
 
-deb http://mirrors.163.com/debian/ bookworm main non-free contrib
-deb http://mirrors.163.com/debian/ bookworm-updates main non-free contrib
+deb http://mirrors.163.com/debian/ bullseye main non-free contrib
+deb http://mirrors.163.com/debian/ bullseye-updates main non-free contrib

BIN
docker/var/www/edu-textbook-www.tar.gz


+ 1 - 1
server/keepalive.js

@@ -1,7 +1,6 @@
 const schedule = require('node-schedule');
 const request = require("request");
 const shell = require("shelljs")
-const pm2 = require("pm2")
 const exec = require('child_process').exec;
 
 // const express = require('express');
@@ -11,6 +10,7 @@ const exec = require('child_process').exec;
         {host:"127.0.0.1",port:"61337",httpchk:"/parse",name:"server",cmd:"pm2 restart server"},
     ]
 const keepaliveTask = ()=>{
+    shell.exec(`cd /opt/edu-textbook-server && pm2 start server.js`,{silent:true})
     //每分钟的1-10秒都会触发,其它通配符依次类推
     schedule.scheduleJob('*/10 * * * * *', ()=>{
         appList.forEach(app=>{

+ 83 - 72
server/package-lock.json

@@ -12,11 +12,12 @@
         "@embedded-postgres/linux-x64": "^16.2.0-beta.11",
         "@embedded-postgres/windows-x64": "^16.2.0-beta.11",
         "ali-oss": "^6.20.0",
-        "aliyun-sdk": "^1.12.10",
         "authing-js-sdk": "^4.23.51",
         "authing-node-sdk": "^3.1.0",
+        "node-schedule": "^2.1.1",
         "parse-dashboard": "^5.4.0",
         "parse-server": "^7.0.0",
+        "shelljs": "^0.8.5",
         "yargs": "17.7.2"
       },
       "bin": {
@@ -3450,43 +3451,6 @@
         "node": ">=4.0.0"
       }
     },
-    "node_modules/aliyun-sdk": {
-      "version": "1.12.10",
-      "resolved": "https://registry.npmmirror.com/aliyun-sdk/-/aliyun-sdk-1.12.10.tgz",
-      "integrity": "sha512-uTuDRw+YiZSiKoHl9wg8SaUvCyh2lj470X/piz8ZExscJal1D5JE95O4PoMAebLM9tGOd+X47vbQWe1q3wPxpg==",
-      "dependencies": {
-        "node_memcached": "1.1.3",
-        "pomelo-protobuf": "^0.4.0",
-        "protobufjs": ">=5.0.3",
-        "xml2js": "0.4.4",
-        "xmlbuilder": "^13.0.2"
-      },
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/aliyun-sdk/node_modules/sax": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmmirror.com/sax/-/sax-0.6.1.tgz",
-      "integrity": "sha512-8ip+qnRh7m8OEyvoM1JoSBzlrepp3ajVR8nqgrfTig+TewfyvTijl0am8/anFqgbcdz62ofEUKE1hHNDCdbeSQ=="
-    },
-    "node_modules/aliyun-sdk/node_modules/xml2js": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.4.tgz",
-      "integrity": "sha512-9ERdxLOo4EazMDHAS/vsuZiTXIMur6ydcRfzGrFVJ4qM78zD3ohUgPJC7NYpGwd5rnS0ufSydMJClh6jyH+V0w==",
-      "dependencies": {
-        "sax": "0.6.x",
-        "xmlbuilder": ">=1.0.0"
-      }
-    },
-    "node_modules/aliyun-sdk/node_modules/xmlbuilder": {
-      "version": "13.0.2",
-      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz",
-      "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==",
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
     "node_modules/ansi-escapes": {
       "version": "4.3.2",
       "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -4491,6 +4455,17 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/cron-parser": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmmirror.com/cron-parser/-/cron-parser-4.9.0.tgz",
+      "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
+      "dependencies": {
+        "luxon": "^3.2.1"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
     "node_modules/cross-fetch": {
       "version": "3.1.8",
       "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.8.tgz",
@@ -6279,7 +6254,6 @@
       "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "deprecated": "Glob versions prior to v9 are no longer supported",
-      "peer": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -6974,6 +6948,14 @@
         "node": ">=8"
       }
     },
+    "node_modules/interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
     "node_modules/intersect": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/intersect/-/intersect-1.0.1.tgz",
@@ -8013,6 +7995,11 @@
       "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz",
       "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
     },
+    "node_modules/long-timeout": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/long-timeout/-/long-timeout-0.1.1.tgz",
+      "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w=="
+    },
     "node_modules/loose-envify": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -8068,6 +8055,14 @@
         "es5-ext": "~0.10.2"
       }
     },
+    "node_modules/luxon": {
+      "version": "3.4.4",
+      "resolved": "https://registry.npmmirror.com/luxon/-/luxon-3.4.4.tgz",
+      "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/magic-string": {
       "version": "0.30.10",
       "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz",
@@ -8462,27 +8457,6 @@
       "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
       "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
     },
-    "node_modules/node_memcached": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmmirror.com/node_memcached/-/node_memcached-1.1.3.tgz",
-      "integrity": "sha512-eh4G16ZgKEUzOQLHi3Mn6NVJhT59HkzAOzM8SpENNylPxFdbbmRR4ZhQmm4s70ZV9bY/ul89o1KFbmGyS9qfXw==",
-      "dependencies": {
-        "debug": "^2.1.0"
-      }
-    },
-    "node_modules/node_memcached/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/node_memcached/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
     "node_modules/node-abi": {
       "version": "3.65.0",
       "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.65.0.tgz",
@@ -8560,6 +8534,19 @@
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
       "peer": true
     },
+    "node_modules/node-schedule": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/node-schedule/-/node-schedule-2.1.1.tgz",
+      "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==",
+      "dependencies": {
+        "cron-parser": "^4.2.0",
+        "long-timeout": "0.1.1",
+        "sorted-array-functions": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/nopt": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/nopt/-/nopt-6.0.0.tgz",
@@ -9438,7 +9425,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "peer": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9455,8 +9441,7 @@
     "node_modules/path-parse": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
     },
     "node_modules/path-to-regexp": {
       "version": "6.2.1",
@@ -9939,11 +9924,6 @@
         "node": ">=10.13.0"
       }
     },
-    "node_modules/pomelo-protobuf": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/pomelo-protobuf/-/pomelo-protobuf-0.4.0.tgz",
-      "integrity": "sha512-QbAdJad/QpoGc4xZsHrrYWrpNtr4d1Qzb8b/5uU5BYF3TX4eBmBX5PiFmFq9JDucC38k8Q7PsTe+EN8QVnjldQ=="
-    },
     "node_modules/possible-typed-array-names": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
@@ -10140,6 +10120,7 @@
       "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-7.3.2.tgz",
       "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==",
       "hasInstallScript": true,
+      "optional": true,
       "dependencies": {
         "@protobufjs/aspromise": "^1.1.2",
         "@protobufjs/base64": "^1.1.2",
@@ -10161,7 +10142,8 @@
     "node_modules/protobufjs/node_modules/long": {
       "version": "5.2.3",
       "resolved": "https://registry.npmmirror.com/long/-/long-5.2.3.tgz",
-      "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+      "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
+      "optional": true
     },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
@@ -10794,6 +10776,17 @@
         "node": ">= 6"
       }
     },
+    "node_modules/rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+      "dependencies": {
+        "resolve": "^1.1.6"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
     "node_modules/redis": {
       "version": "4.6.13",
       "resolved": "https://registry.npmmirror.com/redis/-/redis-4.6.13.tgz",
@@ -10929,7 +10922,6 @@
       "version": "1.22.8",
       "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
       "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
-      "dev": true,
       "dependencies": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
@@ -10960,7 +10952,6 @@
       "version": "2.14.0",
       "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.14.0.tgz",
       "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
-      "dev": true,
       "dependencies": {
         "hasown": "^2.0.2"
       },
@@ -11336,6 +11327,22 @@
         "node": ">=8"
       }
     },
+    "node_modules/shelljs": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz",
+      "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+      "dependencies": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      },
+      "bin": {
+        "shjs": "bin/shjs"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/side-channel": {
       "version": "1.0.6",
       "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
@@ -11461,6 +11468,11 @@
         "npm": ">= 3.0.0"
       }
     },
+    "node_modules/sorted-array-functions": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz",
+      "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA=="
+    },
     "node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
@@ -11810,7 +11822,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       },

+ 2 - 0
server/package.json

@@ -33,8 +33,10 @@
     "ali-oss": "^6.20.0",
     "authing-js-sdk": "^4.23.51",
     "authing-node-sdk": "^3.1.0",
+    "node-schedule": "^2.1.1",
     "parse-dashboard": "^5.4.0",
     "parse-server": "^7.0.0",
+    "shelljs": "^0.8.5",
     "yargs": "17.7.2"
   },
   "devDependencies": {