#!/bin/bash # ============================================================================= # install.sh — Instalador maestro de Project Afterlife # ============================================================================= # Uso: ./install.sh [main|nier|dbo|maple2|fusionfall] # # Si no se especifica argumento, detecta automaticamente la VM por hostname. # ============================================================================= set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" COMPOSE_DIR="$PROJECT_DIR/docker" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_ok() { echo -e "${GREEN}[OK]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # ----------------------------------------------------------------------------- # Detectar VM objetivo # ----------------------------------------------------------------------------- detect_vm() { local hostname hostname=$(hostname -s 2>/dev/null || hostname) case "$hostname" in *main*|*web*|*auth*|*portal*) echo "main" ;; *nier*|*reincarnation*) echo "nier" ;; *dbo*|*dragonball*) echo "dbo" ;; *maple*|*ms2*) echo "maple2" ;; *fusion*|*fusionfall*) echo "fusionfall" ;; *) echo "" ;; esac } # ----------------------------------------------------------------------------- # Verificar prerequisitos # ----------------------------------------------------------------------------- check_prerequisites() { log_info "Verificando prerequisitos..." if ! command -v docker &> /dev/null; then log_error "Docker no esta instalado. Ejecuta primero el script de setup correspondiente." exit 1 fi if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then log_error "Docker Compose no esta instalado." exit 1 fi if ! command -v git &> /dev/null; then log_error "Git no esta instalado." exit 1 fi log_ok "Prerequisitos verificados." } # ----------------------------------------------------------------------------- # Verificar archivo .env # ----------------------------------------------------------------------------- check_env() { if [ ! -f "$COMPOSE_DIR/.env" ]; then log_warn "No se encontro docker/.env" log_info "Copiando desde .env.example..." cp "$COMPOSE_DIR/.env.example" "$COMPOSE_DIR/.env" log_warn "EDITA el archivo $COMPOSE_DIR/.env antes de continuar." log_warn "Al menos debes configurar:" log_warn " - DATABASE_PASSWORD" log_warn " - APP_KEYS, API_TOKEN_SALT, ADMIN_JWT_SECRET, etc. (Strapi)" log_warn " - AUTHENTIK_SECRET_KEY" log_warn " - MINIO_ROOT_PASSWORD" exit 1 fi } # ----------------------------------------------------------------------------- # Instalar VM Principal # ----------------------------------------------------------------------------- install_main() { log_info "Instalando VM PRINCIPAL (Web + Auth + CMS)..." cd "$COMPOSE_DIR" log_info "Descargando imagenes y construyendo..." docker compose -f docker-compose.main.yml pull docker compose -f docker-compose.main.yml build log_info "Iniciando servicios..." docker compose -f docker-compose.main.yml up -d log_info "Esperando a que los servicios esten listos..." sleep 10 log_info "Verificando estado..." docker compose -f docker-compose.main.yml ps echo "" log_ok "=== VM PRINCIPAL INSTALADA ===" echo "" echo "Accesos:" echo " Web: https://TU_DOMINIO" echo " CMS Admin: https://TU_DOMINIO/admin" echo " Authentik: https://TU_DOMINIO/auth (si configuras proxy)" echo " MinIO: https://TU_DOMINIO:9001 (o via proxy)" echo "" echo "Proximos pasos:" echo " 1. Configura Authentik: docker exec -it main-authentik-server ak bootstrap" echo " 2. Crea el admin de Strapi: docker exec -it main-cms npm run strapi admin:create-user" echo " 3. Genera el API Token en Strapi Admin > Settings > API Tokens" echo " 4. Reconstruye Next.js: docker compose -f docker-compose.main.yml exec web npm run build" echo "" } # ----------------------------------------------------------------------------- # Instalar VM de Juego # ----------------------------------------------------------------------------- install_game() { local game="$1" local compose_file="docker-compose.${game}.yml" log_info "Instalando VM de juego: $game..." cd "$COMPOSE_DIR" if [ ! -f "$compose_file" ]; then log_error "No se encontro $compose_file" exit 1 fi log_info "Construyendo e iniciando..." docker compose -f "$compose_file" build docker compose -f "$compose_file" up -d log_info "Verificando estado..." docker compose -f "$compose_file" ps echo "" log_ok "=== VM $game INSTALADA ===" echo "" } # ----------------------------------------------------------------------------- # Main # ----------------------------------------------------------------------------- main() { echo "" echo "==========================================" echo " Project Afterlife — Instalador" echo "==========================================" echo "" local vm_target="${1:-}" if [ -z "$vm_target" ]; then vm_target=$(detect_vm) if [ -n "$vm_target" ]; then log_info "VM detectada automaticamente: $vm_target" else log_error "No se pudo detectar la VM automaticamente." echo "Uso: $0 [main|nier|dbo|maple2|fusionfall]" exit 1 fi fi check_prerequisites check_env case "$vm_target" in main) install_main ;; nier|dbo|maple2|fusionfall) install_game "$vm_target" ;; *) log_error "VM desconocida: $vm_target" echo "Opciones validas: main, nier, dbo, maple2, fusionfall" exit 1 ;; esac log_ok "Instalacion completada!" } main "$@"