#!/usr/bin/env bash # desplegar.sh — Corre desde la máquina de desarrollo # Compila localmente + sube binario/plantillas vía scp/rsync + ejecuta init.sh en el servidor set -Eeuo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" CONF_FILE="${DROP_SERVERS_CONF:-$SCRIPT_DIR/servers.conf}" cargar_conf() { if [[ ! -f "$CONF_FILE" ]]; then echo "❌ Error: Falta $CONF_FILE" >&2 echo "👉 Crea uno copiando la plantilla: cp servers.conf.example servers.conf" >&2 exit 1 fi # Cargar configuración # shellcheck disable=SC1090 source "$CONF_FILE" : "${HOST:?servers.conf debe definir HOST (ej: 192.168.10.160)}" : "${SSH_USER:?servers.conf debe definir SSH_USER (ej: user_apps)}" : "${REMOTE_DIR:?servers.conf debe definir REMOTE_DIR (ej: /home/user_apps/apps/drop_sigmac_app)}" SSH_PORT="${SSH_PORT:-22}" SERVIDOR="${SSH_USER}@${HOST}" if [[ -n "${DEPLOY_SSH_PASSWORD:-}" ]]; then command -v sshpass >/dev/null 2>&1 || { echo "DEPLOY_SSH_PASSWORD requiere sshpass instalado." >&2; exit 1; } SSH=(sshpass -e ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=15 -p "$SSH_PORT") SCP=(sshpass -e scp -o StrictHostKeyChecking=accept-new -o ConnectTimeout=15 -P "$SSH_PORT") else SSH=(ssh -o BatchMode=yes -o ConnectTimeout=15 -p "$SSH_PORT") SCP=(scp -o BatchMode=yes -o ConnectTimeout=15 -P "$SSH_PORT") fi } remote() { "${SSH[@]}" "$SERVIDOR" "$@"; } copy() { "${SCP[@]}" "$@"; } # 1. Compilar compilar() { echo "" echo "==================================================" echo "🔨 Compilando binario Go autónomo (Linux amd64)..." echo "==================================================" cd "$SCRIPT_DIR" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o app_compartir main.go echo "✅ Compilación exitosa: $SCRIPT_DIR/app_compartir" ls -lh "$SCRIPT_DIR/app_compartir" } # 2. Preparar directorios remotos preparar_remoto() { echo "" echo "📂 Preparando estructura de directorios en $SERVIDOR:$REMOTE_DIR..." remote "mkdir -p '$REMOTE_DIR/web/templates' '$REMOTE_DIR/data/uploads'" echo "✅ Directorios listos" } # 3. Subir archivos subir() { compilar preparar_remoto echo "" echo "🚀 Subiendo binario (atómico), plantillas y scripts al servidor..." copy "$SCRIPT_DIR/app_compartir" "$SERVIDOR:$REMOTE_DIR/app_compartir.tmp" remote "mv -f '$REMOTE_DIR/app_compartir.tmp' '$REMOTE_DIR/app_compartir' && chmod 0755 '$REMOTE_DIR/app_compartir'" copy "$SCRIPT_DIR/init.sh" "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/siax-app-DROP_SIGMAC_APP.service" "$SERVIDOR:$REMOTE_DIR/" copy "$SCRIPT_DIR/web/templates/"*.html "$SERVIDOR:$REMOTE_DIR/web/templates/" remote "chmod 0755 '$REMOTE_DIR/init.sh'" echo "✅ Archivos sincronizados en $REMOTE_DIR" } # 4. Reiniciar servicio en el servidor reiniciar() { echo "" echo "🔄 Ejecutando init.sh en $SERVIDOR..." remote "bash '$REMOTE_DIR/init.sh'" } # 5. Despliegue completo todo() { subir reiniciar echo "" echo "==================================================" echo "🎉 ¡Despliegue completado con éxito!" echo "🌐 Dominio público: https://drop.sigmac.app" echo "🎯 Destino interno: http://$HOST:2006" echo "==================================================" } # 6. Ver estado y logs estado() { echo "" echo "📊 Estado del servidor en $SERVIDOR:" remote " if curl -sI http://localhost:8080/api/apps 2>/dev/null | grep -q '200 OK'; then echo '==> Estado en SIAX Monitor (:8080):' curl -s http://localhost:8080/api/apps | grep -o '{\"name\":\"DROP_SIGMAC_APP\"[^}]*}' || true echo '' fi if systemctl is-active --quiet siax-app-DROP_SIGMAC_APP.service 2>/dev/null; then echo '==> Servicio systemd siax-app-DROP_SIGMAC_APP (SIAX Monitor) activo:' journalctl -u siax-app-DROP_SIGMAC_APP.service -n 12 --no-pager -q elif tmux has-session -t drop-sigmac-app 2>/dev/null; then echo '==> Sesión tmux drop-sigmac-app activa:' tmux capture-pane -pt drop-sigmac-app | tail -n 25 elif systemctl is-active --quiet drop-sigmac-app.service 2>/dev/null; then echo '==> Servicio systemd drop-sigmac-app activo:' journalctl -u drop-sigmac-app.service -n 12 --no-pager -q else echo '⚠️ No se detectó proceso activo en tmux ni systemd.' fi " } # Menú interactivo o por argumentos ACCION="${1:-menu}" case "$ACCION" in compilar|build) compilar; exit 0 ;; subir|sync) cargar_conf; subir; exit 0 ;; reiniciar|restart) cargar_conf; reiniciar; exit 0 ;; todo|all) cargar_conf; todo; exit 0 ;; estado|status|logs) cargar_conf; estado; exit 0 ;; esac cargar_conf while true; do echo "" echo "==================================================" echo "🚀 Despliegue de drop.sigmac.app ($SERVIDOR)" echo "==================================================" echo "1) Todo (Compilar + Subir + Reiniciar servidor)" echo "2) Solo compilar binario Go" echo "3) Solo subir binario y plantillas" echo "4) Solo reiniciar servidor remoto (init.sh)" echo "5) Ver estado y últimos logs en el servidor" echo "6) Salir" echo "==================================================" read -rp "Selecciona una opción [1-6]: " OPCION case "$OPCION" in 1) todo; break ;; 2) compilar ;; 3) subir ;; 4) reiniciar ;; 5) estado ;; 6|q|exit) echo "Operación cancelada."; exit 0 ;; *) echo "Opción inválida." ;; esac done