Browse Source

Add startup scripts for backend and frontend

Added convenient startup scripts for development and production:

**Backend script** (backend/start.sh):
- dev: Development with auto-reload
- prod: Production with 4 workers
- background: Run in background
- stop/restart/status commands
- Custom HOST/PORT/LOG_LEVEL via env vars

**Frontend script** (frontend/start.sh):
- dev: Vite dev server with HMR
- build: Production build
- preview: Preview production build
- background: Run in background
- stop/restart/status/clean commands

**Main script** (start-all.sh):
- dev: Start both (frontend interactive)
- background: Both in background
- logs: Watch all logs
- stop/restart/status for all services

**Documentation** (STARTUP.md):
- Quick start guide
- Detailed usage examples
- First-time setup instructions
- Troubleshooting tips
- Useful bash aliases

Usage:
  ./start-all.sh dev        # Recommended for development
  ./start-all.sh background # Start all in background
  ./start-all.sh logs       # Watch logs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
root 4 weeks ago
parent
commit
be376d7a25
4 changed files with 891 additions and 0 deletions
  1. 426 0
      STARTUP.md
  2. 155 0
      backend/start.sh
  3. 165 0
      frontend/start.sh
  4. 145 0
      start-all.sh

+ 426 - 0
STARTUP.md

@@ -0,0 +1,426 @@
+# MyBeacon - Quick Start Guide
+
+## 🚀 Запуск всего проекта
+
+### Самый простой способ (оба сервиса сразу)
+
+```bash
+# Development режим (frontend интерактивный)
+./start-all.sh dev
+
+# Background режим (всё в фоне)
+./start-all.sh background
+
+# Посмотреть логи
+./start-all.sh logs
+
+# Остановить всё
+./start-all.sh stop
+
+# Статус
+./start-all.sh status
+```
+
+---
+
+## 🔧 Запуск по отдельности
+
+### Backend
+
+```bash
+cd backend
+
+# Development с auto-reload
+./start.sh dev
+
+# Production (4 воркера)
+./start.sh prod
+
+# В фоне
+./start.sh background
+
+# Остановить
+./start.sh stop
+
+# Статус
+./start.sh status
+```
+
+**Кастомизация:**
+
+```bash
+# Другой порт
+PORT=8001 ./start.sh dev
+
+# Другой хост
+HOST=127.0.0.1 PORT=9000 ./start.sh background
+
+# Debug логи
+LOG_LEVEL=debug ./start.sh dev
+```
+
+**Логи:**
+- Dev: `/tmp/backend_dev.log`
+- Background: `/tmp/backend_live.log`
+- Production: `/var/log/mybeacon/backend.log`
+
+---
+
+### Frontend
+
+```bash
+cd frontend
+
+# Development server
+./start.sh dev
+
+# В фоне
+./start.sh background
+
+# Build production
+./start.sh build
+
+# Preview production build
+./start.sh preview
+
+# Остановить
+./start.sh stop
+
+# Очистить кеш
+./start.sh clean
+
+# Установить/обновить зависимости
+./start.sh install
+```
+
+**Кастомизация:**
+
+```bash
+# Другой порт
+PORT=3000 ./start.sh dev
+
+# Другой хост
+HOST=192.168.5.4 PORT=5173 ./start.sh dev
+```
+
+**Логи:**
+- Background: `/tmp/frontend_dev.log`
+
+---
+
+## 📦 Первый запуск
+
+### 1. Установка зависимостей
+
+**Backend:**
+```bash
+cd backend
+poetry install
+```
+
+**Frontend:**
+```bash
+cd frontend
+npm install
+```
+
+### 2. Настройка окружения
+
+Создай `.env` файл в `backend/`:
+
+```bash
+cd backend
+cp .env.example .env
+# Отредактируй .env если нужно
+```
+
+### 3. Запуск баз данных
+
+**PostgreSQL:**
+```bash
+sudo systemctl start postgresql
+sudo systemctl enable postgresql
+
+# Создать БД
+sudo -u postgres psql
+CREATE USER mybeacon WITH PASSWORD 'mybeacon';
+CREATE DATABASE mybeacon OWNER mybeacon;
+\q
+```
+
+**ClickHouse:**
+```bash
+sudo systemctl start clickhouse-server
+sudo systemctl enable clickhouse-server
+
+# Создать БД
+clickhouse-client -q "CREATE DATABASE IF NOT EXISTS mybeacon"
+```
+
+**Redis:**
+```bash
+sudo systemctl start redis
+sudo systemctl enable redis
+```
+
+### 4. Миграции
+
+```bash
+cd backend
+poetry run alembic upgrade head
+```
+
+### 5. Создать superadmin
+
+```bash
+cd backend
+poetry run python3 -c "
+from app.core.database import async_session_maker
+from app.models.user import User
+from app.core.security import get_password_hash
+from datetime import datetime, timezone
+import asyncio
+
+async def create_superadmin():
+    async with async_session_maker() as db:
+        admin = User(
+            email='superadmin@mybeacon.com',
+            hashed_password=get_password_hash('superadmin123'),
+            full_name='Super Admin',
+            role='superadmin',
+            status='active',
+            email_verified=True,
+            created_at=datetime.now(timezone.utc)
+        )
+        db.add(admin)
+        await db.commit()
+        print('✅ Superadmin created: superadmin@mybeacon.com / superadmin123')
+
+asyncio.run(create_superadmin())
+"
+```
+
+### 6. Запуск!
+
+```bash
+# Из корня проекта
+./start-all.sh dev
+```
+
+---
+
+## 🌐 URL-адреса
+
+- **Frontend**: http://localhost:5173
+- **Backend API**: http://localhost:8000
+- **API Docs**: http://localhost:8000/docs
+- **ReDoc**: http://localhost:8000/redoc
+
+---
+
+## 📊 Мониторинг
+
+### Проверка статуса
+
+```bash
+# Все сервисы
+./start-all.sh status
+
+# Backend отдельно
+cd backend && ./start.sh status
+
+# Frontend отдельно
+cd frontend && ./start.sh status
+```
+
+### Логи
+
+```bash
+# Все логи сразу
+./start-all.sh logs
+
+# Backend
+tail -f /tmp/backend_live.log
+
+# Frontend
+tail -f /tmp/frontend_dev.log
+```
+
+### Процессы
+
+```bash
+# Backend
+ps aux | grep uvicorn
+
+# Frontend
+ps aux | grep vite
+```
+
+---
+
+## 🛠️ Команды разработчика
+
+### Backend
+
+```bash
+cd backend
+
+# Форматирование кода
+poetry run black app/
+
+# Проверка кода
+poetry run ruff app/
+
+# Тесты
+poetry run pytest
+
+# Новая миграция
+poetry run alembic revision --autogenerate -m "description"
+
+# Применить миграции
+poetry run alembic upgrade head
+
+# Откатить миграцию
+poetry run alembic downgrade -1
+```
+
+### Frontend
+
+```bash
+cd frontend
+
+# Линтинг
+npm run lint
+
+# Форматирование
+npm run format
+
+# Проверка типов
+npm run type-check
+
+# Build
+npm run build
+
+# Preview build
+npm run preview
+```
+
+---
+
+## 🐛 Troubleshooting
+
+### Backend не стартует
+
+```bash
+# Проверь .env
+cat backend/.env
+
+# Проверь БД подключение
+cd backend
+poetry run python3 -c "from app.core.database import engine; print('OK')"
+
+# Проверь порт 8000
+sudo netstat -tlnp | grep 8000
+
+# Убей старые процессы
+pkill -f uvicorn
+```
+
+### Frontend не стартует
+
+```bash
+# Проверь node_modules
+cd frontend
+ls node_modules/ | wc -l  # Должно быть > 0
+
+# Переустанови
+rm -rf node_modules package-lock.json
+npm install
+
+# Проверь порт 5173
+sudo netstat -tlnp | grep 5173
+
+# Убей старые процессы
+pkill -f vite
+```
+
+### Очистка всего
+
+```bash
+# Останови всё
+./start-all.sh stop
+
+# Очисти кеши
+cd backend
+find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null
+find . -type f -name "*.pyc" -delete 2>/dev/null
+
+cd ../frontend
+rm -rf node_modules/.vite dist
+```
+
+---
+
+## 📝 Полезные алиасы
+
+Добавь в `~/.bashrc` или `~/.zshrc`:
+
+```bash
+# MyBeacon
+alias mb-start='cd ~/work/luckfox/alpine/mybeacon-backend && ./start-all.sh background'
+alias mb-stop='cd ~/work/luckfox/alpine/mybeacon-backend && ./start-all.sh stop'
+alias mb-logs='cd ~/work/luckfox/alpine/mybeacon-backend && ./start-all.sh logs'
+alias mb-status='cd ~/work/luckfox/alpine/mybeacon-backend && ./start-all.sh status'
+
+# Backend
+alias mb-be='cd ~/work/luckfox/alpine/mybeacon-backend/backend'
+alias mb-be-logs='tail -f /tmp/backend_live.log'
+
+# Frontend
+alias mb-fe='cd ~/work/luckfox/alpine/mybeacon-backend/frontend'
+alias mb-fe-logs='tail -f /tmp/frontend_dev.log'
+```
+
+Потом: `source ~/.bashrc`
+
+Использование:
+```bash
+mb-start     # Запустить всё
+mb-status    # Статус
+mb-logs      # Логи
+mb-stop      # Остановить
+```
+
+---
+
+## 🎯 Production Deployment
+
+### systemd service для Backend
+
+```bash
+sudo cp backend/systemd/mybeacon-api.service /etc/systemd/system/
+sudo systemctl daemon-reload
+sudo systemctl enable mybeacon-api
+sudo systemctl start mybeacon-api
+```
+
+### Nginx для Frontend
+
+```bash
+# Build frontend
+cd frontend
+npm run build
+
+# Copy to nginx
+sudo cp -r dist /var/www/mybeacon-frontend
+
+# Setup nginx
+sudo cp nginx/mybeacon.conf /etc/nginx/sites-available/
+sudo ln -s /etc/nginx/sites-available/mybeacon.conf /etc/nginx/sites-enabled/
+sudo nginx -t
+sudo systemctl reload nginx
+```
+
+---
+
+Готово! 🎉

