From e7b7e7dd1a39f22245bae6640098476a3eefd1f6 Mon Sep 17 00:00:00 2001
From: Alexey Golubev <Alexey.Golubev@onlyoffice.com>
Date: Wed, 20 Jul 2016 18:56:20 +0300
Subject: [PATCH] made availability check the data container to ensure the
 correct order of starting the containers

---
 docker-compose.yml     |   1 +
 run-document-server.sh | 107 ++++++++++++++++++++++++-----------------
 2 files changed, 65 insertions(+), 43 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index df2ba7a..02ffd90 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -34,6 +34,7 @@ services:
       - onlyoffice-redis
       - onlyoffice-rabbitmq
     environment:
+      - ONLYOFFICE_DATA_CONTAINER_HOST=onlyoffice-documentserver-data
       - BALANCE=uri depth 3
       - HTTP_CHECK=GET /healthcheck
       - EXTRA_SETTINGS=http-check expect string true
diff --git a/run-document-server.sh b/run-document-server.sh
index adfd639..9c67c67 100644
--- a/run-document-server.sh
+++ b/run-document-server.sh
@@ -5,6 +5,8 @@ DATA_DIR="/var/www/onlyoffice/Data"
 LOG_DIR="/var/log/onlyoffice/documentserver"
 
 ONLYOFFICE_DATA_CONTAINER=${ONLYOFFICE_DATA_CONTAINER:-false}
+ONLYOFFICE_DATA_CONTAINER_HOST=${ONLYOFFICE_DATA_CONTAINER_HOST:-localhost}
+ONLYOFFICE_DATA_CONTAINER_PORT=80
 
 SSL_CERTIFICATES_DIR="${DATA_DIR}/certs"
 SSL_CERTIFICATE_PATH=${SSL_CERTIFICATE_PATH:-${SSL_CERTIFICATES_DIR}/onlyoffice.crt}
@@ -26,20 +28,24 @@ ONLYOFFICE_DEFAULT_CONFIG=/etc/onlyoffice/documentserver/default.json
 
 JSON="json -q -f ${ONLYOFFICE_DEFAULT_CONFIG}"
 
-MYSQL_SERVER_HOST=${MYSQL_SERVER_HOST:-$(${JSON} services.CoAuthoring.sql.dbHost)}
-MYSQL_SERVER_PORT=${MYSQL_SERVER_PORT:-$(${JSON} services.CoAuthoring.sql.dbPort)}
-MYSQL_SERVER_DB_NAME=${MYSQL_SERVER_DB_NAME:-$(${JSON} services.CoAuthoring.sql.dbName)}
-MYSQL_SERVER_USER=${MYSQL_SERVER_USER:-$(${JSON} services.CoAuthoring.sql.dbUser)}
-MYSQL_SERVER_PASS=${MYSQL_SERVER_PASS:-$(${JSON} services.CoAuthoring.sql.dbPass)}
+LOCAL_SERVICES=()
 
