refactor: Remove deprecated INTERNAL_API_PORT (ultrathin monolith cleanup)
Architecture cleanup after migration to ultrathin monolith: - Remove INTERNAL_API_PORT from .env files (was port 8002) - Clean up bot_main.py: remove uvicorn, Thread, run_internal_api() - Update validate.md to check /api/telegram/health instead of port 8002 - Add deprecation notices to old Windows deployment docs - Update docs/telegram/README.md with architecture note The Telegram internal API is now served at /api/telegram/internal/* on the main backend port (8000/8001) instead of separate port 8002. Also includes: menu updates, ServerLogsView improvements, script fixes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -401,9 +401,9 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Telegram Bot health check
|
||||
if check_port_available 8002; then
|
||||
echo "✅ Telegram bot internal API is running on port 8002"
|
||||
# Telegram Bot health check (now part of main backend on port 8000)
|
||||
if curl -s http://localhost:8000/api/telegram/health > /dev/null 2>&1; then
|
||||
echo "✅ Telegram bot is running (via main backend)"
|
||||
else
|
||||
echo "⚠️ Telegram bot is not running (optional for validation)"
|
||||
fi
|
||||
|
||||
@@ -143,7 +143,7 @@ TELEGRAM_BOT_TOKEN=your_bot_token_from_botfather
|
||||
BACKEND_URL=http://localhost:8000
|
||||
|
||||
# Internal API port (bot's internal API for backend callbacks)
|
||||
INTERNAL_API_PORT=8002
|
||||
# INTERNAL_API_PORT=8002 # DEPRECATED: Now served via main app at /api/telegram/internal/*
|
||||
|
||||
# Enable internal API documentation (development only)
|
||||
ENABLE_DOCS=false
|
||||
|
||||
@@ -137,7 +137,7 @@ TELEGRAM_BOT_TOKEN=your_bot_token_from_botfather
|
||||
BACKEND_URL=http://localhost:8000
|
||||
|
||||
# Internal API port (bot's internal API for backend callbacks)
|
||||
INTERNAL_API_PORT=8002
|
||||
# INTERNAL_API_PORT=8002 # DEPRECATED: Now served via main app at /api/telegram/internal/*
|
||||
|
||||
# Enable internal API documentation (DISABLE in production!)
|
||||
ENABLE_DOCS=false
|
||||
|
||||
@@ -144,7 +144,7 @@ TELEGRAM_BOT_TOKEN=8483383555:AAGNY1z6WiBkvVfy1ZV_gM_JnAqW4q4MlEY
|
||||
BACKEND_URL=http://localhost:8000
|
||||
|
||||
# Internal API port (bot's internal API for backend callbacks)
|
||||
INTERNAL_API_PORT=8002
|
||||
# INTERNAL_API_PORT=8002 # DEPRECATED: Now served via main app at /api/telegram/internal/*
|
||||
|
||||
# Enable internal API documentation (development only)
|
||||
ENABLE_DOCS=false
|
||||
|
||||
@@ -10,8 +10,7 @@ import logging
|
||||
import os
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
import uvicorn
|
||||
from threading import Thread
|
||||
# Note: uvicorn and threading removed - internal API now served via main.py
|
||||
|
||||
# ============================================================================
|
||||
# LOAD ENVIRONMENT VARIABLES FIRST - BEFORE ANY APP IMPORTS
|
||||
@@ -69,8 +68,7 @@ from backend.modules.telegram.bot.handlers import (
|
||||
# Import email authentication handler
|
||||
from backend.modules.telegram.bot.email_handlers import email_login_handler
|
||||
|
||||
# Import internal API
|
||||
from backend.modules.telegram.internal_api import internal_api
|
||||
# Note: internal_api import removed - now served via main.py at /api/telegram/internal/*
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(
|
||||
@@ -82,7 +80,7 @@ logger = logging.getLogger(__name__)
|
||||
# Environment variables (already loaded above)
|
||||
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
|
||||
BACKEND_URL = os.getenv('BACKEND_URL', 'http://localhost:8000')
|
||||
INTERNAL_API_PORT = int(os.getenv('INTERNAL_API_PORT', '8002'))
|
||||
# Note: INTERNAL_API_PORT removed - internal API now served via main.py
|
||||
|
||||
|
||||
# ============================================================================
|
||||
@@ -153,29 +151,10 @@ def create_telegram_application() -> Application:
|
||||
return application
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# INTERNAL API SERVER
|
||||
# ============================================================================
|
||||
|
||||
def run_internal_api():
|
||||
"""
|
||||
Run the internal FastAPI server in a separate thread.
|
||||
|
||||
This API handles communication from the backend (saving auth codes).
|
||||
"""
|
||||
logger.info(f"Starting internal API on port {INTERNAL_API_PORT}...")
|
||||
|
||||
uvicorn.run(
|
||||
internal_api,
|
||||
host="0.0.0.0",
|
||||
port=INTERNAL_API_PORT,
|
||||
log_level="info"
|
||||
)
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# STARTUP/SHUTDOWN
|
||||
# ============================================================================
|
||||
# Note: Internal API server removed - now served via main.py at /api/telegram/internal/*
|
||||
|
||||
async def startup():
|
||||
"""
|
||||
@@ -247,10 +226,7 @@ async def main():
|
||||
# Create Telegram application
|
||||
telegram_app = create_telegram_application()
|
||||
|
||||
# Start internal API in a separate thread
|
||||
api_thread = Thread(target=run_internal_api, daemon=True)
|
||||
api_thread.start()
|
||||
logger.info(f"✅ Internal API started on port {INTERNAL_API_PORT}")
|
||||
# Note: Internal API server removed - now served via main.py
|
||||
|
||||
# Start scheduled cleanup task in background
|
||||
cleanup_task = asyncio.create_task(scheduled_cleanup())
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
# ROA2WEB Telegram Bot - Windows Server Deployment Guide
|
||||
|
||||
> ⚠️ **DEPRECATED ARCHITECTURE**
|
||||
>
|
||||
> This documentation refers to the OLD microservices architecture where the Telegram bot
|
||||
> ran as a separate service on port 8002. The current architecture is an **ultrathin monolith**
|
||||
> where everything runs on a single port (8000/8001) via `backend/main.py`.
|
||||
>
|
||||
> **Current Architecture**: Telegram bot runs as a background task within the unified backend.
|
||||
> Internal API endpoints are now at `/api/telegram/internal/*` on the main port.
|
||||
>
|
||||
> See `CLAUDE.md` and `QUICK-START.md` for the current architecture.
|
||||
|
||||
**Target Server**: Windows Server (10.0.20.36)
|
||||
**Deployment Method**: Windows Service (NSSM) - No Docker
|
||||
**Service Name**: ROA2WEB-TelegramBot
|
||||
**Internal API Port**: 8002
|
||||
**Internal API Port**: ~~8002~~ (DEPRECATED - now via main backend)
|
||||
**Created**: 2025-10-22
|
||||
**Last Updated**: 2025-10-22
|
||||
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# ROA2WEB Telegram Bot - Windows Deployment Troubleshooting Guide
|
||||
|
||||
> ⚠️ **DEPRECATED ARCHITECTURE**
|
||||
>
|
||||
> This documentation refers to the OLD microservices architecture (port 8002).
|
||||
> The current architecture is an **ultrathin monolith** - everything on port 8000/8001.
|
||||
> Telegram internal API is now at `/api/telegram/internal/*` on the main backend.
|
||||
|
||||
This guide helps diagnose and fix common issues with Telegram bot integration on Windows Server deployments.
|
||||
|
||||
## Problem: "Link invalid sau expirat" (Invalid or expired link)
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# ROA2WEB Telegram Bot
|
||||
|
||||
> ⚠️ **ARCHITECTURE NOTE**
|
||||
>
|
||||
> This documentation partially references the old standalone bot architecture.
|
||||
> The current architecture is an **ultrathin monolith** where the Telegram bot runs
|
||||
> as a background task within the main backend (`backend/main.py`) on port 8000/8001.
|
||||
> The `INTERNAL_API_PORT` variable is no longer used - internal API is at `/api/telegram/internal/*`.
|
||||
|
||||
> **Telegram Frontend for ROA2WEB ERP System** with Direct Command Interface
|
||||
|
||||
## Overview
|
||||
@@ -117,8 +124,8 @@ BACKEND_URL=http://localhost:8001
|
||||
# Database
|
||||
SQLITE_DB_PATH=./data/telegram_bot.db
|
||||
|
||||
# Internal API (for backend communication)
|
||||
INTERNAL_API_PORT=8002
|
||||
# Internal API - DEPRECATED (now served via main backend at /api/telegram/internal/*)
|
||||
# INTERNAL_API_PORT=8002
|
||||
|
||||
# Optional
|
||||
LOG_LEVEL=INFO
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# 🐳 Docker Testing Guide - ROA2WEB Telegram Bot
|
||||
|
||||
> ⚠️ **DEPRECATED ARCHITECTURE**
|
||||
>
|
||||
> This guide references the OLD microservices architecture (separate Telegram container on port 8002).
|
||||
> The current architecture is an **ultrathin monolith** where the Telegram bot runs as a background
|
||||
> task within the main backend (port 8000/8001). No separate Docker container needed for Telegram.
|
||||
|
||||
This guide provides instructions for testing the Telegram bot Docker deployment.
|
||||
|
||||
## 📋 Prerequisites
|
||||
|
||||
@@ -20,7 +20,8 @@ export const menuSections = [
|
||||
items: [
|
||||
{ to: '/reports/telegram', icon: 'pi pi-telegram', label: 'Telegram Bot' },
|
||||
{ to: '/reports/cache-stats', icon: 'pi pi-chart-bar', label: 'Statistici Cache' },
|
||||
{ to: '/data-entry/ocr-metrics', icon: 'pi pi-eye', label: 'Statistici OCR' }
|
||||
{ to: '/data-entry/ocr-metrics', icon: 'pi pi-eye', label: 'Statistici OCR' },
|
||||
{ to: '/reports/server-logs', icon: 'pi pi-server', label: 'Server Logs' }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -70,7 +70,11 @@
|
||||
<p>No log entries found</p>
|
||||
</div>
|
||||
<div v-else class="logs-container" ref="logsContainer">
|
||||
<pre class="logs-content"><code v-for="(line, index) in logs" :key="index" :class="getLineClass(line)">{{ line }}</code></pre>
|
||||
<pre class="logs-content"><code
|
||||
v-for="(line, index) in logs"
|
||||
:key="index"
|
||||
:style="getLineStyle(line)"
|
||||
>{{ line }}</code></pre>
|
||||
</div>
|
||||
</template>
|
||||
</Card>
|
||||
@@ -173,18 +177,28 @@ const loadLogs = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const getLineClass = (line) => {
|
||||
const getLineStyle = (line) => {
|
||||
const lineLower = line.toLowerCase()
|
||||
const baseStyle = {
|
||||
display: 'block',
|
||||
padding: '3px 8px',
|
||||
borderRadius: '2px',
|
||||
fontFamily: "'Consolas', 'Monaco', 'Courier New', monospace",
|
||||
fontSize: '0.8125rem',
|
||||
lineHeight: '1.6'
|
||||
}
|
||||
|
||||
if (lineLower.includes('error') || lineLower.includes('exception') || lineLower.includes('failed')) {
|
||||
return 'log-error'
|
||||
return { ...baseStyle, color: '#b91c1c', backgroundColor: 'rgba(185, 28, 28, 0.1)', fontWeight: '600' }
|
||||
}
|
||||
if (lineLower.includes('warning') || lineLower.includes('warn')) {
|
||||
return 'log-warning'
|
||||
return { ...baseStyle, color: '#b45309', backgroundColor: 'rgba(180, 83, 9, 0.1)', fontWeight: '500' }
|
||||
}
|
||||
if (lineLower.includes('success') || lineLower.includes('completed')) {
|
||||
return 'log-success'
|
||||
return { ...baseStyle, color: '#047857', backgroundColor: 'rgba(4, 120, 87, 0.1)' }
|
||||
}
|
||||
return 'log-info'
|
||||
// Default: pure black text on light background
|
||||
return { ...baseStyle, color: '#000000', backgroundColor: 'rgba(0, 0, 0, 0.02)' }
|
||||
}
|
||||
|
||||
const toggleAutoRefresh = () => {
|
||||
@@ -329,43 +343,17 @@ onUnmounted(() => {
|
||||
.logs-container {
|
||||
max-height: 600px;
|
||||
overflow-y: auto;
|
||||
background: var(--color-bg-secondary, #1e1e1e);
|
||||
background: #ffffff;
|
||||
border: 1px solid #e2e8f0;
|
||||
border-radius: var(--radius-md);
|
||||
padding: var(--space-sm);
|
||||
}
|
||||
|
||||
.logs-content {
|
||||
margin: 0;
|
||||
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
||||
font-size: 0.8125rem;
|
||||
line-height: 1.5;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.logs-content code {
|
||||
display: block;
|
||||
padding: 2px var(--space-xs);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.log-error {
|
||||
color: #f87171;
|
||||
background: rgba(248, 113, 113, 0.1);
|
||||
}
|
||||
|
||||
.log-warning {
|
||||
color: #fbbf24;
|
||||
background: rgba(251, 191, 36, 0.1);
|
||||
}
|
||||
|
||||
.log-success {
|
||||
color: #34d399;
|
||||
background: rgba(52, 211, 153, 0.1);
|
||||
}
|
||||
|
||||
.log-info {
|
||||
color: #e5e7eb;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Responsive */
|
||||
|
||||
@@ -83,7 +83,7 @@ import axios from "axios";
|
||||
|
||||
// Telegram API uses /api/telegram (separate from reports)
|
||||
const telegramApi = axios.create({
|
||||
baseURL: import.meta.env.BASE_URL + 'api/telegram',
|
||||
baseURL: '/api/telegram',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
|
||||
|
||||
@@ -12,7 +12,10 @@ source "$SCRIPT_DIR/scripts/service-helpers.sh"
|
||||
# Service configuration
|
||||
SERVICE_NAME="Unified Backend"
|
||||
PORT=8000
|
||||
LOG_FILE="/tmp/unified-backend.log"
|
||||
LOGS_DIR="$ROOT_DIR/logs"
|
||||
LOG_FILE_STDOUT="$LOGS_DIR/backend-stdout.log"
|
||||
LOG_FILE_STDERR="$LOGS_DIR/backend-stderr.log"
|
||||
LOG_FILE="$LOG_FILE_STDERR" # Default for status/logs commands
|
||||
BACKEND_DIR="$ROOT_DIR/backend"
|
||||
VENV_DIR="$BACKEND_DIR/venv"
|
||||
ENV_FILE="$BACKEND_DIR/.env"
|
||||
@@ -59,11 +62,16 @@ start_backend() {
|
||||
print_info "Starting unified backend on port $PORT..."
|
||||
cd "$BACKEND_DIR"
|
||||
|
||||
# Clear old log file
|
||||
> "$LOG_FILE"
|
||||
# Create logs directory if it doesn't exist
|
||||
mkdir -p "$LOGS_DIR"
|
||||
|
||||
# Clear old log files
|
||||
> "$LOG_FILE_STDOUT"
|
||||
> "$LOG_FILE_STDERR"
|
||||
|
||||
# Activate virtual environment and start uvicorn
|
||||
nohup bash -c "source venv/bin/activate && uvicorn main:app --host 0.0.0.0 --port $PORT --reload" > "$LOG_FILE" 2>&1 &
|
||||
# stdout → backend-stdout.log, stderr → backend-stderr.log
|
||||
nohup bash -c "source venv/bin/activate && uvicorn main:app --host 0.0.0.0 --port $PORT --reload" > "$LOG_FILE_STDOUT" 2> "$LOG_FILE_STDERR" &
|
||||
|
||||
BACKEND_PID=$!
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Get the directory where this script is located
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
@@ -164,13 +167,18 @@ else
|
||||
source .env
|
||||
set +a
|
||||
|
||||
# Clear old log files
|
||||
> /tmp/unified_backend_prod.log
|
||||
# Create logs directory if not exists
|
||||
mkdir -p "$SCRIPT_DIR/logs"
|
||||
|
||||
# Clear old log files (use logs/ for ServerLogs UI, keep /tmp for quick access)
|
||||
> "$SCRIPT_DIR/logs/backend-stdout.log"
|
||||
> "$SCRIPT_DIR/logs/backend-stderr.log"
|
||||
> /tmp/unified_frontend_prod.log
|
||||
|
||||
# Start backend with auto-restart on crash (OOM protection)
|
||||
# Logs go to logs/backend-stderr.log for ServerLogs UI
|
||||
print_message "Starting unified backend with auto-restart (includes Reports, Data Entry, and Telegram bot)..."
|
||||
nohup ./run-with-restart.sh 8000 /tmp/unified_backend_prod.log > /dev/null 2>&1 &
|
||||
nohup ./run-with-restart.sh 8000 "$SCRIPT_DIR/logs/backend-stderr.log" > /dev/null 2>&1 &
|
||||
|
||||
cd - > /dev/null
|
||||
|
||||
@@ -192,8 +200,8 @@ else
|
||||
done
|
||||
|
||||
if ! check_port 8000; then
|
||||
print_error "Unified Backend failed to start - check /tmp/unified_backend_prod.log"
|
||||
tail -n 30 /tmp/unified_backend_prod.log
|
||||
print_error "Unified Backend failed to start - check logs/backend-stderr.log"
|
||||
tail -n 30 "$SCRIPT_DIR/logs/backend-stderr.log"
|
||||
cleanup
|
||||
fi
|
||||
fi
|
||||
@@ -253,7 +261,7 @@ echo " • Unified API Docs: http://localhost:8000/docs"
|
||||
echo " • Health Check: http://localhost:8000/health"
|
||||
echo
|
||||
echo -e "${BLUE}Log Files:${NC}"
|
||||
echo " • Unified Backend: /tmp/unified_backend_prod.log"
|
||||
echo " • Unified Backend: logs/backend-stderr.log"
|
||||
echo " • Unified Frontend: /tmp/unified_frontend_prod.log"
|
||||
echo
|
||||
echo -e "${YELLOW}Press Ctrl+C to stop all services${NC}"
|
||||
|
||||
Reference in New Issue
Block a user