2025-01-06 09:09:27 -05:00
#!/usr/bin/env bash
# shellcheck shell=bash
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
##@Version : 202605241142-git
2025-01-06 09:09:27 -05:00
# @@Author : Jason Hempstead
# @@Contact : jason@casjaysdev.pro
2026-05-26 17:35:40 -04:00
# @@License : WTFPL
2025-01-29 13:43:57 -05:00
# @@ReadME : zz-nginx.sh --help
2026-05-26 17:35:40 -04:00
# @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments
# @@Created : Tuesday, May 26, 2026 15:41 EDT
2025-01-29 13:43:57 -05:00
# @@File : zz-nginx.sh
2025-01-06 09:09:27 -05:00
# @@Description :
# @@Changelog : New script
# @@TODO : Better documentation
# @@Other :
# @@Resource :
# @@Terminal App : no
# @@sudo/root : no
# @@Template : other/start-service
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
# shellcheck disable=SC1001,SC1003,SC2001,SC2003,SC2016,SC2031,SC2090,SC2115,SC2120,SC2155,SC2199,SC2229,SC2317,SC2329
# - - - - - - - - - - - - - - - - - - - - - - - - -
set -e
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# run trap command on exit
2026-05-26 17:35:40 -04:00
trap '__trap_err_handler' ERR
trap 'retVal=$?;if [ "$SERVICE_IS_RUNNING" != "yes" ] && [ -f "$SERVICE_PID_FILE" ]; then rm -Rf "$SERVICE_PID_FILE"; fi;exit $retVal' SIGINT SIGTERM
trap 'retVal=$?;if [ "$SERVICE_IS_RUNNING" != "yes" ] && [ -f "$SERVICE_PID_FILE" ]; then rm -Rf "$SERVICE_PID_FILE"; fi;exit $retVal' SIGPWR 2>/dev/null || true
# - - - - - - - - - - - - - - - - - - - - - - - - -
# ERR trap handler - smart about critical vs non-critical errors
__trap_err_handler( ) {
local retVal = $?
local command = " $BASH_COMMAND "
# Ignore SIGPIPE and user interrupts
[ $retVal -eq 130 ] || [ $retVal -eq 141 ] && return $retVal
# Non-critical: file operations, text processing, user/group operations
if [ [ " $command " = ~ ( mkdir| touch| chmod| chown| chgrp| ln| cp| mv| rm| echo| printf| cat| tee| sed| awk| grep| find| sort| uniq| adduser| addgroup| usermod| groupmod| id| getent) ] ] ; then
return 0
fi
# Non-critical: conditional checks that might fail
if [ [ " $command " = ~ ( test| \[ | \[ \[ | kill -0| pgrep| pidof| ps) ] ] ; then
return 0
fi
# Critical error - but only fail if service hasn't started yet
if [ " $SERVICE_IS_RUNNING " != "yes" ] ; then
echo " ❌ Critical error (exit $retVal ): $command " >& 2
kill -TERM 1 2>/dev/null || exit $retVal
fi
return 0
}
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 09:14:22 -04:00
SCRIPT_FILE = " $0 "
SERVICE_NAME = "nginx"
2026-05-26 17:35:40 -04:00
SCRIPT_NAME = " ${ SCRIPT_FILE ##*/ } "
2025-10-22 09:14:22 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
# Function to exit appropriately based on context
__script_exit( ) {
2026-05-26 17:35:40 -04:00
local exit_code = " ${ 1 :- 0 } "
if [ " ${ BASH_SOURCE [0] } " != " ${ 0 } " ] ; then
# Script is being sourced - use return
return " $exit_code "
else
# Script is being executed - use exit
exit " $exit_code "
fi
2025-10-22 09:14:22 -04:00
}
# - - - - - - - - - - - - - - - - - - - - - - - - -
# Exit if service is disabled
2026-05-26 17:35:40 -04:00
if [ -n " $TOR_NGINX_ENABLED " ] ; then
if [ " $TOR_NGINX_ENABLED " != "yes" ] ; then
export SERVICE_DISABLED = " $SERVICE_NAME "
__script_exit 0
fi
fi
2025-10-22 09:14:22 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# setup debugging - https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
[ -f "/config/.debug" ] && [ -z " $DEBUGGER_OPTIONS " ] && export DEBUGGER_OPTIONS = " $( <"/config/.debug" ) " || DEBUGGER_OPTIONS = " ${ DEBUGGER_OPTIONS :- } "
2026-05-26 17:35:40 -04:00
if [ " $DEBUGGER " = "on" ] || [ -f "/config/.debug" ] ; then
echo "Enabling debugging"
set -o pipefail
[ -n " $DEBUGGER_OPTIONS " ] && set -" $DEBUGGER_OPTIONS "
export DEBUGGER = "on"
else
set -o pipefail
fi
2025-10-22 09:14:22 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
export PATH = "/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin"
2025-10-22 09:14:22 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# import the functions file
if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ] ; then
2026-05-26 17:35:40 -04:00
. "/usr/local/etc/docker/functions/entrypoint.sh"
2025-01-06 09:09:27 -05:00
fi
2025-10-22 09:14:22 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# import variables
for set_env in "/root/env.sh" "/usr/local/etc/docker/env" /*.sh "/config/env" /*.sh; do
2026-05-26 17:35:40 -04:00
if [ -f " $set_env " ] ; then
. " $set_env "
fi
2025-01-06 09:09:27 -05:00
done
2025-10-22 09:14:22 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
# exit if __start_init_scripts function hasn't been Initialized
2026-05-05 19:13:19 -04:00
if [ ! -f "/run/.start_init_scripts.pid" ] ; then
2026-05-26 17:35:40 -04:00
echo "__start_init_scripts function hasn't been Initialized" >& 2
SERVICE_IS_RUNNING = "no"
__script_exit 1
2025-10-22 09:14:22 -04:00
fi
# Clean up any stale PID file for this service on startup
if [ -n " $SERVICE_NAME " ] && [ -f " /run/init.d/ $SERVICE_NAME .pid " ] ; then
2026-05-26 17:35:40 -04:00
old_pid = $( <" /run/init.d/ $SERVICE_NAME .pid " ) 2>/dev/null
if [ -n " $old_pid " ] && ! kill -0 " $old_pid " 2>/dev/null; then
echo " 🧹 Removing stale PID file for $SERVICE_NAME "
rm -f " /run/init.d/ $SERVICE_NAME .pid "
fi
2025-10-22 09:14:22 -04:00
fi
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Custom functions
2025-06-12 11:57:45 -04:00
__onion_site_dir_is_empty( ) { [ " $( ls -A " /data/htdocs/onions/ ${ 1 :- $onion_site } " 2>/dev/null | wc -l) " -eq 0 ] || return 1; }
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Script to execute
START_SCRIPT = " /usr/local/etc/docker/exec/ $SERVICE_NAME "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Reset environment before executing service
2025-01-29 13:43:57 -05:00
RESET_ENV = "no"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set webroot
WWW_ROOT_DIR = "/data/htdocs/www"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Default predefined variables
2025-01-29 13:43:57 -05:00
DATA_DIR = "/data/nginx" # set data directory
CONF_DIR = "/config/nginx" # set config directory
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# set the containers etc directory
2025-01-29 13:43:57 -05:00
ETC_DIR = "/etc/nginx"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# set the var dir
VAR_DIR = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-29 13:43:57 -05:00
TMP_DIR = "/tmp/nginx" # set the temp dir
RUN_DIR = "/run/nginx" # set scripts pid dir
LOG_DIR = "/data/logs/nginx" # set log directory
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set the working dir
WORK_DIR = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# port which service is listening on
SERVICE_PORT = "80"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# User to use to launch service - IE: postgres
2026-05-26 17:35:40 -04:00
# normally root
RUNAS_USER = "root"
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# User and group in which the service switches to - IE: nginx,apache,mysql,postgres
2025-10-22 10:50:04 -04:00
SERVICE_USER = "root" # execute command as another user
SERVICE_GROUP = "root" # Set the service group
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set password length
RANDOM_PASS_USER = ""
RANDOM_PASS_ROOT = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set user and group ID
SERVICE_UID = "0" # set the user id
SERVICE_GID = "0" # set the group id
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# execute command variables - keep single quotes variables will be expanded later
2025-01-29 13:43:57 -05:00
EXEC_CMD_BIN = 'nginx' # command to execute
EXEC_CMD_ARGS = '-c $ETC_DIR/nginx.conf' # command arguments
EXEC_PRE_SCRIPT = '' # execute script before
2026-05-26 17:35:40 -04:00
# Set to 'no' for configuration services (no daemon process), leave blank for actual services
SERVICE_USES_PID = ''
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Is this service a web server
2025-01-29 13:43:57 -05:00
IS_WEB_SERVER = "yes"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Is this service a database server
IS_DATABASE_SERVICE = "no"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Does this service use a database server
USES_DATABASE_SERVICE = "no"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set defualt type - [custom,sqlite,redis,postgres,mariadb,mysql,couchdb,mongodb,supabase]
DATABASE_SERVICE_TYPE = "sqlite"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Show message before execute
PRE_EXEC_MESSAGE = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set the wait time to execute __post_execute function - minutes
POST_EXECUTE_WAIT_TIME = "1"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Update path var
PATH = " $PATH :. "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Where to save passwords to
ROOT_FILE_PREFIX = "/config/secure/auth/root" # directory to save username/password for root user
USER_FILE_PREFIX = "/config/secure/auth/user" # directory to save username/password for normal user
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# root/admin user info password/random]
2025-01-29 13:43:57 -05:00
root_user_name = " ${ NGINX_ROOT_USER_NAME :- } " # root user name
root_user_pass = " ${ NGINX_ROOT_PASS_WORD :- } " # root user password
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Normal user info [password/random]
2025-01-29 13:43:57 -05:00
user_name = " ${ NGINX_USER_NAME :- } " # normal user name
user_pass = " ${ NGINX_USER_PASS_WORD :- } " # normal user password
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Load variables from config
2026-05-26 17:35:40 -04:00
# Generated by my dockermgr script
if [ -f "/config/env/nginx.script.sh" ] ; then
. "/config/env/nginx.script.sh"
fi
# Overwrite the variables
if [ -f "/config/env/nginx.sh" ] ; then
. "/config/env/nginx.sh"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Additional predefined variables
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Additional variables
2025-11-21 09:35:41 -05:00
TOR_HIDDEN_IP = " ${ TOR_HIDDEN_IP :- } "
TOR_HIDDEN_SERVICE_DIR = " ${ TOR_HIDDEN_SERVICE_DIR :- /data/tor/server/hidden } "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Specifiy custom directories to be created
ADD_APPLICATION_FILES = ""
ADD_APPLICATION_DIRS = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
APPLICATION_FILES = " $LOG_DIR / $SERVICE_NAME .log "
2025-10-22 10:08:38 -04:00
APPLICATION_DIRS = " $ETC_DIR $CONF_DIR $LOG_DIR $TMP_DIR $RUN_DIR $VAR_DIR $DATA_DIR "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Additional config dirs - will be Copied to /etc/$name
ADDITIONAL_CONFIG_DIRS = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# define variables that need to be loaded into the service - escape quotes - var=\"value\",other=\"test\"
CMD_ENV = ""
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Overwrite based on file/directory
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Per Application Variables or imports
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Custom commands to run before copying to /config
__run_precopy( ) {
2025-10-22 08:53:17 -04:00
# Define environment
local hostname = ${ HOSTNAME }
# Define actions/commands
if [ ! -d " $WWW_ROOT_DIR " ] || __is_dir_empty " $WWW_ROOT_DIR " ; then
mkdir -p " $WWW_ROOT_DIR "
if [ -d "/usr/share/httpd/default" ] ; then
cp -Rf "/usr/share/httpd/default/." " $WWW_ROOT_DIR / "
2025-10-22 11:33:49 -04:00
[ -f " $WWW_ROOT_DIR /hidden_services.html " ] && rm -Rf " $WWW_ROOT_DIR /hidden_services.html "
2025-10-22 08:53:17 -04:00
else
echo "Welcome" >" $WWW_ROOT_DIR /index.php "
fi
fi
if [ -d " $WWW_ROOT_DIR /.git " ] ; then
rm -Rf " $WWW_ROOT_DIR /.git "
fi
[ -d " $WWW_ROOT_DIR /.well-known " ] || mkdir -p " $WWW_ROOT_DIR /.well-known "
# allow custom functions
if builtin type -t __run_precopy_local | grep -q 'function' ; then __run_precopy_local; fi
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Custom prerun functions - IE setup WWW_ROOT_DIR
__execute_prerun( ) {
2025-10-22 08:53:17 -04:00
# Define environment
local hostname = ${ HOSTNAME }
local php_ver = " ${ PHP_VERSION :- 84 } "
local php_fpm_bin = " $( type -P php-fpm || type -P php-fpm$$ php_ver || false ) "
# Define actions/commands
if [ -n " $php_fpm_bin " ] ; then
$php_fpm_bin --nodaemonize --fpm-config " /etc/php $php_ver /php-fpm.conf " &
fi
# allow custom functions
if builtin type -t __execute_prerun_local | grep -q 'function' ; then __execute_prerun_local; fi
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Run any pre-execution checks
__run_pre_execute_checks( ) {
2026-05-26 17:35:40 -04:00
# Set variables
local exitStatus = 0
# message to show at start
local pre_execute_checks_MessageST = " Running preexecute check for $SERVICE_NAME "
# message to show at completion
local pre_execute_checks_MessageEnd = " Finished preexecute check for $SERVICE_NAME "
__banner " $pre_execute_checks_MessageST "
# Put command to execute in parentheses
{
true
}
exitStatus = $?
__banner " $pre_execute_checks_MessageEnd : Status $exitStatus "
2025-01-06 09:09:27 -05:00
2026-05-26 17:35:40 -04:00
# show exit message
if [ $exitStatus -ne 0 ] ; then
echo "The pre-execution check has failed" >& 2
if [ -f " $SERVICE_PID_FILE " ] ; then
rm -Rf " $SERVICE_PID_FILE "
fi
__script_exit 1
fi
# allow custom functions
if builtin type -t __run_pre_execute_checks_local | grep -q 'function' ; then
__run_pre_execute_checks_local
fi
# exit function
return $exitStatus
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# use this function to update config files - IE: change port
__update_conf_files( ) {
2025-10-22 08:53:17 -04:00
local exitCode = 0 # default exit code
local sysname = " ${ SERVER_NAME :- ${ FULL_DOMAIN_NAME :- $HOSTNAME } } " # set hostname
local default_host = " $DEFAULT_ONION_SITE "
2025-10-22 14:10:17 -04:00
local NEW_SITE = "no"
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 08:53:17 -04:00
# delete files
#__rm ""
2025-01-06 09:09:27 -05:00
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 08:53:17 -04:00
# custom commands
2025-10-22 15:06:50 -04:00
if [ -f " $WWW_ROOT_DIR /defaultOnion.txt " ] ; then
default_host = " ${ default_host :- $( <" $WWW_ROOT_DIR /defaultOnion.txt " ) } "
rm -Rf " $WWW_ROOT_DIR /defaultOnion.txt "
2025-10-22 14:10:17 -04:00
fi
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 08:53:17 -04:00
# replace variables
# __replace "" "" "$CONF_DIR/nginx.conf"
# replace variables recursively
# __find_replace "" "" "$CONF_DIR"
2025-10-22 14:30:35 -04:00
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 08:53:17 -04:00
# define actions
while :; do
2025-11-21 09:35:41 -05:00
[ -d "/run/tor/sites" ] && sites = " $( ls -A /run/tor/sites/* 2>/dev/null | wc -l) "
if [ ! -f "/tmp/init_tor_services" ] ; then echo "The tor server seems to have started" && break; else echo "The nginx server is waiting for tor to start" && sleep 30; fi
2025-10-22 08:53:17 -04:00
done
2025-10-22 11:33:49 -04:00
if [ " $sites " -eq 0 ] ; then
echo "No onion sites found in /run/tor/sites" >& 2
else
for site in "/run/tor/sites" /*; do
onion_site = " $( basename -- $site ) "
2025-10-22 14:10:17 -04:00
__onion_site_dir_is_empty " $onion_site " && NEW_SITE = "yes" || NEW_SITE = "no"
2025-10-22 11:33:49 -04:00
[ -d " /data/htdocs/onions/ $onion_site " ] || mkdir -p " /data/htdocs/onions/ $onion_site "
2025-10-22 15:06:50 -04:00
if [ " $default_host " = " $onion_site " ] ; then
if [ " $NEW_SITE " != "no" ] ; then
cp -Rfa " $WWW_ROOT_DIR /. " " /data/htdocs/onions/ $onion_site / "
fi
elif [ " $NEW_SITE " = "yes" ] ; then
if [ -f "/usr/share/httpd/default/hidden_services.html" ] ; then
cp -Rf "/usr/share/httpd/default/hidden_services.html" " /data/htdocs/onions/ $onion_site /index.html "
else
echo '<html><body><br /><center>HTML Document Root: /data/htdocs/onions/' $onion_site '</center><br /></body></html>' >" /data/htdocs/onions/ $onion_site /index.html "
2025-10-22 08:53:17 -04:00
fi
fi
2025-10-22 11:33:49 -04:00
if [ ! -f " /config/nginx/vhosts.d/ $onion_site .onion.conf " ] ; then
cp -Rf "/config/nginx/vhosts.d/template" " /config/nginx/vhosts.d/ $onion_site .onion.conf "
2025-10-22 12:13:32 -04:00
fi
if [ -f " /config/nginx/vhosts.d/ $onion_site .onion.conf " ] ; then
2025-10-22 11:33:49 -04:00
sed -i 's|REPLACE_ONION_SITE|' $onion_site .onion'|g' " /config/nginx/vhosts.d/ $onion_site .onion.conf "
2025-11-21 09:35:41 -05:00
sed -i 's|REPLACE_ONION_PORT|' $TOR_HIDDEN_IP :$SERVICE_PORT '|g' " /config/nginx/vhosts.d/ $onion_site .onion.conf "
2025-10-22 11:33:49 -04:00
sed -i 's|REPLACE_ONION_WWW_DIR|/data/htdocs/onions/' $onion_site '|g' " /config/nginx/vhosts.d/ $onion_site .onion.conf "
2025-10-22 12:13:32 -04:00
fi
if [ -f " /data/htdocs/onions/ $onion_site /index.html " ] ; then
sed -i 's|REPLACE_ONION_ADDRESS|' $onion_site .onion'|g' " /data/htdocs/onions/ $onion_site /index.html "
2025-10-22 11:33:49 -04:00
sed -i 's|REPLACE_DEFAULT_TOR_ADDRESS|' $onion_site '|g' " /data/htdocs/onions/ $onion_site /index.html "
2025-10-22 12:13:32 -04:00
sed -i 's|REPLACE_ONION_WWW_DIR|/data/htdocs/onions/' $onion_site '|g' " /data/htdocs/onions/ $onion_site /index.html "
2025-10-22 11:33:49 -04:00
fi
2025-11-21 09:35:41 -05:00
if [ " $TOR_HIDDEN_IP " = "0.0.0.0" ] || [ -z " $TOR_HIDDEN_IP " ] ; then
sed -i 's|' $TOR_HIDDEN_IP :$SERVICE_PORT '|' $SERVICE_PORT '|g' " /config/nginx/vhosts.d/ $onion_site .onion.conf "
fi
2025-10-22 11:33:49 -04:00
echo " Created $onion_site .onion in /data/htdocs/onions/ $onion_site "
done
fi
2025-10-22 14:30:35 -04:00
if [ -f " $WWW_ROOT_DIR /index.html " ] ; then
sed -i 's|REPLACE_ONION_WWW_DIR|' $WWW_ROOT_DIR '|g' "/data/htdocs/www/index.html"
[ -n " $default_host " ] && sed -i 's|REPLACE_DEFAULT_TOR_ADDRESS|' $default_host .onion'|g' " $WWW_ROOT_DIR /index.html " || sed -i '/REPLACE_DEFAULT_TOR_ADDRESS/d' " $WWW_ROOT_DIR /index.html "
fi
if [ -f "/data/htdocs/www/index.html" ] ; then
sed -i 's|REPLACE_ONION_WWW_DIR|/data/htdocs/www|g' "/data/htdocs/www/index.html"
[ -n " $default_host " ] && sed -i 's|REPLACE_DEFAULT_TOR_ADDRESS|' $default_host .onion'|g' "/data/htdocs/www/index.html" || sed -i '/REPLACE_DEFAULT_TOR_ADDRESS/d' "/data/htdocs/www/index.html"
fi
2025-10-22 08:53:17 -04:00
# allow custom functions
if builtin type -t __update_conf_files_local | grep -q 'function' ; then __update_conf_files_local; fi
# exit function
return $exitCode
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# function to run before executing
__pre_execute( ) {
2025-10-22 08:53:17 -04:00
local exitCode = 0 # default exit code
local sysname = " ${ SERVER_NAME :- ${ FULL_DOMAIN_NAME :- $HOSTNAME } } " # set hostname
# execute if directories is empty
# __is_dir_empty "$CONF_DIR" && true
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 08:53:17 -04:00
# define actions to run after copying to /config
2025-01-06 09:09:27 -05:00
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 08:53:17 -04:00
# unset unneeded variables
unset sysname
# Lets wait a few seconds before continuing
2026-05-26 17:35:40 -04:00
sleep 2
2025-10-22 08:53:17 -04:00
# allow custom functions
if builtin type -t __pre_execute_local | grep -q 'function' ; then __pre_execute_local; fi
# exit function
return $exitCode
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# function to run after executing
__post_execute( ) {
2026-05-26 17:35:40 -04:00
# init pid var
local pid = ""
# set default exit code
local retVal = 0
# how long to wait before executing
local ctime = ${ POST_EXECUTE_WAIT_TIME :- 1 }
# convert minutes to seconds
local waitTime = $(( ctime * 60 ))
# message to show at start
local postMessageST = " Running post commands for $SERVICE_NAME "
# message to show at completion
local postMessageEnd = " Finished post commands for $SERVICE_NAME "
# wait
sleep $waitTime
# execute commands after waiting
(
# show message
__banner " $postMessageST "
# commands to execute
sleep 5
# show exit message
__banner " $postMessageEnd : Status $retVal "
) 2>"/dev/stderr" | tee -p -a "/data/logs/init.txt" &
# fire-and-forget: backgrounded subshell always succeeds at launch
retVal = 0
# allow custom functions
if builtin type -t __post_execute_local | grep -q 'function' ; then
__post_execute_local
fi
# exit function
return $retVal
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# use this function to update config files - IE: change port
__pre_message( ) {
2026-05-26 17:35:40 -04:00
local exitCode = 0
if [ -n " $PRE_EXEC_MESSAGE " ] ; then
eval echo " $PRE_EXEC_MESSAGE "
fi
# execute commands
2025-01-06 09:09:27 -05:00
2026-05-26 17:35:40 -04:00
# allow custom functions
if builtin type -t __pre_message_local | grep -q 'function' ; then
__pre_message_local
fi
# exit function
return $exitCode
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# use this function to setup ssl support
__update_ssl_conf( ) {
2026-05-26 17:35:40 -04:00
local exitCode = 0
local sysname = " ${ SERVER_NAME :- ${ FULL_DOMAIN_NAME :- $HOSTNAME } } "
# execute commands
2025-01-06 09:09:27 -05:00
2026-05-26 17:35:40 -04:00
# allow custom functions
if builtin type -t __update_ssl_conf_local | grep -q 'function' ; then
__update_ssl_conf_local
fi
# set exitCode
return $exitCode
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
__create_service_env( ) {
2026-05-26 17:35:40 -04:00
local exitCode = 0
if [ ! -f " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .sh " ] ; then
cat <<EOF | tee -p "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" &>/dev/null
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# root/admin user info [password/random]
2025-01-29 13:43:57 -05:00
#ENV_ROOT_USER_NAME="${ENV_ROOT_USER_NAME:-$NGINX_ROOT_USER_NAME}" # root user name
#ENV_ROOT_USER_PASS="${ENV_ROOT_USER_NAME:-$NGINX_ROOT_PASS_WORD}" # root user password
2025-01-06 09:09:27 -05:00
#root_user_name="${ENV_ROOT_USER_NAME:-$root_user_name}" #
#root_user_pass="${ENV_ROOT_USER_PASS:-$root_user_pass}" #
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
#Normal user info [password/random]
2025-01-29 13:43:57 -05:00
#ENV_USER_NAME="${ENV_USER_NAME:-$NGINX_USER_NAME}" #
#ENV_USER_PASS="${ENV_USER_PASS:-$NGINX_USER_PASS_WORD}" #
2025-01-06 09:09:27 -05:00
#user_name="${ENV_USER_NAME:-$user_name}" # normal user name
#user_pass="${ENV_USER_PASS:-$user_pass}" # normal user password
EOF
2026-05-26 17:35:40 -04:00
fi
if [ ! -f " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .local.sh " ] ; then
# - - - - - - - - - - - - - - - - - - - - - - - - -
__run_precopy_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__execute_prerun_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__run_pre_execute_checks_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__update_conf_files_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__pre_execute_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__post_execute_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__pre_message_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
__update_ssl_conf_local( ) { true; }
# - - - - - - - - - - - - - - - - - - - - - - - - -
fi
if ! __file_exists_with_content " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .sh " ; then
exitCode = $(( exitCode + 1 ))
fi
if ! __file_exists_with_content " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .local.sh " ; then
exitCode = $(( exitCode + 1 ))
fi
return $exitCode
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# script to start server
__run_start_script( ) {
2026-05-26 17:35:40 -04:00
local runExitCode = 0
# expand variables
local workdir = " $( eval echo " ${ WORK_DIR :- } " ) "
# expand variables
local cmd = " $( eval echo " ${ EXEC_CMD_BIN :- } " ) "
# expand variables
local args = " $( eval echo " ${ EXEC_CMD_ARGS :- } " ) "
# expand variables
local name = " $( eval echo " ${ EXEC_CMD_NAME :- } " ) "
# expand variables
local pre = " $( eval echo " ${ EXEC_PRE_SCRIPT :- } " ) "
# expand variables
local extra_env = " $( eval echo " ${ CMD_ENV //,/ } " ) "
# expand variables
local lc_type = " $( eval echo " ${ LANG :- ${ LC_ALL :- $LC_CTYPE } } " ) "
# expand variables
local home = " $( eval echo " ${ workdir // \/ root / \/ tmp \/ docker } " ) "
# expand variables
local path = " $( eval echo " $PATH " ) "
# expand variables
local message = " $( eval echo "" ) "
local sysname = " ${ SERVER_NAME :- ${ FULL_DOMAIN_NAME :- $HOSTNAME } } "
if [ -f " $CONF_DIR / $SERVICE_NAME .exec_cmd.sh " ] ; then
. " $CONF_DIR / $SERVICE_NAME .exec_cmd.sh "
fi
#
if [ -z " $cmd " ] ; then
__post_execute 2>"/dev/stderr" | tee -p -a "/data/logs/init.txt"
retVal = $?
__log_info " Initialization of $SCRIPT_NAME has completed "
__script_exit $retVal
else
# ensure the command exists
if [ ! -x " $cmd " ] ; then
__log_error " $name is not a valid executable "
return 2
fi
# check and exit if already running (respects SERVICE_USES_PID in __proc_check)
if __proc_check " $name " || __proc_check " $cmd " ; then
__log_debug " Service $name is already running "
return 0
else
# - - - - - - - - - - - - - - - - - - - - - - - - -
# show message if env exists
if [ -n " $cmd " ] ; then
if [ -n " $SERVICE_USER " ] ; then
__log_info " Setting up $cmd to run as $SERVICE_USER "
else
SERVICE_USER = "root"
fi
if [ -n " $SERVICE_PORT " ] ; then
__log_info " $name will be running on port $SERVICE_PORT "
else
SERVICE_PORT = ""
fi
fi
if [ -n " $pre " ] && command -v " $pre " & >/dev/null; then
export cmd_exec = " $pre $cmd $args "
message = " Starting service: $name $args through $pre "
else
export cmd_exec = " $cmd $args "
message = " Starting service: $name $args "
fi
if [ -n " $su_exec " ] ; then
__log_debug " Using $su_exec " | tee -a -p "/data/logs/init.txt"
fi
__log_info " $message " | tee -a -p "/data/logs/init.txt"
su_cmd touch " $SERVICE_PID_FILE "
# W14: invalidate cached START_SCRIPT if key variables changed
local _script_hash_src = " $cmd $args $SERVICE_USER $RESET_ENV $su_exec "
local _script_hash
_script_hash = $( printf '%s' " $_script_hash_src " | md5sum 2>/dev/null | cut -c1-8 || true )
if [ -f " ${ START_SCRIPT } .hash " ] && [ -f " $START_SCRIPT " ] ; then
if [ " $( cat " ${ START_SCRIPT } .hash " 2>/dev/null) " != " $_script_hash " ] ; then
rm -f " $START_SCRIPT " " ${ START_SCRIPT } .hash "
fi
fi
if [ " $RESET_ENV " = "yes" ] ; then
# RESET_ENV=yes intentionally strips all inherited vars; only explicit vars are passed
if [ ! -f " $START_SCRIPT " ] ; then
# Use printf %q to safely quote each env component for embedding in the script
local _q_home _q_lc _q_path _q_sysname _q_svcuser _q_su _q_cmd _q_args _q_extra
_q_home = $( printf '%q' " $home " )
_q_lc = $( printf '%q' " $lc_type " )
_q_path = $( printf '%q' " $path " )
_q_sysname = $( printf '%q' " $sysname " )
_q_svcuser = $( printf '%q' " ${ SERVICE_USER :- $RUNAS_USER } " )
_q_su = $( printf '%q ' $su_exec )
_q_cmd = $( printf '%q' " $cmd " )
_q_args = $( printf '%q ' $args )
_q_extra = $( printf '%q ' $extra_env )
{
printf '#!/usr/bin/env bash\n'
printf "trap 'exitCode=\$?;[ \$exitCode -ne 0 ] && [ -f \"\$SERVICE_PID_FILE\" ] && rm -Rf \"\$SERVICE_PID_FILE\";exit \$exitCode' EXIT\n"
printf 'set -Eeo pipefail\n'
printf '# Setting up %s to run as %s with env\n' " $cmd " " ${ SERVICE_USER :- root } "
printf 'retVal=10\n'
printf 'SERVICE_NAME=%q\n' " $SERVICE_NAME "
printf 'SERVICE_PID_FILE=%q\n' " $SERVICE_PID_FILE "
printf 'LOG_DIR=%q\n' " $LOG_DIR "
printf '%s env -i HOME=%s LC_CTYPE=%s PATH=%s HOSTNAME=%s USER=%s %s %s %s 2>>"/dev/stderr" >>"$LOG_DIR/$SERVICE_NAME.log" &\n' \
" $_q_su " " $_q_home " " $_q_lc " " $_q_path " " $_q_sysname " " $_q_svcuser " " $_q_extra " " $_q_cmd " " $_q_args "
printf 'execPid=$!\n'
printf 'sleep 1\n'
printf 'if [ -n "$execPid" ] && kill -0 "$execPid" 2>/dev/null; then\n'
printf ' echo "$execPid" >"$SERVICE_PID_FILE"\n'
printf ' retVal=0\n'
printf ' printf ' "'" '%%s\n' "'" ' "$SERVICE_NAME: $execPid" >"/run/healthcheck/$SERVICE_NAME"\n'
printf 'else\n'
printf ' retVal=10\n'
printf ' echo "Failed to start service %s" >&2\n' " $cmd "
printf 'fi\n'
printf 'exit $retVal\n'
} >" $START_SCRIPT "
printf '%s' " $_script_hash " >" ${ START_SCRIPT } .hash "
fi
else
if [ ! -f " $START_SCRIPT " ] ; then
local _q_su _q_cmd _q_args
_q_su = $( printf '%q ' $su_exec )
_q_cmd = $( printf '%q' " $cmd " )
_q_args = $( printf '%q ' $args )
{
printf '#!/usr/bin/env bash\n'
printf "trap 'exitCode=\$?;[ \$exitCode -ne 0 ] && [ -f \"\$SERVICE_PID_FILE\" ] && rm -Rf \"\$SERVICE_PID_FILE\";exit \$exitCode' EXIT\n"
printf 'set -Eeo pipefail\n'
printf '# Setting up %s to run as %s\n' " $cmd " " ${ SERVICE_USER :- root } "
printf 'retVal=10\n'
printf 'SERVICE_NAME=%q\n' " $SERVICE_NAME "
printf 'SERVICE_PID_FILE=%q\n' " $SERVICE_PID_FILE "
printf 'LOG_DIR=%q\n' " $LOG_DIR "
printf '%s %s %s 2>>"/dev/stderr" >>"$LOG_DIR/$SERVICE_NAME.log" &\n' \
" $_q_su " " $_q_cmd " " $_q_args "
printf 'execPid=$!\n'
printf 'sleep 1\n'
printf 'if [ -n "$execPid" ] && kill -0 "$execPid" 2>/dev/null; then\n'
printf ' echo "$execPid" >"$SERVICE_PID_FILE"\n'
printf ' retVal=0\n'
printf 'else\n'
printf ' retVal=10\n'
printf ' echo "Failed to start service %s" >&2\n' " $cmd "
printf 'fi\n'
printf 'exit $retVal\n'
} >" $START_SCRIPT "
printf '%s' " $_script_hash " >" ${ START_SCRIPT } .hash "
fi
fi
fi
if [ ! -x " $START_SCRIPT " ] ; then
chmod 755 -Rf " $START_SCRIPT "
fi
if [ " $CONTAINER_INIT " != "yes" ] ; then
# W15: launch as bash, not sh, since the generated script uses bash-specific features
bash " $START_SCRIPT "
runExitCode = $?
fi
fi
return $runExitCode
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# username and password actions
__run_secure_function( ) {
2026-05-26 17:35:40 -04:00
local filesperms
if [ -n " $user_name " ] || [ -n " $user_pass " ] ; then
for filesperms in " ${ USER_FILE_PREFIX } " /*; do
if [ -e " $filesperms " ] ; then
chmod -Rf 600 " $filesperms "
[ -n " $SERVICE_USER " ] && chown -Rf " $SERVICE_USER : $SERVICE_USER " " $filesperms " 2>/dev/null
fi
done 2>/dev/null | tee -p -a "/data/logs/init.txt"
fi
if [ -n " $root_user_name " ] || [ -n " $root_user_pass " ] ; then
for filesperms in " ${ ROOT_FILE_PREFIX } " /*; do
if [ -e " $filesperms " ] ; then
chmod -Rf 600 " $filesperms "
[ -n " $SERVICE_USER " ] && chown -Rf " $SERVICE_USER : $SERVICE_USER " " $filesperms " 2>/dev/null
fi
done 2>/dev/null | tee -p -a "/data/logs/init.txt"
fi
unset filesperms
2025-01-06 09:09:27 -05:00
}
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Allow ENV_ variable - Import env file
2026-05-26 17:35:40 -04:00
if __file_exists_with_content " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .sh " ; then
. " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .sh "
fi
if __file_exists_with_content " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .local.sh " ; then
. " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .local.sh "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
# default exit code
SERVICE_EXIT_CODE = 0
2025-01-06 09:09:27 -05:00
# application specific
2026-05-26 17:35:40 -04:00
EXEC_CMD_NAME = " ${ EXEC_CMD_BIN ##*/ } "
SERVICE_PID_FILE = " /run/init.d/ $EXEC_CMD_NAME .pid "
_resolved = " $( type -P " $EXEC_CMD_BIN " 2>/dev/null) "
[ -n " $_resolved " ] && EXEC_CMD_BIN = " $_resolved "
_resolved = " $( type -P " $EXEC_PRE_SCRIPT " 2>/dev/null) "
[ -n " $_resolved " ] && EXEC_PRE_SCRIPT = " $_resolved "
unset _resolved
# - - - - - - - - - - - - - - - - - - - - - - - - -
# Only run check when explicitly requested
if [ " $1 " = "check" ] && __check_service " $1 " ; then
SERVICE_IS_RUNNING = yes
elif [ " $1 " = "check" ] ; then
SERVICE_IS_RUNNING = "no"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# ensure needed directories exists
2026-05-26 17:35:40 -04:00
if [ ! -d " $LOG_DIR " ] ; then
mkdir -p " $LOG_DIR "
fi
if [ ! -d " $RUN_DIR " ] ; then
mkdir -p " $RUN_DIR "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# create auth directories
2026-05-26 17:35:40 -04:00
if [ -n " $USER_FILE_PREFIX " ] ; then
if [ ! -d " $USER_FILE_PREFIX " ] ; then
mkdir -p " $USER_FILE_PREFIX "
fi
fi
if [ -n " $ROOT_FILE_PREFIX " ] ; then
if [ ! -d " $ROOT_FILE_PREFIX " ] ; then
mkdir -p " $ROOT_FILE_PREFIX "
fi
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
if [ -z " $RUNAS_USER " ] ; then
RUNAS_USER = "root"
fi
if [ -z " $SERVICE_USER " ] ; then
SERVICE_USER = " $RUNAS_USER "
fi
if [ -z " $SERVICE_GROUP " ] ; then
SERVICE_GROUP = " ${ SERVICE_USER :- $RUNAS_USER } "
fi
if [ " $IS_WEB_SERVER " = "yes" ] ; then
RESET_ENV = "yes"
__is_htdocs_mounted
fi
if [ " $IS_WEB_SERVER " = "yes" ] && [ -z " $SERVICE_PORT " ] ; then
SERVICE_PORT = "80"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Database env
if [ " $IS_DATABASE_SERVICE " = "yes" ] || [ " $USES_DATABASE_SERVICE " = "yes" ] ; then
2026-05-26 17:35:40 -04:00
RESET_ENV = "no"
DATABASE_CREATE = " ${ ENV_DATABASE_CREATE :- $DATABASE_CREATE } "
DATABASE_USER_NORMAL = " ${ ENV_DATABASE_USER :- ${ DATABASE_USER_NORMAL :- $user_name } } "
DATABASE_PASS_NORMAL = " ${ ENV_DATABASE_PASSWORD :- ${ DATABASE_PASS_NORMAL :- $user_pass } } "
DATABASE_USER_ROOT = " ${ ENV_DATABASE_ROOT_USER :- ${ DATABASE_USER_ROOT :- $root_user_name } } "
DATABASE_PASS_ROOT = " ${ ENV_DATABASE_ROOT_PASSWORD :- ${ DATABASE_PASS_ROOT :- $root_user_pass } } "
if [ -n " $DATABASE_PASS_NORMAL " ] ; then
if [ ! -f " ${ USER_FILE_PREFIX } /db_pass_user " ] ; then
echo " $DATABASE_PASS_NORMAL " >" ${ USER_FILE_PREFIX } /db_pass_user "
fi
fi
if [ -n " $DATABASE_PASS_ROOT " ] ; then
if [ ! -f " ${ ROOT_FILE_PREFIX } /db_pass_root " ] ; then
echo " $DATABASE_PASS_ROOT " >" ${ ROOT_FILE_PREFIX } /db_pass_root "
fi
fi
2025-01-06 09:09:27 -05:00
fi
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# [DATABASE_DIR_[SQLITE,REDIS,POSTGRES,MARIADB,COUCHDB,MONGODB,SUPABASE]]
if [ " $DATABASE_SERVICE_TYPE " = "custom" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_CUSTOM :- /data/db/custom } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_CUSTOM :- /data/db/custom } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_CUSTOM :- /usr/local/share/httpd/admin/databases } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_CUSTOM :- /admin/dbadmin } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "redis" ] || [ " $DATABASE_SERVICE_TYPE " = "redis" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_REDIS :- /data/db/redis } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_REDIS :- /data/db/redis } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_REDIS :- /usr/local/share/httpd/admin/redis } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_REDIS :- /admin/redis } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "postgres" ] || [ " $DATABASE_SERVICE_TYPE " = "postgres" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_POSTGRES :- /data/db/postgres } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_POSTGRES :- /data/db/postgres } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_POSTGRES :- /usr/local/share/httpd/admin/postgres } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_POSTGRES :- /admin/postgres } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "mariadb" ] || [ " $DATABASE_SERVICE_TYPE " = "mariadb" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_MARIADB :- /data/db/mariadb } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_MARIADB :- /data/db/mariadb } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_MARIADB :- /usr/local/share/httpd/admin/mysql } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_MARIADB :- /admin/mysql } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "mysql" ] || [ " $DATABASE_SERVICE_TYPE " = "mysql" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_MYSQL :- /data/db/mysql } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_MYSQL :- /data/db/mysql } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_MYSQL :- /usr/local/share/httpd/admin/mysql } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_MYSQL :- /admin/mysql } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "couchdb" ] || [ " $DATABASE_SERVICE_TYPE " = "couchdb" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_COUCHDB :- /data/db/couchdb } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_COUCHDB :- /data/db/couchdb } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_COUCHDB :- /usr/local/share/httpd/admin/couchdb } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_COUCHDB :- /admin/couchdb } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "mongodb" ] || [ " $DATABASE_SERVICE_TYPE " = "mongodb" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_MONGODB :- /data/db/mongodb } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_MONGODB :- /data/db/mongodb } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_MONGODB :- /usr/local/share/httpd/admin/mongodb } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_MONGODB :- /admin/mongodb } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "supabase" ] || [ " $DATABASE_SERVICE_TYPE " = "supabase" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_SUPABASE :- /data/db/supabase } "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_SUPABASE :- /data/db/supabase } "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_SUPABASE :- /usr/local/share/httpd/admin/supabase } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_SUPBASE :- /admin/supabase } "
fi
2025-01-06 09:09:27 -05:00
elif [ " $SERVICE_NAME " = "sqlite" ] || [ " $DATABASE_SERVICE_TYPE " = "sqlite" ] ; then
2026-05-26 17:35:40 -04:00
DATABASE_DIR = " ${ DATABASE_DIR_SQLITE :- /data/db/sqlite } / $SERVER_NAME "
DATABASE_BASE_DIR = " ${ DATABASE_DIR_SQLITE :- /data/db/sqlite } / $SERVER_NAME "
DATABASE_ADMIN_WWW_ROOT = " ${ DATABASE_ADMIN_WWW_ROOT_SQLITE :- /usr/local/share/httpd/admin/sqlite } "
if [ -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
SERVER_ADMIN_URL = " ${ SERVER_ADMIN_URL_SQLITE :- /admin/sqlite } "
fi
if [ ! -d " $DATABASE_DIR " ] ; then
mkdir -p " $DATABASE_DIR "
fi
chmod 777 " $DATABASE_DIR "
fi
if [ -n " $DATABASE_ADMIN_WWW_ROOT " ] ; then
if [ ! -d " $DATABASE_ADMIN_WWW_ROOT " ] ; then
mkdir -p " ${ DATABASE_ADMIN_WWW_ROOT } "
fi
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Allow variables via imports - Overwrite existing
2026-05-26 17:35:40 -04:00
if [ -f " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .sh " ] ; then
. " /config/env/ ${ SERVICE_NAME :- $SCRIPT_NAME } .sh "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# set password to random if variable is random
2026-05-26 17:35:40 -04:00
if [ " $user_pass " = "random" ] ; then
user_pass = " $( __random_password ${ RANDOM_PASS_USER :- 16 } ) "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
if [ " $root_user_pass " = "random" ] ; then
root_user_pass = " $( __random_password ${ RANDOM_PASS_ROOT :- 16 } ) "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Allow setting initial users and passwords via environment and save to file
2026-05-26 17:35:40 -04:00
if [ -n " $user_name " ] ; then
echo " $user_name " >" ${ USER_FILE_PREFIX } / ${ SERVICE_NAME } _name "
fi
if [ -n " $user_pass " ] ; then
echo " $user_pass " >" ${ USER_FILE_PREFIX } / ${ SERVICE_NAME } _pass "
fi
if [ -n " $root_user_name " ] ; then
echo " $root_user_name " >" ${ ROOT_FILE_PREFIX } / ${ SERVICE_NAME } _name "
fi
if [ -n " $root_user_pass " ] ; then
echo " $root_user_pass " >" ${ ROOT_FILE_PREFIX } / ${ SERVICE_NAME } _pass "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Allow per init script usernames and passwords
2026-05-26 17:35:40 -04:00
if __file_exists_with_content " ${ USER_FILE_PREFIX } / ${ SERVICE_NAME } _name " ; then
user_name = " $( <" ${ USER_FILE_PREFIX } / ${ SERVICE_NAME } _name " ) "
fi
if __file_exists_with_content " ${ USER_FILE_PREFIX } / ${ SERVICE_NAME } _pass " ; then
user_pass = " $( <" ${ USER_FILE_PREFIX } / ${ SERVICE_NAME } _pass " ) "
fi
if __file_exists_with_content " ${ ROOT_FILE_PREFIX } / ${ SERVICE_NAME } _name " ; then
root_user_name = " $( <" ${ ROOT_FILE_PREFIX } / ${ SERVICE_NAME } _name " ) "
fi
if __file_exists_with_content " ${ ROOT_FILE_PREFIX } / ${ SERVICE_NAME } _pass " ; then
root_user_pass = " $( <" ${ ROOT_FILE_PREFIX } / ${ SERVICE_NAME } _pass " ) "
fi
if __file_exists_with_content " ${ USER_FILE_PREFIX } /db_pass_user " ; then
DATABASE_PASS_NORMAL = " $( <" ${ USER_FILE_PREFIX } /db_pass_user " ) "
fi
if __file_exists_with_content " ${ ROOT_FILE_PREFIX } /db_pass_root " ; then
DATABASE_PASS_ROOT = " $( <" ${ ROOT_FILE_PREFIX } /db_pass_root " ) "
fi
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# set hostname for script
sysname = " ${ SERVER_NAME :- ${ FULL_DOMAIN_NAME :- $HOSTNAME } } "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
__create_service_env
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Setup /config directories
__init_config_etc
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# pre-run function
__execute_prerun
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# create user if needed
__create_service_user " $SERVICE_USER " " $SERVICE_GROUP " " ${ WORK_DIR :- /home/ $SERVICE_USER } " " ${ SERVICE_UID :- } " " ${ SERVICE_GID :- } "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Modify user if needed
__set_user_group_id $SERVICE_USER ${ SERVICE_UID :- } ${ SERVICE_GID :- }
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Create base directories
__setup_directories
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# set switch user command
__switch_to_user
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Initialize the home/working dir
__init_working_dir
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# show init message
__pre_message
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
#
__initialize_db_users
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Initialize ssl
__update_ssl_conf
__update_ssl_certs
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set permissions in ${USER_FILE_PREFIX} and ${ROOT_FILE_PREFIX}
__run_secure_function
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
__run_precopy
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Copy /config to /etc
for config_2_etc in $CONF_DIR $ADDITIONAL_CONFIG_DIRS ; do
2026-05-26 17:35:40 -04:00
__initialize_system_etc " $config_2_etc " 2>/dev/stderr | tee -p -a "/data/logs/init.txt"
2025-01-06 09:09:27 -05:00
done
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Replace variables
__initialize_replace_variables " $ETC_DIR " " $CONF_DIR " " $ADDITIONAL_CONFIG_DIRS " " $WWW_ROOT_DIR "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
#
__initialize_database
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Updating config files
__update_conf_files
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# run the pre execute commands
__pre_execute
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# Set permissions
__fix_permissions " $SERVICE_USER " " $SERVICE_GROUP "
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
#
__run_pre_execute_checks 2>/dev/stderr | tee -a -p "/data/logs/entrypoint.log" "/data/logs/init.txt" || return 20
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
__run_start_script 2>>/dev/stderr | tee -p -a "/data/logs/entrypoint.log"
2026-05-26 17:35:40 -04:00
errorCode = ${ PIPESTATUS [0] }
2025-01-06 09:09:27 -05:00
if [ -n " $EXEC_CMD_BIN " ] ; then
2026-05-26 17:35:40 -04:00
if [ " $errorCode " -eq 0 ] ; then
SERVICE_EXIT_CODE = 0
SERVICE_IS_RUNNING = "yes"
else
SERVICE_EXIT_CODE = $errorCode
SERVICE_IS_RUNNING = " ${ SERVICE_IS_RUNNING :- no } "
if [ ! -s " $SERVICE_PID_FILE " ] ; then
rm -Rf " $SERVICE_PID_FILE "
fi
fi
2025-01-06 09:09:27 -05:00
fi
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-01-06 09:09:27 -05:00
# start the post execute function in background
__post_execute 2>"/dev/stderr" | tee -p -a "/data/logs/init.txt" &
2026-05-26 17:35:40 -04:00
# - - - - - - - - - - - - - - - - - - - - - - - - -
2025-10-22 10:22:05 -04:00
__script_exit $SERVICE_EXIT_CODE