Преглед на файлове

Building a Docker container with static webapp and websocket backend for collab plugin works

Joeri Exelmans преди 3 години
родител
ревизия
0aa4696a20
променени са 4 файла, в които са добавени 25 реда и са изтрити 13 реда
  1. 8 2
      nix/default.nix
  2. 1 1
      nix/server-builder.sh
  3. 4 6
      scripts/dev_server.sh
  4. 12 4
      src/collab/server/run_server.js

+ 8 - 2
nix/default.nix

@@ -46,6 +46,8 @@ in rec {
     PYTHONPATH = sccd.outPath;
   };
 
+  # build static web app - can host this with any static file server (e.g. nginx, apache, ...)
+  # 'collab' plugin requires a special backend server though.
   staticWebApp = derivation {
     name = "drawio-static";
     system = builtins.currentSystem;
@@ -57,6 +59,7 @@ in rec {
     args = [ ./static-webapp-builder.sh ];
   };
 
+  # build a Node-based web server that hosts the application (statically) and also runs a websocket endpoint for the 'collab' plugin.
   server = derivation {
     name = "drawio-server";
     system = builtins.currentSystem;
@@ -72,11 +75,14 @@ in rec {
     args = [ ./server-builder.sh ];
   };
 
+  # build a Docker container with everything cooked in.
   dockerServer = pkgs.dockerTools.buildImage {
     name = "drawio-server";
-    # contents = ;
+    contents = server;
     config = {
-      Cmd = [ "node" ];
+      Cmd = [ "bin/drawioserver" "--state-dir" "/state"];
+      Volumes = { "/state" = {}; };
+      ExposedPorts = { "8700/tcp" = {}; };
     };
   };
 }

+ 1 - 1
nix/server-builder.sh

@@ -13,7 +13,7 @@ ln -s $src $out/src/run_server.js # copy our server script to output directory
 echo "#!$builder
 export NODE_PATH=$NODE_PATH:$node_path
 cd $staticWebApp # serve this directory statically
-$node/bin/node $out/src/run_server.js
+$node/bin/node $out/src/run_server.js \$*
 " > $out/bin/$EXECUTABLE
 
 chmod +x $out/bin/$EXECUTABLE

+ 4 - 6
scripts/dev_server.sh

@@ -5,12 +5,10 @@
 # Run with:
 #   nix-shell --run scripts/dev_server.sh
 
-export DRAWIOSTATEDIR=/tmp/drawio_dev_server_state
-rm -r $DRAWIOSTATEDIR
-mkdir $DRAWIOSTATEDIR
-
-export DRAWIOVERBOSE=1
+STATEDIR=/tmp/drawio_dev_server_state
+rm -r $STATEDIR
+mkdir $STATEDIR
 
 pushd src/main/webapp # serve this directory
-node ../../collab/server/run_server.js
+DRAWIOVERBOSE=1 node ../../collab/server/run_server.js --state-dir=$STATEDIR
 popd

+ 12 - 4
src/collab/server/run_server.js

@@ -1,7 +1,17 @@
 // NodeJS script
 
-if (process.env.DRAWIOSTATEDIR === undefined) {
-  throw new Error("Refusing to start without DRAWIOSTATEDIR environment variable set.");
+let stateDir;
+process.argv.forEach((argv, i) => {
+  if (argv === "--state-dir") {
+    if (process.argv.length > i+1) {
+      stateDir = process.argv[i+1];
+      return;
+    }
+  }
+});
+
+if (stateDir === undefined) {
+  throw new Error("Refusing to start without --state-dir argument.");
 }
 
 const verbose = (process.env.DRAWIOVERBOSE === '1');
@@ -18,8 +28,6 @@ const IDLENGTH = 36; // UUID v4
 
 const port = process.env.DRAWIOPORT || 8700;
 
-const stateDir = process.env.DRAWIOSTATEDIR;
-
 process.stdout.write("Using stateDir " + stateDir);
 console.log(stateDir);