+ 155 - 0
backend/start.sh

@@ -0,0 +1,155 @@
+#!/bin/bash
+#
+# MyBeacon Backend Startup Script
+#
+
+set -e
+
+# Change to backend directory
+cd "$(dirname "$0")"
+
+# Colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+# Default values
+MODE="${1:-dev}"
+HOST="${HOST:-0.0.0.0}"
+PORT="${PORT:-8000}"
+LOG_LEVEL="${LOG_LEVEL:-info}"
+
+echo -e "${GREEN}=== MyBeacon Backend Startup ===${NC}"
+echo -e "Mode: ${YELLOW}${MODE}${NC}"
+echo -e "Host: ${YELLOW}${HOST}${NC}"
+echo -e "Port: ${YELLOW}${PORT}${NC}"
+echo ""
+
+# Check if .env exists
+if [ ! -f ".env" ]; then
+    echo -e "${RED}Error: .env file not found!${NC}"
+    echo "Please create .env file from .env.example"
+    exit 1
+fi
+
+# Check if poetry is installed
+if ! command -v poetry &> /dev/null; then
+    echo -e "${RED}Error: poetry not found!${NC}"
+    echo "Install poetry: curl -sSL https://install.python-poetry.org | python3 -"
+    exit 1
+fi
+
+# Install dependencies if needed
+if [ ! -d ".venv" ] && [ ! -d "$(poetry env info -p 2>/dev/null)" ]; then
+    echo -e "${YELLOW}Installing dependencies...${NC}"
+    poetry install
+fi
+
+# Function to stop backend
+cleanup() {
+    echo -e "\n${YELLOW}Stopping backend...${NC}"
+    pkill -f "uvicorn app.main:app" 2>/dev/null || true
+    exit 0
+}
+
+trap cleanup SIGINT SIGTERM
+
+# Start backend based on mode
+case "$MODE" in
+    dev)
+        echo -e "${GREEN}Starting in DEVELOPMENT mode...${NC}"
+        echo -e "${YELLOW}Logs: /tmp/backend_dev.log${NC}"
+        echo ""
+        poetry run python3 -m uvicorn app.main:app \
+            --host "$HOST" \
+            --port "$PORT" \
+            --reload \
+            --log-level "$LOG_LEVEL" \
+            2>&1 | tee /tmp/backend_dev.log
+        ;;
+
+    prod)
+        echo -e "${GREEN}Starting in PRODUCTION mode...${NC}"
+        echo -e "${YELLOW}Logs: /var/log/mybeacon/backend.log${NC}"
+        echo ""
+
+        # Create log directory
+        sudo mkdir -p /var/log/mybeacon
+        sudo chown $USER:$USER /var/log/mybeacon
+
+        poetry run python3 -m uvicorn app.main:app \
+            --host "$HOST" \
+            --port "$PORT" \
+            --workers 4 \
+            --log-level "$LOG_LEVEL" \
+            --access-log \
+            2>&1 | tee -a /var/log/mybeacon/backend.log
+        ;;
+
+    background)
+        echo -e "${GREEN}Starting in BACKGROUND mode...${NC}"
+        echo -e "${YELLOW}Logs: /tmp/backend_live.log${NC}"
+        echo ""
+
+        # Kill existing backend
+        pkill -f "uvicorn app.main:app" 2>/dev/null || true
+        sleep 1
+
+        # Start in background
+        poetry run python3 -m uvicorn app.main:app \
+            --host "$HOST" \
+            --port "$PORT" \
+            --log-level "$LOG_LEVEL" \
+            2>&1 < /dev/null | tee /tmp/backend_live.log &
+
+        PID=$!
+        echo -e "${GREEN}Backend started with PID: ${PID}${NC}"
+        echo -e "Check logs: ${YELLOW}tail -f /tmp/backend_live.log${NC}"
+        echo -e "Stop: ${YELLOW}pkill -f 'uvicorn app.main:app'${NC}"
+        ;;
+
+    stop)
+        echo -e "${YELLOW}Stopping backend...${NC}"
+        pkill -f "uvicorn app.main:app" 2>/dev/null && echo -e "${GREEN}Backend stopped${NC}" || echo -e "${YELLOW}Backend not running${NC}"
+        ;;
+
+    restart)
+        echo -e "${YELLOW}Restarting backend...${NC}"
+        pkill -f "uvicorn app.main:app" 2>/dev/null || true
+        sleep 2
+        exec "$0" background
+        ;;
+
+    status)
+        if pgrep -f "uvicorn app.main:app" > /dev/null; then
+            echo -e "${GREEN}Backend is running${NC}"
+            ps aux | grep "uvicorn app.main:app" | grep -v grep
+        else
+            echo -e "${YELLOW}Backend is not running${NC}"
+        fi
+        ;;
+
+    *)
+        echo "Usage: $0 {dev|prod|background|stop|restart|status}"
+        echo ""
+        echo "Modes:"
+        echo "  dev        - Development mode with auto-reload"
+        echo "  prod       - Production mode with 4 workers"
+        echo "  background - Run in background"
+        echo "  stop       - Stop backend"
+        echo "  restart    - Restart backend"
+        echo "  status     - Check backend status"
+        echo ""
+        echo "Environment variables:"
+        echo "  HOST       - Bind host (default: 0.0.0.0)"
+        echo "  PORT       - Bind port (default: 8000)"
+        echo "  LOG_LEVEL  - Log level (default: info)"
+        echo ""
+        echo "Examples:"
+        echo "  $0 dev                    # Development mode"
+        echo "  $0 background             # Background mode"
+        echo "  PORT=8001 $0 dev          # Custom port"
+        exit 1
+        ;;
+esac

