#!/bin/bash set -euo pipefail # Remote server configuration REMOTE_USER="${REMOTE_USER:-root}" REMOTE_HOST="${REMOTE_HOST:-}" REMOTE_PATH="${REMOTE_PATH:-/opt/tm-panel}" SSH_KEY="${SSH_KEY:-}" CONTAINER_NAME="tm-panel" IMAGE_NAME="tm-panel" HOST_PORT="${HOST_PORT:-3000}" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" usage() { echo "Usage: $0 --host [--user ] [--path ] [--key ] [--port ]" echo "" echo "Options:" echo " --host Remote server hostname or IP (required)" echo " --user Remote user (default: root)" echo " --path Remote destination path (default: /opt/tm-panel)" echo " --key Path to SSH private key (optional)" echo " --port Host port to expose (default: 3000)" echo "" echo "Environment variables REMOTE_USER, REMOTE_HOST, REMOTE_PATH, SSH_KEY, HOST_PORT can also be used." exit 1 } while [[ $# -gt 0 ]]; do case "$1" in --host) REMOTE_HOST="$2"; shift 2 ;; --user) REMOTE_USER="$2"; shift 2 ;; --path) REMOTE_PATH="$2"; shift 2 ;; --key) SSH_KEY="$2"; shift 2 ;; --port) HOST_PORT="$2"; shift 2 ;; -h|--help) usage ;; *) echo "Unknown option: $1"; usage ;; esac done if [[ -z "$REMOTE_HOST" ]]; then echo "Error: --host is required" usage fi SSH_CMD="ssh" SCP_SSH="" if [[ -n "$SSH_KEY" ]]; then SSH_CMD="ssh -i $SSH_KEY" SCP_SSH="-e ssh -i $SSH_KEY" fi echo "==> Uploading source code to ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}" # Create remote directory ${SSH_CMD} "${REMOTE_USER}@${REMOTE_HOST}" "mkdir -p ${REMOTE_PATH}" # Rsync source code, excluding build artifacts and dev files rsync -avz --progress --delete \ --exclude 'node_modules/' \ --exclude '.next/' \ --exclude '.git/' \ --exclude '.idea/' \ --exclude '.vscode/' \ --exclude 'upload.sh' \ ${SSH_KEY:+-e "ssh -i $SSH_KEY"} \ "${SCRIPT_DIR}/" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" echo "" echo "==> Upload complete. Building Docker image on remote..."