Build bot management dashboard system #1

Merged
overspend1 merged 1 commits from claude/bot-management-dashboard-019eUkzJ11Nebi3NoaADESdy into main 2025-11-21 11:34:54 +01:00
overspend1 commented 2025-11-21 11:33:56 +01:00 (Migrated from github.com)

Implement a comprehensive web-based dashboard for managing Telegram and Discord bots with real-time monitoring, process control, and beautiful UI.

Backend (FastAPI):

  • Complete REST API with OpenAPI documentation
  • WebSocket support for real-time log streaming and statistics
  • SQLAlchemy models for bots, logs, and users
  • JWT-based authentication system
  • Process management with subprocess and psutil
  • Auto-restart functionality with configurable backoff
  • System and bot resource monitoring (CPU, RAM, network)
  • Comprehensive error handling and logging

Frontend (Next.js 14 + TypeScript):

  • Modern React application with App Router
  • shadcn/ui components with Tailwind CSS
  • TanStack Query for data fetching and caching
  • Real-time WebSocket integration
  • Responsive design for mobile, tablet, and desktop
  • Beautiful dark theme with glassmorphism effects
  • Bot cards with status badges and controls
  • System statistics dashboard

Example Bots:

  • Telegram userbot using Telethon
  • Telegram bot using python-telegram-bot
  • Discord bot using discord.py
  • Full command examples and error handling

Infrastructure:

  • Docker and Docker Compose configurations
  • Multi-stage builds for optimal image sizes
  • Nginx reverse proxy with WebSocket support
  • Production and development compose files
  • Rate limiting and security headers

Documentation:

  • Comprehensive README with setup instructions
  • API documentation examples
  • Configuration guides
  • Troubleshooting section
  • Makefile for common commands

Features:

  • Start/stop/restart bots with one click
  • Real-time log streaming via WebSocket
  • Live system and bot statistics
  • Auto-restart on crashes
  • Bot configuration management
  • Process monitoring and resource tracking
  • Search and filter bots
  • Responsive UI with loading states
  • Toast notifications for all actions

Security:

  • JWT token-based authentication
  • Password hashing with bcrypt
  • CORS configuration
  • Environment variable management
  • Input validation and sanitization
  • Rate limiting in nginx
  • Security headers configured

Summary by CodeRabbit

Release Notes

  • New Features
    • Complete bot management platform with REST API for creating, configuring, and controlling bot lifecycles
    • Real-time web dashboard displaying bot status, system metrics, and performance data
    • WebSocket-powered streaming of logs and statistics for live monitoring
    • User authentication system with role-based access control
    • Docker deployment configuration for simplified setup and scaling
    • Multi-bot support with automatic health monitoring and optional crash recovery

✏️ Tip: You can customize this high-level summary in your review settings.

Implement a comprehensive web-based dashboard for managing Telegram and Discord bots with real-time monitoring, process control, and beautiful UI. Backend (FastAPI): - Complete REST API with OpenAPI documentation - WebSocket support for real-time log streaming and statistics - SQLAlchemy models for bots, logs, and users - JWT-based authentication system - Process management with subprocess and psutil - Auto-restart functionality with configurable backoff - System and bot resource monitoring (CPU, RAM, network) - Comprehensive error handling and logging Frontend (Next.js 14 + TypeScript): - Modern React application with App Router - shadcn/ui components with Tailwind CSS - TanStack Query for data fetching and caching - Real-time WebSocket integration - Responsive design for mobile, tablet, and desktop - Beautiful dark theme with glassmorphism effects - Bot cards with status badges and controls - System statistics dashboard Example Bots: - Telegram userbot using Telethon - Telegram bot using python-telegram-bot - Discord bot using discord.py - Full command examples and error handling Infrastructure: - Docker and Docker Compose configurations - Multi-stage builds for optimal image sizes - Nginx reverse proxy with WebSocket support - Production and development compose files - Rate limiting and security headers Documentation: - Comprehensive README with setup instructions - API documentation examples - Configuration guides - Troubleshooting section - Makefile for common commands Features: - Start/stop/restart bots with one click - Real-time log streaming via WebSocket - Live system and bot statistics - Auto-restart on crashes - Bot configuration management - Process monitoring and resource tracking - Search and filter bots - Responsive UI with loading states - Toast notifications for all actions Security: - JWT token-based authentication - Password hashing with bcrypt - CORS configuration - Environment variable management - Input validation and sanitization - Rate limiting in nginx - Security headers configured <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit # Release Notes * **New Features** * Complete bot management platform with REST API for creating, configuring, and controlling bot lifecycles * Real-time web dashboard displaying bot status, system metrics, and performance data * WebSocket-powered streaming of logs and statistics for live monitoring * User authentication system with role-based access control * Docker deployment configuration for simplified setup and scaling * Multi-bot support with automatic health monitoring and optional crash recovery <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2025-11-21 11:34:09 +01:00 (Migrated from github.com)

