diff --git a/Dockerfile b/Dockerfile
index c0452f12b36c04489229a5a11a5bb2f02e8974c7..a443b2c27cd9ac455885f9e50b792a7adb1bbe8f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,4 @@
+
 FROM centos:7
 
 ENV LC_ALL en_US.utf8
diff --git a/Dockerfile.vnet_router0 b/Dockerfile.vnet_router0
deleted file mode 120000
index b2e9ee37fc55ed4077ddc9895c5bdcd5f3d0741c..0000000000000000000000000000000000000000
--- a/Dockerfile.vnet_router0
+++ /dev/null
@@ -1 +0,0 @@
-router-container/Dockerfile
\ No newline at end of file
diff --git a/Dockerfile.centos.base b/Dockerfiles.d/Dockerfile.centos.base
similarity index 80%
rename from Dockerfile.centos.base
rename to Dockerfiles.d/Dockerfile.centos.base
index 824d419f1c8e0c11269f97d67cbc640e1237ff7a..85260aabf7e6dcb514a0beaab9d4a9d61a89f146 100644
--- a/Dockerfile.centos.base
+++ b/Dockerfiles.d/Dockerfile.centos.base
@@ -1,5 +1,5 @@
 
-#use: docker build -f Dockerfile.centos.base -t fodpy3_base .
+#use (from main dir): docker build -f ./Dockerfiles.d/Dockerfile.centos.base -t fodpy3_base . && docker build -f ./Dockerfiles.d/Dockerfile.centos.step2 -t fodpy3 .
 
 FROM centos:7
 
diff --git a/Dockerfile.centos.step2 b/Dockerfiles.d/Dockerfile.centos.step2
similarity index 78%
rename from Dockerfile.centos.step2
rename to Dockerfiles.d/Dockerfile.centos.step2
index 247653110cdb408d84641385aa7d438fbf327c24..23095bedd27e2ab460a3fc57f246b30f322fe8d4 100644
--- a/Dockerfile.centos.step2
+++ b/Dockerfiles.d/Dockerfile.centos.step2
@@ -1,5 +1,5 @@
 
-#use: cd /root/FOD && docker build -f Dockerfile.centos.base -t fodpy3_base . ; cd /root/FOD && docker build -f Dockerfile.centos.step2 -t fodpy3 .
+#use (from main dir): docker build -f ./Dockerfiles.d/Dockerfile.centos.base -t fodpy3_base . && docker build -f ./Dockerfiles.d/Dockerfile.centos.step2 -t fodpy3 .
 
 #FROM centos:7
 FROM fodpy3_base