-RABBITMQ_SERVER_URL=$(${JSON} rabbitmq.url)
-RABBITMQ_SERVER_HOST=${RABBITMQ_SERVER_HOST:-${RABBITMQ_SERVER_URL#'amqp://'}}
-RABBITMQ_SERVER_USER=${RABBITMQ_SERVER_USER:-$(${JSON} rabbitmq.login)}
-RABBITMQ_SERVER_PASS=${RABBITMQ_SERVER_PASS:-$(${JSON} rabbitmq.password)}
-RABBITMQ_SERVER_PORT=${RABBITMQ_SERVER_PORT:-"5672"}
+read_setting(){
+  MYSQL_SERVER_HOST=${MYSQL_SERVER_HOST:-$(${JSON} services.CoAuthoring.sql.dbHost)}
+  MYSQL_SERVER_PORT=${MYSQL_SERVER_PORT:-$(${JSON} services.CoAuthoring.sql.dbPort)}
+  MYSQL_SERVER_DB_NAME=${MYSQL_SERVER_DB_NAME:-$(${JSON} services.CoAuthoring.sql.dbName)}
+  MYSQL_SERVER_USER=${MYSQL_SERVER_USER:-$(${JSON} services.CoAuthoring.sql.dbUser)}
+  MYSQL_SERVER_PASS=${MYSQL_SERVER_PASS:-$(${JSON} services.CoAuthoring.sql.dbPass)}
 
-REDIS_SERVER_HOST=${REDIS_SERVER_HOST:-$(${JSON} services.CoAuthoring.redis.host)}
-REDIS_SERVER_PORT=${REDIS_SERVER_PORT:-$(${JSON} services.CoAuthoring.redis.port)}
+  RABBITMQ_SERVER_URL=$(${JSON} rabbitmq.url)
+  RABBITMQ_SERVER_HOST=${RABBITMQ_SERVER_HOST:-${RABBITMQ_SERVER_URL#'amqp://'}}
+  RABBITMQ_SERVER_USER=${RABBITMQ_SERVER_USER:-$(${JSON} rabbitmq.login)}
+  RABBITMQ_SERVER_PASS=${RABBITMQ_SERVER_PASS:-$(${JSON} rabbitmq.password)}
+  RABBITMQ_SERVER_PORT=${RABBITMQ_SERVER_PORT:-"5672"}
+
+  REDIS_SERVER_HOST=${REDIS_SERVER_HOST:-$(${JSON} services.CoAuthoring.redis.host)}
+  REDIS_SERVER_PORT=${REDIS_SERVER_PORT:-$(${JSON} services.CoAuthoring.redis.port)}
+}
 
 waiting_for_connection(){
   until nc -z -w 3 "$1" "$2"; do
@@ -59,7 +65,9 @@ waiting_for_rabbitmq(){
 waiting_for_redis(){
   waiting_for_connection ${REDIS_SERVER_HOST} ${REDIS_SERVER_PORT}
 }
-
+waiting_for_datacontainer(){
+  waiting_for_connection ${ONLYOFFICE_DATA_CONTAINER_HOST} ${ONLYOFFICE_DATA_CONTAINER_PORT}
+}
 update_mysql_settings(){
   ${JSON} -I -e "this.services.CoAuthoring.sql.dbHost = '${MYSQL_SERVER_HOST}'"
   ${JSON} -I -e "this.services.CoAuthoring.sql.dbPort = '${MYSQL_SERVER_PORT}'"
@@ -90,7 +98,7 @@ create_mysql_db(){
   ${MYSQL} "${MYSQL_SERVER_DB_NAME}" < "${APP_DIR}/server/schema/createdb.sql"
 }  
 
-start_nginx(){
+update_nginx_settings(){
   # Set up nginx
   sed 's/^worker_processes.*/'"worker_processes ${NGINX_WORKER_PROCESSES};"'/' -i ${NGINX_CONFIG_PATH}
   sed 's/worker_connections.*/'"worker_connections ${NGINX_WORKER_CONNECTIONS};"'/' -i ${NGINX_CONFIG_PATH}
@@ -127,61 +135,74 @@ start_nginx(){
   else
     cp ${SYSCONF_TEMPLATES_DIR}/nginx/onlyoffice-documentserver.conf ${NGINX_ONLYOFFICE_PATH}
   fi
-  
-  #start service
-  service nginx start
 }
 
-start_supervisor(){
+update_supervisor_settings(){
   # Copy modified supervisor start script
   cp ${SYSCONF_TEMPLATES_DIR}/supervisor/supervisor /etc/init.d/
   # Copy modified supervisor config
   cp ${SYSCONF_TEMPLATES_DIR}/supervisor/supervisord.conf /etc/supervisor/supervisord.conf
-  
-  #start service
-  service supervisor start
 }
 
 # create base folders
 for i in converter docservice spellchecker metrics gc; do
-	mkdir -p "${LOG_DIR}/$i"
+  mkdir -p "${LOG_DIR}/$i"
 done
 
 mkdir -p ${LOG_DIR}-example
 
-if [ ${MYSQL_SERVER_HOST} != "localhost" ]; then
-  update_mysql_settings
-  create_mysql_db
-else
-  if [ ${ONLYOFFICE_DATA_CONTAINER} != "true" ]; then
-    service mysql start
+if [ ${ONLYOFFICE_DATA_CONTAINER_HOST} = "localhost" ]; then
+
+  read_setting
+
+  # update settings by env variables
+  if [ ${MYSQL_SERVER_HOST} != "localhost" ]; then
+    update_mysql_settings
+    waiting_for_mysql
+    create_mysql_db
+  else
+    LOCAL_SERVICES+=("mysql")
   fi
-fi
 
-if [ ${RABBITMQ_SERVER_HOST} != "localhost" ]; then
-  update_rabbitmq_setting
-else
-  if [ ${ONLYOFFICE_DATA_CONTAINER} != "true" ]; then
-    service redis-server start
+  if [ ${RABBITMQ_SERVER_HOST} != "localhost" ]; then
+    update_rabbitmq_setting
+  else
+    LOCAL_SERVICES+=("redis-server")
   fi
-fi
 
-if [ ${REDIS_SERVER_HOST} != "localhost" ]; then
-  update_redis_settings
-else
-  if [ ${ONLYOFFICE_DATA_CONTAINER} != "true" ]; then
-    service rabbitmq-server start
+  if [ ${REDIS_SERVER_HOST} != "localhost" ]; then
+    update_redis_settings
+  else
+    LOCAL_SERVICES+=("rabbitmq-server")
   fi
+else
+  # no need to update settings just wait for remote data
+  waiting_for_datacontainer
+
+  # read settings after the data container in ready state
+  # to prevent get unconfigureted data
+  read_setting
 fi
 
+#start needed local services
+for i in ${LOCAL_SERVICES[@]}; do
+  service $i start
+done
+
 if [ ${ONLYOFFICE_DATA_CONTAINER} != "true" ]; then
   waiting_for_mysql
   waiting_for_rabbitmq
   waiting_for_redis
-  
-  start_nginx
-  start_supervisor
+
+  update_nginx_settings
+
+  update_supervisor_settings
+  service supervisor start
 fi
 
+# nginx used as a proxy, and as data container status service.
+# it run in all cases.
+service nginx start
+
 # Regenerate the fonts list and the fonts thumbnails
 documentserver-generate-allfonts.sh ${ONLYOFFICE_DATA_CONTAINER}
-- 
GitLab