- 新增完整的 Python 实现,替代 Go 版本 - 添加 Web 登录界面和仪表板 - 实现 JWT 认证和 API 密钥管理 - 添加数据库存储功能 - 保持与 Go 版本一致的目录结构和启动脚本 - 包含完整的文档和测试脚本
220 lines
5.6 KiB
Bash
Executable File
220 lines
5.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Gitea Webhook Ambassador (Python) - Devbox Script
|
|
# This script mimics the Go version's devbox functionality
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
APP_NAME="gitea-webhook-ambassador"
|
|
PID_FILE="$SCRIPT_DIR/service.pid"
|
|
LOG_FILE="$SCRIPT_DIR/logs/service.log"
|
|
|
|
# Create logs directory
|
|
mkdir -p "$SCRIPT_DIR/logs"
|
|
|
|
# Function to show usage
|
|
show_usage() {
|
|
echo "Usage: $0 {start|stop|restart|status|logs|follow|init|install|help}"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " start - Start the service in background"
|
|
echo " stop - Stop the service"
|
|
echo " restart - Restart the service"
|
|
echo " status - Show service status"
|
|
echo " logs - Show latest logs"
|
|
echo " follow - Follow logs in real-time"
|
|
echo " init - Initialize database"
|
|
echo " install - Install dependencies"
|
|
echo " help - Show this help message"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 start # Start service"
|
|
echo " $0 status # Check status"
|
|
echo " $0 logs # View logs"
|
|
}
|
|
|
|
# Function to check if virtual environment exists
|
|
check_venv() {
|
|
if [ ! -d "$SCRIPT_DIR/venv" ]; then
|
|
echo "❌ Virtual environment not found. Run '$0 install' first."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Function to activate virtual environment
|
|
activate_venv() {
|
|
source "$SCRIPT_DIR/venv/bin/activate"
|
|
}
|
|
|
|
# Function to start service
|
|
start_service() {
|
|
echo "🚀 Starting $APP_NAME (Python Version)..."
|
|
echo "🐍 Version: Python Enhanced with Web UI"
|
|
|
|
check_venv
|
|
|
|
if [ -f "$PID_FILE" ]; then
|
|
PID=$(cat "$PID_FILE")
|
|
if ps -p $PID > /dev/null 2>&1; then
|
|
echo "❌ Service is already running (PID: $PID)"
|
|
return 1
|
|
else
|
|
echo "⚠️ Found stale PID file, cleaning up..."
|
|
rm -f "$PID_FILE"
|
|
fi
|
|
fi
|
|
|
|
# Activate virtual environment and start service
|
|
cd "$SCRIPT_DIR"
|
|
activate_venv
|
|
|
|
# Start the service in background
|
|
nohup python -m uvicorn app.main_enhanced:app --host 0.0.0.0 --port 8000 > "$LOG_FILE" 2>&1 &
|
|
PID=$!
|
|
echo $PID > "$PID_FILE"
|
|
|
|
# Wait a moment for service to start
|
|
sleep 3
|
|
|
|
if ps -p $PID > /dev/null 2>&1; then
|
|
echo "✅ Python Service started successfully (PID: $PID)"
|
|
echo "📝 Log file: $LOG_FILE"
|
|
echo "🌐 Access: http://localhost:8000"
|
|
echo "📊 Dashboard: http://localhost:8000/dashboard"
|
|
echo "🔑 Admin key: admin-secret-key-change-in-production"
|
|
echo "🐍 Python Version Features: Web UI, Database, JWT Auth"
|
|
else
|
|
echo "❌ Service failed to start"
|
|
rm -f "$PID_FILE"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to stop service
|
|
stop_service() {
|
|
echo "🛑 Stopping $APP_NAME..."
|
|
|
|
if [ -f "$PID_FILE" ]; then
|
|
PID=$(cat "$PID_FILE")
|
|
if ps -p $PID > /dev/null 2>&1; then
|
|
kill $PID
|
|
echo "✅ Service stopped (PID: $PID)"
|
|
else
|
|
echo "⚠️ Service not running"
|
|
fi
|
|
rm -f "$PID_FILE"
|
|
else
|
|
echo "⚠️ No PID file found"
|
|
fi
|
|
}
|
|
|
|
# Function to restart service
|
|
restart_service() {
|
|
echo "🔄 Restarting $APP_NAME..."
|
|
stop_service
|
|
sleep 2
|
|
start_service
|
|
}
|
|
|
|
# Function to show status
|
|
show_status() {
|
|
if [ -f "$PID_FILE" ]; then
|
|
PID=$(cat "$PID_FILE")
|
|
if ps -p $PID > /dev/null 2>&1; then
|
|
echo "✅ $APP_NAME (Python Version) is running (PID: $PID)"
|
|
echo "🐍 Version: Python Enhanced with Web UI"
|
|
echo "📝 Log file: $LOG_FILE"
|
|
echo "🌐 Access: http://localhost:8000"
|
|
echo "📊 Dashboard: http://localhost:8000/dashboard"
|
|
else
|
|
echo "❌ $APP_NAME is not running (PID file exists but process not found)"
|
|
rm -f "$PID_FILE"
|
|
fi
|
|
else
|
|
echo "❌ $APP_NAME is not running"
|
|
fi
|
|
}
|
|
|
|
# Function to show logs
|
|
show_logs() {
|
|
if [ -f "$LOG_FILE" ]; then
|
|
echo "📝 Latest logs (last 50 lines):"
|
|
echo "----------------------------------------"
|
|
tail -n 50 "$LOG_FILE"
|
|
echo "----------------------------------------"
|
|
echo "Full log file: $LOG_FILE"
|
|
else
|
|
echo "❌ No log file found"
|
|
fi
|
|
}
|
|
|
|
# Function to follow logs
|
|
follow_logs() {
|
|
if [ -f "$LOG_FILE" ]; then
|
|
echo "📝 Following logs (Ctrl+C to exit):"
|
|
tail -f "$LOG_FILE"
|
|
else
|
|
echo "❌ No log file found"
|
|
fi
|
|
}
|
|
|
|
# Function to initialize database
|
|
init_database() {
|
|
echo "🗄️ Initializing database..."
|
|
check_venv
|
|
cd "$SCRIPT_DIR"
|
|
activate_venv
|
|
python -c "from app.models.database import create_tables; create_tables(); print('Database initialized successfully')"
|
|
}
|
|
|
|
# Function to install dependencies
|
|
install_dependencies() {
|
|
echo "📦 Installing dependencies..."
|
|
cd "$SCRIPT_DIR"
|
|
|
|
if [ -d "venv" ]; then
|
|
echo "⚠️ Virtual environment already exists. Removing..."
|
|
rm -rf venv
|
|
fi
|
|
|
|
python3 -m venv venv
|
|
activate_venv
|
|
pip install -r requirements.txt
|
|
echo "✅ Dependencies installed successfully"
|
|
}
|
|
|
|
# Main logic
|
|
case "$1" in
|
|
start)
|
|
start_service
|
|
;;
|
|
stop)
|
|
stop_service
|
|
;;
|
|
restart)
|
|
restart_service
|
|
;;
|
|
status)
|
|
show_status
|
|
;;
|
|
logs)
|
|
show_logs
|
|
;;
|
|
follow)
|
|
follow_logs
|
|
;;
|
|
init)
|
|
init_database
|
|
;;
|
|
install)
|
|
install_dependencies
|
|
;;
|
|
help|--help|-h)
|
|
show_usage
|
|
;;
|
|
*)
|
|
echo "❌ Unknown command: $1"
|
|
echo ""
|
|
show_usage
|
|
exit 1
|
|
;;
|
|
esac |