diff --git a/server_scripts/auto_server_setup.sh b/server_scripts/auto_server_setup.sh index 328b53c..7082339 100644 --- a/server_scripts/auto_server_setup.sh +++ b/server_scripts/auto_server_setup.sh @@ -5,25 +5,23 @@ # Samba share • Oh-My-Zsh (plugins + alias) # Utilidades básicas (SSH, net-tools, htop, ufw, fail2ban, avahi) # Visual: barra de progreso con emojis 🚀🛠️ -# Todo el output se registra en /var/log/auto_server_setup.log +# Todos los logs en /var/log/auto_server_setup.log set -euo pipefail -# Workaround para evitar errores de "unbound variable" en funciones -width=30 - # Logfile setup -LOGFILE="/var/log/auto_server_setup.log" -mkdir -p "$(dirname "$LOGFILE")" -: > "$LOGFILE" -exec > >(tee -a "$LOGFILE") 2>&1 +debug_log="/var/log/auto_server_setup.log" +mkdir -p "$(dirname "$debug_log")" +: > "$debug_log" +exec > >(tee -a "$debug_log") 2>&1 LOG() { echo -e "\033[1;32m▶ $*\033[0m"; } -# Check ports function + +# Función para verificar puertos libres check_ports() { - local svc="$1"; shift + local name="$1"; shift for port in "$@"; do - if ss -tulpn | grep -q ":$port "; then - LOG "⚠️ Puertos en uso para $svc (puerto $port), omitiendo $svc" + if ss -tulpn | grep -q ":${port} "; then + LOG "⚠️ $name: puerto $port en uso, se omitirá este servicio" return 1 fi done @@ -31,41 +29,46 @@ check_ports() { } ############################################################################## -# Barra de progreso estética # +# Barra de progreso estética # ############################################################################## STEPS_TOTAL=17 STEP_NOW=0 bar() { clear - local width=30 filled=$(( STEP_NOW * width / STEPS_TOTAL )) empty=$(( width - filled )) gauge - gauge="$(printf '%0.s🟩' $(seq 1 $filled))$(printf '%0.s⬜' $(seq 1 $empty))" - printf "\n %s %3d%% [ %s ]\n" "$gauge" $(( STEP_NOW * 100 / STEPS_TOTAL )) "$1" + local width=30 + local filled empty gauge + filled=$(( STEP_NOW * width / STEPS_TOTAL )) + empty=$(( width - filled )) + gauge="$(printf '🟩%.0s' $(seq 1 $filled))$(printf '⬜%.0s' $(seq 1 $empty))" + printf "\n %s %3d%% [ %s ]\n" "$gauge" "${STEP_NOW}*100/$STEPS_TOTAL" "$1" +} +next() { + STEP_NOW=$(( STEP_NOW + 1 )) + bar "$1" } -next() { STEP_NOW=$(( STEP_NOW + 1 )); bar "$1"; } ############################################################################## # 0. Root check # ############################################################################## -next "🔑 Verificando root" -[[ $(id -u) -eq 0 ]] || { echo "⚠️ Run as root or sudo." >&2; exit 1; } +next "🔑 Verificando permisos root" +[[ $(id -u) -eq 0 ]] || { echo "⚠️ Ejecuta este script como root o con sudo" >&2; exit 1; } ############################################################################## # 1. Wi-Fi Configuration # ############################################################################## next "📶 Configuración Wi-Fi" -if lspci | grep -i wireless >/dev/null || lsusb | grep -i wireless >/dev/null; then +if lspci | grep -qi wireless || lsusb | grep -qi wireless; then LOG "Adaptador Wi-Fi detectado" apt update && apt install -y wpasupplicant wireless-tools - read -rp "➤ SSID de la red Wi-Fi: " WIFI_SSID + read -rp "➤ SSID Wi-Fi: " WIFI_SSID read -rsp "➤ Contraseña Wi-Fi: " WIFI_PASS; echo cat > /etc/wpa_supplicant/wpa_supplicant.conf </etc/hostname sed -i "s/127.0.1.1.*/127.0.1.1\t$NEW_HOST/" /etc/hosts || true hostname "$NEW_HOST" -read -rp "➤ Configure local domain? (e.g., server.local) [Y/n]: " DOM -if [[ ${DOM,,} =~ ^y ]]; then - read -rp "➤ Domain: " LOCAL_DOMAIN +read -rp "➤ Configurar dominio local (ej. server.local)? [Y/n]: " CONF_DOMAIN +if [[ ${CONF_DOMAIN,,} =~ ^y ]]; then + read -rp "➤ Nombre de dominio: " LOCAL_DOMAIN echo "127.0.0.1\t$LOCAL_DOMAIN" >>/etc/hosts - LOG "Dominio local configurado: $LOCAL_DOMAIN" + LOG "Dominio local: $LOCAL_DOMAIN" fi ############################################################################## # 4. Basic utilities # ############################################################################## -next "🛠️ Instalando utilidades" +next "🛠️ Instalando utilidades básicas" apt update && apt -y upgrade apt install -y \ openssh-server net-tools htop curl wget gnupg2 ca-certificates lsb-release \ @@ -115,13 +118,15 @@ apt install -y \ ############################################################################## next "🐳 Instalando Docker" apt install -y apt-transport-https software-properties-common -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor \ + -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ -https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" >/etc/apt/sources.list.d/docker.list +https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ + >/etc/apt/sources.list.d/docker.list apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl enable docker && systemctl start docker groupadd docker || true -read -rp "➤ User for Docker group [${SUDO_USER:-$USER}]: " DU +read -rp "➤ Usuario Docker (sin sudo) [${SUDO_USER:-$USER}]: " DU DOCKER_USER="${DU:-${SUDO_USER:-$USER}}" usermod -aG docker "$DOCKER_USER" @@ -131,7 +136,7 @@ usermod -aG docker "$DOCKER_USER" next "🔧 Desplegando Portainer" if check_ports "Portainer" 9443; then docker volume create portainer_data - docker run -d --name portainer \ +docker run -d --name portainer \ --restart=always -p 9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data portainer/portainer-ce:latest @@ -183,7 +188,7 @@ next "🚫 Desplegando Pi-hole" if check_ports "Pi-hole DNS" 53 && check_ports "Pi-hole UI" 8080; then docker run -d --name pihole --restart=unless-stopped \ -p 53:53/tcp -p 53:53/udp -p 8080:80 \ - -e TZ="America/Monterrey" \ + -e TZ="America/Monterrey" \ -e WEBPASSWORD="changeme" \ -v /opt/pihole/etc-pihole:/etc/pihole \ -v /opt/pihole/etc-dnsmasq.d:/etc/dnsmasq.d pihole/pihole:latest @@ -198,17 +203,17 @@ if check_ports "CasaOS" 80 443; then curl -fsSL https://get.casaos.io | bash LOG "CasaOS: http://$NEW_HOST" else - LOG "Salteando CasaOS: puertos 80/443 en uso" + LOG "CasaOS omitido: puertos 80/443 en uso" fi ############################################################################## # 12. Samba share # ############################################################################## next "📁 Configurando Samba" -read -rp "➤ Folder to share (full path): " SMB_DIR +read -rp "➤ Carpeta a compartir (ruta completa): " SMB_DIR mkdir -p "$SMB_DIR" -read -rp "➤ Samba user: " SMB_USER -read -srp "➤ Samba password: " SMB_PASS; echo +read -rp "➤ Usuario Samba: " SMB_USER +read -srp "➤ Contraseña Samba: " SMB_PASS; echo adduser --gecos "" --disabled-password "$SMB_USER" echo "$SMB_USER:$SMB_PASS" | chpasswd (echo "$SMB_PASS"; echo "$SMB_PASS") | smbpasswd -s -a "$SMB_USER" @@ -248,7 +253,7 @@ systemctl enable fail2ban && systemctl start fail2ban ############################################################################## next "✅ Resumen" echo -LOG "Access your services:" +LOG "Accede a tus servicios:" echo " - Portainer → https://$NEW_HOST:9443" echo " - CapRover → http://$NEW_HOST:3000" echo " - NPM → http://$NEW_HOST:81" @@ -260,9 +265,9 @@ echo " - Samba → //$NEW_HOST/$SMB_USER" ############################################################################## # 16. Reboot if desired # ############################################################################## -read -rp "🔄 Reboot now? [y/N]: " REBOOT +read -rp "🔄 Reiniciar ahora? [y/N]: " REBOOT if [[ ${REBOOT,,} == y ]]; then reboot else - LOG "Setup complete. Reboot manually to apply all changes." + LOG "Script finalizado. Reinicia manualmente para aplicar todo." fi