Caution

Review failed

The pull request is closed.

Walkthrough

A full-stack bot management dashboard application scaffold is introduced, featuring a FastAPI backend with SQLAlchemy ORM, authentication, bot lifecycle management, real-time logging via WebSocket, and statistics collection; a Next.js frontend dashboard with bot controls and monitoring; Docker and Nginx deployment configurations; and example bot implementations for Telegram and Discord platforms.

Changes

Cohort / File(s) Summary
Configuration & Infrastructure
.gitignore, Makefile, docker-compose.yml, docker-compose.prod.yml, nginx/nginx.conf
Git ignore patterns for Python/Node projects; Makefile with dev/prod/test targets; Docker Compose configs for local and production deployments with backend, frontend, and Nginx services; Nginx reverse proxy with rate limiting, WebSocket support, and SSL hooks.
Backend Core Application
backend/app/__init__.py, backend/app/config.py, backend/app/database.py, backend/app/main.py, backend/Dockerfile
App initialization with version; Pydantic settings configuration from environment; SQLAlchemy session/engine setup with conditional SQLite configuration; FastAPI application with lifespan management, CORS, request logging, exception handlers, health checks, and router integration; multi-stage Dockerfile with runtime dependencies.
Backend Data Models
backend/app/models/__init__.py, backend/app/models/bot.py, backend/app/models/log.py, backend/app/models/user.py
ORM models for Bot (with BotType/BotStatus enums), LogEntry (with LogLevel enum), and User; relationships between bots and logs; package exports.
Backend Schemas
backend/app/schemas/__init__.py, backend/app/schemas/bot.py, backend/app/schemas/log.py, backend/app/schemas/stats.py, backend/app/schemas/user.py
Pydantic request/response models for bot CRUD, pagination, authentication, logging, and statistics; ORM-to-schema conversion support via from_attributes.
Backend API Routers
backend/app/routers/__init__.py, backend/app/routers/auth.py, backend/app/routers/bots.py, backend/app/routers/stats.py, backend/app/routers/websocket.py
Authentication endpoints (register, login, refresh); bot management endpoints (CRUD, start/stop/restart, logs); system and bot statistics endpoints; WebSocket handlers for real-time logs and stats streaming.
Backend Services
backend/app/services/__init__.py, backend/app/services/bot_manager.py, backend/app/services/process_manager.py, backend/app/services/log_collector.py, backend/app/services/stats_collector.py
BotManager singleton coordinating bot lifecycle with health monitoring and auto-restart; ProcessManager for subprocess creation and management; LogCollector for buffered and streamed log access; StatsCollector for system and per-bot metrics.
Backend Utilities
backend/app/utils/__init__.py, backend/app/utils/logger.py, backend/app/utils/security.py
Unified logger setup with file rotation; password hashing/verification via bcrypt; JWT token creation and validation for access/refresh flows.
Backend Dependencies & Examples
backend/.env.example, backend/requirements.txt, backend/requirements-dev.txt, bots/examples/telegram_bot.py, bots/examples/telegram_userbot.py, bots/examples/discord_bot.py, bots/examples/requirements.txt
Environment variable template; FastAPI, SQLAlchemy, Pydantic, authentication, async dependencies; example bot implementations for Telegram (bot/userbot) and Discord with command handlers.
Frontend Configuration
frontend/package.json, frontend/tsconfig.json, frontend/next.config.js, frontend/postcss.config.js, frontend/tailwind.config.ts, frontend/.env.local.example, frontend/.eslintrc.json
Next.js 14 project manifest with TanStack Query and Tailwind dependencies; TypeScript config with strict mode; Next.js rewrites for API proxying; PostCSS/Tailwind/Autoprefixer pipeline; custom Tailwind colors, animations, and glass-morphism utilities; ESLint config.
Frontend UI Component Library
frontend/components/ui/badge.tsx, frontend/components/ui/button.tsx, frontend/components/ui/card.tsx, frontend/components/ui/input.tsx, frontend/components/ui/label.tsx, frontend/components/ui/switch.tsx
Reusable shadcn/ui-style components with CVA-based variants, ref forwarding, and Radix primitives integration.
Frontend Dashboard Components
frontend/components/dashboard/BotCard.tsx, frontend/components/dashboard/BotGrid.tsx, frontend/components/dashboard/StatusBadge.tsx, frontend/components/dashboard/SystemStats.tsx
Bot card with controls (start/stop/restart/delete) and logs link; responsive grid layout; status badge with visual indicators; system stats display with CPU/RAM/disk/bot counts.
Frontend Layouts & Pages
frontend/app/layout.tsx, frontend/app/page.tsx, frontend/app/providers.tsx, frontend/app/globals.css
Root layout with Providers wrapper and Inter font; dashboard page with bot management, stats, search, and status filtering; React Query provider setup with caching and retry logic; global Tailwind styles with color tokens and animations.
Frontend Type Definitions
frontend/types/api.ts, frontend/types/bot.ts, frontend/types/log.ts, frontend/types/stats.ts
API error/response types; bot enums (Type, Status) and interfaces (Bot, BotCreate, BotUpdate, responses); log types and WebSocket messages; statistics types (system, per-bot, aggregate) and WebSocket messages.
Documentation
README.md
Comprehensive project documentation including features, tech stack, prerequisites, quick start, deployment (Docker/manual), API endpoints, WebSocket flows, security, monitoring, troubleshooting, and development guidelines.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Frontend as Frontend Dashboard
    participant Nginx
    participant Backend as FastAPI Backend
    participant BotMgr as BotManager
    participant ProcMgr as ProcessManager
    participant DB as Database

    User->>Frontend: Click "Start Bot"
    Frontend->>Nginx: POST /api/v1/bots/{id}/start
    Nginx->>Backend: Route to start_bot endpoint
    Backend->>DB: Query bot by id
    DB-->>Backend: Return bot record
    Backend->>BotMgr: start_bot(bot_id)
    BotMgr->>ProcMgr: start process
    ProcMgr->>ProcMgr: Launch subprocess
    ProcMgr-->>BotMgr: Return process_id
    BotMgr->>DB: Update bot status to RUNNING
    BotMgr->>BotMgr: Start health monitor thread
    BotMgr-->>Backend: Return success
    Backend-->>Frontend: Return BotStatusResponse
    Frontend-->>User: Update UI with RUNNING status
    
    rect rgb(200, 220, 255)
    note over BotMgr: Ongoing monitoring
    BotMgr->>ProcMgr: Periodic health checks
    alt Bot crashed
        BotMgr->>DB: Update status to CRASHED
        BotMgr->>DB: Set last_crash_at timestamp
        alt AUTO_RESTART_BOTS enabled
            BotMgr->>BotMgr: Check backoff policy
            BotMgr->>ProcMgr: Restart process
        end
    else Bot running
        BotMgr->>DB: Update uptime, pid
    end
    end
