Docker/initialize.sh
Rama master · réplica de lectura del repositorio original.
#! /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=$(</var/run/apache2/apache2.pid)
if kill -0 $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=$(</var/run/nginx.pid)
if kill -0 $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=$(</var/run/crond.pid)
if kill -0 $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