#! /bin/bash export HOME=/root export DA_ROOT="${DA_ROOT:-/usr/share/docassemble}" export DA_DEFAULT_LOCAL="local3.14" export DA_ACTIVATE="${DA_PYTHON:-${DA_ROOT}/${DA_DEFAULT_LOCAL}}/bin/activate" echo "initialize: Activating Python with ${DA_ACTIVATE}" >&2 source "${DA_ACTIVATE}" export DA_CONFIG_FILE_DIST="${DA_CONFIG_FILE_DIST:-${DA_ROOT}/config/config.yml.dist}" export DA_CONFIG_FILE="${DA_CONFIG:-${DA_ROOT}/config/config.yml}" export CONTAINERROLE=":${CONTAINERROLE:-all}:" echo "initialize: config.yml is at" $DA_CONFIG_FILE >&2 echo "initialize: initialize starting" >&2 RESTOREFROMBACKUP=true if [ -f /var/run/docassemble/da_running ] || [ -f /var/run/docassemble/status-rabbitmq-running ]; then echo "initialize: unsafe shutdown detected; will not restore from backup" >&2 RESTOREFROMBACKUP=false fi if [ "${DAREADONLYFILESYSTEM:-false}" == "true" ]; then RESTOREFROMBACKUP=false fi mkdir -p /var/run/docassemble rm -f /var/run/docassemble/status-* touch /var/run/docassemble/da_running export DEBIAN_FRONTEND=noninteractive if [ "${DAALLOWUPDATES:-true}" == "true" ]; then echo "initialize: Running apt-get clean" >&2 apt-get clean &> /dev/null echo "initialize: Running apt-get update" >&2 apt-get -q -y update &> /dev/null fi if [[ '$(dpkg --print-architecture)' == 'amd64' ]]; then CURRENTARCH=x86_64 else CURRENTARCH=aarch64 fi echo "initialize: Determining if web browser already running" >&2 if [ -f /var/run/apache2/apache2.pid ]; then APACHE_PID=$( /dev/null; then APACHERUNNING=true else rm -f /var/run/apache2/apache2.pid APACHERUNNING=false fi else APACHERUNNING=false fi if [ -f /var/run/nginx.pid ]; then NGINX_PID=$( /dev/null; then NGINXRUNNING=true else rm -f /var/run/nginx.pid NGINXRUNNING=false fi else NGINXRUNNING=false fi echo "initialize: Determining if redis already running" >&2 if [[ $CONTAINERROLE =~ .*:(all|redis):.* ]] && redis-cli ping &> /dev/null; then REDISRUNNING=true else REDISRUNNING=false fi echo "initialize: Determining if cron already running" >&2 if [ -f /var/run/crond.pid ]; then CRON_PID=$( /dev/null; then CRONRUNNING=true else rm -f /var/run/crond.pid CRONRUNNING=false fi else CRONRUNNING=false fi echo "initialize: Determining hostname" >&2 if [ "${USEHTTPS:-false}" == "false" ] && [ "${BEHINDHTTPSLOADBALANCER:-false}" == "false" ]; then URLROOT="http:\\/\\/" else URLROOT="https:\\/\\/" fi if [ "${DAHOSTNAME:-none}" != "none" ]; then URLROOT="${URLROOT}${DAHOSTNAME}" else if [ "${EC2:-false}" == "true" ]; then PUBLIC_HOSTNAME=`curl -s http://169.254.169.254/latest/meta-data/public-hostname` else PUBLIC_HOSTNAME=`hostname --fqdn` fi URLROOT="${URLROOT}${PUBLIC_HOSTNAME}" fi echo "initialize: Testing if S3 is in use" >&2 if [ "${S3ENABLE:-null}" == "null" ] && [ "${S3BUCKET:-null}" != "null" ]; then export S3ENABLE=true fi if [ "${S3ENABLE:-null}" == "true" ] && [ "${S3BUCKET:-null}" != "null" ] && [ "${S3ACCESSKEY:-null}" != "null" ] && [ "${S3SECRETACCESSKEY:-null}" != "null" ]; then export S3_ACCESS_KEY="$S3ACCESSKEY" export S3_SECRET_KEY="$S3SECRETACCESSKEY" export AWS_ACCESS_KEY_ID="$S3ACCESSKEY" export AWS_SECRET_ACCESS_KEY="$S3SECRETACCESSKEY" export AWS_DEFAULT_REGION="$S3REGION" fi export AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED export AWS_RESPONSE_CHECKSUM_VALIDATION=WHEN_REQUIRED S4CMD_OPTS="" if [ "${S3ENDPOINTURL:-null}" != "null" ]; then S4CMD_OPTS="${S4CMD_OPTS}--endpoint-url=\"${S3ENDPOINTURL}\" " fi if [ "${S3_SSE_ALGORITHM:-null}" != "null" ]; then S4CMD_OPTS="${S4CMD_OPTS}--API-ServerSideEncryption=\"${S3_SSE_ALGORITHM}\" " fi if [ "${S3_SSE_CUSTOMER_ALGORITHM:-null}" != "null" ]; then S4CMD_OPTS="${S4CMD_OPTS}--API-SSECustomerAlgorithm=\"${S3_SSE_CUSTOMER_ALGORITHM}\" " fi if [ "${S3_SSE_CUSTOMER_KEY:-null}" != "null" ]; then S4CMD_OPTS="${S4CMD_OPTS}--API-SSECustomerKey=\"${S3_SSE_CUSTOMER_KEY}\" " fi if [ "${S3_SSE_KMS_KEY_ID:-null}" != "null" ]; then S4CMD_OPTS="${S4CMD_OPTS}--API-SSEKMSKeyId=\"${S3_SSE_KMS_KEY_ID}\" " fi export S4CMD_OPTS if [ "${S3ENABLE:-null}" == "true" ]; then echo "initialize: Creating S3 bucket, which may already exist" >&2 if [ "${USEMINIO:-false}" == "true" ]; then python -m docassemble.webapp.createminio "${S3ENDPOINTURL}" "${S3ACCESSKEY}" "${S3SECRETACCESSKEY}" "${S3BUCKET}" &> /dev/null else s4cmd mb "s3://${S3BUCKET}" &> /dev/null fi fi echo "initialize: Testing if Azure Blob Storage is in use" >&2 if [ "${AZUREENABLE:-null}" == "null" ] && [ "${AZUREACCOUNTNAME:-null}" != "null" ] && [ "${AZUREACCOUNTKEY:-null}" != "null" ] && [ "${AZURECONTAINER:-null}" != "null" ]; then echo "initialize: Enabling Azure Blob Storage" >&2 export AZUREENABLE=true fi echo "initialize: If S3 is in use, see if RabbitMQ is running in the cluster" >&2 if [ "${S3ENABLE:-false}" == "true" ] && [[ $CONTAINERROLE =~ .*:(web):.* ]] && [[ $(s4cmd ls s3://${S3BUCKET}/hostname-rabbitmq) ]] && [[ $(s4cmd ls s3://${S3BUCKET}/ip-rabbitmq) ]]; then TEMPKEYFILE=`mktemp` s4cmd -f get s3://${S3BUCKET}/hostname-rabbitmq $TEMPKEYFILE HOSTNAMERABBITMQ=$(<$TEMPKEYFILE) s4cmd -f get s3://${S3BUCKET}/ip-rabbitmq $TEMPKEYFILE IPRABBITMQ=$(<$TEMPKEYFILE) rm -f $TEMPKEYFILE if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ -n "$(grep $HOSTNAMERABBITMQ /etc/hosts)" ]; then sed -i "/$HOSTNAMERABBITMQ/d" /etc/hosts fi echo "$IPRABBITMQ $HOSTNAMERABBITMQ" >> /etc/hosts fi fi if [ "${AZUREENABLE:-false}" == "true" ]; then echo "initialize: Initializing azure" >&2 export AZURE_STORAGE_KEY="${AZUREACCOUNTKEY}" export AZURE_STORAGE_ACCOUNT="${AZUREACCOUNTNAME}" export AZURE_STORAGE_AUTH_MODE=key fi echo "initialize: If Azure Blob Storage is in use, see if RabbitMQ is running in the cluster" >&2 if [ "${AZUREENABLE:-false}" == "true" ] && [[ $CONTAINERROLE =~ .*:(web):.* ]] && [[ $(python -m docassemble.webapp.list-cloud hostname-rabbitmq) ]] && [[ $(python -m docassemble.webapp.list-cloud ip-rabbitmq) ]]; then TEMPKEYFILE=`mktemp` echo "initialize: Copying hostname-rabbitmq" >&2 az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "hostname-rabbitmq" -f "${TEMPKEYFILE}" HOSTNAMERABBITMQ=$(<$TEMPKEYFILE) echo "initialize: Copying ip-rabbitmq" >&2 az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "ip-rabbitmq" -f "${TEMPKEYFILE}" IPRABBITMQ=$(<$TEMPKEYFILE) rm -f "${TEMPKEYFILE}" if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ -n "$(grep $HOSTNAMERABBITMQ /etc/hosts)" ]; then sed -i "/$HOSTNAMERABBITMQ/d" /etc/hosts fi echo "$IPRABBITMQ $HOSTNAMERABBITMQ" >> /etc/hosts fi fi echo "initialize: Determining public hostname" >&2 if [ "${EC2:-false}" == "true" ]; then export LOCAL_HOSTNAME=`curl -s http://169.254.169.254/latest/meta-data/local-hostname` export PUBLIC_HOSTNAME=`curl -s http://169.254.169.254/latest/meta-data/public-hostname` else export LOCAL_HOSTNAME=`hostname --fqdn` export PUBLIC_HOSTNAME="${LOCAL_HOSTNAME}" fi if [ "${RESTOREFROMBACKUP}" == "true" ]; then echo "initialize: Restoring from backup" >&2 if [ "${S3ENABLE:-false}" == "true" ]; then echo "initialize: Restoring from S3" >&2 if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [[ $(s4cmd ls "s3://${S3BUCKET}/letsencrypt.tar.gz") ]]; then echo "initialize: Restoring Let's Encrypt information from S3" >&2 rm -f /tmp/letsencrypt.tar.gz s4cmd get "s3://${S3BUCKET}/letsencrypt.tar.gz" /tmp/letsencrypt.tar.gz cd / tar -xf /tmp/letsencrypt.tar.gz rm -f /tmp/letsencrypt.tar.gz cd /tmp else rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ "${DABACKUPDAYS}" != "0" ]; then if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then if [[ $(s4cmd ls "s3://${S3BUCKET}/backup") ]]; then echo "initialize: Restoring backup information from S3" >&2 s4cmd dsync "s3://${S3BUCKET}/backup" "${DA_ROOT}/backup" fi elif [[ $(s4cmd ls "s3://${S3BUCKET}/backup/${LOCAL_HOSTNAME}") ]]; then echo "initialize: Restoring backup information from S3" >&2 s4cmd dsync "s3://${S3BUCKET}/backup/${LOCAL_HOSTNAME}" "${DA_ROOT}/backup/${LOCAL_HOSTNAME}" fi fi if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]] && [[ $(s4cmd ls "s3://${S3BUCKET}/apache") ]]; then echo "initialize: Restoring apache information from S3" >&2 s4cmd dsync "s3://${S3BUCKET}/apache" /etc/apache2/sites-available fi if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then if [[ $(s4cmd ls "s3://${S3BUCKET}/apachelogs") ]]; then echo "initialize: Restoring apache logs from S3" >&2 s4cmd dsync "s3://${S3BUCKET}/apachelogs" /var/log/apache2 chown root:adm /var/log/apache2/* chmod 640 /var/log/apache2/* fi if [[ $(s4cmd ls "s3://${S3BUCKET}/nginxlogs") ]]; then echo "initialize: Restoring NGINX logs from S3" >&2 s4cmd dsync "s3://${S3BUCKET}/nginxlogs" /var/log/nginx chown www-data:adm /var/log/nginx/* chmod 640 /var/log/nginx/* fi fi if [[ $CONTAINERROLE =~ .*:(all|log):.* ]] && [[ $(s4cmd ls "s3://${S3BUCKET}/log") ]]; then echo "initialize: Restoring logs from S3" >&2 s4cmd dsync "s3://${S3BUCKET}/log" "${LOGDIRECTORY:-${DA_ROOT}/log}" chown -R www-data:www-data "${LOGDIRECTORY:-${DA_ROOT}/log}" fi if [[ $(s4cmd ls "s3://${S3BUCKET}/config.yml") ]]; then echo "initialize: Restoring configuration from S3" >&2 rm -f "$DA_CONFIG_FILE" s4cmd get "s3://${S3BUCKET}/config.yml" "$DA_CONFIG_FILE" chown www-data:www-data "$DA_CONFIG_FILE" fi if [[ $CONTAINERROLE =~ .*:(all|redis):.* ]] && [[ $(s4cmd ls "s3://${S3BUCKET}/redis.rdb") ]] && [ "$REDISRUNNING" == "false" ]; then echo "initialize: Restoring Redis from S3" >&2 s4cmd -f get "s3://${S3BUCKET}/redis.rdb" "/var/lib/redis/dump.rdb" chown redis:redis "/var/lib/redis/dump.rdb" fi elif [ "${AZUREENABLE:-false}" == "true" ]; then echo "initialize: Restoring from Azure" >&2 if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [[ $(python -m docassemble.webapp.list-cloud letsencrypt.tar.gz) ]]; then echo "initialize: Restoring Let's Encrypt information from Azure Blob Storage" >&2 rm -f /tmp/letsencrypt.tar.gz echo "initialize: Copying let's encrypt" >&2 az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "letsencrypt.tar.gz" -f "/tmp/letsencrypt.tar.gz" cd / tar -xf /tmp/letsencrypt.tar.gz rm -f /tmp/letsencrypt.tar.gz cd /tmp else rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ "${DABACKUPDAYS}" != "0" ]; then if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then if [[ $(python -m docassemble.webapp.list-cloud backup/) ]]; then echo "initialize: Restoring backup information from Azure Blob Storage" >&2 BACKUPDIR="backup/" let BACKUPDIRLENGTH=${#BACKUPDIR}+1 for the_file in $(python -m docassemble.webapp.list-cloud $BACKUPDIR | cut -c ${BACKUPDIRLENGTH}-); do echo "initialize: Found $the_file on Azure" >&2 if ! [[ $the_file =~ /$ ]]; then if [ ! -f "${DA_ROOT}/backup/${the_file}" ]; then echo "initialize: Copying backup file" $the_file >&2 mkdir -p "`dirname \"${DA_ROOT}/backup/${the_file}\"`" az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "backup/${the_file}" -f "${DA_ROOT}/backup/${the_file}" fi fi done fi elif [[ $(python -m docassemble.webapp.list-cloud backup/${LOCAL_HOSTNAME}/) ]]; then echo "initialize: Restoring backup information from Azure Blob Storage" >&2 BACKUPDIR="backup/${LOCAL_HOSTNAME}/" let BACKUPDIRLENGTH=${#BACKUPDIR}+1 for the_file in $(python -m docassemble.webapp.list-cloud $BACKUPDIR | cut -c ${BACKUPDIRLENGTH}-); do echo "initialize: Found $the_file on Azure" >&2 if ! [[ $the_file =~ /$ ]]; then if [ ! -f "${DA_ROOT}/backup/${the_file}" ]; then echo "initialize: Copying backup file" $the_file >&2 mkdir -p "`dirname \"${DA_ROOT}/backup/${the_file}\"`" az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "backup/${LOCAL_HOSTNAME}/${the_file}" -f "${DA_ROOT}/backup/${the_file}" fi fi done fi fi if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]] && [[ $(python -m docassemble.webapp.list-cloud apache/) ]]; then echo "initialize: Restoring apache information from Azure Blob Storage" >&2 for the_file in $(python -m docassemble.webapp.list-cloud apache/ | cut -c 8-); do if ! [[ $the_file =~ /$ ]]; then az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "apache/${the_file}" -f "/etc/apache2/sites-available/${the_file}" fi done else rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then if [[ $(python -m docassemble.webapp.list-cloud apachelogs/) ]]; then echo "initialize: Restoring apache logs from Azure Blob Storage" >&2 for the_file in $(python -m docassemble.webapp.list-cloud apachelogs/ | cut -c 12-); do if ! [[ $the_file =~ /$ ]]; then az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "apachelogs/${the_file}" -f "/var/log/apache2/${the_file}" fi done chown root:adm /var/log/apache2/* chmod 640 /var/log/apache2/* fi if [[ $(python -m docassemble.webapp.list-cloud nginxlogs/) ]]; then echo "initialize: Restoring NGINX logs from Azure Blob Storage" >&2 for the_file in $(python -m docassemble.webapp.list-cloud nginxlogs/ | cut -c 11-); do if ! [[ $the_file =~ /$ ]]; then az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "nginxlogs/${the_file}" -f "/var/log/nginx/${the_file}" fi done chown www-data:adm /var/log/nginx/* chmod 640 /var/log/nginx/* fi fi if [[ $CONTAINERROLE =~ .*:(all|log):.* ]] && [[ $(python -m docassemble.webapp.list-cloud log) ]]; then echo "initialize: Restoring logs from Azure Blob Storage" >&2 for the_file in $(python -m docassemble.webapp.list-cloud log/ | cut -c 5-); do if ! [[ $the_file =~ /$ ]]; then az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "log/${the_file}" -f "${LOGDIRECTORY:-${DA_ROOT}/log}/${the_file}" fi done chown -R www-data:www-data "${LOGDIRECTORY:-${DA_ROOT}/log}" fi if [[ $(python -m docassemble.webapp.list-cloud config.yml) ]]; then echo "initialize: Restoring configuration from Azure Blob Storage" >&2 rm -f "$DA_CONFIG_FILE" echo "initialize: Copying config.yml" >&2 az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "config.yml" -f "${DA_CONFIG_FILE}" chown www-data:www-data "${DA_CONFIG_FILE}" fi if [[ $CONTAINERROLE =~ .*:(all|redis):.* ]] && [[ $(python -m docassemble.webapp.list-cloud redis.rdb) ]] && [ "$REDISRUNNING" == "false" ]; then echo "initialize: Restoring Redis from Azure Blob Storage" >&2 az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "redis.rdb" -f "/var/lib/redis/dump.rdb" chown redis:redis "/var/lib/redis/dump.rdb" fi else if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [ -f "${DA_ROOT}/backup/letsencrypt.tar.gz" ]; then echo "initialize: Restoring Let's Encrypt information from backup" >&2 cd / tar -xf "${DA_ROOT}/backup/letsencrypt.tar.gz" cd /tmp fi if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]] && [ -d "${DA_ROOT}/backup/apache" ]; then echo "initialize: Restoring Apache information from backup" >&2 rsync -auq "${DA_ROOT}/backup/apache/" /etc/apache2/sites-available/ fi if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [ -d "${DA_ROOT}/backup/apachelogs" ]; then echo "initialize: Restoring Apache logs from backup" >&2 rsync -auq "${DA_ROOT}/backup/apachelogs/" /var/log/apache2/ chown root:adm /var/log/apache2/* chmod 640 /var/log/apache2/* fi if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [ -d "${DA_ROOT}/backup/nginxlogs" ]; then echo "initialize: Restoring NGINX logs from backup" >&2 rsync -auq "${DA_ROOT}/backup/nginxlogs/" /var/log/nginx/ chown www-data:adm /var/log/nginx/* chmod 640 /var/log/nginx/* fi if [[ $CONTAINERROLE =~ .*:(all|log):.* ]] && [ -d "${DA_ROOT}/backup/log" ]; then echo "initialize: Restoring logs from backup" >&2 rsync -auq "${DA_ROOT}/backup/log/" "${LOGDIRECTORY:-${DA_ROOT}/log}/" chown -R www-data:www-data "${LOGDIRECTORY:-${DA_ROOT}/log}" fi if [ -f "${DA_ROOT}/backup/config.yml" ]; then echo "initialize: Restoring Configuration from backup" >&2 cp "${DA_ROOT}/backup/config.yml" "${DA_CONFIG_FILE}" chown www-data:www-data "${DA_CONFIG_FILE}" fi if [ -d "${DA_ROOT}/backup/files" ]; then echo "initialize: Restoring files from backup" >&2 rsync -auq "${DA_ROOT}/backup/files" "${DA_ROOT}/" chown -R www-data:www-data "${DA_ROOT}/files" fi if [[ $CONTAINERROLE =~ .*:(all|redis):.* ]] && [ -f "${DA_ROOT}/backup/redis.rdb" ] && [ "$REDISRUNNING" == "false" ]; then echo "initialize: Restoring Redis from backup" >&2 cp "${DA_ROOT}/backup/redis.rdb" /var/lib/redis/dump.rdb chown redis:redis "/var/lib/redis/dump.rdb" fi fi fi if [ "${BEHINDHTTPSLOADBALANCER:-null}" == "true" ] && [ "${XSENDFILE:-null}" == "null" ]; then export XSENDFILE=false fi if [ ! -f "$DA_CONFIG_FILE" ]; then if [ "${DADEFAULTSECRET:-null}" = "null" ]; then DADEFAULTSECRET=$(python -m docassemble.base.generate_key) fi echo "initialize: There is no config file. Creating one from source." >&2 sed -e 's@{{DBPREFIX}}@'"${DBPREFIX:-postgresql+psycopg2:\/\/}"'@' \ -e 's/{{DBNAME}}/'"${DBNAME:-docassemble}"'/' \ -e 's/{{DBUSER}}/'"${DBUSER:-docassemble}"'/' \ -e 's#{{DBPASSWORD}}#'"${DBPASSWORD:-abc123}"'#' \ -e 's/{{DBHOST}}/'"${DBHOST:-null}"'/' \ -e 's/{{DBPORT}}/'"${DBPORT:-null}"'/' \ -e 's/{{DBTABLEPREFIX}}/'"${DBTABLEPREFIX:-null}"'/' \ -e 's/{{DBBACKUP}}/'"${DBBACKUP:-true}"'/' \ -e 's/{{DBSSLMODE}}/'"${DBSSLMODE:-null}"'/' \ -e 's/{{DBSSLCERT}}/'"${DBSSLCERT:-null}"'/' \ -e 's#{{DBSSLKEY}}#'"${DBSSLKEY:-null}"'#' \ -e 's#{{DBSSLROOTCERT}}#'"${DBSSLROOTCERT:-null}"'#' \ -e 's#{{CONFIGFROM}}#'"${CONFIGFROM:-null}"'#' \ -e 's/{{S3ENABLE}}/'"${S3ENABLE:-false}"'/' \ -e 's#{{S3ACCESSKEY}}#'"${S3ACCESSKEY:-null}"'#' \ -e 's#{{S3SECRETACCESSKEY}}#'"${S3SECRETACCESSKEY:-null}"'#' \ -e 's@{{S3ENDPOINTURL}}@'"${S3ENDPOINTURL:-null}"'@' \ -e 's/{{S3BUCKET}}/'"${S3BUCKET:-null}"'/' \ -e 's/{{S3REGION}}/'"${S3REGION:-null}"'/' \ -e 's/{{S3_SSE_ALGORITHM}}/'"${S3_SSE_ALGORITHM:-null}"'/' \ -e 's/{{S3_SSE_CUSTOMER_ALGORITHM}}/'"${S3_SSE_CUSTOMER_ALGORITHM:-null}"'/' \ -e 's#{{S3_SSE_CUSTOMER_KEY}}#'"${S3_SSE_CUSTOMER_KEY:-null}"'#' \ -e 's#{{S3_SSE_KMS_KEY_ID}}#'"${S3_SSE_KMS_KEY_ID:-null}"'#' \ -e 's/{{AZUREENABLE}}/'"${AZUREENABLE:-false}"'/' \ -e 's/{{AZUREACCOUNTNAME}}/'"${AZUREACCOUNTNAME:-null}"'/' \ -e 's@{{AZUREACCOUNTKEY}}@'"${AZUREACCOUNTKEY:-null}"'@' \ -e 's/{{AZURECONTAINER}}/'"${AZURECONTAINER:-null}"'/' \ -e 's/{{DABACKUPDAYS}}/'"${DABACKUPDAYS:-14}"'/' \ -e 's#{{REDIS}}#'"${REDIS:-null}"'#' \ -e 's#{{RABBITMQ}}#'"${RABBITMQ:-null}"'#' \ -e 's@{{DACELERYWORKERS}}@'"${DACELERYWORKERS:-null}"'@' \ -e 's@{{DAMAXCELERYWORKERS}}@'"${DAMAXCELERYWORKERS:-null}"'@' \ -e 's@{{TIMEZONE}}@'"${TIMEZONE:-null}"'@' \ -e 's/{{EC2}}/'"${EC2:-false}"'/' \ -e 's/{{COLLECTSTATISTICS}}/'"${COLLECTSTATISTICS:-false}"'/' \ -e 's/{{KUBERNETES}}/'"${KUBERNETES:-false}"'/' \ -e 's/{{USECLOUDURLS}}/'"${USECLOUDURLS:-false}"'/' \ -e 's/{{USEMINIO}}/'"${USEMINIO:-false}"'/' \ -e 's/{{USEHTTPS}}/'"${USEHTTPS:-false}"'/' \ -e 's/{{USELETSENCRYPT}}/'"${USELETSENCRYPT:-false}"'/' \ -e 's/{{LETSENCRYPTEMAIL}}/'"${LETSENCRYPTEMAIL:-null}"'/' \ -e 's@{{LOGSERVER}}@'"${LOGSERVER:-null}"'@' \ -e 's/{{DAHOSTNAME}}/'"${DAHOSTNAME:-none}"'/' \ -e 's/{{LOCALE}}/'"${LOCALE:-null}"'/' \ -e 's/{{SERVERADMIN}}/'"${SERVERADMIN:-webmaster@localhost}"'/' \ -e 's@{{DASECRETKEY}}@'"${DADEFAULTSECRET}"'@' \ -e 's@{{URLROOT}}@'"${URLROOT:-null}"'@' \ -e 's@{{POSTURLROOT}}@'"${POSTURLROOT:-/}"'@' \ -e 's/{{BEHINDHTTPSLOADBALANCER}}/'"${BEHINDHTTPSLOADBALANCER:-false}"'/' \ -e 's/{{XSENDFILE}}/'"${XSENDFILE:-true}"'/' \ -e 's/{{DAEXPOSEWEBSOCKETS}}/'"${DAEXPOSEWEBSOCKETS:-false}"'/' \ -e 's/{{DAWEBSOCKETSIP}}/'"${DAWEBSOCKETSIP:-null}"'/' \ -e 's/{{DAWEBSOCKETSPORT}}/'"${DAWEBSOCKETSPORT:-null}"'/' \ -e 's/{{DAUPDATEONSTART}}/'"${DAUPDATEONSTART:-true}"'/' \ -e 's/{{DAALLOWUPDATES}}/'"${DAALLOWUPDATES:-true}"'/' \ -e 's/{{DAWEBSERVER}}/'"${DAWEBSERVER:-nginx}"'/' \ -e 's/{{DASTABLEVERSION}}/'"${DASTABLEVERSION:-false}"'/' \ -e 's/{{DASQLPING}}/'"${DASQLPING:-false}"'/' \ -e 's/{{ENABLEUNOCONV}}/'"${ENABLEUNOCONV:-true}"'/' \ -e 's/{{DAALLOWCONFIGURATIONEDITING}}/'"${DAALLOWCONFIGURATIONEDITING:-true}"'/' \ -e 's/{{DAENABLEPLAYGROUND}}/'"${DAENABLEPLAYGROUND:-true}"'/' \ -e 's/{{DAALLOWLOGVIEWING}}/'"${DAALLOWLOGVIEWING:-true}"'/' \ -e 's/{{DAROOTOWNED}}/'"${DAROOTOWNED:-false}"'/' \ -e 's/{{DAREADONLYFILESYSTEM}}/'"${DAREADONLYFILESYSTEM:-false}"'/' \ -e 's/{{DADEBUG}}/'"${DADEBUG:-true}"'/g' \ -e 's/{{DASUPERVISORUSERNAME}}/'"${DASUPERVISORUSERNAME:-null}"'/g' \ -e 's/{{DASUPERVISORPASSWORD}}/'"${DASUPERVISORPASSWORD:-null}"'/g' \ -e 's#{{GOTENBERGENABLE}}#'"${GOTENBERGENABLE:-false}"'#g' \ -e 's@{{GOTENBERGURL}}@'"${GOTENBERGURL:-null}"'@g' \ -e 's#{{GOTENBERGUSERNAME}}#'"${GOTENBERGUSERNAME:-null}"'#g' \ -e 's/{{GOTENBERGPASSWORD}}/'"${GOTENBERGPASSWORD:-null}"'/g' \ -e 's/{{USENGINXTOSERVEFILES}}/'"${USENGINXTOSERVEFILES:-true}"'/g' \ "$DA_CONFIG_FILE_DIST" > "$DA_CONFIG_FILE" || exit 1 fi if [ "${DAROOTOWNED:-false}" == "false" ] && [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then chown www-data:www-data "$DA_CONFIG_FILE" chsh -s /bin/bash www-data fi echo "initialize: Defining environment variables from Configuration" >&2 source /dev/stdin < <(su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.base.read_config \"${DA_CONFIG_FILE}\"" www-data) export LOGDIRECTORY="${LOGDIRECTORY:-${DA_ROOT}/log}" echo "initialize: Checking to see if this is the first time the server was initialized" >&2 DAINSTALLASROOT=true if [ "${DAROOTOWNED:-false}" == "true" ]; then if [ "${DAALLOWUPDATES:-true}" == "true" ] || [ "${DAENABLEPLAYGROUND:-true}" == "true" ]; then DAINSTALLASROOT=false fi else DAINSTALLASROOT=false fi if [ "${DASUPERVISORUSERNAME:-null}" != "null" ]; then export SUPERVISORCMD="supervisorctl --serverurl http://localhost:9001 --username ${DASUPERVISORUSERNAME} --password ${DASUPERVISORPASSWORD}" else export SUPERVISORCMD="supervisorctl --serverurl http://localhost:9001" fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ ! -f /etc/hasbeeninitialized ]; then echo "initialize: This is the first time the server was initialized" >&2 if [ "${DAROOTOWNED:-false}" == "true" ]; then if [ "${DAALLOWUPDATES:-true}" == "true" ] \ || [ "${DAENABLEPLAYGROUND:-true}" == "true" ]; then chown -R www-data:www-data /usr/share/docassemble/local3.14 else echo "initialize: Python virtual environment is read-only" >&2 fi if [ "${DAALLOWCONFIGURATIONEDITING:-true}" == "true" ]; then chown -R www-data:www-data /usr/share/docassemble/config else echo "initialize: The config.yml file is read-only" >&2 fi if [ "${DAALLOWUPDATES:-true}" == "true" ] \ || [ "${DAENABLEPLAYGROUND:-true}" == "true" ] \ || [ "${DAALLOWCONFIGURATIONEDITING:-true}" == "true" ]; then chown www-data:www-data /usr/share/docassemble/webapp/docassemble.wsgi else echo "initialize: The WSGI file is read-only" >&2 fi else echo "initialize: No root ownership; changing file ownership to www-data (this takes a long time)" >&2 chsh -s /bin/bash www-data chown -R www-data:www-data /usr/share/docassemble/local3.14 chown -R www-data:www-data /usr/share/docassemble/config \ /usr/share/docassemble/webapp/docassemble.wsgi fi echo "initialize: considering whether to install extra fonts" >&2 if [ "${DAEXTRAFONTS:-false}" == "true" ]; then echo "initialize: installing extra fonts" >&2 apt-get -q -y install \ texlive-fonts-extra \ fonts-adf-accanthis \ fonts-adf-berenis \ fonts-adf-gillius \ fonts-adf-universalis \ fonts-arkpandora \ fonts-beng \ fonts-beng-extra \ fonts-cabin \ fonts-cantarell \ fonts-clear-sans \ fonts-comfortaa \ fonts-comic-neue \ fonts-deva \ fonts-deva-extra \ fonts-ebgaramond-extra \ fonts-font-awesome \ fonts-gargi \ fonts-gfs-artemisia \ fonts-gfs-complutum \ fonts-gfs-didot \ fonts-gfs-neohellenic \ fonts-gfs-olga \ fonts-gfs-solomos \ fonts-go \ fonts-gubbi \ fonts-gujr \ fonts-gujr-extra \ fonts-guru \ fonts-guru-extra \ fonts-indic \ fonts-inter \ fonts-kalapi \ fonts-knda \ fonts-lato \ fonts-liberation2 \ fonts-lobster \ fonts-lobstertwo \ fonts-lohit-beng-assamese \ fonts-lohit-beng-bengali \ fonts-lohit-deva \ fonts-lohit-gujr \ fonts-lohit-guru \ fonts-lohit-knda \ fonts-lohit-mlym \ fonts-lohit-orya \ fonts-lohit-taml \ fonts-lohit-taml-classical \ fonts-lohit-telu \ fonts-mlym \ fonts-nakula \ fonts-navilu \ fonts-noto \ fonts-noto-cjk \ fonts-noto-cjk-extra \ fonts-noto-core \ fonts-noto-extra \ fonts-noto-ui-extra \ fonts-noto-unhinted \ fonts-oflb-asana-math \ fonts-open-sans \ fonts-orya \ fonts-orya-extra \ fonts-pagul \ fonts-paratype \ fonts-roboto-slab \ fonts-roboto-unhinted \ fonts-sahadeva \ fonts-samyak \ fonts-samyak-deva \ fonts-samyak-gujr \ fonts-samyak-mlym \ fonts-samyak-orya \ fonts-samyak-taml \ fonts-sarai \ fonts-sil-andika \ fonts-sil-annapurna \ fonts-sil-charis \ fonts-sil-gentiumplus \ fonts-sil-gentiumplus-compact \ fonts-smc \ fonts-smc-anjalioldlipi \ fonts-smc-chilanka \ fonts-smc-dyuthi \ fonts-smc-gayathri \ fonts-smc-karumbi \ fonts-smc-keraleeyam \ fonts-smc-manjari \ fonts-smc-meera \ fonts-smc-rachana \ fonts-smc-raghumalayalamsans \ fonts-smc-suruma \ fonts-smc-uroob \ fonts-stix \ fonts-taml \ fonts-telu \ fonts-telu-extra \ fonts-teluguvijayam \ fonts-yrsa-rasa \ cm-super &> /dev/null if [ $? -eq 0 ]; then echo "initialize: extra fonts installed." >&2 else echo "initialize: error while installing extra fonts." >&2 fi fi echo "initialize: considering whether to install google fonts" >&2 if [ "${DAGOOGLEFONTS:-false}" == "true" ]; then echo "initialize: installing google fonts" >&2 { cd /tmp \ && wget -q -O google-fonts.tar.gz https://github.com/google/fonts/archive/main.tar.gz \ && tar -zxf google-fonts.tar.gz \ && rm google-fonts.tar.gz \ && mkdir -p /usr/share/fonts/truetype/google-fonts \ && find ./fonts-main/ -name "*.ttf" -exec install -m644 {} /usr/share/fonts/truetype/google-fonts/ \; \ && rm -r ./fonts-main \ && fc-cache -f -v; } &> /dev/null if [ $? -eq 0 ]; then echo "initialize: google fonts installed." >&2 else echo "initialize: error while installing google fonts." >&2 fi fi touch /etc/hasbeeninitialized else echo "initialize: This is not the first time the server was initialized" >&2 fi fi echo "initialize: Running start hook" >&2 python -m docassemble.webapp.starthook "${DA_CONFIG_FILE}" if [ "${DAWEBSERVER:-nginx}" = "nginx" ]; then echo "initialize: Setting up NGINX basic configuration and uwsgi directory" >&2 if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then sed -e 's@{{DA_PYTHON}}@'"${DA_PYTHON:-${DA_ROOT}/${DA_DEFAULT_LOCAL}}"'@' \ -e 's@{{DAWSGIROOT}}@'"${WSGIROOT}"'@' \ -e 's@{{DA_ROOT}}@'"${DA_ROOT}"'@' \ "${DA_ROOT}/config/docassemble.ini.dist" > "${DA_ROOT}/config/docassemble.ini" sed -e 's@{{DA_PYTHON}}@'"${DA_PYTHON:-${DA_ROOT}/${DA_DEFAULT_LOCAL}}"'@' \ -e 's@{{DA_ROOT}}@'"${DA_ROOT}"'@' \ "${DA_ROOT}/config/docassemblelog.ini.dist" > "${DA_ROOT}/config/docassemblelog.ini" fi mkdir -p /var/run/uwsgi chown www-data:www-data /var/run/uwsgi fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "initialize: If S3 is in use, save Configuration to S3" >&2 if [ "${S3ENABLE:-false}" == "true" ] && [[ ! $(s4cmd ls "s3://${S3BUCKET}/config.yml") ]]; then s4cmd -f put "${DA_CONFIG_FILE}" "s3://${S3BUCKET}/config.yml" fi echo "initialize: If S3 is in use, test if the files folder is missing" >&2 if [ "${S3ENABLE:-false}" == "true" ] && [[ ! $(s4cmd ls "s3://${S3BUCKET}/files") ]]; then echo "initialize: Test if a files folder is present locally" >&2 if [ -d "${DA_ROOT}/files" ]; then echo "initialize: Copy files from local storage to S3" >&2 for the_file in $(ls "${DA_ROOT}/files"); do if [[ $the_file =~ ^[0-9]+ ]]; then for sub_file in $(find "${DA_ROOT}/files/$the_file" -type f); do file_number="${sub_file#${DA_ROOT}/files/}" file_number="${file_number:0:15}" file_directory="${DA_ROOT}/files/$file_number" target_file="${sub_file#${file_directory}}" file_number="${file_number//\//}" file_number=$((16#$file_number)) s4cmd -f put "${sub_file}" "s3://${S3BUCKET}/files/${file_number}/${target_file}" done else s4cmd dsync "${DA_ROOT}/files/${the_file}" "s3://${S3BUCKET}/${the_file}" fi done fi fi if [ "${AZUREENABLE:-false}" == "true" ]; then echo "initialize: Initializing Azure Blob Storage if it is not already initialized" >&2 export AZURE_STORAGE_KEY="${AZUREACCOUNTKEY}" export AZURE_STORAGE_ACCOUNT="${AZUREACCOUNTNAME}" export AZURE_STORAGE_AUTH_MODE=key fi echo "initialize: If Azure Blob Storage is in use, save Configuration to Azure Blob Storage" >&2 if [ "${AZUREENABLE:-false}" == "true" ] && [[ ! $(python -m docassemble.webapp.list-cloud config.yml) ]]; then az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "${DA_CONFIG_FILE}" -n "config.yml" fi echo "initialize: If Azure Blob Storage is in use, test if the files folder is missing" >&2 if [ "${AZUREENABLE:-false}" == "true" ] && [[ ! $(python -m docassemble.webapp.list-cloud files) ]]; then echo "initialize: Test if a files folder is present locally" >&2 if [ -d "${DA_ROOT}/files" ]; then echo "initialize: Copy files from local storage to Azure Blob Storage" >&2 for the_file in $(ls "${DA_ROOT}/files"); do if [[ $the_file =~ ^[0-9]+ ]]; then for sub_file in $(find "${DA_ROOT}/files/$the_file" -type f); do file_number="${sub_file#${DA_ROOT}/files/}" file_number="${file_number:0:15}" file_directory="${DA_ROOT}/files/$file_number/" target_file="${sub_file#${file_directory}}" file_number="${file_number//\//}" file_number=$((16#$file_number)) az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "${sub_file}" -n "files/${file_number}/${target_file}" done else for sub_file in $(find "${DA_ROOT}/files/$the_file" -type f); do target_file="${sub_file#${DA_ROOT}/files/}" az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "${sub_file}" -n "${target_file}" done fi done fi fi fi if [ "${DAHOSTNAME:-none}" == "none" ]; then export DAHOSTNAME="${PUBLIC_HOSTNAME}" fi if [ "${DAWEBSERVER:-nginx}" = "apache" ] && [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then rm -f /etc/cron.daily/apache2 ln -s /usr/share/docassemble/cron/apache2 /etc/cron.daily/apache2 if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]]; then echo "initialize: Setting up Apache" >&2 a2dissite -q 000-default &> /dev/null a2dissite -q default-ssl &> /dev/null rm -f /etc/apache2/sites-available/000-default.conf rm -f /etc/apache2/sites-available/default-ssl.conf if [ "${DAHOSTNAME:-none}" != "none" ]; then if [ ! -f "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" ]; then rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ ! -f /etc/apache2/sites-available/docassemble-ssl.conf ]; then cp "${DA_ROOT}/config/docassemble-ssl.conf.dist" /etc/apache2/sites-available/docassemble-ssl.conf rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ ! -f /etc/apache2/sites-available/docassemble-http.conf ]; then cp "${DA_ROOT}/config/docassemble-http.conf.dist" /etc/apache2/sites-available/docassemble-http.conf rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ ! -f /etc/apache2/sites-available/docassemble-log.conf ]; then cp "${DA_ROOT}/config/docassemble-log.conf.dist" /etc/apache2/sites-available/docassemble-log.conf fi if [ ! -f /etc/apache2/sites-available/docassemble-redirect.conf ]; then cp "${DA_ROOT}/config/docassemble-redirect.conf.dist" /etc/apache2/sites-available/docassemble-redirect.conf fi else if [ ! -f /etc/apache2/sites-available/docassemble-http.conf ]; then cp "${DA_ROOT}/config/docassemble-http.conf.dist" /etc/apache2/sites-available/docassemble-http.conf || exit 1 fi fi a2ensite docassemble-http fi elif [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "initialize: Disabling apache2 cron" >&2 rm -f /etc/cron.daily/apache2 ln -s /usr/share/docassemble/cron/donothing /etc/cron.daily/apache2 fi if [ "${DAWEBSERVER:-nginx}" = "nginx" ] && [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "initialize: Setting up NGINX configuration" >&2 if [ "${USELETSENCRYPT:-false}" == "true" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" ]; then DASSLCERTIFICATE="/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem; # managed by Certbot" DASSLCERTIFICATEKEY="/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem; # managed by Certbot" else DASSLCERTIFICATE="/etc/ssl/docassemble/nginx.crt;" DASSLCERTIFICATEKEY="/etc/ssl/docassemble/nginx.key;" fi DASSLPROTOCOLS=${DASSLPROTOCOLS:-TLSv1.2 TLSv1.3} DASSLCIPHERS=${DASSLCIPHERS:-HIGH:!aNULL:!MD5} if [ ! -f "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" ]; then rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ "${BEHINDHTTPSLOADBALANCER:-false}" == "true" ]; then DAREALIP="include ${DA_ROOT}/config/nginx-realip;" ln -sf /etc/nginx/sites-available/docassembleredirect /etc/nginx/sites-enabled/docassembleredirect else DAREALIP="" rm -f /etc/nginx/sites-enabled/docassembleredirect fi if [ "${POSTURLROOT}" == "/" ]; then DALOCATIONREWRITE=" " else DALOCATIONREWRITE="location = ${WSGIROOT} { rewrite ^ ${POSTURLROOT}; }" fi if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]]; then rm -f /etc/nginx/sites-available/default rm -f /etc/nginx/sites-enabled/default if [ "${DAHOSTNAME:-none}" != "none" ]; then if [ ! -f /etc/nginx/sites-available/docassemblessl ]; then sed -e 's@{{DAHOSTNAME}}@'"${DAHOSTNAME:-localhost}"'@' \ -e 's@{{DALOCATIONREWRITE}}@'"${DALOCATIONREWRITE}"'@' \ -e 's@{{DAWSGIROOT}}@'"${WSGIROOT}"'@' \ -e 's@{{DAPOSTURLROOT}}@'"${POSTURLROOT}"'@' \ -e 's@{{DAREALIP}}@'"${DAREALIP}"'@' \ -e 's@{{DAMAXCONTENTLENGTH}}@'"${DAMAXCONTENTLENGTH}"'@' \ -e 's@{{DASSLCERTIFICATE}}@'"${DASSLCERTIFICATE}"'@' \ -e 's@{{DASSLCERTIFICATEKEY}}@'"${DASSLCERTIFICATEKEY}"'@' \ -e 's@{{DASSLPROTOCOLS}}@'"${DASSLPROTOCOLS}"'@' \ -e 's@{{DASSLCIPHERS}}@'"${DASSLCIPHERS}"'@' \ -e 's@{{DAWEBSOCKETSIP}}@'"${DAWEBSOCKETSIP:-127.0.0.1}"'@' \ -e 's@{{DAWEBSOCKETSPORT}}@'"${DAWEBSOCKETSPORT:-5000}"'@' \ -e 's@{{DALISTENPORT}}@'"${PORT:-80}"'@' \ "${DA_ROOT}/config/nginx-ssl.dist" > "/etc/nginx/sites-available/docassemblessl" rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ ! -f /etc/nginx/sites-available/docassemblehttp ]; then sed -e 's@{{DAHOSTNAME}}@'"${DAHOSTNAME:-localhost}"'@' \ -e 's@{{DALOCATIONREWRITE}}@'"${DALOCATIONREWRITE}"'@' \ -e 's@{{DAWSGIROOT}}@'"${WSGIROOT}"'@' \ -e 's@{{DAPOSTURLROOT}}@'"${POSTURLROOT}"'@' \ -e 's@{{DAREALIP}}@'"${DAREALIP}"'@' \ -e 's@{{DAMAXCONTENTLENGTH}}@'"${DAMAXCONTENTLENGTH}"'@' \ -e 's@{{DAWEBSOCKETSIP}}@'"${DAWEBSOCKETSIP:-127.0.0.1}"'@' \ -e 's@{{DAWEBSOCKETSPORT}}@'"${DAWEBSOCKETSPORT:-5000}"'@' \ -e 's@{{DALISTENPORT}}@'"${PORT:-80}"'@' \ "${DA_ROOT}/config/nginx-http.dist" > "/etc/nginx/sites-available/docassemblehttp" rm -f /etc/letsencrypt/da_using_lets_encrypt fi if [ ! -f /etc/nginx/sites-available/docassemblelog ]; then sed -e 's@{{DAHOSTNAME}}@'"${DAHOSTNAME:-localhost}"'@' \ -e 's@{{DAMAXCONTENTLENGTH}}@'"${DAMAXCONTENTLENGTH}"'@' \ "${DA_ROOT}/config/nginx-log.dist" > "/etc/nginx/sites-available/docassemblelog" fi if [ ! -f /etc/nginx/sites-available/docassembleredirect ]; then sed -e 's@{{DAHOSTNAME}}@'"${DAHOSTNAME:-localhost}"'@' \ "${DA_ROOT}/config/nginx-redirect.dist" > "/etc/nginx/sites-available/docassembleredirect" fi if [ ! -f /etc/nginx/sites-available/docassemblesslredirect ]; then sed -e 's@{{DAHOSTNAME}}@'"${DAHOSTNAME:-localhost}"'@' \ "${DA_ROOT}/config/nginx-ssl-redirect.dist" > "/etc/nginx/sites-available/docassemblesslredirect" fi else if [ ! -f /etc/nginx/sites-available/docassemblehttp ]; then sed -e 's@{{DAHOSTNAME}}@'"${DAHOSTNAME:-localhost}"'@' \ -e 's@{{DALOCATIONREWRITE}}@'"${DALOCATIONREWRITE}"'@' \ -e 's@{{DAWSGIROOT}}@'"${WSGIROOT}"'@' \ -e 's@{{DAPOSTURLROOT}}@'"${POSTURLROOT}"'@' \ -e 's@{{DAREALIP}}@'"${DAREALIP}"'@' \ -e 's@{{DAMAXCONTENTLENGTH}}@'"${DAMAXCONTENTLENGTH}"'@' \ -e 's@{{DAWEBSOCKETSIP}}@'"${DAWEBSOCKETSIP:-127.0.0.1}"'@' \ -e 's@{{DAWEBSOCKETSPORT}}@'"${DAWEBSOCKETSPORT:-5000}"'@' \ -e 's@{{DALISTENPORT}}@'"${PORT:-80}"'@' \ "${DA_ROOT}/config/nginx-http.dist" > "/etc/nginx/sites-available/docassemblehttp" fi fi fi fi echo "initialize: Setting and updating locale" >&2 if [ "${LOCALE:-undefined}" == "undefined" ]; then LOCALE="en_US.UTF-8 UTF-8" fi set -- $LOCALE DA_LANGUAGE=$1 export LANG=$1 if [ "${DAREADONLYFILESYSTEM:-false}" == "true" ]; then echo "initialize: not running anything related to update-locale, locale-gen, apt-get, dpkg, or pip because file system is read-only" >&2 else grep -q "^$LOCALE" /etc/locale.gen || { echo $LOCALE >> /etc/locale.gen && locale-gen ; } update-locale LANG="${DA_LANGUAGE}" if [ -n "$OTHERLOCALES" ]; then echo "initialize: Setting other locales" >&2 NEWLOCALE=false for LOCALETOSET in "${OTHERLOCALES[@]}"; do grep -q "^$LOCALETOSET" /etc/locale.gen || { echo $LOCALETOSET >> /etc/locale.gen; NEWLOCALE=true; } done if [ "$NEWLOCALE" == "true" ]; then locale-gen fi fi if [ -n "$PACKAGES" ]; then echo "initialize: Installing Ubuntu packages specified in the Configuration" >&2 for PACKAGE in "${PACKAGES[@]}"; do apt-get -q -y install $PACKAGE &> /dev/null done fi if [ "${DAINSTALLASROOT}" == "false" ]; then echo "initialize: Disabling pip version check" >&2 su -c "source \"${DA_ACTIVATE}\" && pip config set global.disable-pip-version-check true" www-data echo "initialize: Checking to see if an alternative pip global index is used" >&2 if [ "${PIPINDEXURL:-null}" != "null" ]; then echo "initialize: Setting the alternative pip global index" >&2 su -c "source \"${DA_ACTIVATE}\" && pip config set global.index-url \"${PIPINDEXURL}\"" www-data else echo "initialize: Using the standard pip global index" >&2 su -c "source \"${DA_ACTIVATE}\" && pip config unset global.index-url" www-data &> /dev/null fi echo "initialize: Checking to see if extra pip index urls are used" >&2 if [ "${PIPEXTRAINDEXURLS:-null}" != "null" ]; then echo "initialize: Setting extra pip index urls" >&2 su -c "source \"${DA_ACTIVATE}\" && pip config set global.extra-index-url ${PIPEXTRAINDEXURLS}" www-data else echo "initialize: Not using extra pip index urls" >&2 su -c "source \"${DA_ACTIVATE}\" && pip config unset global.extra-index-url" www-data &> /dev/null fi echo "initialize: Checking to see if pip trusted host is used" >&2 if [ "${PIPTRUSTEDHOST:-null}" != "null" ]; then su -c "source \"${DA_ACTIVATE}\" && pip config set global.trusted-host \"${PIPTRUSTEDHOST}\"" www-data else su -c "source \"${DA_ACTIVATE}\" && pip config set global.trusted-host github.com" www-data &> /dev/null fi if [ -n "$PYTHONPACKAGES" ]; then echo "initialize: Installing Python packages specified in the Configuration" >&2 for PACKAGE in "${PYTHONPACKAGES[@]}"; do su -c "source \"${DA_ACTIVATE}\" && pip install $PACKAGE" www-data done fi else echo "initialize: Disabling pip version check" >&2 pip config set global.disable-pip-version-check true echo "initialize: Checking to see if an alternative pip global index is used" >&2 if [ "${PIPINDEXURL:-null}" != "null" ]; then echo "initialize: Setting the alternative pip global index" >&2 pip config set global.index-url ${PIPINDEXURL} else echo "initialize: Using the standard pip global index" >&2 pip config unset global.index-url &> /dev/null fi echo "initialize: Checking to see if extra pip index urls are used" >&2 if [ "${PIPEXTRAINDEXURLS:-null}" != "null" ]; then echo "initialize: Setting extra pip index urls" >&2 pip config set global.extra-index-url ${PIPEXTRAINDEXURLS} else echo "initialize: Not using extra pip index urls" >&2 pip config unset global.extra-index-url &> /dev/null fi echo "initialize: Checking to see if pip trusted host is used" >&2 if [ "${PIPTRUSTEDHOST:-null}" != "null" ]; then pip config set global.trusted-host "${PIPTRUSTEDHOST}" else pip config set global.trusted-host "github.com" &> /dev/null fi if [ -n "$PYTHONPACKAGES" ]; then echo "initialize: Installing Python packages specified in the Configuration" >&2 for PACKAGE in "${PYTHONPACKAGES[@]}"; do pip install $PACKAGE done fi fi if [ "${TIMEZONE:-undefined}" != "undefined" ] && [ -f /usr/share/zoneinfo/$TIMEZONE ]; then echo "initialize: Configuring time zone" >&2 ln -fs /usr/share/zoneinfo/$TIMEZONE /etc/localtime dpkg-reconfigure -f noninteractive tzdata fi fi if [[ ! $CONTAINERROLE =~ .*:(all):.* ]] && [ "${KUBERNETES:-false}" == "false" ] && ([ "${S3ENABLE:-false}" == "true" ] || [ "${AZUREENABLE:-false}" == "true" ]); then echo "initialize: Registering this machine in the cloud" >&2 su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.cloud_register \"${DA_CONFIG_FILE}\"" www-data fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "initialize: Copying SSL certificates into position, if necessary" >&2 if [ ! -f "${DA_ROOT}/certs/apache.key" ] && [ -f "${DA_ROOT}/certs/apache.key.orig" ]; then mv "${DA_ROOT}/certs/apache.key.orig" "${DA_ROOT}/certs/apache.key" fi if [ ! -f "${DA_ROOT}/certs/apache.crt" ] && [ -f "${DA_ROOT}/certs/apache.crt.orig" ]; then mv "${DA_ROOT}/certs/apache.crt.orig" "${DA_ROOT}/certs/apache.crt" fi if [ ! -f "${DA_ROOT}/certs/apache.ca.pem" ] && [ -f "${DA_ROOT}/certs/apache.ca.pem.orig" ]; then mv "${DA_ROOT}/certs/apache.ca.pem.orig" "${DA_ROOT}/certs/apache.ca.pem" fi if [ ! -f "${DA_ROOT}/certs/nginx.key" ] && [ -f "${DA_ROOT}/certs/nginx.key.orig" ]; then mv "${DA_ROOT}/certs/nginx.key.orig" "${DA_ROOT}/certs/nginx.key" fi if [ ! -f "${DA_ROOT}/certs/nginx.crt" ] && [ -f "${DA_ROOT}/certs/nginx.crt.orig" ]; then mv "${DA_ROOT}/certs/nginx.crt.orig" "${DA_ROOT}/certs/nginx.crt" fi if [ ! -f "${DA_ROOT}/certs/nginx.ca.pem" ] && [ -f "${DA_ROOT}/certs/nginx.ca.pem.orig" ]; then mv "${DA_ROOT}/certs/nginx.ca.pem.orig" "${DA_ROOT}/certs/nginx.ca.pem" fi if [ ! -f "${DA_ROOT}/certs/exim.key" ] && [ -f "${DA_ROOT}/certs/exim.key.orig" ]; then mv "${DA_ROOT}/certs/exim.key.orig" "${DA_ROOT}/certs/exim.key" fi if [ ! -f "${DA_ROOT}/certs/exim.crt" ] && [ -f "${DA_ROOT}/certs/exim.crt.orig" ]; then mv "${DA_ROOT}/certs/exim.crt.orig" "${DA_ROOT}/certs/exim.crt" fi if [ ! -f "${DA_ROOT}/certs/postgresql.key" ] && [ -f "${DA_ROOT}/certs/postgresql.key.orig" ]; then mv "${DA_ROOT}/certs/postgresql.key.orig" "${DA_ROOT}/certs/postgresql.key" fi if [ ! -f "${DA_ROOT}/certs/postgresql.crt" ] && [ -f "${DA_ROOT}/certs/postgresql.crt.orig" ]; then mv "${DA_ROOT}/certs/postgresql.crt.orig" "${DA_ROOT}/certs/postgresql.crt" fi if [ ! -f "${DA_ROOT}/certs/apache.key" ] && [ -f "${DA_ROOT}/config/defaultcerts/apache.key.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/apache.key.orig" "${DA_ROOT}/certs/apache.key" fi if [ ! -f "${DA_ROOT}/certs/apache.crt" ] && [ -f "${DA_ROOT}/config/defaultcerts/apache.crt.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/apache.crt.orig" "${DA_ROOT}/certs/apache.crt" fi if [ ! -f "${DA_ROOT}/certs/apache.ca.pem" ] && [ -f "${DA_ROOT}/config/defaultcerts/apache.ca.pem.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/apache.ca.pem.orig" "${DA_ROOT}/certs/apache.ca.pem" fi if [ ! -f "${DA_ROOT}/certs/nginx.key" ] && [ -f "${DA_ROOT}/config/defaultcerts/nginx.key.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/nginx.key.orig" "${DA_ROOT}/certs/nginx.key" fi if [ ! -f "${DA_ROOT}/certs/nginx.crt" ] && [ -f "${DA_ROOT}/config/defaultcerts/nginx.crt.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/nginx.crt.orig" "${DA_ROOT}/certs/nginx.crt" fi if [ ! -f "${DA_ROOT}/certs/nginx.ca.pem" ] && [ -f "${DA_ROOT}/config/defaultcerts/nginx.ca.pem.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/nginx.ca.pem.orig" "${DA_ROOT}/certs/nginx.ca.pem" fi if [ ! -f "${DA_ROOT}/certs/exim.key" ] && [ -f "${DA_ROOT}/config/defaultcerts/exim.key.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/exim.key.orig" "${DA_ROOT}/certs/exim.key" fi if [ ! -f "${DA_ROOT}/certs/exim.crt" ] && [ -f "${DA_ROOT}/config/defaultcerts/exim.crt.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/exim.crt.orig" "${DA_ROOT}/certs/exim.crt" fi if [ ! -f "${DA_ROOT}/certs/postgresql.key" ] && [ -f "${DA_ROOT}/config/defaultcerts/postgresql.key.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/postgresql.key.orig" "${DA_ROOT}/certs/postgresql.key" fi if [ ! -f "${DA_ROOT}/certs/postgresql.crt" ] && [ -f "${DA_ROOT}/config/defaultcerts/postgresql.crt.orig" ]; then cp "${DA_ROOT}/config/defaultcerts/postgresql.crt.orig" "${DA_ROOT}/certs/postgresql.crt" fi python -m docassemble.webapp.install_certs "${DA_CONFIG_FILE}" || exit 1 fi echo "initialize: Testing if PostgreSQL is running" >&2 if pg_isready -q; then PGRUNNING=true else PGRUNNING=false fi if [[ $CONTAINERROLE =~ .*:(all|sql):.* ]] && [ "$PGRUNNING" == "false" ] && [ "$DBTYPE" == "postgresql" ]; then echo "initialize: Starting PostgreSQL" >&2 ${SUPERVISORCMD} start main:postgres || exit 1 sleep 4 su -c "while ! pg_isready -q; do sleep 1; done" postgres if [[ $CONTAINERROLE =~ .*:all:.* ]] && [ "${DBHOST:-localhost}" != "localhost" ]; then echo "initialize: Using remote SQL server so no need to test if database user exists" >&2 else echo "initialize: Testing if the database user exists" >&2 roleexists=`su -c "psql -tAc \"SELECT 1 FROM pg_roles WHERE rolname='${DBUSER:-docassemble}'\"" postgres` if [ -z "$roleexists" ]; then echo "initialize: Creating the database user" >&2 echo "create role "${DBUSER:-docassemble}" with login password '"${DBPASSWORD:-abc123}"';" | su -c psql postgres || exit 1 fi fi if [ "${RESTOREFROMBACKUP}" == "true" ]; then echo "initialize: Restoring SQL database" >&2 if [ "${S3ENABLE:-false}" == "true" ] && [[ $(s4cmd ls s3://${S3BUCKET}/postgres) ]]; then echo "initialize: Copying SQL file from S3" >&2 PGBACKUPDIR=`mktemp -d` s4cmd dsync "s3://${S3BUCKET}/postgres" "$PGBACKUPDIR" elif [ "${AZUREENABLE:-false}" == "true" ] && [[ $(python -m docassemble.webapp.list-cloud postgres) ]]; then echo "initialize: Copying SQL file from Azure Blob Storage" >&2 PGBACKUPDIR=`mktemp -d` for the_file in $(python -m docassemble.webapp.list-cloud postgres/); do if ! [[ $the_file =~ /$ ]]; then target_file=`basename "${the_file}"` az storage blob download --no-progress --only-show-errors --output none --container-name "${AZURECONTAINER}" -n "${the_file}" -f "$PGBACKUPDIR/${target_file}" fi done else PGBACKUPDIR="${DA_ROOT}/backup/postgres" fi if [ -d "${PGBACKUPDIR}" ]; then cd "$PGBACKUPDIR" chown -R postgres:postgres "$PGBACKUPDIR" for db in $( find . -maxdepth 1 -type f ! -iname ".*" ); do if [[ $CONTAINERROLE =~ .*:all:.* ]] && [ "${DBHOST:-localhost}" != "localhost" ] && [ "${DBBACKUP:-true}" == "true" ] && [ "${DBNAME:-docassemble}" == "${db}" ]; then echo "initialize: Not restoring postgres database $db because it is a backup of the remote database" >&2 else echo "initialize: Restoring postgres database $db" >&2 pg_restore -f - -F c -C -c $db | su -c psql postgres fi done if ([ "${S3ENABLE:-false}" == "true" ] || [ "${AZUREENABLE:-false}" == "true" ]) && [ "${PGBACKUPDIR}" != "${DA_ROOT}/backup/postgres" ]; then cd / rm -rf $PGBACKUPDIR fi cd /tmp fi fi if [[ $CONTAINERROLE =~ .*:all:.* ]] && [ "${DBHOST:-localhost}" != "localhost" ]; then echo "initialize: Using remote SQL server so no need to test if database exists" >&2 else echo "initialize: Testing if database exists" >&2 dbexists=`su -c "psql -tAc \"SELECT 1 FROM pg_database WHERE datname='${DBNAME:-docassemble}'\"" postgres` if [ -z "$dbexists" ]; then echo "initialize: Creating SQL database" >&2 echo "create database "${DBNAME:-docassemble}" owner "${DBUSER:-docassemble}" encoding UTF8;" | su -c psql postgres || exit 1 fi fi elif [ "$PGRUNNING" == "false" ] && [ "$DBTYPE" == "postgresql" ]; then export PGHOST="${DBHOST}" export PGUSER="${DBUSER}" export PGPASSWORD="${DBPASSWORD}" export PGDATABASE="postgres" if [ "$DBPORT" != "" ]; then export PGPORT="${DBPORT}" fi if [ "$DBSSLMODE" != "" ]; then export PGSSLMODE="${DBSSLMODE}" fi if [ "$DBSSLCERT" != "" ]; then export PGSSLCERT="/etc/ssl/docassemble/${DBSSLCERT}" fi if [ "$DBSSLKEY" != "" ]; then export PGSSLKEY="/etc/ssl/docassemble/${DBSSLKEY}" fi if [ "$DBSSLROOTCERT" != "" ]; then export PGSSLROOTCERT="/etc/ssl/docassemble/${DBSSLROOTCERT}" fi echo "initialize: Testing if remote SQL server is ready" >&2 while ! pg_isready -q; do sleep 1; done echo "initialize: Testing if remote SQL database exists" >&2 dbexists=`psql -tAc "SELECT 1 FROM pg_database WHERE datname='${DBNAME:-docassemble}'"` if [ -z "$dbexists" ]; then echo "initialize: Creating remote SQL database" >&2 echo "create database "${DBNAME:-docassemble}" owner "${DBUSER:-docassemble}";" | psql fi unset PGHOST unset PGUSER unset PGPASSWORD unset PGDATABASE unset PGPORT unset PGSSLMODE unset PGSSLCERT unset PGSSLKEY unset PGSSLROOTCERT fi if [[ $CONTAINERROLE =~ .*:(all|redis):.* ]] && [ "$REDISRUNNING" == "false" ]; then echo "initialize: Starting Redis" >&2 ${SUPERVISORCMD} start main:redis fi if [[ $CONTAINERROLE =~ .*:(all|cron):.* ]]; then echo "initialize: Obtaining default e-mail and password from mounted credentials, if available" >&2 if [ -f /configdata/initial_credentials ]; then echo "initialize: Found initial credentials" >&2 source /configdata/initial_credentials rm -f /configdata/initial_credentials fi echo "initialize: Creating tables" >&2 su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.create_tables \"${DA_CONFIG_FILE}\"" www-data unset DA_ADMIN_EMAIL unset DA_ADMIN_PASSWORD unset DA_ADMIN_API_KEY fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "initialize: Configuring log server, if applicable" >&2 if [ -f /etc/syslog-ng/syslog-ng.conf ] && [ ! -f "${DA_ROOT}/webapp/syslog-ng-orig.conf" ]; then cp /etc/syslog-ng/syslog-ng.conf "${DA_ROOT}/webapp/syslog-ng-orig.conf" fi fi OTHERLOGSERVER=false if [[ $CONTAINERROLE =~ .*:(web|celery):.* ]]; then if [ "${LOGSERVER:-undefined}" != "undefined" ]; then OTHERLOGSERVER=true fi fi if [[ $CONTAINERROLE =~ .*:(log):.* ]] || [ "${LOGSERVER:-undefined}" == "null" ]; then OTHERLOGSERVER=false fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ "$OTHERLOGSERVER" == "false" ] && [ -f "${LOGDIRECTORY}/docassemble.log" ]; then chown www-data:www-data "${LOGDIRECTORY}/docassemble.log" fi fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ "${DAUPDATEONSTART:-true}" == "true" ] && [ "${DAALLOWUPDATES:-true}" == "true" ]; then echo "initialize: Doing upgrading of packages" >&2 su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.update \"${DA_CONFIG_FILE}\" initialize" www-data || exit 1 touch "${DA_ROOT}/webapp/initialized" fi if [ "${DAUPDATEONSTART:-true}" == "initial" ] && [ ! -f "${DA_ROOT}/webapp/initialized" ] && [ "${DAALLOWUPDATES:-true}" == "true" ]; then echo "initialize: Doing initial upgrading of packages" >&2 su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.update \"${DA_CONFIG_FILE}\" initialize" www-data || exit 1 touch "${DA_ROOT}/webapp/initialized" fi fi if [[ $CONTAINERROLE =~ .*:(all|rabbitmq):.* ]]; then echo "initialize: Testing if RabbitMQ is running" >&2 if rabbitmqctl status &> /dev/null; then RABBITMQRUNNING=true echo "initialize: RabbitMQ is running" >&2 else RABBITMQRUNNING=false echo "initialize: RabbitMQ is not already running" >&2 fi if [ "$RABBITMQRUNNING" == "false" ]; then echo "initialize: Starting RabbitMQ" >&2 ${SUPERVISORCMD} start rabbitmq fi fi if [[ $CONTAINERROLE =~ .*:(all|celery):.* ]]; then echo "initialize: Checking if celery is already running" >&2 if su -c "source \"${DA_ACTIVATE}\" && timeout 5s celery -A docassemble.webapp.worker status" www-data 2>&1 | grep -q `hostname`; then echo "initialize: Celery is running" >&2 CELERYRUNNING=true; else echo "initialize: Celery is not already running" >&2 CELERYRUNNING=false; fi else CELERYRUNNING=false; fi if [[ $CONTAINERROLE =~ .*:(all|web|celery|cron):.* ]] && [ "${USENLTKSERVER:-true}" == "true" ]; then mkdir -p /var/run/nltk chown www-data:www-data /var/run/nltk rm -f "${NLTKSOCKET:-/var/run/nltk/da_nltk.sock}" echo "initialize: Starting NLTK server" >&2 ${SUPERVISORCMD} start nltk while [ ! -e "${NLTKSOCKET:-/var/run/nltk/da_nltk.sock}" ]; do echo "Waiting for NLTK server to start" >&2 sleep 1 done fi if [[ $CONTAINERROLE =~ .*:(all|celery):.* ]] && [ "$CELERYRUNNING" == "false" ]; then echo "initialize: Starting Celery" >&2 ${SUPERVISORCMD} start celery ${SUPERVISORCMD} start celerysingle fi NASCENTRUNNING=true; if [ "${DAWEBSERVER:-nginx}" != "none" ] && [ "${USEHTTPS:-false}" == "true" ] && [ "${USELETSENCRYPT:-false}" == "true" ]; then echo "initialize: Stopping the nascent web server so that Let's Encrypt can run" >&2 ${SUPERVISORCMD} stop nascent &> /dev/null NASCENTRUNNING=false; fi touch /usr/share/docassemble/log/worker.log \ && touch /usr/share/docassemble/log/single_worker.log \ && touch /usr/share/docassemble/log/uwsgi.log \ && touch /usr/share/docassemble/log/websockets.log \ && chown -R www-data:www-data /usr/share/docassemble/log if [ "${DAWEBSERVER:-nginx}" = "none" ]; then mkdir -p /var/run/uwsgi chown www-data:www-data /var/run/uwsgi echo "initialize: Stopping the nascent web server so that uwsgi can run" >&2 ${SUPERVISORCMD} stop nascent &> /dev/null NASCENTRUNNING=false; if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then if [ "${ENABLEMONITOR:-true}" = "true" ]; then echo "initialize: Starting websockets" >&2 ${SUPERVISORCMD} start websockets fi echo "initialize: Starting uwsgi" >&2 ${SUPERVISORCMD} start uwsgi fi if [[ $CONTAINERROLE =~ .*:log:.* ]]; then echo "initialize: Starting NGINX" >&2 ${SUPERVISORCMD} start nginx fi fi if [ "${DAWEBSERVER:-nginx}" = "nginx" ]; then if [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "$NGINXRUNNING" == "false" ]; then echo "initialize: Getting ready to start NGINX" >&2 if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ "${WWWUID:-none}" != "none" ] && [ "${WWWGID:-none}" != "none" ] && [ `id -u www-data` != $WWWUID ]; then echo "initialize: Changing the UID and GID of files" >&2 OLDUID=`id -u www-data` OLDGID=`id -g www-data` usermod -o -u $WWWUID www-data groupmod -o -g $WWWGID www-data find / -user $OLDUID -exec chown -h www-data {} \; find / -group $OLDGID -exec chgrp -h www-data {} \; if [[ $CONTAINERROLE =~ .*:(all|celery):.* ]] && [ "$CELERYRUNNING" == "false" ]; then ${SUPERVISORCMD} stop celery ${SUPERVISORCMD} stop celerysingle fi ${SUPERVISORCMD} reread ${SUPERVISORCMD} update if [[ $CONTAINERROLE =~ .*:(all|celery):.* ]] && [ "$CELERYRUNNING" == "false" ]; then ${SUPERVISORCMD} start celery ${SUPERVISORCMD} start celerysingle fi fi if [ "${USEHTTPS:-false}" == "true" ]; then echo "initialize: Configuring HTTPS" >&2 rm -f /etc/nginx/sites-enabled/docassemblehttp ln -sf /etc/nginx/sites-available/docassemblessl /etc/nginx/sites-enabled/docassemblessl if [ "${USELETSENCRYPT:-false}" == "true" ]; then echo "initialize: Running Let's Encrypt" >&2 export USE_PYTHON_3=1 if [ -f /etc/letsencrypt/da_using_lets_encrypt ]; then certbot renew --nginx --cert-name "${DAHOSTNAME}" else certbot --nginx --quiet --email "${LETSENCRYPTEMAIL}" --agree-tos --no-redirect -d "${DAHOSTNAME}" && touch /etc/letsencrypt/da_using_lets_encrypt fi nginx -s stop &> /dev/null touch /etc/letsencrypt/da_using_lets_encrypt else rm -f /etc/letsencrypt/da_using_lets_encrypt fi else echo "initialize: Not using HTTPS" >&2 rm -f /etc/letsencrypt/da_using_lets_encrypt rm -f /etc/nginx/sites-enabled/docassemblessl ln -sf /etc/nginx/sites-available/docassemblehttp /etc/nginx/sites-enabled/docassemblehttp fi fi fi if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [ "${USELETSENCRYPT:-false}" == "true" ]; then if [ "${S3ENABLE:-false}" == "true" ]; then echo "initialize: Copying Let's Encrypt to S3" >&2 cd / rm -f /tmp/letsencrypt.tar.gz if [ -d etc/letsencrypt ]; then tar -zcf /tmp/letsencrypt.tar.gz etc/letsencrypt s4cmd -f put /tmp/letsencrypt.tar.gz "s3://${S3BUCKET}/letsencrypt.tar.gz" rm -f /tmp/letsencrypt.tar.gz fi elif [ "${AZUREENABLE:-false}" == "true" ]; then echo "initialize: Copying Let's Encrypt to Azure Blob Storage" >&2 cd / rm -f /tmp/letsencrypt.tar.gz if [ -d etc/letsencrypt ]; then tar -zcf /tmp/letsencrypt.tar.gz etc/letsencrypt az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "/tmp/letsencrypt.tar.gz" -n "letsencrypt.tar.gz" rm -f /tmp/letsencrypt.tar.gz fi else echo "initialize: Backing up Let's Encrypt" >&2 cd / rm -f "${DA_ROOT}/backup/letsencrypt.tar.gz" tar -zcf "${DA_ROOT}/backup/letsencrypt.tar.gz" etc/letsencrypt fi cd /tmp fi if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then if [ "${ENABLEMONITOR:-true}" = "true" ]; then echo "initialize: Starting websockets" >&2 ${SUPERVISORCMD} start websockets fi echo "initialize: Starting uwsgi" >&2 ${SUPERVISORCMD} start uwsgi fi if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]]; then if [ "$NGINXRUNNING" == "false" ]; then if [ "$NASCENTRUNNING" == "true" ]; then echo "initialize: Stopping the nascent web server" >&2 ${SUPERVISORCMD} stop nascent &> /dev/null fi echo "initialize: Starting NGINX" >&2 ${SUPERVISORCMD} start nginx fi fi fi if [ "${DAWEBSERVER:-nginx}" = "apache" ]; then echo "initialize: Getting ready to start Apache" >&2 if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]] && [ "$APACHERUNNING" == "false" ] && [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then rm -f /etc/apache2/ports.conf fi function backup_apache { echo "initialize: Backing up Apache" >&2 if [ "${S3ENABLE:-false}" == "true" ]; then if [ "${USELETSENCRYPT:-false}" == "true" ]; then echo "initialize: Copying Let's Encrypt to S3" >&2 cd / rm -f /tmp/letsencrypt.tar.gz if [ -d etc/letsencrypt ]; then tar -zcf /tmp/letsencrypt.tar.gz etc/letsencrypt s4cmd -f put /tmp/letsencrypt.tar.gz "s3://${S3BUCKET}/letsencrypt.tar.gz" rm -f /tmp/letsencrypt.tar.gz fi cd /tmp fi if [[ $CONTAINERROLE =~ .*:(all):.* ]] || [[ ! $(python -m docassemble.webapp.list-cloud apache) ]]; then echo "initialize: Copying Apache to S3" >&2 s4cmd dsync "/etc/apache2/sites-available" "s3://${S3BUCKET}/apache" fi elif [ "${AZUREENABLE:-false}" == "true" ]; then if [ "${USELETSENCRYPT:-false}" == "true" ]; then echo "initialize: Copying Let's Encrypt to Azure Blob Storage" >&2 cd / rm -f /tmp/letsencrypt.tar.gz if [ -d etc/letsencrypt ]; then tar -zcf /tmp/letsencrypt.tar.gz etc/letsencrypt az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "/tmp/letsencrypt.tar.gz" -n "letsencrypt.tar.gz" rm -f /tmp/letsencrypt.tar.gz fi cd /tmp fi echo "initialize: Looking for Apache folder on Azure Blob Storage, if applicable" >&2 if [[ $CONTAINERROLE =~ .*:(all):.* ]] || [[ ! $(python -m docassemble.webapp.list-cloud apache) ]]; then echo "initialize: Copying Apache to Azure Blob Storage" >&2 for the_file in $(find /etc/apache2/sites-available/ -type f); do target_file=`basename "${the_file}"` echo "initialize: Saving apache" >&2 az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "${the_file}" -n "apache/${target_file}" done fi else if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then if [ "${USELETSENCRYPT:-false}" == "true" ]; then cd / rm -f "${DA_ROOT}/backup/letsencrypt.tar.gz" tar -zcf "${DA_ROOT}/backup/letsencrypt.tar.gz" etc/letsencrypt cd /tmp fi mkdir -p "${DA_ROOT}/backup/apache" rsync -auq --delete /etc/apache2/sites-available/ "${DA_ROOT}/backup/apache/" fi fi } if [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "$APACHERUNNING" == "false" ]; then echo "initialize: Configuring Apache" >&2 if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "Listen ${PORT:-80}" > /etc/apache2/ports.conf if [ "${WWWUID:-none}" != "none" ] && [ "${WWWGID:-none}" != "none" ] && [ `id -u www-data` != $WWWUID ]; then echo "initialize: Changing the UID and GID of files" >&2 OLDUID=`id -u www-data` OLDGID=`id -g www-data` usermod -o -u $WWWUID www-data groupmod -o -g $WWWGID www-data find / -user $OLDUID -exec chown -h www-data {} \; find / -group $OLDGID -exec chgrp -h www-data {} \; if [[ $CONTAINERROLE =~ .*:(all|celery):.* ]] && [ "$CELERYRUNNING" == "false" ]; then ${SUPERVISORCMD} stop celery ${SUPERVISORCMD} stop celerysingle fi ${SUPERVISORCMD} reread ${SUPERVISORCMD} update if [[ $CONTAINERROLE =~ .*:(all|celery):.* ]] && [ "$CELERYRUNNING" == "false" ]; then ${SUPERVISORCMD} start celery ${SUPERVISORCMD} start celerysingle fi fi if [ "${BEHINDHTTPSLOADBALANCER:-false}" == "true" ]; then a2enmod remoteip a2enconf docassemble-behindlb else a2dismod remoteip a2disconf docassemble-behindlb fi echo -e "LoadModule wsgi_module ${DA_PYTHON:-${DA_ROOT}/${DA_DEFAULT_LOCAL}}/lib/python3.14/site-packages/mod_wsgi/server/mod_wsgi-py314.cpython-314-${CURRENTARCH}-linux-gnu.so" >> /etc/apache2/conf-available/docassemble.conf echo -e "# This file is automatically generated" > /etc/apache2/conf-available/docassemble.conf echo -e "WSGIPythonHome ${DA_PYTHON:-${DA_ROOT}/${DA_DEFAULT_LOCAL}}" >> /etc/apache2/conf-available/docassemble.conf echo -e "Timeout ${DATIMEOUT:-60}\nDefine DAHOSTNAME ${DAHOSTNAME}\nDefine DAPOSTURLROOT ${POSTURLROOT}\nDefine DAWSGIROOT ${WSGIROOT}\nDefine DASERVERADMIN ${SERVERADMIN}\nDefine DAWEBSOCKETSIP ${DAWEBSOCKETSIP}\nDefine DAWEBSOCKETSPORT ${DAWEBSOCKETSPORT}\nDefine DACROSSSITEDOMAINVALUE *\nDefine DALISTENPORT ${PORT:-80}" >> /etc/apache2/conf-available/docassemble.conf if [ "${BEHINDHTTPSLOADBALANCER:-false}" == "true" ]; then echo "Listen 8081" >> /etc/apache2/ports.conf a2ensite docassemble-redirect fi if [ "${USEHTTPS:-false}" == "true" ]; then echo "initialize: Configuring HTTPS" >&2 echo "Listen 443" >> /etc/apache2/ports.conf a2enmod ssl a2ensite docassemble-ssl if [ "${USELETSENCRYPT:-false}" == "true" ]; then echo "initialize: Running Let's Encrypt" >&2 export USE_PYTHON_3=1 if [ -f /etc/letsencrypt/da_using_lets_encrypt ]; then certbot renew --apache --cert-name "${DAHOSTNAME}" else certbot --apache --quiet --email "${LETSENCRYPTEMAIL}" --agree-tos --redirect -d "${DAHOSTNAME}" && touch /etc/letsencrypt/da_using_lets_encrypt fi /etc/init.d/apache2 stop touch /etc/letsencrypt/da_using_lets_encrypt else rm -f /etc/letsencrypt/da_using_lets_encrypt fi else echo "initialize: Not using HTTPS" >&2 rm -f /etc/letsencrypt/da_using_lets_encrypt a2dismod ssl a2dissite -q docassemble-ssl &> /dev/null fi fi backup_apache fi if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ] && [[ $CONTAINERROLE =~ .*:(log):.* ]] && [ "$APACHERUNNING" == "false" ]; then echo "Listen 8080" >> /etc/apache2/ports.conf a2enmod cgid a2ensite docassemble-log fi if [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "${ENABLEMONITOR:-true}" = "true" ]; then echo "initialize: Starting websockets" >&2 ${SUPERVISORCMD} start websockets fi if [[ $CONTAINERROLE =~ .*:(all|web|log):.* ]] && [ "$APACHERUNNING" == "false" ]; then if [ "$NASCENTRUNNING" == "true" ]; then echo "initialize: Stopping the nascent web server" >&2 ${SUPERVISORCMD} stop nascent &> /dev/null fi echo "initialize: Starting Apache" >&2 ${SUPERVISORCMD} start apache2 fi fi if [ "${DAWEBSERVER:-nginx}" != "none" ] && [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then echo "initialize: Test localhost through HTTP" >&2 if [ "${USEHTTPS:-false}" == "false" ]; then curl -s http://localhost/ > /dev/null else curl -s -k https://localhost/ > /dev/null fi if [ "${DAWEBSERVER:-nginx}" = "apache" ]; then if [ "$APACHERUNNING" == "false" ]; then echo "initialize: Restarting Apache" >&2 ${SUPERVISORCMD} stop apache2 ${SUPERVISORCMD} start apache2 fi fi fi echo "initialize: Checking to see if unoserver should be started" >&2 if [ "$ENABLEUNOCONV" == "true" ] && command -v unoserver &> /dev/null; then echo "initialize: Starting unoserver" >&2 ${SUPERVISORCMD} start unoserver fi if [[ ! $CONTAINERROLE =~ .*:(all):.* ]]; then echo "initialize: Registering this server" >&2 su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.register \"${DA_CONFIG_FILE}\"" www-data fi if [ "$CRONRUNNING" == "false" ]; then echo "initialize: Starting cron" >&2 if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if ! grep -q '^CONTAINERROLE' /etc/crontab; then bash -c "set | grep -e '^CONTAINERROLE=' -e '^DA_PYTHON=' -e '^DA_CONFIG=' -e '^DA_ROOT=' -e '^DASUPERVISORUSERNAME=...' -e '^DASUPERVISORPASSWORD=...'; echo MAILTO=root@localhost; cat \"${DA_ROOT}/cron/crontab\"" > /tmp/crontab && cat /tmp/crontab > "${DA_ROOT}/cron/crontab" && rm -f /tmp/crontab fi fi ${SUPERVISORCMD} start cron fi if [ "${ENABLEEMAILSERVER:-true}" == "true" ]; then if exiwhat 2> /dev/null | grep -q listening; then EXIM4RUNNING=true else EXIM4RUNNING=false fi if [ "$EXIM4RUNNING" == "false" ] && [[ $CONTAINERROLE =~ .*:(all|mail):.* && ($DBTYPE = "postgresql" || $DBTYPE = "mysql") ]]; then echo "initialize: Starting exim4" >&2 if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ -f /usr/share/docassemble/config/exim4-update ] && [ "${DAHOSTNAME}" != "localhost" ]; then sed "s/dc_other_hostnames='\**'/dc_other_hostnames='${DAHOSTNAME}'/" /usr/share/docassemble/config/exim4-update > /tmp/temp-exim4-update if [ ! -f /etc/exim4/update-exim4.conf.conf ] || ! cmp -s /tmp/temp-exim4-update /etc/exim4/update-exim4.conf.conf; then cp /tmp/temp-exim4-update /etc/exim4/update-exim4.conf.conf update-exim4.conf fi rm -f /tmp/temp-exim4-update fi rm -f /etc/cron.daily/exim4-base ln -s /usr/share/docassemble/cron/exim4-base /etc/cron.daily/exim4-base if [ "${DBTYPE}" = "postgresql" ]; then cp "${DA_ROOT}/config/exim4-router-postgresql" /etc/exim4/dbrouter if [ "${DBHOST:-null}" != "null" ]; then echo -n 'hide pgsql_servers = '${DBHOST} > /etc/exim4/dbinfo else echo -n 'hide pgsql_servers = localhost' > /etc/exim4/dbinfo fi if [ "${DBPORT:-null}" != "null" ]; then echo -n '::'${DBPORT} >> /etc/exim4/dbinfo fi echo '/'${DBNAME}'/'${DBUSER}'/'${DBPASSWORD} >> /etc/exim4/dbinfo fi if [ "$DBTYPE" = "mysql" ]; then cp "${DA_ROOT}/config/exim4-router-mysql" /etc/exim4/dbrouter if [ "${DBHOST:-null}" != "null" ]; then echo -n 'hide mysql_servers = '${DBHOST} > /etc/exim4/dbinfo else echo -n 'hide mysql_servers = localhost' > /etc/exim4/dbinfo fi if [ "${DBPORT:-null}" != "null" ]; then echo -n '::'${DBPORT} >> /etc/exim4/dbinfo fi echo '/'${DBNAME}'/'${DBUSER}'/'${DBPASSWORD} >> /etc/exim4/dbinfo fi if [ "${DBTYPE}" = "postgresql" ]; then echo 'DAQUERY = select short from '${DBTABLEPREFIX}"shortener where short='\${quote_pgsql:\$local_part}'" >> /etc/exim4/dbinfo fi if [ "${DBTYPE}" = "mysql" ]; then echo 'DAQUERY = select short from '${DBTABLEPREFIX}"shortener where short='\${quote_mysql:\$local_part}'" >> /etc/exim4/dbinfo fi if [ -f /etc/ssl/docassemble/exim.crt ] && [ -f /etc/ssl/docassemble/exim.key ]; then cp /etc/ssl/docassemble/exim.crt /etc/exim4/exim.crt cp /etc/ssl/docassemble/exim.key /etc/exim4/exim.key chown root:Debian-exim /etc/exim4/exim.crt chown root:Debian-exim /etc/exim4/exim.key chmod 640 /etc/exim4/exim.crt chmod 640 /etc/exim4/exim.key echo 'MAIN_TLS_ENABLE = yes' >> /etc/exim4/dbinfo elif [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "${USELETSENCRYPT:-false}" == "true" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/cert.pem" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" ]; then cp "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" /etc/exim4/exim.crt cp "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" /etc/exim4/exim.key chown root:Debian-exim /etc/exim4/exim.crt chown root:Debian-exim /etc/exim4/exim.key chmod 640 /etc/exim4/exim.crt chmod 640 /etc/exim4/exim.key echo 'MAIN_TLS_ENABLE = yes' >> /etc/exim4/dbinfo else echo 'MAIN_TLS_ENABLE = no' >> /etc/exim4/dbinfo fi chmod og-rwx /etc/exim4/dbinfo fi ${SUPERVISORCMD} start exim4 elif [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then echo "initialize: Disabling exim4 cron" >&2 rm -f /etc/cron.daily/exim4-base ln -s /usr/share/docassemble/cron/donothing /etc/cron.daily/exim4-base fi fi if [[ $CONTAINERROLE =~ .*:(log):.* ]] || [ "$OTHERLOGSERVER" == "true" ]; then if [ -d /etc/syslog-ng ]; then echo "initialize: Starting log server" >&2 if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [ "$OTHERLOGSERVER" == "true" ]; then cp "${DA_ROOT}/webapp/syslog-ng-docker.conf" "${DA_ROOT}/syslogng/syslog-ng.conf" cp "${DA_ROOT}/webapp/docassemble-syslog-ng.conf" /etc/syslog-ng/conf.d/docassemble.conf sleep 5s else rm -f /etc/syslog-ng/conf.d/docassemble.conf cp "${DA_ROOT}/webapp/syslog-ng.conf" "${DA_ROOT}/syslogng/syslog-ng.conf" fi fi ${SUPERVISORCMD} start syslogng fi fi echo "initialize: Creating crashpad folder" >&2 mkdir -p /tmp/Crashpad/attachments mkdir -p /tmp/Crashpad/completed mkdir -p /tmp/Crashpad/new mkdir -p /tmp/Crashpad/pending touch /tmp/Crashpad/settings.dat chmod -R ogu+rwx /tmp/Crashpad mkdir -p /var/www/.cache mkdir -p /var/www/.config mkdir -p /var/www/.texlive2021 chown -R www-data:www-data /var/www/.cache chown -R www-data:www-data /var/www/.config chown -R www-data:www-data /var/www/.texlive2021 function stopfunc { echo "initialize: Beginning the stop process" >&2 rm -f "/var/run/docassemble/ready" if [[ ! $CONTAINERROLE =~ .*:(all):.* ]]; then su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.deregister \"${DA_CONFIG_FILE}\"" www-data if [ "${KUBERNETES:-false}" == "false" ] && ([ "${S3ENABLE:-false}" == "true" ] || [ "${AZUREENABLE:-false}" == "true" ]); then su -c "source \"${DA_ACTIVATE}\" && python -m docassemble.webapp.cloud_deregister" www-data fi fi if [ "${S3ENABLE:-false}" == "true" ]; then if [[ $CONTAINERROLE =~ .*:(all|log):.* ]]; then s4cmd dsync "${DA_ROOT}/log" "s3://${S3BUCKET}/log" fi if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then if [ "${DAWEBSERVER:-nginx}" = "apache" ]; then s4cmd dsync "/var/log/apache2" "s3://${S3BUCKET}/apachelogs" fi if [ "${DAWEBSERVER:-nginx}" = "nginx" ]; then s4cmd dsync "/var/log/nginx" "s3://${S3BUCKET}/nginxlogs" fi fi elif [ "${AZUREENABLE:-false}" == "true" ]; then if [[ $CONTAINERROLE =~ .*:(all|log):.* ]]; then echo "initialize: Saving log files to Azure Blob Storage" >&2 let LOGDIRECTORYLENGTH=${#LOGDIRECTORY}+2 for the_file in $(find "${LOGDIRECTORY}" -type f | cut -c ${LOGDIRECTORYLENGTH}-); do echo "initialize: Saving log file $the_file" >&2 az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "${LOGDIRECTORY}/${the_file}" -n "log/${the_file}" done fi if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then echo "initialize: Saving Apache log files to Azure Blob Storage" >&2 if [ "${DAWEBSERVER:-nginx}" = "apache" ]; then for the_file in $(find /var/log/apache2 -type f | cut -c 18-); do az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "/var/log/apache2/${the_file}" -n "apachelogs/${the_file}" done fi if [ "${DAWEBSERVER:-nginx}" = "nginx" ]; then echo "initialize: Saving NGINX log files to Azure Blob Storage" >&2 for the_file in $(find /var/log/nginx -type f | cut -c 16-); do az storage blob upload --no-progress --overwrite true --only-show-errors --output none --container-name "${AZURECONTAINER}" -f "/var/log/nginx/${the_file}" -n "nginxlogs/${the_file}" done fi fi elif [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then if [[ $CONTAINERROLE =~ .*:(all|web|celery|log|cron):.* ]]; then echo "initialize: Saving log files" >&2 rsync -auq --delete "${LOGDIRECTORY}" "${DA_ROOT}/backup/" fi if [[ $CONTAINERROLE =~ .*:(all|cron):.* ]]; then echo "initialize: Saving Configuration" >&2 rm -f "${DA_ROOT}/backup/config.yml" cp "${DA_CONFIG_FILE}" "${DA_ROOT}/backup/config.yml" echo "initialize: Saving files" >&2 rsync -auq --delete "${DA_ROOT}/files" "${DA_ROOT}/backup/" echo "initialize: Done saving files" >&2 fi if [[ $CONTAINERROLE =~ .*:(all):.* ]]; then if [ "${DAWEBSERVER:-nginx}" = "apache" ]; then echo "initialize: Saving Apache log files" >&2 mkdir -p "${DA_ROOT}/backup/apachelogs" rsync -auq --delete /var/log/apache2/ "${DA_ROOT}/backup/apachelogs/" fi if [ "${DAWEBSERVER:-nginx}" = "nginx" ]; then echo "initialize: Saving NGINX log files" >&2 mkdir -p "${DA_ROOT}/backup/nginxlogs" rsync -auq --delete /var/log/nginx/ "${DA_ROOT}/backup/nginxlogs/" fi fi fi if [[ $CONTAINERROLE =~ .*:(all|sql):.* ]]; then while [ -f "/var/run/docassemble/status-postgres-running" ]; do echo "Waiting for postgres to finish" >&2 sleep 1 done fi if [[ $CONTAINERROLE =~ .*:(all|redis):.* ]]; then while [ -f "/var/run/docassemble/status-redis-running" ]; do echo "Waiting for redis to finish" >&2 sleep 1 done fi DISK_USAGE=$(df --sync --portability / | sed '1d' | awk '{print $5}') if [ "${DISK_USAGE}" == "99%" ] || [ "${DISK_USAGE}" == "100%" ]; then echo "initialize: Disk is full; shutdown was not safe" >&2 kill %1 exit 1 fi rm -f /var/run/docassemble/da_running echo "initialize: Finished shutting down initialize" >&2 kill %1 exit 0 } trap stopfunc SIGINT SIGTERM touch /var/run/docassemble/ready echo "initialize: Finished initializing" >&2 sleep infinity & wait %1