Files
PinePods-nix/PinePods-0.8.2/startup/startup.sh
2026-03-03 10:57:43 -05:00

180 lines
6.6 KiB
Bash
Executable File

#!/bin/bash
set -e # Exit immediately if a command exits with a non-zero status
# Function to handle shutdown
shutdown() {
echo "Shutting down..."
pkill -TERM horust
exit 0
}
# Set up signal handling
trap shutdown SIGTERM SIGINT
# Export all environment variables
export DB_USER=$DB_USER
export DB_PASSWORD=$DB_PASSWORD
export DB_HOST=$DB_HOST
export DB_NAME=$DB_NAME
export DB_PORT=$DB_PORT
export DB_TYPE=$DB_TYPE
export FULLNAME=${FULLNAME}
export USERNAME=${USERNAME}
export EMAIL=${EMAIL}
export PASSWORD=${PASSWORD}
export REVERSE_PROXY=$REVERSE_PROXY
export SEARCH_API_URL=$SEARCH_API_URL
export PEOPLE_API_URL=$PEOPLE_API_URL
export PINEPODS_PORT=$PINEPODS_PORT
export PROXY_PROTOCOL=$PROXY_PROTOCOL
export DEBUG_MODE=${DEBUG_MODE:-'False'}
export VALKEY_HOST=${VALKEY_HOST:-'valkey'}
export VALKEY_PORT=${VALKEY_PORT:-'6379'}
export DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE:-'en'}
# Save user's HOSTNAME to SERVER_URL before Docker overwrites it with container ID
# This preserves the user-configured server URL for RSS feed generation
export SERVER_URL=${HOSTNAME}
# Export OIDC environment variables
export OIDC_DISABLE_STANDARD_LOGIN=${OIDC_DISABLE_STANDARD_LOGIN:-'false'}
export OIDC_PROVIDER_NAME=${OIDC_PROVIDER_NAME}
export OIDC_CLIENT_ID=${OIDC_CLIENT_ID}
export OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET}
export OIDC_AUTHORIZATION_URL=${OIDC_AUTHORIZATION_URL}
export OIDC_TOKEN_URL=${OIDC_TOKEN_URL}
export OIDC_USER_INFO_URL=${OIDC_USER_INFO_URL}
export OIDC_BUTTON_TEXT=${OIDC_BUTTON_TEXT}
export OIDC_SCOPE=${OIDC_SCOPE}
export OIDC_BUTTON_COLOR=${OIDC_BUTTON_COLOR}
export OIDC_BUTTON_TEXT_COLOR=${OIDC_BUTTON_TEXT_COLOR}
export OIDC_ICON_SVG=${OIDC_ICON_SVG}
export OIDC_NAME_CLAIM=${OIDC_NAME_CLAIM}
export OIDC_EMAIL_CLAIM=${OIDC_EMAIL_CLAIM}
export OIDC_USERNAME_CLAIM=${OIDC_USERNAME_CLAIM}
export OIDC_ROLES_CLAIM=${OIDC_ROLES_CLAIM}
export OIDC_USER_ROLE=${OIDC_USER_ROLE}
export OIDC_ADMIN_ROLE=${OIDC_ADMIN_ROLE}
# Print admin info if default admin is used
if [[ $FULLNAME == 'Pinepods Admin' ]]; then
echo "Admin User Information:"
echo "FULLNAME: $FULLNAME"
echo "USERNAME: $USERNAME"
echo "EMAIL: $EMAIL"
echo "PASSWORD: $PASSWORD"
fi
# Print PinePods logo
cat << "EOF"
A
d$b
.d\$$b.
.d$i$$\$$b. _______ ** **
d$$@b / \ / | / |
d\$$$ib $$$$$$$ |$$/ _______ ______ ______ ______ ____$$ | _______
.d$$$\$$$b $$ |__$$ |/ |/ \ / \ / \ / \ / $$ | / |
.d$$@$$$$\$$ib. $$ $$/ $$ |$$$$$$$ |/$$$$$$ |/$$$$$$ |/$$$$$$ |/$$$$$$$ |/$$$$$$$/
d$$i$$b $$$$$$$/ $$ |$$ | $$ |$$ $$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ \
d\$$$$@$b. $$ | $$ |$$ | $$ |$$$$$$$$/ $$ |__$$ |$$ \__$$ |$$ \__$$ | $$$$$$ |
.d$@$$\$$$$$@b. $$ | $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ $$ |/ $$/
.d$$$$i$$$\$$$$$$b. $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$/ $$$$$$$/
### $$ |
### $$ |
### $$/
A project created and written by Collin Pendleton
collinp@gooseberrydevelopment.com
EOF
# Configure timezone based on TZ environment variable
if [ -n "$TZ" ]; then
echo "Setting timezone to $TZ"
# For Alpine, we need to copy the zoneinfo file
if [ -f "/usr/share/zoneinfo/$TZ" ]; then
# Check if /etc/localtime is a mounted volume
if [ -f "/etc/localtime" ] && ! [ -L "/etc/localtime" ]; then
echo "Using mounted timezone file from host"
else
# If it's not mounted or is a symlink, we can modify it
cp /usr/share/zoneinfo/$TZ /etc/localtime
echo "$TZ" > /etc/timezone
fi
else
echo "Timezone $TZ not found, using UTC"
# Only modify if not mounted
if ! [ -f "/etc/localtime" ] || [ -L "/etc/localtime" ]; then
cp /usr/share/zoneinfo/UTC /etc/localtime
echo "UTC" > /etc/timezone
fi
fi
else
echo "No timezone specified, using UTC"
# Only modify if not mounted
if ! [ -f "/etc/localtime" ] || [ -L "/etc/localtime" ]; then
cp /usr/share/zoneinfo/UTC /etc/localtime
echo "UTC" > /etc/timezone
fi
fi
# Export TZ to the environment for all child processes
export TZ
# Create required directories
echo "Creating required directories..."
mkdir -p /pinepods/cache
mkdir -p /opt/pinepods/backups
mkdir -p /opt/pinepods/downloads
mkdir -p /opt/pinepods/certs
mkdir -p /var/log/pinepods # Make sure log directory exists
# Database Setup
echo "Using $DB_TYPE database"
# Use compiled database setup binary (no Python dependency)
# Web API key file creation has been removed for security
/usr/local/bin/pinepods-db-setup
echo "Database validation complete"
# Cron jobs removed - now handled by internal Rust scheduler
# Check if we need to create exim directories
# Only do this if the user/group exists on the system
if getent group | grep -q "Debian-exim"; then
echo "Setting up exim directories and permissions..."
mkdir -p /var/log/exim4
mkdir -p /var/spool/exim4
chown -R Debian-exim:Debian-exim /var/log/exim4
chown -R Debian-exim:Debian-exim /var/spool/exim4
else
echo "Skipping exim setup as user/group doesn't exist on this system"
fi
# Set up environment variables for Horust logging modes
if [[ $DEBUG_MODE == "true" ]]; then
export HORUST_STDOUT_MODE="STDOUT"
export HORUST_STDERR_MODE="STDERR"
echo "Starting Horust in debug mode (logs to stdout)..."
else
export HORUST_STDOUT_MODE="/var/log/pinepods/service.log"
export HORUST_STDERR_MODE="/var/log/pinepods/service.log"
echo "Starting Horust in production mode (logs to files)..."
fi
# Set permissions for download and backup directories BEFORE starting services
# Only do this if PUID and PGID are set
if [[ -n "$PUID" && -n "$PGID" ]]; then
echo "Setting permissions for download and backup directories...(Be patient this might take a while if you have a lot of downloads)"
chown -R ${PUID}:${PGID} /opt/pinepods/downloads
chown -R ${PUID}:${PGID} /opt/pinepods/backups
else
echo "Skipping permission setting as PUID/PGID are not set"
fi
# Copy service configurations to Horust directory
cp /pinepods/startup/services/*.toml /etc/horust/services/
# Start all services with Horust
echo "Starting services with Horust..."
echo "PinePods startup complete, running Horust in foreground..."
exec horust --services-path /etc/horust/services/