sequenceDiagram
    participant Client as WebSocket Client
    participant Frontend
    participant Nginx
    participant Backend as FastAPI WebSocket
    participant LogCol as LogCollector
    participant DB as Database

    Client->>Frontend: Open logs viewer for bot
    Frontend->>Nginx: WebSocket upgrade /ws/logs/{bot_id}
    Nginx->>Backend: Establish WebSocket connection
    Backend->>DB: Query bot existence & auth
    DB-->>Backend: Bot found
    Backend->>LogCol: Initialize LogCollector
    Backend->>LogCol: get_buffered_logs()
    LogCol-->>Backend: Return last 100 logs
    Backend-->>Frontend: Send buffered logs batch
    Frontend-->>Client: Render historical logs

    rect rgb(200, 255, 220)
    note over Backend: Real-time streaming phase
    LogCol->>Backend: stream_logs() iterator active
    Backend->>Backend: Listen for new log lines
    alt New log published
        Backend->>Frontend: Send log message
        Frontend-->>Client: Append to live log view
    end
    end

    Client->>Frontend: Close logs viewer
    Frontend->>Nginx: Close WebSocket
    Nginx->>Backend: Disconnect
    Backend->>Backend: Remove connection from active_connections
    Backend->>LogCol: Cleanup

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Key areas requiring extra attention:

  • BotManager service (backend/app/services/bot_manager.py): Thread-safe singleton with background health monitoring, crash detection, auto-restart logic with backoff, and database state management—verify thread safety, backoff policy correctness, and edge cases in crash recovery.
  • ProcessManager (backend/app/services/process_manager.py): Subprocess lifecycle management, output streaming to logs, resource usage tracking via psutil—validate subprocess creation, signal handling, log file I/O, and cleanup guarantees.
  • WebSocket handlers (backend/app/routers/websocket.py): Active connection tracking, real-time streaming, connection cleanup—check for connection leaks, proper error handling, and graceful disconnection.
  • Authentication flow (backend/app/routers/auth.py): JWT token creation/verification, password hashing, user validation—confirm token expiry logic, refresh token handling, and password security practices.
  • Database initialization (backend/app/database.py): Conditional SQLite setup, lazy model imports for metadata creation—verify import order and transaction safety.
  • Frontend hooks & API layer: Ensure proper React Query integration, error boundaries, and WebSocket lifecycle management in real-time features.

