Files
app_compartir/desplegar.sh
T

146 lines
4.9 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/data/uploads'"
echo "✅ Directorios listos"
}
# 3. Subir archivos
subir() {
compilar
preparar_remoto
echo ""
echo "🚀 Subiendo binario, plantillas y scripts al servidor..."
copy "$SCRIPT_DIR/app_compartir" "$SCRIPT_DIR/init.sh" "$SCRIPT_DIR/.env.example" "$SERVIDOR:$REMOTE_DIR/"
copy "$SCRIPT_DIR/web/templates/"*.html "$SERVIDOR:$REMOTE_DIR/web/templates/"
remote "chmod 0755 '$REMOTE_DIR/app_compartir' '$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 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:'
systemctl status drop-sigmac-app.service --no-pager
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