#!/bin/bash echo "=== ActaLog Restart Script ===" echo "" # Get the absolute path of the project directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" PROJECT_NAME="actionlog" echo "Project directory: $PROJECT_ROOT" echo "" # Kill backend processes echo "Stopping backend..." # Kill processes with "actalog" binary name pkill -9 -f "bin/actalog" 2>/dev/null || true # Kill go run processes in this directory for pid in $(ps aux | grep "[g]o run" | grep "$PROJECT_ROOT" | awk '{print $2}'); do echo " Killing go run process: $pid" kill -9 $pid 2>/dev/null || true done # Kill any actalog binary processes for pid in $(ps aux | grep "[a]ctalog" | grep -v "grep" | awk '{print $2}'); do # Check if it's running from our directory if [ -d "/proc/$pid" ]; then cwd=$(readlink -f /proc/$pid/cwd 2>/dev/null || echo "") if [[ "$cwd" == *"$PROJECT_NAME"* ]] || [[ "$cwd" == *"$PROJECT_ROOT"* ]]; then echo " Killing actalog process: $pid (from $cwd)" kill -9 $pid 2>/dev/null || true fi fi done # Also check for processes listening on any port from our binary for pid in $(lsof -ti -c actalog 2>/dev/null); do echo " Killing actalog listener: $pid" kill -9 $pid 2>/dev/null || true done echo "✓ Backend processes stopped" # Kill frontend processes echo "Stopping frontend..." # Kill npm/node processes from the web directory for pid in $(ps aux | grep "[n]pm run dev" | awk '{print $2}'); do if [ -d "/proc/$pid" ]; then cwd=$(readlink -f /proc/$pid/cwd 2>/dev/null || echo "") if [[ "$cwd" == *"$PROJECT_NAME"* ]] || [[ "$cwd" == *"/web"* ]] || [[ "$cwd" == *"$PROJECT_ROOT/web"* ]]; then echo " Killing npm dev process: $pid (from $cwd)" kill -9 $pid 2>/dev/null || true fi fi done # Kill vite processes from the web directory for pid in $(ps aux | grep "[v]ite" | grep -v "grep" | awk '{print $2}'); do if [ -d "/proc/$pid" ]; then cwd=$(readlink -f /proc/$pid/cwd 2>/dev/null || echo "") if [[ "$cwd" == *"$PROJECT_NAME"* ]] || [[ "$cwd" == *"/web"* ]] || [[ "$cwd" == *"$PROJECT_ROOT/web"* ]]; then echo " Killing vite process: $pid (from $cwd)" kill -9 $pid 2>/dev/null || true fi fi done # Kill node processes from the web directory for pid in $(ps aux | grep "[n]ode" | grep "vite" | awk '{print $2}'); do if [ -d "/proc/$pid" ]; then cwd=$(readlink -f /proc/$pid/cwd 2>/dev/null || echo "") if [[ "$cwd" == *"$PROJECT_NAME/web"* ]] || [[ "$cwd" == *"$PROJECT_ROOT/web"* ]]; then echo " Killing node/vite process: $pid (from $cwd)" kill -9 $pid 2>/dev/null || true fi fi done echo "✓ Frontend processes stopped" # Give processes a moment to fully terminate sleep 1 echo "" echo "Building and starting backend..." # Ensure Go is installed before attempting to build if ! command -v go >/dev/null 2>&1; then cat < "$PROJECT_ROOT/backend.log" 2>&1 & BACKEND_PID=$! echo "✓ Backend started (PID: $BACKEND_PID, logs: $PROJECT_ROOT/backend.log)" # Wait a moment for backend to start sleep 2 # Check if backend is running if ! ps -p $BACKEND_PID > /dev/null; then echo "❌ Backend failed to start! Check backend.log for errors" tail -20 backend.log exit 1 fi # Detect backend port from the running process BACKEND_PORT=$(lsof -Pan -p $BACKEND_PID -i 2>/dev/null | grep LISTEN | awk '{print $9}' | cut -d: -f2 | head -1) if [ -z "$BACKEND_PORT" ]; then BACKEND_PORT="8080" fi echo "" echo "Starting frontend..." # Recommend running the full setup script on first use if [ ! -f "$PROJECT_ROOT/bin/actalog" ]; then echo "\nNote: If this is the first time running ActaLog on this machine," echo "consider running the full setup script to install tools and dependencies:" echo " ./scripts/build.sh" fi # Verify Node/NPM are available before attempting to start the frontend if ! command -v node >/dev/null 2>&1; then echo "❌ 'node' not found in PATH. Install Node.js (16+) and retry. See: https://nodejs.org/" exit 1 fi if ! command -v npm >/dev/null 2>&1; then echo "❌ 'npm' not found in PATH. Install npm (bundled with Node.js) and retry." exit 1 fi # Verify Node.js version meets minimum requirement # Read the minimum required Node major version from environment if provided, # otherwise default to 18. Set MIN_NODE_MAJOR in your shell or export it from # another script if you need to override the requirement. MIN_NODE_MAJOR=${MIN_NODE_MAJOR:-18} NODE_VERSION_STR=$(node --version 2>/dev/null || echo "") NODE_MAJOR=$(echo "$NODE_VERSION_STR" | sed 's/^v//' | cut -d. -f1) if ! [[ "$NODE_MAJOR" =~ ^[0-9]+$ ]]; then echo "❌ Could not determine Node.js version from: $NODE_VERSION_STR" echo "Please ensure a compatible Node.js (>= ${MIN_NODE_MAJOR}) is installed." exit 1 fi if [ "$NODE_MAJOR" -lt "$MIN_NODE_MAJOR" ]; then echo "❌ Node.js major version $MIN_NODE_MAJOR or higher is required. Detected: $NODE_VERSION_STR" echo "Install a newer Node.js (https://nodejs.org/) or run './scripts/build.sh --update' to install one on Debian/Ubuntu systems." exit 1 fi # Install frontend dependencies if needed (uses npm --prefix so we don't change cwd) if [ ! -d "$PROJECT_ROOT/web/node_modules" ]; then echo "Installing frontend dependencies..." npm --prefix "$PROJECT_ROOT/web" install fi # Start frontend in background using npm --prefix to avoid changing cwd npm --prefix "$PROJECT_ROOT/web" run dev > "$PROJECT_ROOT/frontend.log" 2>&1 & FRONTEND_PID=$! echo "✓ Frontend started (PID: $FRONTEND_PID, logs: $PROJECT_ROOT/frontend.log)" # Optional: warn if mkcert might be useful for local HTTPS testing if ! command -v mkcert >/dev/null 2>&1; then echo "\nNote: 'mkcert' not found in PATH. If you plan to test HTTPS locally, install mkcert: https://github.com/FiloSottile/mkcert" fi # Wait for frontend to start and detect its port sleep 3 FRONTEND_PORT=$(lsof -Pan -p $FRONTEND_PID -i 2>/dev/null | grep LISTEN | awk '{print $9}' | cut -d: -f2 | head -1) if [ -z "$FRONTEND_PORT" ]; then # Try to find any vite process port FRONTEND_PORT=$(lsof -Pan -c node -i 2>/dev/null | grep LISTEN | grep "$PROJECT_ROOT/web" | awk '{print $9}' | cut -d: -f2 | head -1) if [ -z "$FRONTEND_PORT" ]; then FRONTEND_PORT="5173 or 3000" fi fi echo "" echo "=== Services Running ===" echo "Backend: http://localhost:$BACKEND_PORT (PID: $BACKEND_PID)" echo "Frontend: http://localhost:$FRONTEND_PORT (PID: $FRONTEND_PID)" echo "" echo "Log files:" echo " Backend: $PROJECT_ROOT/backend.log" echo " Frontend: $PROJECT_ROOT/frontend.log" echo "" echo "To view logs:" echo " tail -f $PROJECT_ROOT/backend.log" echo " tail -f $PROJECT_ROOT/frontend.log" echo "" echo "To stop services:" echo " ./stop.sh" echo " or: kill $BACKEND_PID $FRONTEND_PID" echo "" echo "✓ Restart complete!"