#!/usr/bin/env bash set -euo pipefail # Este script prepara el compose para EasyPanel. # Si Node.js está disponible y existe easypanel/update.js, lo ejecuta. # De lo contrario, realiza la copia y saneado en bash/perl (fallback). BASE_DIR="$(cd "$(dirname "$0")" && pwd)" SRC="$BASE_DIR/../docker-compose.easypanel.yml" DEST_DIR="$BASE_DIR/code" DEST="$DEST_DIR/docker-compose.yml" REQUIRED_SECRETS=(POSTGRES_PASSWORD RABBITMQ_DEFAULT_PASS) function read_env_file() { local f="$BASE_DIR/service.env" if [ ! -f "$f" ]; then return fi # shellcheck disable=SC1090 # do not source to avoid side effects; parse manually grep -E '^[A-Za-z_][A-Za-z0-9_]*=' "$f" | sed "s/^[^=]*=//" >/dev/null 2>&1 || true } function check_required_secrets() { local missing=() for key in "${REQUIRED_SECRETS[@]}"; do # prefer environment then service.env val="${!key:-}" if [ -z "$val" ] && [ -f "$BASE_DIR/service.env" ]; then val=$(grep -E "^${key}=" "$BASE_DIR/service.env" | head -n1 | sed -E "s/^${key}=//") fi if [ -z "$val" ] || echo "$val" | grep -Eiq '^(CAMBIA|pon_aqui|tu_|CHANGE|REPLACE)'; then missing+=("$key") fi done if [ ${#missing[@]} -ne 0 ]; then echo "ERROR: faltan valores seguros para las siguientes variables: ${missing[*]}" echo "Definelas en la sección Environment/Secrets de EasyPanel o en $BASE_DIR/service.env" exit 2 fi } check_required_secrets if command -v node >/dev/null 2>&1 && [ -f "$BASE_DIR/update.js" ]; then echo "Node.js detectado, ejecutando easypanel/update.js" # Ejecutar con node (permitirá usar la versión JS en lugar del sed/perl) node "$BASE_DIR/update.js" echo "Preparado $DEST para EasyPanel (vía update.js)." exit 0 fi echo "Node.js no disponible o easypanel/update.js no encontrado; usando fallback shell copy" mkdir -p "$DEST_DIR" if [ ! -f "$SRC" ]; then echo "ERROR: no se encuentra $SRC" exit 2 fi # Copiar cp "$SRC" "$DEST" # Copiar la carpeta tools al directorio generado para que los bind-mounts './tools' funcionen if [ -d "$BASE_DIR/../tools" ]; then rm -rf "$DEST_DIR/tools" mkdir -p "$DEST_DIR" cp -a "$BASE_DIR/../tools" "$DEST_DIR/" fi if [ -d "$DEST_DIR/tools" ]; then # Asegurar permisos ejecutables para scripts .sh dentro de code/tools find "$DEST_DIR/tools" -type f -iname '*.sh' -exec chmod 0755 {} \; fi # Eliminar container_name y ports keys (simplemente eliminamos las líneas que contienen 'container_name:' o 'ports:') # Esto es similar a lo que hacen muchos ejemplos de EasyPanel. if command -v perl >/dev/null 2>&1; then perl -0777 -pe "s/^[ \t]*container_name:[^\n]*\n//mg" -i "$DEST" perl -0777 -pe "s/^[ \t]*ports:[^\n]*\n(?:^[ \t]+-.*\n)*//mg" -i "$DEST" perl -0777 -pe "s/^[ \t]*version:[^\n]*\n//mg" -i "$DEST" else # Fallback con awk/sed si perl no está disponible # Elimina líneas 'container_name:' y bloques 'ports:' simples sed -E '/^[ \t]*container_name:/d' -i "" "$DEST" 2>/dev/null || sed -E '/^[ \t]*container_name:/d' -i '$DEST' awk 'BEGIN{skip=0} /^[ \t]*ports:[ \t]*$/ {skip=1; next} /^[ \t]*[^ \t]/ { if(skip){skip=0} } { if(!skip) print $0 }' "$DEST" > "$DEST.tmp" && mv "$DEST.tmp" "$DEST" # Elimina 'version:' si queda sed -E '/^[ \t]*version:/d' -i "" "$DEST" 2>/dev/null || sed -E '/^[ \t]*version:/d' -i '$DEST' fi echo "Preparado $DEST para EasyPanel. Revisa variables de entorno en el README y súbelas en la UI de EasyPanel." # Resumen: listar scripts copiados y sus permisos if [ -d "$DEST_DIR/tools" ]; then echo echo "Resumen - archivos en $DEST_DIR/tools:" ls -l "$DEST_DIR/tools" | sed -n '1,200p' echo echo "Permisos verificables para scripts .sh (deben ser ejecutables):" find "$DEST_DIR/tools" -type f -iname '*.sh' -exec ls -l {} \; || true else echo "Nota: no se encontró $DEST_DIR/tools" fi echo "update.sh completado correctamente. Si EasyPanel aún muestra errores, revisa los logs del contenedor 'config-generator'."