#!/usr/bin/env bash set -euo pipefail ############################################### # CONFIGURACIÓN BÁSICA – EDITA ESTO ############################################### # TODO: pon aquí la URL real de tu repo (sin credenciales) REPO_URL_DEFAULT="https://github.com/igferne/Beyond-Diagnosis.git" INSTALL_BASE="/home/garbelo/" ############################################### # UTILIDADES ############################################### step() { echo echo "==================================================" echo " 👉 $1" echo "==================================================" } require_root() { if [ "$(id -u)" -ne 0 ]; then echo "Este script debe ejecutarse como root (o con sudo)." exit 1 fi } ############################################### # 1. COMPROBACIONES INICIALES ############################################### require_root step "Recogiendo datos de configuración" read -rp "Dominio para la aplicación (ej: app.cliente.com): " DOMAIN if [ -z "$DOMAIN" ]; then echo "El dominio no puede estar vacío." exit 1 fi SUBDOMAIN="$DOMAIN%%.*" INSTALL_DIR=$INSTALL_BASE"/"$SUBDOMAIN read -rp "Email para Let's Encrypt (avisos de renovación): " EMAIL if [ -z "$EMAIL" ]; then echo "El email no puede estar vacío." exit 1 fi read -rp "Usuario de acceso (Basic Auth / login): " API_USER if [ -z "$API_USER" ]; then echo "El usuario no puede estar vacío." exit 1 fi read -rsp "Contraseña de acceso: " API_PASS echo if [ -z "$API_PASS" ]; then echo "La contraseña no puede estar vacía." exit 1 fi echo read -rp "URL del repositorio Git (HTTPS, sin credenciales) [$REPO_URL_DEFAULT]: " REPO_URL REPO_URL=${REPO_URL:-$REPO_URL_DEFAULT} echo read -rp "¿El repositorio es PRIVADO en GitHub y necesitas token? [s/N]: " IS_PRIVATE IS_PRIVATE=${IS_PRIVATE:-N} GIT_CLONE_URL="$REPO_URL" #if [[ "$IS_PRIVATE" =~ ^[sS]$ ]]; then # echo "Introduce un Personal Access Token (PAT) de GitHub con permiso de lectura del repo." # read -rsp "GitHub PAT: " GITHUB_TOKEN # echo # if [ -z "$GITHUB_TOKEN" ]; then # echo "El token no puede estar vacío si el repo es privado." # exit 1 # fi # # # Construimos una URL del tipo: https://TOKEN@github.com/usuario/repo.git # if [[ "$REPO_URL" =~ ^https:// ]]; then # GIT_CLONE_URL="https://${GITHUB_TOKEN}@${REPO_URL#https://}" # else # echo "La URL del repositorio debe empezar por https:// para usar el token." # exit 1 # fi #fi # echo echo "Resumen de configuración:" echo " Dominio: $DOMAIN" echo " Email Let'sEnc: $EMAIL" echo " Usuario API: $API_USER" echo " Repo (visible): $REPO_URL" echo " Path del despliegue: $INSTALL_DIR" if [[ "$IS_PRIVATE" =~ ^[sS]$ ]]; then echo " Repo privado: Sí (se usará un PAT sólo para el clon inicial)" else echo " Repo privado: No" fi echo read -rp "¿Continuar con la instalación? [s/N]: " CONFIRM CONFIRM=${CONFIRM:-N} if [[ ! "$CONFIRM" =~ ^[sS]$ ]]; then echo "Instalación cancelada." exit 0 fi ############################################### # 2. INSTALAR DOCKER + DOCKER COMPOSE + CERTBOT ############################################### #step "Instalando Docker, docker compose plugin y certbot" # #apt-get update -y # ## Dependencias para repositorio Docker #apt-get install -y \ # ca-certificates \ # curl \ # gnupg \ # lsb-release # ## Clave GPG de Docker #if [ ! -f /etc/apt/keyrings/docker.gpg ]; then # install -m 0755 -d /etc/apt/keyrings # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ # gpg --dearmor -o /etc/apt/keyrings/docker.gpg #fi # ## Repo Docker estable #if [ ! -f /etc/apt/sources.list.d/docker.list ]; then # echo \ # "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ # $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ # tee /etc/apt/sources.list.d/docker.list > /dev/null #fi # #apt-get update -y # #apt-get install -y \ # docker-ce \ # docker-ce-cli \ # containerd.io \ # docker-buildx-plugin \ # docker-compose-plugin \ # git \ # certbot # #systemctl enable docker #systemctl start docker # ## Abrimos puertos en ufw si está activo #if command -v ufw >/dev/null 2>&1; then # if ufw status | grep -q "Status: active"; then # step "Configurando firewall (ufw) para permitir 80 y 443" # ufw allow 80/tcp || true # ufw allow 443/tcp || true # fi #fi # ################################################ # 3. CLONAR / ACTUALIZAR REPO ############################################### step "Descargando/actualizando el repositorio en $INSTALL_DIR" if [ -d "$INSTALL_DIR/.git" ]; then echo "Directorio git ya existe, haciendo 'git pull'..." git -C "$INSTALL_DIR" pull --ff-only else rm -rf "$INSTALL_DIR" echo "Clonando repositorio..." git clone "$GIT_CLONE_URL" "$INSTALL_DIR" fi cd "$INSTALL_DIR" ############################################### # 4. CONFIGURAR docker-compose.yml (credenciales y nginx) ############################################### step "Aplicando credenciales al docker-compose.yml" if ! grep -q "BASIC_AUTH_USERNAME" docker-compose.yml; then echo "⚠ No encuentro BASIC_AUTH_USERNAME en docker-compose.yml. Revisa el archivo a mano." else sed -i "s/BASIC_AUTH_USERNAME:.*/BASIC_AUTH_USERNAME: \"$API_USER\"/" docker-compose.yml fi if ! grep -q "BASIC_AUTH_PASSWORD" docker-compose.yml; then echo "⚠ No encuentro BASIC_AUTH_PASSWORD en docker-compose.yml. Revisa el archivo a mano." else sed -i "s/BASIC_AUTH_PASSWORD:.*/BASIC_AUTH_PASSWORD: \"$API_PASS\"/" docker-compose.yml fi if ! grep -q "XXX" docker-compose.yml; then echo "⚠ No encuentro XXX en docker-compose.yml. Revisa el archivo a mano." else sed -i "s/XXX/\"$SUBDOMAIN\"/" docker-compose.yml fi # Aseguramos que nginx exponga también 443 #if grep -q 'ports:' docker-compose.yml && grep -q 'nginx:' docker-compose.yml; then # if ! grep -q '443:443' docker-compose.yml; then # sed -i '/- "80:80"/a\ - "443:443"' docker-compose.yml || true # fi #fi # ## Aseguramos que montamos /etc/letsencrypt dentro del contenedor de nginx #if ! grep -q '/etc/letsencrypt:/etc/letsencrypt:ro' docker-compose.yml; then # sed -i '/nginx:/,/networks:/{ # /volumes:/a\ - /etc/letsencrypt:/etc/letsencrypt:ro # }' docker-compose.yml || true #fi # ############################################### # 5. OBTENER CERTIFICADO LET'S ENCRYPT ############################################### #step "Obteniendo certificado SSL de Let’s Encrypt para $DOMAIN" # #if [ -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then # echo "Certificado ya existe, saltando paso de emisión." #else # # Asegurarnos de que no hay nada escuchando en 80/443 # systemctl stop nginx || true # # certbot certonly \ # --standalone \ # --non-interactive \ # --agree-tos \ # -m "$EMAIL" \ # -d "$DOMAIN" # # echo "Certificado emitido en /etc/letsencrypt/live/$DOMAIN/" #fi # ################################################ ## 6. CONFIGURAR NGINX DENTRO DEL REPO ################################################ #step "Generando configuración nginx con SSL" # #mkdir -p nginx/conf.d # #cat > nginx/conf.d/beyond.conf <