#!/bin/bash # ============================================================================== # Open Notebook - HuggingFace Spaces Start Script # Initializes directories, sets defaults, and launches supervisord # ============================================================================== set -e echo "==============================================" echo " Open Notebook - HuggingFace Spaces" echo "==============================================" echo "" # ============================================================================== # 1. Create required directories # ============================================================================== echo "[INIT] Creating directories..." mkdir -p /data /app/data /tmp/nginx/client_body /tmp/nginx/proxy \ /tmp/nginx/fastcgi /tmp/nginx/uwsgi /tmp/nginx/scgi \ /var/log/supervisor 2>/dev/null || true # ============================================================================== # 2. Set default environment variables if not provided via HF Secrets # ============================================================================== export SURREAL_URL="${SURREAL_URL:-ws://localhost:8000/rpc}" export SURREAL_USER="${SURREAL_USER:-root}" export SURREAL_PASSWORD="${SURREAL_PASSWORD:-root}" export SURREAL_NAMESPACE="${SURREAL_NAMESPACE:-open_notebook}" export SURREAL_DATABASE="${SURREAL_DATABASE:-open_notebook}" export OPEN_NOTEBOOK_ENCRYPTION_KEY="${OPEN_NOTEBOOK_ENCRYPTION_KEY:-hf-spaces-default-key-change-me}" export TIKTOKEN_CACHE_DIR="${TIKTOKEN_CACHE_DIR:-/app/tiktoken-cache}" # ============================================================================== # 3. Verify critical binaries # ============================================================================== echo "[INIT] Checking SurrealDB..." surreal version 2>/dev/null && echo "[OK] SurrealDB found" || echo "[WARN] SurrealDB not found" echo "[INIT] Checking Node.js..." node --version 2>/dev/null && echo "[OK] Node.js found" || echo "[WARN] Node.js not found" echo "[INIT] Checking Python venv..." /app/.venv/bin/python --version 2>/dev/null && echo "[OK] Python venv found" || echo "[WARN] Python venv not found" # ============================================================================== # 4. Print configuration (without secrets) # ============================================================================== echo "" echo "[CONFIG] SURREAL_URL=$SURREAL_URL" echo "[CONFIG] SURREAL_NAMESPACE=$SURREAL_NAMESPACE" echo "[CONFIG] SURREAL_DATABASE=$SURREAL_DATABASE" echo "[CONFIG] TIKTOKEN_CACHE_DIR=$TIKTOKEN_CACHE_DIR" echo "[CONFIG] Encryption key: $([ "$OPEN_NOTEBOOK_ENCRYPTION_KEY" = "hf-spaces-default-key-change-me" ] && echo 'DEFAULT (change in HF Secrets!)' || echo 'CUSTOM (set via HF Secrets)')" echo "" # ============================================================================== # 5. Symlink /data -> /app/data for app compatibility # Some code references /app/data while HF persistent storage uses /data # ============================================================================== if [ ! -L /app/data ] && [ -d /app/data ]; then # If /app/data exists and is a real directory, move contents to /data cp -rn /app/data/* /data/ 2>/dev/null || true rm -rf /app/data ln -sf /data /app/data elif [ ! -e /app/data ]; then ln -sf /data /app/data fi echo "[INIT] Data directory: /data ($(ls /data 2>/dev/null | wc -l) files)" echo "" # ============================================================================== # 6. Launch supervisord (PID 1) # ============================================================================== echo "==============================================" echo " Starting all services via supervisord..." echo " - SurrealDB (port 8000, internal)" echo " - FastAPI (port 5055, internal)" echo " - Worker (background tasks)" echo " - Next.js (port 8502, internal)" echo " - Nginx (port 7860, PUBLIC)" echo "==============================================" echo "" exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf