|
| 1 | +#!/usr/bin/env bash |
| 2 | +# Brarner.M.Alete™ — Remote Linux Server Deploy [EXAMPLE — safe for GitHub] |
| 3 | +# Copy this file to deploy-remote-linux.sh and set real values. |
| 4 | +# deploy-remote-linux.sh is gitignored — never commit real server IPs. |
| 5 | +# |
| 6 | +# Prerequisites: SSH key access to target server |
| 7 | +# Usage: bash install/deploy-remote-linux.sh |
| 8 | +set -e |
| 9 | + |
| 10 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 11 | +BMA_ROOT="$(dirname "$SCRIPT_DIR")" |
| 12 | +WEBAPP_SRC="$BMA_ROOT/servlets/servlet/src/main/webapp" |
| 13 | +WAR_FILE="$BMA_ROOT/brarner.m.alete.war" |
| 14 | + |
| 15 | +# ─── Server config — fill these in before use ─────────────────────────────── |
| 16 | +REMOTE_HOST="${BMA_REMOTE_HOST:-YOUR_SERVER_IP}" |
| 17 | +REMOTE_USER="${BMA_REMOTE_USER:-root}" |
| 18 | +REMOTE_DOMAIN="${BMA_REMOTE_DOMAIN:-YOUR_DOMAIN}" |
| 19 | +REMOTE_PATH="/var/www/html/brarner.m.alete" |
| 20 | +TOMCAT_CONTEXT="brarner.m.alete" |
| 21 | +SITE_URL="https://${REMOTE_DOMAIN}/brarner.m.alete" |
| 22 | + |
| 23 | +SSH_OPTS="-o ConnectTimeout=10 -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=15 -o ServerAliveCountMax=3" |
| 24 | + |
| 25 | +echo "═══════════════════════════════════════════════════════════════" |
| 26 | +echo " Brarner.M.Alete™ — Remote Linux Server Deploy" |
| 27 | +echo " Target: ${SITE_URL}" |
| 28 | +echo " Server: ${REMOTE_HOST} (${REMOTE_DOMAIN})" |
| 29 | +echo "═══════════════════════════════════════════════════════════════" |
| 30 | + |
| 31 | +# ─── Pre-flight: Check webapp source ─── |
| 32 | +if [ ! -d "$WEBAPP_SRC" ]; then |
| 33 | + echo "[!] Webapp source not found: $WEBAPP_SRC" |
| 34 | + exit 1 |
| 35 | +fi |
| 36 | +echo "[*] Webapp source OK" |
| 37 | + |
| 38 | +# ─── Pre-flight: Build WAR if not present ─── |
| 39 | +if [ ! -f "$WAR_FILE" ]; then |
| 40 | + echo "[*] WAR not found — building..." |
| 41 | + bash "$BMA_ROOT/build.sh" |
| 42 | +fi |
| 43 | +if [ -f "$WAR_FILE" ]; then |
| 44 | + echo "[*] WAR file: $WAR_FILE ($(du -h "$WAR_FILE" | cut -f1))" |
| 45 | +fi |
| 46 | + |
| 47 | +# ─── Pre-flight: Reverse DNS ─── |
| 48 | +echo "[*] Checking reverse DNS for ${REMOTE_HOST}..." |
| 49 | +RDNS=$(dig +short -x "$REMOTE_HOST" 2>/dev/null | head -1 || echo "") |
| 50 | +if [ -n "$RDNS" ]; then |
| 51 | + echo "[*] PTR: ${REMOTE_HOST} → ${RDNS}" |
| 52 | +else |
| 53 | + echo "[!] No PTR record — SSL may require manual DNS verification" |
| 54 | +fi |
| 55 | + |
| 56 | +# ─── Pre-flight: SSH access ─── |
| 57 | +echo "[*] Verifying SSH access to ${REMOTE_USER}@${REMOTE_HOST}..." |
| 58 | + |
| 59 | +if ! timeout 5 bash -c "echo >/dev/tcp/${REMOTE_HOST}/22" 2>/dev/null; then |
| 60 | + echo "[!] Port 22 not reachable on ${REMOTE_HOST}" |
| 61 | + exit 1 |
| 62 | +fi |
| 63 | + |
| 64 | +if ! ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "echo OK" 2>/dev/null; then |
| 65 | + echo "[!] SSH key not accepted." |
| 66 | + if [ ! -f ~/.ssh/id_rsa ] && [ ! -f ~/.ssh/id_ed25519 ]; then |
| 67 | + echo "[*] Generating ed25519 keypair..." |
| 68 | + mkdir -p ~/.ssh && chmod 700 ~/.ssh |
| 69 | + ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" -q |
| 70 | + fi |
| 71 | + if [ -t 0 ]; then |
| 72 | + ssh-copy-id -o ConnectTimeout=10 "$REMOTE_USER@$REMOTE_HOST" 2>/dev/null || \ |
| 73 | + { echo "[!] Run: ssh-copy-id ${REMOTE_USER}@${REMOTE_HOST}"; exit 1; } |
| 74 | + else |
| 75 | + echo "[!] Run: ssh-copy-id ${REMOTE_USER}@${REMOTE_HOST}"; exit 1 |
| 76 | + fi |
| 77 | +fi |
| 78 | +echo "[*] SSH access confirmed" |
| 79 | + |
| 80 | +# ─── Install Apache2 + Java 21 + Tomcat ─── |
| 81 | +echo "[*] Ensuring Apache2, Java 21, Tomcat 11 on remote..." |
| 82 | +ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" ' |
| 83 | + set -e |
| 84 | + if ! command -v apache2 &>/dev/null && ! command -v httpd &>/dev/null; then |
| 85 | + if command -v apt &>/dev/null; then |
| 86 | + DEBIAN_FRONTEND=noninteractive apt update -qq |
| 87 | + DEBIAN_FRONTEND=noninteractive apt install -y -qq apache2 |
| 88 | + elif command -v dnf &>/dev/null; then |
| 89 | + dnf install -y httpd && systemctl enable httpd |
| 90 | + fi |
| 91 | + fi |
| 92 | + systemctl enable apache2 2>/dev/null || systemctl enable httpd 2>/dev/null |
| 93 | + systemctl start apache2 2>/dev/null || systemctl start httpd 2>/dev/null |
| 94 | + if ! java -version 2>&1 | grep -q "21\|22\|23"; then |
| 95 | + if command -v apt &>/dev/null; then |
| 96 | + DEBIAN_FRONTEND=noninteractive apt install -y -qq openjdk-21-jre-headless |
| 97 | + elif command -v dnf &>/dev/null; then |
| 98 | + dnf install -y java-21-openjdk-headless |
| 99 | + fi |
| 100 | + fi |
| 101 | + TOMCAT_HOME="/opt/tomcat" |
| 102 | + if [ ! -f "$TOMCAT_HOME/bin/catalina.sh" ]; then |
| 103 | + TOMCAT_VERSION="11.0.2" |
| 104 | + cd /tmp |
| 105 | + curl -sfLO "https://archive.apache.org/dist/tomcat/tomcat-11/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz" |
| 106 | + mkdir -p "$TOMCAT_HOME" |
| 107 | + tar -xzf "apache-tomcat-${TOMCAT_VERSION}.tar.gz" -C "$TOMCAT_HOME" --strip-components=1 |
| 108 | + rm -f "apache-tomcat-${TOMCAT_VERSION}.tar.gz" |
| 109 | + id tomcat &>/dev/null || useradd -r -M -d "$TOMCAT_HOME" -s /bin/false tomcat |
| 110 | + chown -R tomcat:tomcat "$TOMCAT_HOME" |
| 111 | + chmod +x "$TOMCAT_HOME"/bin/*.sh |
| 112 | + systemctl daemon-reload && systemctl enable tomcat && systemctl start tomcat |
| 113 | + echo "[*] Tomcat 11 installed" |
| 114 | + else |
| 115 | + echo "[*] Tomcat already present" |
| 116 | + systemctl start tomcat 2>/dev/null || true |
| 117 | + fi |
| 118 | +' |
| 119 | + |
| 120 | +# ─── Deploy WAR to Tomcat ─── |
| 121 | +echo "[*] Deploying to Tomcat context: /${TOMCAT_CONTEXT}" |
| 122 | +ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "rm -rf /opt/tomcat/webapps/${TOMCAT_CONTEXT} /opt/tomcat/webapps/${TOMCAT_CONTEXT}.war" |
| 123 | + |
| 124 | +if [ -f "$WAR_FILE" ]; then |
| 125 | + scp -o ConnectTimeout=10 -o BatchMode=yes "$WAR_FILE" "$REMOTE_USER@$REMOTE_HOST:/opt/tomcat/webapps/${TOMCAT_CONTEXT}.war" |
| 126 | +else |
| 127 | + ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "mkdir -p /opt/tomcat/webapps/${TOMCAT_CONTEXT}/WEB-INF/lib" |
| 128 | + scp -o ConnectTimeout=10 -o BatchMode=yes -r "$WEBAPP_SRC/"* "$REMOTE_USER@$REMOTE_HOST:/opt/tomcat/webapps/${TOMCAT_CONTEXT}/" |
| 129 | +fi |
| 130 | + |
| 131 | +ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "chown -R tomcat:tomcat /opt/tomcat/webapps/${TOMCAT_CONTEXT}* && systemctl restart tomcat" |
| 132 | +echo "[*] Tomcat restarted" |
| 133 | + |
| 134 | +# ─── Remote MySQL password is prompted at deploy time — never hardcoded ──── |
| 135 | +echo "[*] Configuring database credentials for JSP pages..." |
| 136 | +DB_PROPS_LOCAL="$WEBAPP_SRC/WEB-INF/db.properties" |
| 137 | +DB_PROPS_REMOTE="/opt/tomcat/webapps/${TOMCAT_CONTEXT}/WEB-INF/db.properties" |
| 138 | + |
| 139 | +if [ -f "$DB_PROPS_LOCAL" ] && grep -q "db.password=." "$DB_PROPS_LOCAL" 2>/dev/null; then |
| 140 | + scp -o ConnectTimeout=10 -o BatchMode=yes "$DB_PROPS_LOCAL" "$REMOTE_USER@$REMOTE_HOST:$DB_PROPS_REMOTE" |
| 141 | + echo "[*] db.properties copied from local" |
| 142 | +else |
| 143 | + echo " JSP pages need MySQL credentials on the remote server." |
| 144 | + read -rp " Remote MySQL user [root]: " R_DB_USER |
| 145 | + R_DB_USER="${R_DB_USER:-root}" |
| 146 | + read -rsp " Remote MySQL password: " R_DB_PASS |
| 147 | + echo "" |
| 148 | + read -rp " Remote MySQL host [localhost]: " R_DB_HOST |
| 149 | + R_DB_HOST="${R_DB_HOST:-localhost}" |
| 150 | + read -rp " Remote MySQL port [3306]: " R_DB_PORT |
| 151 | + R_DB_PORT="${R_DB_PORT:-3306}" |
| 152 | + |
| 153 | + ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "mkdir -p /opt/tomcat/webapps/${TOMCAT_CONTEXT}/WEB-INF && cat > $DB_PROPS_REMOTE <<DBEOF |
| 154 | +# BMA Database Configuration — written by deploy-remote-linux.sh |
| 155 | +db.driver=com.mysql.cj.jdbc.Driver |
| 156 | +db.url=jdbc:mysql://${R_DB_HOST}:${R_DB_PORT}/BrarnerScience |
| 157 | +db.user=${R_DB_USER} |
| 158 | +db.password=${R_DB_PASS} |
| 159 | +DBEOF |
| 160 | +" |
| 161 | +fi |
| 162 | +ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "chmod 600 $DB_PROPS_REMOTE && chown tomcat:tomcat $DB_PROPS_REMOTE" |
| 163 | +echo "[✓] db.properties configured" |
| 164 | + |
| 165 | +echo "" |
| 166 | +echo "═══════════════════════════════════════════════════════════════" |
| 167 | +echo " [✓] Deploy complete" |
| 168 | +echo " URL: ${SITE_URL}" |
| 169 | +echo " Server: ${REMOTE_HOST}" |
| 170 | +echo " Verify: bash install/test-remote.sh" |
| 171 | +echo "═══════════════════════════════════════════════════════════════" |
0 commit comments