diff --git a/Dockerfiles.d/Dockerfile.centos.supervisord.base b/Dockerfiles.d/Dockerfile.centos.supervisord.base
new file mode 100644
index 0000000000000000000000000000000000000000..04bc300d5c83a239a2ccc64297bffb6e450b6cad
--- /dev/null
+++ b/Dockerfiles.d/Dockerfile.centos.supervisord.base
@@ -0,0 +1,36 @@
+
+#use (from main dir): docker build -f ./Dockerfiles.d/Dockerfile.centos.supervisord.base -t fodpy3_base . && docker build -f ./Dockerfiles.d/Dockerfile.centos.supervisord.step2 -t fodpy3 .
+
+##
+
+#docker_label: fodpy3_base
+#dockerbuild_sticky: 0
+
+FROM centos:7
+
+##
+
+ENV LC_ALL en_US.utf8
+
+RUN yum -y install procps
+
+RUN mkdir -p /var/log/fod /srv
+#COPY . /srv/flowspy
+COPY install-centos.sh requirements.txt /srv/flowspy/
+
+RUN (cd /srv/flowspy; ./install-centos.sh --basesw;)
+
+#  echo "To set environment to English, run: export LC_ALL=en_US"
+#  echo "To activate virualenv: source /srv/venv/bin/activate"
+#  echo "To create a user run: cd /srv/flowspy; ./manage.py createsuperuser"
+#  echo "To start flowspy server: cd /srv/flowspy; ./manage.py runserver 0.0.0.0:8000"
+#  echo "To start celeryd: cd /srv/flowspy; ./manage.py celeryd"
+
+RUN yum install -y supervisor
+RUN yum install -y net-utils lsof w3m links lynx curl wget
+
+#EXPOSE 8000
+
+#CMD [ "/srv/flowspy/runfod.sh" ]
+CMD [ "sleep" "10000000" ]
+
diff --git a/Dockerfiles.d/Dockerfile.centos.supervisord.step2 b/Dockerfiles.d/Dockerfile.centos.supervisord.step2
new file mode 100644
index 0000000000000000000000000000000000000000..4c0a5aa1f7d4aee33d2db0a6f14727d30a279218
--- /dev/null
+++ b/Dockerfiles.d/Dockerfile.centos.supervisord.step2
@@ -0,0 +1,44 @@
+
+#use (from main dir): docker build -f ./Dockerfiles.d/Dockerfile.centos.supervisord.base -t fodpy3_base . && docker build -f ./Dockerfiles.d/Dockerfile.centos.supervisord.step2 -t fodpy3 .
+
+##
+
+#docker_label: fodpy3
+
+##
+
+#FROM centos:7
+
+FROM fodpy3_base
+#dockerbase_dockerfile: Dockerfile.centos.supervisord.base
+
+##
+
+ENV LC_ALL en_US.utf8
+
+#RUN yum -y install procps
+
+RUN mkdir -p /var/log/fod /srv
+COPY . /srv/flowspy
+
+RUN useradd -m fod
+#RUN chown -R fod: /srv/flowspy
+
+RUN (cd /srv/flowspy; ./install-centos.sh --fodproper;)
+
+RUN chown -R fod: /srv/flowspy
+
+#  echo "To set environment to English, run: export LC_ALL=en_US"
+#  echo "To activate virualenv: source /srv/venv/bin/activate"
+#  echo "To create a user run: cd /srv/flowspy; ./manage.py createsuperuser"
+#  echo "To start flowspy server: cd /srv/flowspy; ./manage.py runserver 0.0.0.0:8000"
+#  echo "To start celeryd: cd /srv/flowspy; ./manage.py celeryd"
+
+EXPOSE 8000
+
+RUN yum -y install supervisor
+COPY supervisord.conf /etc/supervisord.conf
+
+#CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"
+CMD [ "/srv/flowspy/runfod-supervisord.sh" ]
+
diff --git a/Dockerfile.debian b/Dockerfiles.d/Dockerfile.debian
similarity index 100%
rename from Dockerfile.debian
rename to Dockerfiles.d/Dockerfile.debian
diff --git a/Dockerfile.debian.base b/Dockerfiles.d/Dockerfile.debian.supervisord.base
similarity index 59%
rename from Dockerfile.debian.base
rename to Dockerfiles.d/Dockerfile.debian.supervisord.base
index ddc2bef9f9cfc9211745b007c1241a415d62fbdc..de33469a83bf81f9c62afa603dc1760447df7d99 100644
--- a/Dockerfile.debian.base
+++ b/Dockerfiles.d/Dockerfile.debian.supervisord.base
@@ -1,3 +1,8 @@
+
+#use (from main dir): docker build -f ./Dockerfiles.d/Dockerfile.debian.supervisor.base -t fodpy3_base . && docker build -f ./Dockerfiles.d/Dockerfile.debian.supervisor.step2 -t fodpy3 .
+
+#docker_label: fodpy3_base-debian
+
 FROM debian:buster
 
 ENV LC_ALL en_US.utf8
@@ -17,6 +22,10 @@ RUN apt-get -qqy install patch
 #RUN (cd /srv/flowspy; ./install-debian.sh;)
 RUN (cd /srv/flowspy; ./install-debian.sh --basesw;)
 
+RUN apt-get -qqy install supervisor
+#RUN apt-get -qqy install net-utils lsof w3m links lynx curl wget
+RUN apt-get -qqy install lsof w3m links lynx curl wget
+
 #EXPOSE 8000
 
 #CMD [ "/srv/flowspy/runfod.sh" ]
diff --git a/Dockerfile.debian.step2 b/Dockerfiles.d/Dockerfile.debian.supervisord.step2
similarity index 59%
rename from Dockerfile.debian.step2
rename to Dockerfiles.d/Dockerfile.debian.supervisord.step2
index fd038da1e71aefa1bbda7ab85bdba58596cb5bba..529c9356394f5c180de4044e40f174a2158b5afe 100644
--- a/Dockerfile.debian.step2
+++ b/Dockerfiles.d/Dockerfile.debian.supervisord.step2
@@ -1,5 +1,9 @@
+
+#use (from main dir): docker build -f ./Dockerfiles.d/Dockerfile.debian.supervisor.base -t fodpy3_base . && docker build -f ./Dockerfiles.d/Dockerfile.debian.supervisor.step2 -t fodpy3 .
+
 #FROM debian:buster
 FROM fodpy3-debian_base
