From 919bf6e69c1bca09980f03aa116510c49e02fe9f Mon Sep 17 00:00:00 2001 From: MOIS3Y Date: Tue, 12 Sep 2023 18:03:17 +0900 Subject: [PATCH] Add: psql support to entrypoint.sh --- scripts/entrypoint.sh | 104 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 3 deletions(-) diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index fa14713..c7a41b2 100755 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -1,6 +1,104 @@ #!/usr/bin/env sh -python manage.py migrate --no-input -python manage.py collectstatic --no-input -gunicorn logs_collector.wsgi:application +# set global variables: +_DB_URL="${DB_URL}" + + +# parses the database connection url and sets global variables: +# +# _DBMS: {psql, sqlite} default dbms used +# _DB_HOST {domain,ip_address} for connections +# _DB_PORT {5432,3306,etc} for connections +# _DB_USER {root,admin,etc} db username +# _DB_PASSWORD {super_secret} db user password +parse_db_url() { + local db_url=$1 + echo "-------- Check used DBMS --------" + if [ -n "${db_url}" ]; then + # ! PARSING: + # -- -- -- + # extract the protocol + local proto="$(echo "${db_url}" | grep '://' | sed -e's,^\(.*://\).*,\1,g')" + local dbms=${proto%:*} + # if dpms is "sqlite" we do not need parse url args + if [ "${dbms}" = "psql" ]; then + # remove the protocol (clean url) + local url=$(echo "${db_url}" | sed -e s,"${proto}",,g) + # extract the user and password (if any) + local userpass="$(echo "${url}" | grep @ | cut -d@ -f1)" + local password=$(echo "${userpass}" | grep : | cut -d: -f2) + # extract the host and port connection + local hostport=$(echo "${url}" | sed -e s,$userpass@,,g | cut -d/ -f1) + local port=$(echo "${hostport}" | grep : | cut -d: -f2) + # ! SET VARIABLES: + # -- -- -- -- -- + # _DB_HOST or/and _DB_PORT for test db connection + if [ -n "${port}" ]; then + _DB_HOST=$(echo "${hostport}" | grep : | cut -d: -f1) + _DB_PORT="${port}" + else + _DB_HOST="${hostport}" + fi + # _DB_USER or/and _DB_PASSWORD for future features + if [ -n "${password}" ]; then + _DB_USER=$(echo "${userpass}" | grep : | cut -d: -f1) + _DB_PASSWORD="${password}" + else + _DB_USER="${userpass}" + fi + fi + # _DBMS (sqlite or psql) + _DBMS="${dbms}" + echo "${_DBMS} is set as the default DBMS" + else + # _DBMS (sqlite) + _DBMS="sqlite" + echo "${_DBMS} is set as the default DBMS" + fi +} + + +# waits until the database becomes available for connection +wait_db() { + local dbms=$1 + local db_host=$2 + local db_port=$3 + if [ "${dbms}" = "psql" ];then + echo "------- Waiting for database start -------" + while ! nc -z $db_host $db_port; do + sleep 0.1 + done + echo "PostgreSQL started" + fi +} + + +# app config performs database migration, collects static files +app_config() { + echo "-------- Apply migration --------" + python manage.py migrate --no-input + echo "----- Collect static files ------" + python manage.py collectstatic --no-input +} + + +# run app wsgi web server +app_run() { + echo "--------- Run gunicorn ----------" + gunicorn logs_collector.wsgi:application +} + + +# app entrypoint +main() { + parse_db_url $_DB_URL + wait_db $_DBMS $_DB_HOST $_DB_PORT + app_config + app_run +} + +# RUN +main + +exec "$@"