Files
roa2web-service-auto/ssh-tunnel-prod.sh
Claude Agent 02a8c8682c feat: Add Linux deployment scripts and server logs view
- Add deployment/linux/ with deploy.sh for deploying from Claude-Agent LXC to Windows server
- Add ServerLogsView.vue for viewing server logs from frontend
- Add shared/routes/system.py for system health endpoints
- Update CLAUDE.md with quick deploy instructions
- Improve Windows deployment scripts (ROA2WEB-Console.ps1)
- Fix OCR service validation and worker pool improvements
- Update environment config examples
- Various script permission and startup fixes

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 00:26:36 +00:00

200 lines
6.2 KiB
Bash
Executable File

#!/bin/bash
# ROA2WEB SSH Tunnel Manager
# Manages SSH tunnel to Oracle server for development
SSH_SERVER="roa.romfast.ro"
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