157 lines
5.7 KiB
Bash
Executable File
157 lines
5.7 KiB
Bash
Executable File
#!/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/web/static' '$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/"
|
|
copy "$SCRIPT_DIR/web/static/"* "$SERVIDOR:$REMOTE_DIR/web/static/"
|
|
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:2008"
|
|
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
|