#!/command/with-contenv /usr/bin/bash
# shellcheck shell=bash
+# vim: set ft=bash ts=4 sw=4 sts=4 et :
-declare -r log_prefix="[init-db-wait]"
+set -euo pipefail
-wait_for_postgres() {
- local attempt_num=1
- local -r max_attempts=5
+declare -r LOG_PREFIX="[init-db-wait]"
- echo "${log_prefix} Waiting for PostgreSQL to start..."
+declare -ri TIMEOUT=60
+declare -i ATTEMPT=0
+declare -i DELAY=0
+declare -i STARTED_AT=${EPOCHSECONDS:?EPOCHSECONDS var unset}
- local -r host="${PAPERLESS_DBHOST:-localhost}"
- local -r port="${PAPERLESS_DBPORT:-5432}"
- local -r user="${PAPERLESS_DBUSER:-paperless}"
+delay_next_attempt() {
+ local -i elapsed=$(( EPOCHSECONDS - STARTED_AT ))
+ local -ri remaining=$(( TIMEOUT - elapsed ))
- # Disable warning, host and port can't have spaces
- # shellcheck disable=SC2086
- while [ ! "$(pg_isready -h ${host} -p ${port} --username ${user})" ]; do
+ if (( remaining <= 0 )); then
+ echo "${LOG_PREFIX} Unable to connect after $elapsed seconds."
+ exit 1
+ fi
- if [ $attempt_num -eq $max_attempts ]; then
- echo "${log_prefix} Unable to connect to database."
- exit 1
- else
- echo "${log_prefix} Attempt $attempt_num failed! Trying again in 5 seconds..."
- fi
+ DELAY+=1
- attempt_num=$(("$attempt_num" + 1))
- sleep 5
- done
- # Extra in case this is a first start
- sleep 5
- echo "Connected to PostgreSQL"
-}
+ # clamp to remaining time
+ if (( DELAY > remaining )); then
+ DELAY=$remaining
+ fi
-wait_for_mariadb() {
- echo "${log_prefix} Waiting for MariaDB to start..."
+ ATTEMPT+=1
+ echo "${LOG_PREFIX} Attempt $ATTEMPT failed! Trying again in $DELAY seconds..."
+ sleep "$DELAY"
+}
- local -r host="${PAPERLESS_DBHOST:=localhost}"
- local -r port="${PAPERLESS_DBPORT:=3306}"
+wait_for_postgres() {
+ echo "${LOG_PREFIX} Waiting for PostgreSQL to start..."
- local attempt_num=1
- local -r max_attempts=5
+ local -r host="${PAPERLESS_DBHOST:-localhost}"
+ local -r port="${PAPERLESS_DBPORT:-5432}"
+ local -r user="${PAPERLESS_DBUSER:-paperless}"
- # Disable warning, host and port can't have spaces
- # shellcheck disable=SC2086
- while ! true > /dev/tcp/$host/$port; do
+ while ! pg_isready -h "${host}" -p "${port}" --username "${user}"; do
+ delay_next_attempt
+ done
+ echo "${LOG_PREFIX} Connected to PostgreSQL"
+}
- if [ $attempt_num -eq $max_attempts ]; then
- echo "${log_prefix} Unable to connect to database."
- exit 1
- else
- echo "${log_prefix} Attempt $attempt_num failed! Trying again in 5 seconds..."
+wait_for_mariadb() {
+ echo "${LOG_PREFIX} Waiting for MariaDB to start..."
- fi
+ local -r host="${PAPERLESS_DBHOST:-localhost}"
+ local -r port="${PAPERLESS_DBPORT:-3306}"
- attempt_num=$(("$attempt_num" + 1))
- sleep 5
+ while ! true > "/dev/tcp/$host/$port"; do
+ delay_next_attempt
done
- echo "Connected to MariaDB"
+ echo "${LOG_PREFIX} Connected to MariaDB"
}
-if [[ "${PAPERLESS_DBENGINE}" == "mariadb" ]]; then
- echo "${log_prefix} Waiting for MariaDB to report ready"
+if [[ "${PAPERLESS_DBENGINE:-}" == "mariadb" ]]; then
wait_for_mariadb
-elif [[ -n "${PAPERLESS_DBHOST}" ]]; then
- echo "${log_prefix} Waiting for postgresql to report ready"
+elif [[ -n "${PAPERLESS_DBHOST:-}" ]]; then
wait_for_postgres
fi
- echo "${log_prefix} Database is ready"
+echo "${LOG_PREFIX} Database is ready"