#!/usr/bin/env bash # Instalador Linux de CloudRestoreAS. # # NO instala ni descarga NADA del sistema: el binario es 100% autocontenido # (Qt/xcb, driver ODBC + Kerberos/OpenSSL, y 7-Zip van embebidos). Este script solo # coloca el binario, marca permisos, hace el bootstrap de config/, y opcionalmente # registra el arranque automático (servicio systemd headless o autostart de escritorio). # # Uso: # sudo ./install.sh --service # 24/7 headless vía systemd (recomendado en servidor) # ./install.sh --desktop # autostart de escritorio (requiere sesión gráfica) # ./install.sh # solo instala; sin arranque automático # # Variables: # PREFIX=/opt/cloudrestoreas # carpeta destino (default) # SERVICE_USER= # usuario del servicio systemd (default: quien invoca) set -euo pipefail MODE="none" for arg in "$@"; do case "$arg" in --service) MODE="service" ;; --desktop) MODE="desktop" ;; -h|--help) grep '^#' "$0" | grep -v '^#!' | sed 's/^# \{0,1\}//'; exit 0 ;; *) echo "Opción desconocida: $arg" >&2; exit 2 ;; esac done SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PREFIX="${PREFIX:-/opt/cloudrestoreas}" BIN_NAME="CloudRestoreAS" # Localizar el binario: dist/CloudRestoreAS, dist/CloudRestoreAS-linux, o junto al script. SRC="" for cand in \ "$SCRIPT_DIR/dist/$BIN_NAME" \ "$SCRIPT_DIR/dist/${BIN_NAME}-linux" \ "$SCRIPT_DIR/$BIN_NAME" \ "$SCRIPT_DIR/${BIN_NAME}-linux"; do if [[ -f "$cand" ]]; then SRC="$cand"; break; fi done if [[ -z "$SRC" ]]; then echo "ERROR: no se encontró el binario ($BIN_NAME). Ejecuta ./build.sh primero" >&2 exit 1 fi echo "===============================================" echo "CloudRestoreAS - Instalación Linux" echo " Binario : $SRC" echo " Destino : $PREFIX" echo " Modo : $MODE" echo "===============================================" mkdir -p "$PREFIX" install -m 0755 "$SRC" "$PREFIX/$BIN_NAME" echo "Binario instalado en $PREFIX/$BIN_NAME" # Bootstrap de config/: el propio binario crea config/, .env y carpetas de trabajo # al inicio de su arranque. Se corre una vez en modo offscreen (sin display) y se # corta con timeout; así el usuario ya puede editar config/.env antes de habilitar # el servicio. echo "Inicializando config/ (bootstrap)..." ( cd "$PREFIX" && QT_QPA_PLATFORM=offscreen timeout 20 "$PREFIX/$BIN_NAME" --headless >/dev/null 2>&1 || true ) if [[ -f "$PREFIX/config/.env" ]]; then echo "config/.env creado." else echo "NOTA: config/.env se creará en la primera ejecución." fi case "$MODE" in service) SERVICE_USER="${SERVICE_USER:-${SUDO_USER:-$(id -un)}}" UNIT_SRC="$SCRIPT_DIR/packaging/linux/cloudrestoreas.service" UNIT_DST="/etc/systemd/system/cloudrestoreas.service" if [[ ! -w "$(dirname "$UNIT_DST")" ]]; then echo "ERROR: se requiere sudo para instalar el servicio systemd" >&2 exit 1 fi sed -e "s|__USER__|$SERVICE_USER|g" \ -e "s|__WORKDIR__|$PREFIX|g" \ -e "s|__EXEC__|$PREFIX/$BIN_NAME|g" \ "$UNIT_SRC" > "$UNIT_DST" systemctl daemon-reload systemctl enable --now cloudrestoreas.service echo "Servicio systemd instalado y arrancado (usuario: $SERVICE_USER)." echo " Estado : systemctl status cloudrestoreas" echo " Logs : journalctl -u cloudrestoreas -f" ;; desktop) echo "Modo escritorio: la app registra su autostart .desktop al iniciarse." echo "Ejecuta '$PREFIX/$BIN_NAME' en tu sesión gráfica." ;; none) echo "Instalación sin arranque automático." echo "Ejecuta: QT_QPA_PLATFORM=offscreen $PREFIX/$BIN_NAME --start-engine --headless" ;; esac echo "" echo "Siguiente paso: edita $PREFIX/config/.env (CLOUDRESTORE_PANEL_*) y reinicia." [[ "$MODE" == "service" ]] && echo " Tras editar: sudo systemctl restart cloudrestoreas" echo "Listo."