+#dockerbase_dockerfile: Dockerfile.debian.supervisord.base
 
 ENV LC_ALL en_US.utf8
 
@@ -22,5 +26,9 @@ EXPOSE 8000
 
 WORKDIR /srv/flowspy
 
-CMD [ "/srv/flowspy/runfod.sh" ]
+RUN apt-get -qqy install supervisor
+COPY supervisord.conf /etc/supervisord.conf
+
+#CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"
+CMD [ "/srv/flowspy/runfod-supervisord.sh" ]
 
diff --git a/Dockerfiles.d/Dockerfile.vnet_router0 b/Dockerfiles.d/Dockerfile.vnet_router0
new file mode 120000
index 0000000000000000000000000000000000000000..0fc5d609a4b088f0232a686ea240a800d2ed64c0
--- /dev/null
+++ b/Dockerfiles.d/Dockerfile.vnet_router0
@@ -0,0 +1 @@
+../router-container/Dockerfile
\ No newline at end of file
diff --git a/Dockerfile.vnet_router0a b/Dockerfiles.d/Dockerfile.vnet_router0a
similarity index 95%
rename from Dockerfile.vnet_router0a
rename to Dockerfiles.d/Dockerfile.vnet_router0a
index 77a2d9432ad5a65dd58d2571d228fdf3e842d6f8..74f8ee75b0abb05a3f98e0c97c7734eeb5fcf562 100644
--- a/Dockerfile.vnet_router0a
+++ b/Dockerfiles.d/Dockerfile.vnet_router0a
@@ -4,7 +4,7 @@
 # instructions:
 
 # 1. build container, e.g., by: 
-#> docker build -f Dockerfile.vnet_router0a -t vnet0a .
+#> docker build -f ./Dockerfiles.d/Dockerfile.vnet_router0a -t vnet0a . # run from main dir
 
 #> docker run -t -i vnet0a
 
diff --git a/Dockerfile.vnet_router1 b/Dockerfiles.d/Dockerfile.vnet_router1
similarity index 97%
rename from Dockerfile.vnet_router1
rename to Dockerfiles.d/Dockerfile.vnet_router1
index 1971d94f64422c47bfe5fb3214b4cf24ea3a23ad..3d112b56087d76ea10112cbbc8b9cbf8ecd1bcd6 100644
--- a/Dockerfile.vnet_router1
+++ b/Dockerfiles.d/Dockerfile.vnet_router1
@@ -4,7 +4,7 @@
 # instructions:
 
 # 1. build container, e.g., by: 
-#> docker build -f Dockerfile.vnet_router1 -t vnet .
+#> docker build -f ./Dockerfiles.d/Dockerfile.vnet_router1 -t vnet . # run from main dir
 
 # 2. before running container make sure openvswitch module is loaded in kernel (modprobe openvswitch) and run container with --privileged (needed for openvswitch inside container)
 #> modprobe openvswitch
diff --git a/Dockerfile.vnet_router2 b/Dockerfiles.d/Dockerfile.vnet_router2
similarity index 97%
rename from Dockerfile.vnet_router2
rename to Dockerfiles.d/Dockerfile.vnet_router2
index a2233124d22a10a8c5f6331879b76690b374d73a..cd9ecd21be022f36f414a4e9f951ba86d9836d7d 100644
--- a/Dockerfile.vnet_router2
+++ b/Dockerfiles.d/Dockerfile.vnet_router2
@@ -4,7 +4,7 @@
 # instructions:
 
 # 1. build container, e.g., by: 
-#> docker build -f Dockerfile.vnet_router2 -t vnet2 .
+#> docker build -f ./Dockerfiles.d/Dockerfile.vnet_router2 -t vnet2 . # run from main dir
 
 # 2. before running container make sure openvswitch module is loaded in kernel (modprobe openvswitch) and run container with --privileged (needed for openvswitch inside container)
 #> modprobe openvswitch
diff --git a/doc/installation/v1.7/docker.md b/doc/installation/v1.7/docker.md
index cbe81083dd9cfc5036db4c820aaae118ae26063a..5419a79c369044dc2baac542ddcf3789809bda19 100644
--- a/doc/installation/v1.7/docker.md
+++ b/doc/installation/v1.7/docker.md
@@ -106,6 +106,8 @@ without an actual effect on any network, but FoD functionality of controlling ru
 
 similar to router-container/Dockerfile but will use netconfd (DEBIAN package) instead of CESNET's netopeer NETCONF server
 
+./Dockerfiles.d/Dockerfile.vnet_router0a : 
+
 ### NETCONF test server docker container extended to virtual DDoS test network
 
 Based on an instance of the NETCONF test server docker container
@@ -117,8 +119,8 @@ SNMPd and a Perl SNMPd statistic collector script
 
 Yields a more complete simulation of a router for FoD.
 
-Dockerfile.vnet_router1 : 
-Dockerfile.vnet_router2 : similar to Dockerfile.vnet_router1, but will use netconfd (DEBIAN package) instead of CESNET's netopeer NETCONF server
+./Dockerfiles.d/Dockerfile.vnet_router1 : 
+./Dockerfiles.d/Dockerfile.vnet_router2 : similar to Dockerfile.vnet_router1, but will use netconfd (DEBIAN package) instead of CESNET's netopeer NETCONF server
 (instructions how to build and run inside the Dockerfiles)
 
 
diff --git a/install-debian.sh b/install-debian.sh
index 831c62399e8724eed54977407aead46dc2fda0b3..2d573227127d4bfe36569fa9acc5a2d42324b651 100755
--- a/install-debian.sh
+++ b/install-debian.sh
@@ -4,22 +4,71 @@
 # with Celery, Redis, and sqlite.
 #
 
+fod_dir="/srv/flowspy"
+venv_dir="/srv/venv"
+
 install_basesw=1
 install_fodproper=1
