#!/bin/bash # Startup script for Dissistant # This script starts the Streamlit service and exposes it via Tailscale Serve # Exit on error set -e # --- Configuration for Streamlit App --- STREAMLIT_APP_FILE="app.py" STREAMLIT_PORT="8502" STREAMLIT_PID_FILE="dissistant.pid" STREAMLIT_LOG_FILE="dissistant.log" # --- End Configuration --- # Check if UV is installed if ! command -v uv &> /dev/null; then echo "Error: UV is not installed. Please install UV first." echo "You can install UV with: pip install uv" exit 1 fi # Create virtual environment if it doesn't exist if [ ! -d ".venv" ]; then echo "Creating virtual environment..." uv venv fi # Activate virtual environment echo "Activating virtual environment..." source .venv/bin/activate # Install dependencies echo "Installing dependencies..." uv pip install -r requirements.txt # Kill any existing instances of the Streamlit app echo "Stopping any existing instances of the Streamlit app..." if [ -f "$STREAMLIT_PID_FILE" ]; then OLD_STREAMLIT_PID=$(cat $STREAMLIT_PID_FILE) if ps -p $OLD_STREAMLIT_PID > /dev/null; then kill $OLD_STREAMLIT_PID echo "Killed existing Streamlit app process with PID $OLD_STREAMLIT_PID" sleep 1 # Give it time to shut down else echo "No running Streamlit app process found with PID $OLD_STREAMLIT_PID" fi fi # Also try to kill any other streamlit processes for this specific app file and port pkill -f "streamlit run $STREAMLIT_APP_FILE --server.port $STREAMLIT_PORT" || true sleep 1 # Start the Streamlit app echo "Starting Streamlit app on port $STREAMLIT_PORT..." nohup streamlit run $STREAMLIT_APP_FILE --server.port $STREAMLIT_PORT --server.headless true > $STREAMLIT_LOG_FILE 2>&1 & echo $! > $STREAMLIT_PID_FILE # Check if the Streamlit service started successfully sleep 3 # Give Streamlit a bit more time to start if ! nc -z localhost $STREAMLIT_PORT; then echo "Error: Failed to start Streamlit app on port $STREAMLIT_PORT." cat $STREAMLIT_LOG_FILE # Output log file for debugging exit 1 else echo "Streamlit app started successfully on port $STREAMLIT_PORT." fi # Check if Tailscale is installed if ! command -v tailscale &> /dev/null; then echo "Warning: Tailscale is not installed. The app will only be available locally." echo "Install Tailscale to expose the service over your tailnet." else # Expose the service via Tailscale Serve echo "Exposing Streamlit app via Tailscale Serve on port $STREAMLIT_PORT..." echo "Setting up Funnel on port 10000..." tailscale funnel --https=10000 --bg localhost:$STREAMLIT_PORT # Get the Tailscale hostname HOSTNAME=$(tailscale status --json | jq -r '.Self.DNSName') if [ -n "$HOSTNAME" ]; then echo "App may be available at a Tailscale URL. Check 'tailscale status' for details." echo "If using a funnel, it might be https://$HOSTNAME/" else echo "App is exposed via Tailscale Serve, but couldn't determine the primary hostname." echo "Check 'tailscale status' for details." fi fi echo "Dissistant is now running!" echo "Local URL: http://localhost:$STREAMLIT_PORT" echo "Log file: $STREAMLIT_LOG_FILE" echo "PID file: $STREAMLIT_PID_FILE" echo "" echo "If Tailscale is active, the app should be accessible via a Tailscale funnel URL."