Poem

🐰 A dashboard born, with bots to manage,
Telegram whispers, Discord in passage,
WebSocket streams dance, stats take flight,
FastAPI frameworks and Next.js delight,
From seed to scaffold, the journey's bright! 🌟

Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch claude/bot-management-dashboard-019eUkzJ11Nebi3NoaADESdy

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3bee6c27f7 and 297e94593f.

📒 Files selected for processing (67)
  • .gitignore (1 hunks)
  • Makefile (1 hunks)
  • README.md (1 hunks)
  • backend/.env.example (1 hunks)
  • backend/Dockerfile (1 hunks)
  • backend/app/__init__.py (1 hunks)
  • backend/app/config.py (1 hunks)
  • backend/app/database.py (1 hunks)
  • backend/app/main.py (1 hunks)
  • backend/app/models/__init__.py (1 hunks)
  • backend/app/models/bot.py (1 hunks)
  • backend/app/models/log.py (1 hunks)
  • backend/app/models/user.py (1 hunks)
  • backend/app/routers/__init__.py (1 hunks)
  • backend/app/routers/auth.py (1 hunks)
  • backend/app/routers/bots.py (1 hunks)
  • backend/app/routers/stats.py (1 hunks)
  • backend/app/routers/websocket.py (1 hunks)
  • backend/app/schemas/__init__.py (1 hunks)
  • backend/app/schemas/bot.py (1 hunks)
  • backend/app/schemas/log.py (1 hunks)
  • backend/app/schemas/stats.py (1 hunks)
  • backend/app/schemas/user.py (1 hunks)
  • backend/app/services/__init__.py (1 hunks)
  • backend/app/services/bot_manager.py (1 hunks)
  • backend/app/services/log_collector.py (1 hunks)
  • backend/app/services/process_manager.py (1 hunks)
  • backend/app/services/stats_collector.py (1 hunks)
  • backend/app/utils/__init__.py (1 hunks)
  • backend/app/utils/logger.py (1 hunks)
  • backend/app/utils/security.py (1 hunks)
  • backend/requirements-dev.txt (1 hunks)
  • backend/requirements.txt (1 hunks)
  • bots/examples/discord_bot.py (1 hunks)
  • bots/examples/requirements.txt (1 hunks)
  • bots/examples/telegram_bot.py (1 hunks)
  • bots/examples/telegram_userbot.py (1 hunks)
  • docker-compose.prod.yml (1 hunks)
  • docker-compose.yml (1 hunks)
  • frontend/.env.local.example (1 hunks)
  • frontend/.eslintrc.json (1 hunks)
  • frontend/Dockerfile (1 hunks)
  • frontend/app/globals.css (1 hunks)
  • frontend/app/layout.tsx (1 hunks)
  • frontend/app/page.tsx (1 hunks)
  • frontend/app/providers.tsx (1 hunks)
  • frontend/components.json (1 hunks)
  • frontend/components/dashboard/BotCard.tsx (1 hunks)
  • frontend/components/dashboard/BotGrid.tsx (1 hunks)
  • frontend/components/dashboard/StatusBadge.tsx (1 hunks)
  • frontend/components/dashboard/SystemStats.tsx (1 hunks)
  • frontend/components/ui/badge.tsx (1 hunks)
  • frontend/components/ui/button.tsx (1 hunks)
  • frontend/components/ui/card.tsx (1 hunks)
  • frontend/components/ui/input.tsx (1 hunks)
  • frontend/components/ui/label.tsx (1 hunks)
  • frontend/components/ui/switch.tsx (1 hunks)
  • frontend/next.config.js (1 hunks)
  • frontend/package.json (1 hunks)
  • frontend/postcss.config.js (1 hunks)
  • frontend/tailwind.config.ts (1 hunks)
  • frontend/tsconfig.json (1 hunks)
  • frontend/types/api.ts (1 hunks)
  • frontend/types/bot.ts (1 hunks)
  • frontend/types/log.ts (1 hunks)
  • frontend/types/stats.ts (1 hunks)
  • nginx/nginx.conf (1 hunks)

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- This is an auto-generated comment: failure by coderabbit.ai --> > [!CAUTION] > ## Review failed > > The pull request is closed. <!-- end of auto-generated comment: failure by coderabbit.ai --> <!-- walkthrough_start --> ## Walkthrough A full-stack bot management dashboard application scaffold is introduced, featuring a FastAPI backend with SQLAlchemy ORM, authentication, bot lifecycle management, real-time logging via WebSocket, and statistics collection; a Next.js frontend dashboard with bot controls and monitoring; Docker and Nginx deployment configurations; and example bot implementations for Telegram and Discord platforms. ## Changes | Cohort / File(s) | Summary | |---|---| | **Configuration & Infrastructure** <br> `.gitignore`, `Makefile`, `docker-compose.yml`, `docker-compose.prod.yml`, `nginx/nginx.conf` | Git ignore patterns for Python/Node projects; Makefile with dev/prod/test targets; Docker Compose configs for local and production deployments with backend, frontend, and Nginx services; Nginx reverse proxy with rate limiting, WebSocket support, and SSL hooks. | | **Backend Core Application** <br> `backend/app/__init__.py`, `backend/app/config.py`, `backend/app/database.py`, `backend/app/main.py`, `backend/Dockerfile` | App initialization with version; Pydantic settings configuration from environment; SQLAlchemy session/engine setup with conditional SQLite configuration; FastAPI application with lifespan management, CORS, request logging, exception handlers, health checks, and router integration; multi-stage Dockerfile with runtime dependencies. | | **Backend Data Models** <br> `backend/app/models/__init__.py`, `backend/app/models/bot.py`, `backend/app/models/log.py`, `backend/app/models/user.py` | ORM models for Bot (with BotType/BotStatus enums), LogEntry (with LogLevel enum), and User; relationships between bots and logs; package exports. | | **Backend Schemas** <br> `backend/app/schemas/__init__.py`, `backend/app/schemas/bot.py`, `backend/app/schemas/log.py`, `backend/app/schemas/stats.py`, `backend/app/schemas/user.py` | Pydantic request/response models for bot CRUD, pagination, authentication, logging, and statistics; ORM-to-schema conversion support via from_attributes. | | **Backend API Routers** <br> `backend/app/routers/__init__.py`, `backend/app/routers/auth.py`, `backend/app/routers/bots.py`, `backend/app/routers/stats.py`, `backend/app/routers/websocket.py` | Authentication endpoints (register, login, refresh); bot management endpoints (CRUD, start/stop/restart, logs); system and bot statistics endpoints; WebSocket handlers for real-time logs and stats streaming. | | **Backend Services** <br> `backend/app/services/__init__.py`, `backend/app/services/bot_manager.py`, `backend/app/services/process_manager.py`, `backend/app/services/log_collector.py`, `backend/app/services/stats_collector.py` | BotManager singleton coordinating bot lifecycle with health monitoring and auto-restart; ProcessManager for subprocess creation and management; LogCollector for buffered and streamed log access; StatsCollector for system and per-bot metrics. | | **Backend Utilities** <br> `backend/app/utils/__init__.py`, `backend/app/utils/logger.py`, `backend/app/utils/security.py` | Unified logger setup with file rotation; password hashing/verification via bcrypt; JWT token creation and validation for access/refresh flows. | | **Backend Dependencies & Examples** <br> `backend/.env.example`, `backend/requirements.txt`, `backend/requirements-dev.txt`, `bots/examples/telegram_bot.py`, `bots/examples/telegram_userbot.py`, `bots/examples/discord_bot.py`, `bots/examples/requirements.txt` | Environment variable template; FastAPI, SQLAlchemy, Pydantic, authentication, async dependencies; example bot implementations for Telegram (bot/userbot) and Discord with command handlers. | | **Frontend Configuration** <br> `frontend/package.json`, `frontend/tsconfig.json`, `frontend/next.config.js`, `frontend/postcss.config.js`, `frontend/tailwind.config.ts`, `frontend/.env.local.example`, `frontend/.eslintrc.json` | Next.js 14 project manifest with TanStack Query and Tailwind dependencies; TypeScript config with strict mode; Next.js rewrites for API proxying; PostCSS/Tailwind/Autoprefixer pipeline; custom Tailwind colors, animations, and glass-morphism utilities; ESLint config. | | **Frontend UI Component Library** <br> `frontend/components/ui/badge.tsx`, `frontend/components/ui/button.tsx`, `frontend/components/ui/card.tsx`, `frontend/components/ui/input.tsx`, `frontend/components/ui/label.tsx`, `frontend/components/ui/switch.tsx` | Reusable shadcn/ui-style components with CVA-based variants, ref forwarding, and Radix primitives integration. | | **Frontend Dashboard Components** <br> `frontend/components/dashboard/BotCard.tsx`, `frontend/components/dashboard/BotGrid.tsx`, `frontend/components/dashboard/StatusBadge.tsx`, `frontend/components/dashboard/SystemStats.tsx` | Bot card with controls (start/stop/restart/delete) and logs link; responsive grid layout; status badge with visual indicators; system stats display with CPU/RAM/disk/bot counts. | | **Frontend Layouts & Pages** <br> `frontend/app/layout.tsx`, `frontend/app/page.tsx`, `frontend/app/providers.tsx`, `frontend/app/globals.css` | Root layout with Providers wrapper and Inter font; dashboard page with bot management, stats, search, and status filtering; React Query provider setup with caching and retry logic; global Tailwind styles with color tokens and animations. | | **Frontend Type Definitions** <br> `frontend/types/api.ts`, `frontend/types/bot.ts`, `frontend/types/log.ts`, `frontend/types/stats.ts` | API error/response types; bot enums (Type, Status) and interfaces (Bot, BotCreate, BotUpdate, responses); log types and WebSocket messages; statistics types (system, per-bot, aggregate) and WebSocket messages. | | **Documentation** <br> `README.md` | Comprehensive project documentation including features, tech stack, prerequisites, quick start, deployment (Docker/manual), API endpoints, WebSocket flows, security, monitoring, troubleshooting, and development guidelines. | ## Sequence Diagram(s) ```mermaid sequenceDiagram participant User participant Frontend as Frontend Dashboard participant Nginx participant Backend as FastAPI Backend participant BotMgr as BotManager participant ProcMgr as ProcessManager participant DB as Database User->>Frontend: Click "Start Bot" Frontend->>Nginx: POST /api/v1/bots/{id}/start Nginx->>Backend: Route to start_bot endpoint Backend->>DB: Query bot by id DB-->>Backend: Return bot record Backend->>BotMgr: start_bot(bot_id) BotMgr->>ProcMgr: start process ProcMgr->>ProcMgr: Launch subprocess ProcMgr-->>BotMgr: Return process_id BotMgr->>DB: Update bot status to RUNNING BotMgr->>BotMgr: Start health monitor thread BotMgr-->>Backend: Return success Backend-->>Frontend: Return BotStatusResponse Frontend-->>User: Update UI with RUNNING status rect rgb(200, 220, 255) note over BotMgr: Ongoing monitoring BotMgr->>ProcMgr: Periodic health checks alt Bot crashed BotMgr->>DB: Update status to CRASHED BotMgr->>DB: Set last_crash_at timestamp alt AUTO_RESTART_BOTS enabled BotMgr->>BotMgr: Check backoff policy BotMgr->>ProcMgr: Restart process end else Bot running BotMgr->>DB: Update uptime, pid end end ``` ```mermaid sequenceDiagram participant Client as WebSocket Client participant Frontend participant Nginx participant Backend as FastAPI WebSocket participant LogCol as LogCollector participant DB as Database Client->>Frontend: Open logs viewer for bot Frontend->>Nginx: WebSocket upgrade /ws/logs/{bot_id} Nginx->>Backend: Establish WebSocket connection Backend->>DB: Query bot existence & auth DB-->>Backend: Bot found Backend->>LogCol: Initialize LogCollector Backend->>LogCol: get_buffered_logs() LogCol-->>Backend: Return last 100 logs Backend-->>Frontend: Send buffered logs batch Frontend-->>Client: Render historical logs rect rgb(200, 255, 220) note over Backend: Real-time streaming phase LogCol->>Backend: stream_logs() iterator active Backend->>Backend: Listen for new log lines alt New log published Backend->>Frontend: Send log message Frontend-->>Client: Append to live log view end end Client->>Frontend: Close logs viewer Frontend->>Nginx: Close WebSocket Nginx->>Backend: Disconnect Backend->>Backend: Remove connection from active_connections Backend->>LogCol: Cleanup ``` ## Estimated code review effort 🎯 4 (Complex) | ⏱️ ~60 minutes **Key areas requiring extra attention:** - **BotManager service** (`backend/app/services/bot_manager.py`): Thread-safe singleton with background health monitoring, crash detection, auto-restart logic with backoff, and database state management—verify thread safety, backoff policy correctness, and edge cases in crash recovery. - **ProcessManager** (`backend/app/services/process_manager.py`): Subprocess lifecycle management, output streaming to logs, resource usage tracking via psutil—validate subprocess creation, signal handling, log file I/O, and cleanup guarantees. - **WebSocket handlers** (`backend/app/routers/websocket.py`): Active connection tracking, real-time streaming, connection cleanup—check for connection leaks, proper error handling, and graceful disconnection. - **Authentication flow** (`backend/app/routers/auth.py`): JWT token creation/verification, password hashing, user validation—confirm token expiry logic, refresh token handling, and password security practices. - **Database initialization** (`backend/app/database.py`): Conditional SQLite setup, lazy model imports for metadata creation—verify import order and transaction safety. - **Frontend hooks & API layer**: Ensure proper React Query integration, error boundaries, and WebSocket lifecycle management in real-time features. ## Poem > 🐰 *A dashboard born, with bots to manage,* > *Telegram whispers, Discord in passage,* > *WebSocket streams dance, stats take flight,* > *FastAPI frameworks and Next.js delight,* > *From seed to scaffold, the journey's bright!* 🌟 <!-- walkthrough_end --> <!-- finishing_touch_checkbox_start --> <details> <summary>✨ Finishing touches</summary> - [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate docstrings <details> <summary>🧪 Generate unit tests (beta)</summary> - [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests - [ ] <!-- {"checkboxId": "07f1e7d6-8a8e-4e23-9900-8731c2c87f58", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Post copyable unit tests in a comment - [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Commit unit tests in branch `claude/bot-management-dashboard-019eUkzJ11Nebi3NoaADESdy` </details> </details> <!-- finishing_touch_checkbox_end --> --- <details> <summary>📜 Recent review details</summary> **Configuration used**: CodeRabbit UI **Review profile**: CHILL **Plan**: Pro <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 3bee6c27f7762d4616f368645e799689b6fa0520 and 297e94593fb9ffa50a1e4981e833b5b7e0744972. </details> <details> <summary>📒 Files selected for processing (67)</summary> * `.gitignore` (1 hunks) * `Makefile` (1 hunks) * `README.md` (1 hunks) * `backend/.env.example` (1 hunks) * `backend/Dockerfile` (1 hunks) * `backend/app/__init__.py` (1 hunks) * `backend/app/config.py` (1 hunks) * `backend/app/database.py` (1 hunks) * `backend/app/main.py` (1 hunks) * `backend/app/models/__init__.py` (1 hunks) * `backend/app/models/bot.py` (1 hunks) * `backend/app/models/log.py` (1 hunks) * `backend/app/models/user.py` (1 hunks) * `backend/app/routers/__init__.py` (1 hunks) * `backend/app/routers/auth.py` (1 hunks) * `backend/app/routers/bots.py` (1 hunks) * `backend/app/routers/stats.py` (1 hunks) * `backend/app/routers/websocket.py` (1 hunks) * `backend/app/schemas/__init__.py` (1 hunks) * `backend/app/schemas/bot.py` (1 hunks) * `backend/app/schemas/log.py` (1 hunks) * `backend/app/schemas/stats.py` (1 hunks) * `backend/app/schemas/user.py` (1 hunks) * `backend/app/services/__init__.py` (1 hunks) * `backend/app/services/bot_manager.py` (1 hunks) * `backend/app/services/log_collector.py` (1 hunks) * `backend/app/services/process_manager.py` (1 hunks) * `backend/app/services/stats_collector.py` (1 hunks) * `backend/app/utils/__init__.py` (1 hunks) * `backend/app/utils/logger.py` (1 hunks) * `backend/app/utils/security.py` (1 hunks) * `backend/requirements-dev.txt` (1 hunks) * `backend/requirements.txt` (1 hunks) * `bots/examples/discord_bot.py` (1 hunks) * `bots/examples/requirements.txt` (1 hunks) * `bots/examples/telegram_bot.py` (1 hunks) * `bots/examples/telegram_userbot.py` (1 hunks) * `docker-compose.prod.yml` (1 hunks) * `docker-compose.yml` (1 hunks) * `frontend/.env.local.example` (1 hunks) * `frontend/.eslintrc.json` (1 hunks) * `frontend/Dockerfile` (1 hunks) * `frontend/app/globals.css` (1 hunks) * `frontend/app/layout.tsx` (1 hunks) * `frontend/app/page.tsx` (1 hunks) * `frontend/app/providers.tsx` (1 hunks) * `frontend/components.json` (1 hunks) * `frontend/components/dashboard/BotCard.tsx` (1 hunks) * `frontend/components/dashboard/BotGrid.tsx` (1 hunks) * `frontend/components/dashboard/StatusBadge.tsx` (1 hunks) * `frontend/components/dashboard/SystemStats.tsx` (1 hunks) * `frontend/components/ui/badge.tsx` (1 hunks) * `frontend/components/ui/button.tsx` (1 hunks) * `frontend/components/ui/card.tsx` (1 hunks) * `frontend/components/ui/input.tsx` (1 hunks) * `frontend/components/ui/label.tsx` (1 hunks) * `frontend/components/ui/switch.tsx` (1 hunks) * `frontend/next.config.js` (1 hunks) * `frontend/package.json` (1 hunks) * `frontend/postcss.config.js` (1 hunks) * `frontend/tailwind.config.ts` (1 hunks) * `frontend/tsconfig.json` (1 hunks) * `frontend/types/api.ts` (1 hunks) * `frontend/types/bot.ts` (1 hunks) * `frontend/types/log.ts` (1 hunks) * `frontend/types/stats.ts` (1 hunks) * `nginx/nginx.conf` (1 hunks) </details> </details> <!-- tips_start --> --- Thanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=overspend1/bot-dashboard&utm_content=1)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. <details> <summary>❤️ Share</summary> - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code) </details> <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- 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 --> <!-- internal state end -->
Sign in to join this conversation.