Spaces:
Building
Building
# Ensure we're in the right directory and set up paths | |
SCRIPT_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") | |
cd "$SCRIPT_DIR" || exit 1 | |
export DATA_DIR="/app/backend/data" | |
export PYTHONPATH="/app/backend:${PYTHONPATH}" | |
# Validate required environment variables | |
for var in "BACKUP_PASSPHRASE" "HF_TOKEN" "SPACE_ID"; do | |
if [ -z "${!var}" ]; then | |
echo "Error: $var is not set. Required for database backup/restore." | |
exit 1 | |
fi | |
done | |
# Restore database from backup | |
echo "Restoring database from backup..." | |
python "$SCRIPT_DIR/scripts/restore.py" | |
restore_status=$? | |
if [ $restore_status -ne 0 ]; then | |
echo "Warning: Database restore failed. Starting with empty database." | |
fi | |
# Handle WebUI secret key | |
KEY_FILE="$SCRIPT_DIR/.webui_secret_key" | |
PORT="${PORT:-8080}" | |
HOST="${HOST:-0.0.0.0}" | |
if test "$WEBUI_SECRET_KEY $WEBUI_JWT_SECRET_KEY" = " "; then | |
if ! [ -e "$KEY_FILE" ]; then | |
head -c 12 /dev/random | base64 > "$KEY_FILE" || exit 1 | |
fi | |
WEBUI_SECRET_KEY=$(cat "$KEY_FILE") || exit 1 | |
fi | |
# Start Ollama if enabled | |
if [[ "${USE_OLLAMA_DOCKER,,}" == "true" ]]; then | |
ollama serve & | |
fi | |
# Configure CUDA if enabled | |
if [[ "${USE_CUDA_DOCKER,,}" == "true" ]]; then | |
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib/python3.11/site-packages/torch/lib:/usr/local/lib/python3.11/site-packages/nvidia/cudnn/lib" | |
fi | |
# Handle HuggingFace Space deployment | |
if [ -n "$SPACE_ID" ]; then | |
echo "Configuring HuggingFace Space deployment" | |
if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then | |
# Start webui temporarily to create admin user | |
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' & | |
webui_pid=$! | |
# Wait for the server to be ready | |
while ! curl -s http://localhost:8080/health > /dev/null; do | |
echo "Waiting for WebUI to start..." | |
sleep 1 | |
done | |
# Create the admin user | |
echo "Creating admin user: ${ADMIN_USER_EMAIL}" | |
curl \ | |
-X POST "http://localhost:8080/api/v1/auths/signup" \ | |
-H "accept: application/json" \ | |
-H "Content-Type: application/json" \ | |
-d "{ \"email\": \"${ADMIN_USER_EMAIL}\", \"password\": \"${ADMIN_USER_PASSWORD}\", \"name\": \"Admin\" }" | |
# Stop the temporary webui server | |
echo "Stopping temporary WebUI server..." | |
kill $webui_pid | |
wait $webui_pid 2>/dev/null # Wait for it to fully shut down | |
fi | |
# Set the public URL for Space deployments | |
export WEBUI_URL=${SPACE_HOST} | |
fi | |
# Start the main web server in the background | |
echo "Starting main WebUI server..." | |
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn open_webui.main:app \ | |
--host "$HOST" --port "$PORT" --forwarded-allow-ips '*' \ | |
--workers "${UVICORN_WORKERS:-1}" & | |
WEBUI_PID=$! | |
# Configure and start backup scheduler in the background | |
BACKUP_INITIAL_WAIT="${BACKUP_INITIAL_WAIT:-100}" | |
BACKUP_INTERVAL="${BACKUP_INTERVAL:-300}" | |
( | |
echo "Starting backup scheduler (Initial wait: ${BACKUP_INITIAL_WAIT}s, Interval: ${BACKUP_INTERVAL}s)" | |
sleep "$BACKUP_INITIAL_WAIT" | |
while true; do | |
echo "Running scheduled backup" | |
# Pass relevant env vars to backup script if needed | |
BACKUP_THRESHOLD_MINUTES="${BACKUP_THRESHOLD_MINUTES:-120}" \ | |
python "$SCRIPT_DIR/scripts/backup.py" | |
if [ $? -ne 0 ]; then | |
echo "Warning: Backup failed" | |
fi | |
sleep "$BACKUP_INTERVAL" | |
done | |
) & | |
# Wait for the main web server process to exit | |
# This keeps the script alive while the server runs and allows graceful shutdown | |
echo "Web server started (PID: ${WEBUI_PID}). Waiting for it to exit..." | |
wait $WEBUI_PID | |
echo "Web server process ${WEBUI_PID} exited." | |
# Optional: Add cleanup here if needed after the web server stops. | |
# The background backup loop will likely be terminated when the main script exits. |