+ 165 - 0
frontend/start.sh

@@ -0,0 +1,165 @@
+#!/bin/bash
+#
+# MyBeacon Frontend Startup Script
+#
+
+set -e
+
+# Change to frontend directory
+cd "$(dirname "$0")"
+
+# Colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+# Default values
+MODE="${1:-dev}"
+HOST="${HOST:-0.0.0.0}"
+PORT="${PORT:-5173}"
+
+echo -e "${GREEN}=== MyBeacon Frontend Startup ===${NC}"
+echo -e "Mode: ${YELLOW}${MODE}${NC}"
+echo -e "Host: ${YELLOW}${HOST}${NC}"
+echo -e "Port: ${YELLOW}${PORT}${NC}"
+echo ""
+
+# Check if package.json exists
+if [ ! -f "package.json" ]; then
+    echo -e "${RED}Error: package.json not found!${NC}"
+    exit 1
+fi
+
+# Check if npm is installed
+if ! command -v npm &> /dev/null; then
+    echo -e "${RED}Error: npm not found!${NC}"
+    echo "Install Node.js and npm first"
+    exit 1
+fi
+
+# Install dependencies if needed
+if [ ! -d "node_modules" ]; then
+    echo -e "${YELLOW}Installing dependencies...${NC}"
+    npm install
+fi
+
+# Function to stop frontend
+cleanup() {
+    echo -e "\n${YELLOW}Stopping frontend...${NC}"
+    pkill -f "vite" 2>/dev/null || true
+    exit 0
+}
+
+trap cleanup SIGINT SIGTERM
+
+# Start frontend based on mode
+case "$MODE" in
+    dev)
+        echo -e "${GREEN}Starting DEVELOPMENT server...${NC}"
+        echo -e "${YELLOW}URL: http://${HOST}:${PORT}${NC}"
+        echo ""
+        npm run dev -- --host "$HOST" --port "$PORT"
+        ;;
+
+    build)
+        echo -e "${GREEN}Building for PRODUCTION...${NC}"
+        echo -e "${YELLOW}Output: ./dist/${NC}"
+        echo ""
+        npm run build
+        echo -e "${GREEN}Build complete!${NC}"
+        ;;
+
+    preview)
+        echo -e "${GREEN}Starting PREVIEW server...${NC}"
+        echo -e "${YELLOW}Serving production build${NC}"
+        echo ""
+        npm run preview -- --host "$HOST" --port "$PORT"
+        ;;
+
+    background)
+        echo -e "${GREEN}Starting in BACKGROUND mode...${NC}"
+        echo -e "${YELLOW}Logs: /tmp/frontend_dev.log${NC}"
+        echo ""
+
+        # Kill existing frontend
+        pkill -f "vite" 2>/dev/null || true
+        sleep 1
+
+        # Start in background
+        npm run dev -- --host "$HOST" --port "$PORT" > /tmp/frontend_dev.log 2>&1 &
+
+        PID=$!
+        sleep 2
+
+        if ps -p $PID > /dev/null; then
+            echo -e "${GREEN}Frontend started with PID: ${PID}${NC}"
+            echo -e "URL: ${YELLOW}http://${HOST}:${PORT}${NC}"
+            echo -e "Check logs: ${YELLOW}tail -f /tmp/frontend_dev.log${NC}"
+            echo -e "Stop: ${YELLOW}pkill -f vite${NC}"
+        else
+            echo -e "${RED}Failed to start frontend${NC}"
+            cat /tmp/frontend_dev.log
+            exit 1
+        fi
+        ;;
+
+    stop)
+        echo -e "${YELLOW}Stopping frontend...${NC}"
+        pkill -f "vite" 2>/dev/null && echo -e "${GREEN}Frontend stopped${NC}" || echo -e "${YELLOW}Frontend not running${NC}"
+        ;;
+
+    restart)
+        echo -e "${YELLOW}Restarting frontend...${NC}"
+        pkill -f "vite" 2>/dev/null || true
+        sleep 2
+        exec "$0" background
+        ;;
+
+    status)
+        if pgrep -f "vite" > /dev/null; then
+            echo -e "${GREEN}Frontend is running${NC}"
+            ps aux | grep "vite" | grep -v grep
+        else
+            echo -e "${YELLOW}Frontend is not running${NC}"
+        fi
+        ;;
+
+    clean)
+        echo -e "${YELLOW}Cleaning build artifacts...${NC}"
+        rm -rf dist node_modules/.vite
+        echo -e "${GREEN}Clean complete!${NC}"
+        ;;
+
+    install)
+        echo -e "${YELLOW}Installing dependencies...${NC}"
+        npm install
+        echo -e "${GREEN}Install complete!${NC}"
+        ;;
+
+    *)
+        echo "Usage: $0 {dev|build|preview|background|stop|restart|status|clean|install}"
+        echo ""
+        echo "Modes:"
+        echo "  dev        - Development server with HMR"
+        echo "  build      - Build for production"
+        echo "  preview    - Preview production build"
+        echo "  background - Run dev server in background"
+        echo "  stop       - Stop frontend"
+        echo "  restart    - Restart frontend"
+        echo "  status     - Check frontend status"
+        echo "  clean      - Clean build artifacts"
+        echo "  install    - Install/update dependencies"
+        echo ""
+        echo "Environment variables:"
+        echo "  HOST       - Bind host (default: 0.0.0.0)"
+        echo "  PORT       - Bind port (default: 5173)"
+        echo ""
+        echo "Examples:"
+        echo "  $0 dev                    # Development mode"
+        echo "  $0 background             # Background mode"
+        echo "  $0 build                  # Build production"
+        echo "  PORT=3000 $0 dev          # Custom port"
+        exit 1
+        ;;
+esac

+ 145 - 0
start-all.sh

@@ -0,0 +1,145 @@
+#!/bin/bash
+#
+# MyBeacon - Start Both Backend and Frontend
+#
+
+set -e
+
+# Colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+# Get script directory
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+BACKEND_DIR="$SCRIPT_DIR/backend"
+FRONTEND_DIR="$SCRIPT_DIR/frontend"
+
+MODE="${1:-dev}"
+
+echo -e "${BLUE}╔════════════════════════════════════╗${NC}"
+echo -e "${BLUE}║   MyBeacon - Full Stack Startup   ║${NC}"
+echo -e "${BLUE}╚════════════════════════════════════╝${NC}"
+echo ""
+
+# Function to cleanup on exit
+cleanup() {
+    echo -e "\n${YELLOW}Stopping all services...${NC}"
+    cd "$BACKEND_DIR" && ./start.sh stop 2>/dev/null || true
+    cd "$FRONTEND_DIR" && ./start.sh stop 2>/dev/null || true
+    exit 0
+}
+
+trap cleanup SIGINT SIGTERM
+
+case "$MODE" in
+    dev)
+        echo -e "${GREEN}Starting in DEVELOPMENT mode...${NC}"
+        echo ""
+
+        # Start backend in background
+        echo -e "${BLUE}[1/2]${NC} Starting Backend..."
+        cd "$BACKEND_DIR"
+        ./start.sh background
+
+        echo ""
+        sleep 3
+
+        # Start frontend in foreground
+        echo -e "${BLUE}[2/2]${NC} Starting Frontend..."
+        cd "$FRONTEND_DIR"
+        ./start.sh dev
+        ;;
+
+    background)
+        echo -e "${GREEN}Starting in BACKGROUND mode...${NC}"
+        echo ""
+
+        # Start backend
+        echo -e "${BLUE}[1/2]${NC} Starting Backend..."
+        cd "$BACKEND_DIR"
+        ./start.sh background
+
+        echo ""
+        sleep 2
+
+        # Start frontend
+        echo -e "${BLUE}[2/2]${NC} Starting Frontend..."
+        cd "$FRONTEND_DIR"
+        ./start.sh background
+
+        echo ""
+        echo -e "${GREEN}════════════════════════════════════${NC}"
+        echo -e "${GREEN}All services started!${NC}"
+        echo ""
+        echo -e "Backend:  ${YELLOW}http://localhost:8000${NC}"
+        echo -e "Frontend: ${YELLOW}http://localhost:5173${NC}"
+        echo ""
+        echo -e "Backend logs:  ${YELLOW}tail -f /tmp/backend_live.log${NC}"
+        echo -e "Frontend logs: ${YELLOW}tail -f /tmp/frontend_dev.log${NC}"
+        echo ""
+        echo -e "Stop all: ${YELLOW}$0 stop${NC}"
+        ;;
+
+    stop)
+        echo -e "${YELLOW}Stopping all services...${NC}"
+        cd "$BACKEND_DIR" && ./start.sh stop
+        cd "$FRONTEND_DIR" && ./start.sh stop
+        echo -e "${GREEN}All services stopped${NC}"
+        ;;
+
+    restart)
+        echo -e "${YELLOW}Restarting all services...${NC}"
+        "$0" stop
+        sleep 2
+        exec "$0" background
+        ;;
+
+    status)
+        echo -e "${BLUE}Backend Status:${NC}"
+        cd "$BACKEND_DIR" && ./start.sh status
+        echo ""
+        echo -e "${BLUE}Frontend Status:${NC}"
+        cd "$FRONTEND_DIR" && ./start.sh status
+        ;;
+
+    logs)
+        echo -e "${GREEN}Showing logs (Ctrl+C to exit)...${NC}"
+        echo ""
+
+        # Check which logs exist
+        BACKEND_LOG="/tmp/backend_live.log"
+        FRONTEND_LOG="/tmp/frontend_dev.log"
+
+        LOGS=""
+        [ -f "$BACKEND_LOG" ] && LOGS="$LOGS $BACKEND_LOG"
+        [ -f "$FRONTEND_LOG" ] && LOGS="$LOGS $FRONTEND_LOG"
+
+        if [ -z "$LOGS" ]; then
+            echo -e "${YELLOW}No logs found. Services not running?${NC}"
+            exit 1
+        fi
+
+        tail -f $LOGS
+        ;;
+
+    *)
+        echo "Usage: $0 {dev|background|stop|restart|status|logs}"
+        echo ""
+        echo "Modes:"
+        echo "  dev        - Development mode (frontend interactive)"
+        echo "  background - Both services in background"
+        echo "  stop       - Stop all services"
+        echo "  restart    - Restart all services"
+        echo "  status     - Check services status"
+        echo "  logs       - Show logs from all services"
+        echo ""
+        echo "Examples:"
+        echo "  $0 dev         # Dev mode (recommended)"
+        echo "  $0 background  # Start all in background"
+        echo "  $0 logs        # Watch all logs"
+        exit 1
+        ;;
+esac