Modern ERP Reports Application with microservices architecture Tech Stack: - Backend: FastAPI + python-oracledb (Oracle DB integration) - Frontend: Vue.js 3 + PrimeVue + Vite - Telegram Bot: python-telegram-bot + SQLite - Infrastructure: Shared database pool, JWT authentication, SSH tunnel Features: - FastAPI backend with async Oracle connection pool - Vue.js 3 responsive frontend with PrimeVue components - Telegram bot alternative interface - Microservices architecture with shared components - Complete deployment support (Linux Docker + Windows IIS) - Comprehensive testing (Playwright E2E + pytest) Repository Structure: - reports-app/ - Main application (backend, frontend, telegram-bot) - shared/ - Shared components (database pool, auth, utils) - deployment/ - Deployment scripts (Linux & Windows) - docs/ - Project documentation - security/ - Security scanning and git hooks
200 lines
6.2 KiB
Bash
200 lines
6.2 KiB
Bash
#!/bin/bash
|
|
# ROA2WEB SSH Tunnel Manager
|
|
# Manages SSH tunnel to Oracle server for development
|
|
|
|
SSH_SERVER="83.103.197.79"
|
|
SSH_PORT="22122"
|
|
SSH_USER="roa2web" # Replace with Bitvise SSH Server username
|
|
SSH_KEY="/tmp/roa_oracle_server"
|
|
LOCAL_PORT="1526"
|
|
REMOTE_HOST="10.0.20.36" # Oracle server IP on remote network
|
|
REMOTE_PORT="1521"
|
|
TUNNEL_PID_FILE="/tmp/roa_ssh_tunnel.pid"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
print_header() {
|
|
echo -e "${BLUE}================================${NC}"
|
|
echo -e "${BLUE} ROA2WEB SSH Tunnel Manager${NC}"
|
|
echo -e "${BLUE}================================${NC}"
|
|
}
|
|
|
|
check_tunnel() {
|
|
if [ -f "$TUNNEL_PID_FILE" ]; then
|
|
local pid=$(cat "$TUNNEL_PID_FILE")
|
|
if ps -p "$pid" > /dev/null 2>&1; then
|
|
return 0 # Tunnel is running
|
|
else
|
|
rm -f "$TUNNEL_PID_FILE"
|
|
return 1 # PID file exists but process is dead
|
|
fi
|
|
fi
|
|
return 1 # No PID file
|
|
}
|
|
|
|
start_tunnel() {
|
|
print_header
|
|
|
|
if check_tunnel; then
|
|
echo -e "${YELLOW}⚠️ SSH tunnel is already running (PID: $(cat $TUNNEL_PID_FILE))${NC}"
|
|
return 0
|
|
fi
|
|
|
|
# Copy SSH key to /tmp with correct permissions (WSL/NTFS fix)
|
|
echo -e "${BLUE}🔧 Setting up SSH key with correct permissions...${NC}"
|
|
cp "$(dirname "$0")/secrets/roa_oracle_server" "$SSH_KEY" 2>/dev/null || true
|
|
chmod 600 "$SSH_KEY" 2>/dev/null || true
|
|
|
|
echo -e "${BLUE}🔄 Starting SSH tunnel...${NC}"
|
|
echo -e " Server: ${SSH_SERVER}:${SSH_PORT}"
|
|
echo -e " Local: 127.0.0.1:${LOCAL_PORT}"
|
|
echo -e " Remote: ${REMOTE_HOST}:${REMOTE_PORT}"
|
|
echo
|
|
|
|
# Test SSH connectivity first
|
|
echo -e "${BLUE}🔍 Testing SSH connectivity...${NC}"
|
|
# Note: roa2web user may not have shell access, so just test authentication
|
|
if ! ssh -o ConnectTimeout=10 -o BatchMode=yes -p "$SSH_PORT" -i "$SSH_KEY" "$SSH_USER@$SSH_SERVER" "echo 'SSH connection successful'" 2>/dev/null; then
|
|
echo -e "${YELLOW}⚠️ Command execution failed, but trying tunnel (user may not have shell access)${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ SSH connectivity OK${NC}"
|
|
fi
|
|
echo
|
|
|
|
# Start the tunnel
|
|
echo -e "${BLUE}🚀 Creating SSH tunnel...${NC}"
|
|
ssh -f -N -L "${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT}" \
|
|
-p "$SSH_PORT" \
|
|
-i "$SSH_KEY" \
|
|
-o ServerAliveInterval=60 \
|
|
-o ServerAliveCountMax=3 \
|
|
-o ExitOnForwardFailure=yes \
|
|
"$SSH_USER@$SSH_SERVER"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
# Find and save the tunnel PID
|
|
local tunnel_pid=$(ps aux | grep "ssh.*${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT}" | grep -v grep | awk '{print $2}')
|
|
if [ -n "$tunnel_pid" ]; then
|
|
echo "$tunnel_pid" > "$TUNNEL_PID_FILE"
|
|
echo -e "${GREEN}✅ SSH tunnel started successfully (PID: $tunnel_pid)${NC}"
|
|
|
|
# Test the tunnel
|
|
echo -e "${BLUE}🔍 Testing tunnel connectivity...${NC}"
|
|
if timeout 5 bash -c "cat < /dev/null > /dev/tcp/127.0.0.1/$LOCAL_PORT" 2>/dev/null; then
|
|
echo -e "${GREEN}✅ Tunnel is working! Port $LOCAL_PORT is accessible${NC}"
|
|
else
|
|
echo -e "${YELLOW}⚠️ Tunnel created but port $LOCAL_PORT is not responding${NC}"
|
|
echo -e "${YELLOW} This might be normal if Oracle listener is not running${NC}"
|
|
fi
|
|
else
|
|
echo -e "${RED}❌ Tunnel process not found${NC}"
|
|
return 1
|
|
fi
|
|
else
|
|
echo -e "${RED}❌ Failed to create SSH tunnel${NC}"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
stop_tunnel() {
|
|
print_header
|
|
|
|
if ! check_tunnel; then
|
|
echo -e "${YELLOW}⚠️ No SSH tunnel is running${NC}"
|
|
return 0
|
|
fi
|
|
|
|
local pid=$(cat "$TUNNEL_PID_FILE")
|
|
echo -e "${BLUE}🛑 Stopping SSH tunnel (PID: $pid)...${NC}"
|
|
|
|
if kill "$pid" 2>/dev/null; then
|
|
rm -f "$TUNNEL_PID_FILE"
|
|
echo -e "${GREEN}✅ SSH tunnel stopped successfully${NC}"
|
|
else
|
|
echo -e "${RED}❌ Failed to stop tunnel process${NC}"
|
|
# Try to clean up stale PID file
|
|
rm -f "$TUNNEL_PID_FILE"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
status_tunnel() {
|
|
print_header
|
|
|
|
if check_tunnel; then
|
|
local pid=$(cat "$TUNNEL_PID_FILE")
|
|
echo -e "${GREEN}✅ SSH tunnel is running (PID: $pid)${NC}"
|
|
echo -e " Local port: 127.0.0.1:$LOCAL_PORT"
|
|
echo -e " Remote: $SSH_SERVER:$SSH_PORT -> $REMOTE_HOST:$REMOTE_PORT"
|
|
|
|
# Test port accessibility
|
|
if timeout 2 bash -c "cat < /dev/null > /dev/tcp/127.0.0.1/$LOCAL_PORT" 2>/dev/null; then
|
|
echo -e "${GREEN} 🔗 Port $LOCAL_PORT is accessible${NC}"
|
|
else
|
|
echo -e "${YELLOW} ⚠️ Port $LOCAL_PORT is not responding${NC}"
|
|
fi
|
|
else
|
|
echo -e "${RED}❌ SSH tunnel is not running${NC}"
|
|
fi
|
|
}
|
|
|
|
restart_tunnel() {
|
|
stop_tunnel
|
|
sleep 2
|
|
start_tunnel
|
|
}
|
|
|
|
show_help() {
|
|
print_header
|
|
echo
|
|
echo -e "${BLUE}Usage: $0 {start|stop|status|restart|help}${NC}"
|
|
echo
|
|
echo -e "${YELLOW}Commands:${NC}"
|
|
echo -e " start - Start SSH tunnel to Oracle server"
|
|
echo -e " stop - Stop SSH tunnel"
|
|
echo -e " status - Show tunnel status"
|
|
echo -e " restart - Restart SSH tunnel"
|
|
echo -e " help - Show this help message"
|
|
echo
|
|
echo -e "${YELLOW}Configuration:${NC}"
|
|
echo -e " SSH Server: $SSH_SERVER:$SSH_PORT"
|
|
echo -e " SSH User: $SSH_USER"
|
|
echo -e " SSH Key: $SSH_KEY"
|
|
echo -e " Tunnel: 127.0.0.1:$LOCAL_PORT -> $REMOTE_HOST:$REMOTE_PORT"
|
|
echo
|
|
echo -e "${YELLOW}Setup:${NC}"
|
|
echo -e " 1. Update SSH_USER in this script with your Bitvise username"
|
|
echo -e " 2. Install public key in Bitvise SSH Server (see BITVISE_SSH_SETUP.md)"
|
|
echo -e " 3. Run: $0 start"
|
|
echo
|
|
}
|
|
|
|
# Main script logic
|
|
case "$1" in
|
|
start)
|
|
start_tunnel
|
|
;;
|
|
stop)
|
|
stop_tunnel
|
|
;;
|
|
status)
|
|
status_tunnel
|
|
;;
|
|
restart)
|
|
restart_tunnel
|
|
;;
|
|
help|--help|-h)
|
|
show_help
|
|
;;
|
|
*)
|
|
echo -e "${RED}❌ Invalid command: $1${NC}"
|
|
echo
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac |