Wait for Postgres in run script

This commit is contained in:
Colin Seymour
2026-06-15 15:12:14 +00:00
parent b03e782e8f
commit a7bc113eb0
+48 -34
View File
@@ -52,46 +52,60 @@ for env_var in $(bashio::config 'env_vars|keys'); do
export "${name}=${value}" export "${name}=${value}"
done done
# Create the PostgreSQL database if it doesn't exist # Wait for PostgreSQL to be ready before continuing. The add-on can start
bashio::log.info "Checking for database '$DATABASE_NAME' on $DATABASE_HOST" # before the database is accepting connections (e.g. on a Home Assistant reboot
if pg_isready -h "$DATABASE_HOST" -p "$DATABASE_PORT" > /dev/null 2>&1; then # when both add-ons start together, or under load in CI), so retry instead of
# Check the version of PostgreSQL database is v16.7 or later or v17.3 or later # failing immediately - TeslaMate has no built-in retry for this pre-check and
pg_version=$(PGPASSWORD="$DATABASE_PASS" psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER" postgres -Atqc "SELECT regexp_replace(version(), 'PostgreSQL ([^ ]+) .*', '\\1') AS version") # the s6 finish script would otherwise halt the whole add-on.
major_version=$(echo "$pg_version" | cut -d '.' -f 1) bashio::log.info "Waiting for PostgreSQL at '$DATABASE_HOST:$DATABASE_PORT'..."
minor_version=$(echo "$pg_version" | cut -d '.' -f 2) pg_wait_attempt=0
compat=true pg_wait_max=30
case "$major_version" in until pg_isready -h "$DATABASE_HOST" -p "$DATABASE_PORT" > /dev/null 2>&1; do
16) pg_wait_attempt=$((pg_wait_attempt + 1))
[[ "$minor_version" -lt 7 ]] && compat=false if [[ "$pg_wait_attempt" -ge "$pg_wait_max" ]]; then
;; bashio::log.error "PostgreSQL at '$DATABASE_HOST' is not ready or unreachable after $((pg_wait_max * 2))s"
17)
[[ "$minor_version" -lt 3 ]] && compat=false
;;
*)
[[ "$major_version" -lt 16 ]] && compat=false
;;
esac
if [ $compat = false ]; then
bashio::log.error "PostgreSQL version $pg_version is not supported. Please upgrade to v16.7 or later or v17.3 or later."
exit 1 exit 1
fi fi
bashio::log.info "PostgreSQL not ready yet, retrying in 2s (${pg_wait_attempt}/${pg_wait_max})..."
sleep 2
done
bashio::log.info "PostgreSQL is ready"
if [[ -n $(PGPASSWORD="$DATABASE_PASS" psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER" postgres -Atqc "SELECT datname FROM pg_database WHERE datname = '$DATABASE_NAME'") ]]; then # Create the PostgreSQL database if it doesn't exist
bashio::log.info "Database $DATABASE_NAME already exists" bashio::log.info "Checking for database '$DATABASE_NAME' on $DATABASE_HOST"
else # Check the version of PostgreSQL database is v16.7 or later or v17.3 or later
if PGPASSWORD="$DATABASE_PASS" psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER" postgres -qc "CREATE DATABASE \"$DATABASE_NAME\""; then pg_version=$(PGPASSWORD="$DATABASE_PASS" psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER" postgres -Atqc "SELECT regexp_replace(version(), 'PostgreSQL ([^ ]+) .*', '\\1') AS version")
bashio::log.info "Database $DATABASE_NAME created" major_version=$(echo "$pg_version" | cut -d '.' -f 1)
else minor_version=$(echo "$pg_version" | cut -d '.' -f 2)
bashio::log.error "Failed to create database $DATABASE_NAME" compat=true
exit 1 case "$major_version" in
fi 16)
fi [[ "$minor_version" -lt 7 ]] && compat=false
else ;;
bashio::log.error "PostgreSQL at '$DATABASE_HOST' is not ready or unreachable" 17)
[[ "$minor_version" -lt 3 ]] && compat=false
;;
*)
[[ "$major_version" -lt 16 ]] && compat=false
;;
esac
if [ $compat = false ]; then
bashio::log.error "PostgreSQL version $pg_version is not supported. Please upgrade to v16.7 or later or v17.3 or later."
exit 1 exit 1
fi fi
if [[ -n $(PGPASSWORD="$DATABASE_PASS" psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER" postgres -Atqc "SELECT datname FROM pg_database WHERE datname = '$DATABASE_NAME'") ]]; then
bashio::log.info "Database $DATABASE_NAME already exists"
else
if PGPASSWORD="$DATABASE_PASS" psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER" postgres -qc "CREATE DATABASE \"$DATABASE_NAME\""; then
bashio::log.info "Database $DATABASE_NAME created"
else
bashio::log.error "Failed to create database $DATABASE_NAME"
exit 1
fi
fi
# Import dashboards # Import dashboards
if bashio::config.true 'grafana_import_dashboards'; then if bashio::config.true 'grafana_import_dashboards'; then
bashio::log.info "Importing Grafana dashboards..." bashio::log.info "Importing Grafana dashboards..."