-if [ $# -ge 1 -a "$1" = "--both" ]; then
-  shift 1
-  install_basesw=1
-  install_fodproper=1
-elif [ $# -ge 1 -a "$1" = "--basesw" ]; then 
-  shift 1
-  install_basesw=1
-  install_fodproper=0
-elif [ $# -ge 1 -a "$1" = "--fodproper" ]; then
-  shift 1
-  install_basesw=0
-  install_fodproper=1
+
+#
+
+while [ $# -gt 0 ]; do
+
+  if [ $# -ge 1 -a "$1" = "--here" ]; then
+    shift 1
+    fod_dir="$PWD"
+    venv_dir="$PWD/venv"
+  elif [ $# -ge 1 -a "$1" = "--base_dir" ]; then
+    shift 1
+    base_dir="$1"
+    shift 1
+    fod_dir="$base_dir/flowspy"
+    venv_dir="$base_dir/venv"
+  elif [ $# -ge 1 -a "$1" = "--fod_dir" ]; then
+    shift 1
+    fod_dir="$1"
+    shift 1
+  elif [ $# -ge 1 -a "$1" = "--venv_dir" ]; then
+    shift 1
+    venv_dir="$1"
+    shift 1
+  elif [ $# -ge 1 -a "$1" = "--both" ]; then
+    shift 1
+    install_basesw=1
+    install_fodproper=1
+  elif [ $# -ge 1 -a "$1" = "--basesw" ]; then 
+    shift 1
+    install_basesw=1
+    install_fodproper=0
+  elif [ $# -ge 1 -a "$1" = "--fodproper" ]; then
+    shift 1
+    install_basesw=0
+    install_fodproper=1
+  else
+    break
+  fi
+
+done
+
+##
+  
+venv_dir_base="$(dirname "$venv_dir")"
+
+static_dir="$fod_dir/static"
+	
+inst_dir="$(dirname "$0")"
+
+mkdir -p "$fod_dir" || exit
+
+if [ "$(stat -Lc "%i" "$inst_dir/" "$fod_dir/" | sort -n -k 1 -u | wc -l)" = "1" ]; then
+  inst_dir_is_fod_dir=1
+else
+  inst_dir_is_fod_dir=0
 fi
 
+echo "$0: inst_dir=$inst_dir fod_dir=$fod_dir => inst_dir_is_fod_dir=$inst_dir_is_fod_dir venv_dir=$venv_dir static_dir=$static_dir" 1>&2
+#exit
+
 ##
 
 if [ "$install_basesw" = 1 ]; then
@@ -42,54 +91,93 @@ if [ "$install_fodproper" = 0 ]; then
 
   echo "Setup partial python environment for FoD"
 
-  mkdir -p /srv
-  pyvenv /srv/venv
-  source /srv/venv/bin/activate
+  #mkdir -p /srv
+  mkdir -p "$venv_dir_base"
+  if [ -x pyvenv ]; then
+    #pyvenv /srv/venv
+    pyvenv "$venv_dir"
+  else
+    #virtualenv /srv/venv
+    virtualenv "$venv_dir"
+  fi
+  ln -sf "$venv_dir" "$fod_dir/venv"
+
+  #source /srv/venv/bin/activate
+  source "$venv_dir/bin/activate"
+
   pip install wheel
   pip install -r requirements.txt
 
 else 
 
   echo "Setup python environment for FoD"
-  mkdir -p /var/log/fod /srv
-  pyvenv /srv/venv
+  #mkdir -p /var/log/fod /srv
+  mkdir -p /var/log/fod "$venv_dir_base"
+  if [ -x pyvenv ]; then
+    #pyvenv /srv/venv
+    pyvenv "$venv_dir"
+  else
+    #virtualenv /srv/venv
+    virtualenv "$venv_dir"
+  fi
+  ln -sf "$venv_dir" "$fod_dir/venv"
   (
         set +e
-	source /srv/venv/bin/activate
-	mkdir -p /srv/flowspy/
-
-	# Select source dir and copy FoD into /srv/flowspy/
-	if [ "`basename "$0"`" = install-centos.sh ]; then
-		# this script is in the source directory
-		cp -f -r "`dirname $0`"/* /srv/flowspy/
-	elif [ -e /vagrant ]; then
-		# vagrant's copy in /vagrant/
-		cp -f -r /vagrant/* /srv/flowspy/
-	elif [ -e ./install-centos.sh ]; then
-		# current directory is with the sourcecode
-		cp -f -r ./* /srv/flowspy/
-	else
-		echo "Could not find FoD src directory tried `dirname $0`, /vagrant/, ./"
-		exit 1
-	fi
+	#source /srv/venv/bin/activate
+	source "$venv_dir/bin/activate"
+	#mkdir -p /srv/flowspy/
+	mkdir -p "$fod_dir"
+
+	if [ "$inst_dir_is_fod_dir" = 0 ]; then
+
+    	  # Select source dir and copy FoD into /srv/flowspy/
+    	  if [ "`basename "$0"`" = install-debian.sh ]; then
+    		# this script is in the source directory
+    		#cp -f -r "`dirname $0`"/* /srv/flowspy/
+     		cp -f -r "$inst_dir"/* "$fod_dir"
+      	  elif [ -e /vagrant ]; then
+    		# vagrant's copy in /vagrant/
+    		#cp -f -r /vagrant/* /srv/flowspy/
+    		cp -f -r /vagrant/* "$fod_dir"
+    	  elif [ -e ./install-centos.sh ]; then
+    		# current directory is with the sourcecode
+    		#cp -f -r ./* /srv/flowspy/
+    		cp -f -r ./* "$fod_dir"
+    	  else
+    		echo "Could not find FoD src directory tried `dirname $0`, /vagrant/, ./"
+    		exit 1
+    	  fi
+
+    	fi
+
+	find "$fod_dir/" -not -user fod -exec chown -v fod: {} \;
 
 	set -e
 	
-	cd /srv/flowspy/
+	#cd /srv/flowspy/
+	cd "$fod_dir"
 	(
 		cd flowspy
 		cp -f settings.py.dist settings.py
 		patch settings.py < settings.py.patch
+	        
+		sed -i "s#/srv/flowspy#$fod_dir#" "settings.py"
 	)
 	pip install -r requirements.txt
 
 	touch flowspy/settings_local.py
 
 	#./manage.py syncdb --noinput
-	mkdir -p /srv/flowspy/static/
+	#mkdir -p /srv/flowspy/static/
+	mkdir -p "$static_dir"
 	./manage.py collectstatic --noinput
 	./manage.py migrate
 	./manage.py loaddata initial_data
+
+	mkdir -p "$fod_dir/log" "$fod_dir/logs"
+	chown -R fod: "$fod_dir/log" "$fod_dir/logs"
+
+	sed -i "s#/srv/flowspy#$fod_dir#" "$fod_dir/supervisord.conf"
   )
 
   set +e
diff --git a/runfod-supervisord.sh b/runfod-supervisord.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e7dab72a5640d2a3e2b3ca243edbb5ff35776e6a
--- /dev/null
+++ b/runfod-supervisord.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+
+export LC_ALL="C" # this will unfortunatelly break ./manage.py createsuperuser as locale string is literally used to derive encoding
+
+##
+
+#fod_dir="/srv/flowspy"
+#venv_dir="/srv/venv"
+
+fod_dir="$(dirname "$0")"
+venv_dir="$fod_dir/venv"
+
+echo "$0: ini fod_dir=$fod_dir venv_dir=$venv_dir" 1>&2
+
+#
+
+while [ $# -gt 0 ]; do
+
+  if [ $# -ge 1 -a "$1" = "--here" ]; then
+    shift 1
+    fod_dir="$PWD"
+    venv_dir="$PWD/venv"
+  elif [ $# -ge 1 -a "$1" = "--base_dir" ]; then
+    shift 1
+    base_dir="$1"
+    shift 1
+    fod_dir="$base_dir/flowspy"
+    venv_dir="$base_dir/venv"
+  elif [ $# -ge 1 -a "$1" = "--fod_dir" ]; then
+    shift 1
+    fod_dir="$1"
+    shift 1
+  elif [ $# -ge 1 -a "$1" = "--venv_dir" ]; then
+    shift 1
+    venv_dir="$1"
+    shift 1
+  else
+    break
+  fi
+
+done
+
+##
+
+#. /srv/venv/bin/activate
+. "$venv_dir/bin/activate"
+
+#if [ ! -e /srv/flowspy/pythonenv ]; then
+if [ ! -e "$fod_dir/pythonenv" ]; then
+  #cat > /srv/flowspy/pythonenv <<EOF
+  cat > "$fod_dir/pythonenv" <<EOF
+#!/bin/bash
+. "$venv_dir/bin/activate"
+exec "\$@"
+EOF
+  #chmod +x /srv/flowspy/pythonenv
+  chmod +x "$fod_dir/pythonenv"
+fi
+
+##
+
+cd "$(dirname "$0")"
+
+#if [ ! -x ./fodcli_db_is_mysql ] || ./fodcli_db_is_mysql; then
+#  echo "Starting DB services FoD might be depending on (depending on its config): mysql" 1>&2
+#  systemctl start mysql.service
+#fi
+
+# hook to initiallize (without any user interaction admin user and its peer data)
+[ -x "$fod_dir/fodcli_insert_basic_data.sh" ] && "$fod_dir/fodcli_insert_basic_data.sh"
+
+#echo "starting redis" 1>&2
+#/usr/bin/redis-server &
+
+#echo "Starting FoD celeryd in background" 1>&2
+#celery worker -A flowspy -B --concurrency=2 --detach -l debug -f celery.log
+
+#echo "Starting FoD gunicorn in foreground" 1>&2
+#exec ./manage.py runserver 0.0.0.0:8000 
+#exec ./manage.py runserver 0.0.0.0:8000 --nothreading
+#exec gunicorn -w 1 --limit-request-fields 10000 --worker-class gevent --timeout 30
+#exec gunicorn -b 0.0.0.0:8000 flowspy.wsgi -w 1 --limit-request-fields 10000 --timeout 30
+#exec gunicorn -b 0.0.0.0:8000 flowspy.wsgi -w 1
+#exec gunicorn -b 0.0.0.0:8000 flowspy.wsgi -w 1 -k gevent --limit-request-fields 10000 --timeout 30 #--preload
+#exec gunicorn -b 0.0.0.0:8000 flowspy.wsgi -w 1 -k gevent --limit-request-fields 10000 --timeout 30 
+
+##
+
+if ! which supervisord; then 
+  echo "supervisor not installed, trying to do this" 1>&2
+  if [ -f /etc/debian_version ]; then
+    apt-get install -qqy supervisor
+  else
+    yum install -y supervisor
+  fi
+fi
+
+#useradd -m fod
+(
+  set -x
+  #source /srv/venv/bin/activate
+  source "$venv_dir/bin/activate"
+  #cd /srv/flowspy && ./manage.py collectstatic --noinput
+  cd "$fod_dir" && ./manage.py collectstatic --noinput
+)
+
+# needed for redis
+sysctl vm.overcommit_memory=1
+
+# supervisord.conf
+cp -f supervisord.conf /etc
+
+
+mkdir -p /var/run/fod /var/log/fod
+chown -R fod /var/run/fod /var/log/fod
+mkdir -p log/fod
+mkdir -p logs 
+#chown fod /srv/flowspy /srv/flowspy/log /srv/flowspy/logs /srv/flowspy/log/* /srv/flowspy/logs/* /srv/flowspy/debug.log /srv/flowspy/example-data
+chown fod "$fod_dir" "$fod_dir/log" "$fod_dir/logs" "$fod_dir/log/"* "$fod_dir/logs/"* "$fod_dir/debug.log" "$fod_dir/example-data"
+
+##
+
+mkdir -p /var/run/supervisor
+exec /usr/bin/supervisord -n -c /etc/supervisord.conf
+
diff --git a/runfod.sh b/runfod.sh
index 2516d34e6034e71ce6193de6f7ffcab9d9101dba..06724f96e52cdecff2b710b2a406b10df562f1df 100755
--- a/runfod.sh
+++ b/runfod.sh
@@ -1,15 +1,60 @@
 #!/bin/bash
 
 export LC_ALL="C" # this will unfortunatelly break ./manage.py createsuperuser as locale string is literally used to derive encoding
-. /srv/venv/bin/activate
 
-if [ ! -e /srv/flowspy/pythonenv ]; then
-	cat > /srv/flowspy/pythonenv <<EOF
+##
+
+#fod_dir="/srv/flowspy"
+#venv_dir="/srv/venv"
+
+fod_dir="$(dirname "$0")"
+venv_dir="$fod_dir/venv"
+
+echo "$0: ini fod_dir=$fod_dir venv_dir=$venv_dir" 1>&2
+
+#
+
+while [ $# -gt 0 ]; do
+
+  if [ $# -ge 1 -a "$1" = "--here" ]; then
+    shift 1
+    fod_dir="$PWD"
+    venv_dir="$PWD/venv"
+  elif [ $# -ge 1 -a "$1" = "--base_dir" ]; then
+    shift 1
+    base_dir="$1"
+    shift 1
+    fod_dir="$base_dir/flowspy"
+    venv_dir="$base_dir/venv"
+  elif [ $# -ge 1 -a "$1" = "--fod_dir" ]; then
+    shift 1
+    fod_dir="$1"
+    shift 1
+  elif [ $# -ge 1 -a "$1" = "--venv_dir" ]; then
+    shift 1
+    venv_dir="$1"
+    shift 1
+  else
+    break
+  fi
+
+done
+
+##
+
+#. /srv/venv/bin/activate
+. "$venv_dir/bin/activate"
+
+#if [ ! -e /srv/flowspy/pythonenv ]; then
+if [ ! -e "$fod_dir/pythonenv" ]; then
+  #cat > /srv/flowspy/pythonenv <<EOF
+  cat > "$fod_dir/pythonenv" <<EOF
 #!/bin/bash
-. /srv/venv/bin/activate
+. "$venv_dir/bin/activate"
 exec "\$@"
 EOF
-	chmod +x /srv/flowspy/pythonenv
+  #chmod +x /srv/flowspy/pythonenv
+  chmod +x "$fod_dir/pythonenv"
 fi
 
 ##
@@ -22,7 +67,7 @@ cd "$(dirname "$0")"
 #fi
 
 # hook to initiallize (without any user interaction admin user and its peer data)
-[ -x ./fodcli_insert_basic_data.sh ] && ./fodcli_insert_basic_data.sh
+[ -x "$fod_dir/fodcli_insert_basic_data.sh" ] && "$fod_dir/fodcli_insert_basic_data.sh"
 
 mkdir -p /var/run/fod
 
diff --git a/supervisord.conf b/supervisord.conf
new file mode 100644
index 0000000000000000000000000000000000000000..538daafc5f71189539f3baa011ca8664488a5273
--- /dev/null
+++ b/supervisord.conf
@@ -0,0 +1,143 @@
+; Sample supervisor config file.
+
+[unix_http_server]
+file=/var/run/supervisor/supervisor.sock   ; (the path to the socket file)
+;chmod=0700                 ; sockef file mode (default 0700)
+;chown=nobody:nogroup       ; socket file uid:gid owner
+;username=user              ; (default is no username (open server))
+;password=123               ; (default is no password (open server))
+
+;[inet_http_server]         ; inet (TCP) server disabled by default
+;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
+;username=user              ; (default is no username (open server))
+;password=123               ; (default is no password (open server))
+
+[supervisord]
+logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log)
+logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
+logfile_backups=10          ; (num of main logfile rotation backups;default 10)
+loglevel=info               ; (log level;default info; others: debug,warn,trace)
+pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
+nodaemon=false              ; (start in foreground if true;default false)
+minfds=1024                 ; (min. avail startup file descriptors;default 1024)
+minprocs=200                ; (min. avail process descriptors;default 200)
+;umask=022                  ; (process file creation umask;default 022)
+;user=chrism                 ; (default is current user, required if root)
+;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')
+;directory=/tmp              ; (default is not to cd during start)
+;nocleanup=true              ; (don't clean up tempfiles at start;default false)
+;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
+;environment=KEY=value       ; (key value pairs to add to environment)
+;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)
+
+; the below section must remain in the config file for RPC
+; (supervisorctl/web interface) to work, additional interfaces may be
+; added by defining them in separate rpcinterface: sections
+[rpcinterface:supervisor]
+supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
+
+[supervisorctl]
+serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket
+;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
+;username=chris              ; should be same as http_username if set
+;password=123                ; should be same as http_password if set
+;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
+;history_file=~/.sc_history  ; use readline history if available
+
+; The below sample program section shows all possible program subsection values,
+; create one or more 'real' program: sections to be able to control them under
+; supervisor.
+
+[program:celeryd]
+#command=celery worker -A flowspy -B --concurrency=2 -l debug -f celery.log
+#command=celery worker -A flowspy -B --concurrency=2 -l debug -f log/celery.log
+command=celery worker -A flowspy -B --concurrency=2 -l debug -f logs/celery.log
+directory=/srv/flowspy
+user=fod
+
+
+[program:gunicorn]
+command=gunicorn -b 0.0.0.0:8000 flowspy.wsgi -w 1 -k gevent --limit-request-fields 10000 --timeout 30
+directory=/srv/flowspy
+user=fod
+
+
+[program:redis]
+command=/usr/bin/redis-server  ; the program (relative uses PATH, can take args)
+;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
+;numprocs=1                    ; number of processes copies to start (def 1)
+;directory=/tmp                ; directory to cwd to before exec (def no cwd)
+;umask=022                     ; umask for process (default None)
+;priority=999                  ; the relative start priority (default 999)
+;autostart=true                ; start at supervisord start (default: true)
+;autorestart=true              ; retstart at unexpected quit (default: true)
+;startsecs=10                  ; number of secs prog must stay running (def. 1)
+;startretries=3                ; max # of serial start failures (default 3)
+;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
+;stopsignal=QUIT               ; signal used to kill process (default TERM)
+;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
+;user=chrism                   ; setuid to this UNIX account to run the program
+;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
+;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
+;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
+;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
+;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
+;stdout_events_enabled=false   ; emit events on stdout writes (default false)
+;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
+;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
+;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
+;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
+;stderr_events_enabled=false   ; emit events on stderr writes (default false)
+;environment=A=1,B=2           ; process environment additions (def no adds)
+;serverurl=AUTO                ; override serverurl computation (childutils)
+
+; The below sample eventlistener section shows all possible
+; eventlistener subsection values, create one or more 'real'
+; eventlistener: sections to be able to handle event notifications
+; sent by supervisor.
+
+;[eventlistener:theeventlistenername]
+;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
+;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
+;numprocs=1                    ; number of processes copies to start (def 1)
+;events=EVENT                  ; event notif. types to subscribe to (req'd)
+;buffer_size=10                ; event buffer queue size (default 10)
+;directory=/tmp                ; directory to cwd to before exec (def no cwd)
+;umask=022                     ; umask for process (default None)
+;priority=-1                   ; the relative start priority (default -1)
+;autostart=true                ; start at supervisord start (default: true)
+;autorestart=unexpected        ; restart at unexpected quit (default: unexpected)
+;startsecs=10                  ; number of secs prog must stay running (def. 1)
+;startretries=3                ; max # of serial start failures (default 3)
+;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
+;stopsignal=QUIT               ; signal used to kill process (default TERM)
+;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
+;user=chrism                   ; setuid to this UNIX account to run the program
+;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
+;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
+;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
+;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
+;stdout_events_enabled=false   ; emit events on stdout writes (default false)
+;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
+;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
+;stderr_logfile_backups        ; # of stderr logfile backups (default 10)
+;stderr_events_enabled=false   ; emit events on stderr writes (default false)
+;environment=A=1,B=2           ; process environment additions
+;serverurl=AUTO                ; override serverurl computation (childutils)
+
+; The below sample group section shows all possible group values,
+; create one or more 'real' group: sections to create "heterogeneous"
+; process groups.
+
+;[group:thegroupname]
+;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
+;priority=999                  ; the relative start priority (default 999)
+
+; The [include] section can just contain the "files" setting.  This
+; setting can list multiple files (separated by whitespace or
+; newlines).  It can also contain wildcards.  The filenames are
+; interpreted as relative to this file.  Included files *cannot*
+; include files themselves.
+
+[include]
+files = supervisord.d/*.ini