libretime/easypanel/update.sh
Cesar Jhoanny Mendivil Rubio 778264653e
Some checks are pending
Container / meta (analyzer) (push) Waiting to run
Container / meta (api) (push) Waiting to run
Container / meta (legacy) (push) Waiting to run
Container / meta (nginx) (push) Waiting to run
Container / meta (playout) (push) Waiting to run
Container / meta (worker) (push) Waiting to run
Container / build (push) Blocked by required conditions
Project / pre-commit (push) Waiting to run
Project / test-tools (push) Waiting to run
Release-Please / release-please (push) Waiting to run
feat(easypanel): actualizar docker-compose y scripts para mejorar la gestión de configuraciones y secretos, incluyendo la copia de archivos nginx
2025-10-01 17:48:09 -07:00

127 lines
4.6 KiB
Bash
Executable File

#!/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
# Copiar docker/nginx para que ./docker/nginx/default.conf exista como archivo
if [ -d "$BASE_DIR/../docker/nginx" ]; then
rm -rf "$DEST_DIR/docker/nginx"
mkdir -p "$DEST_DIR/docker"
cp -a "$BASE_DIR/../docker/nginx" "$DEST_DIR/docker/"
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
if [ -f "$DEST_DIR/docker/nginx/default.conf" ]; then
echo
echo "OK: encontrado $DEST_DIR/docker/nginx/default.conf (archivo)"
ls -l "$DEST_DIR/docker/nginx/default.conf"
elif [ -d "$DEST_DIR/docker/nginx/default.conf" ]; then
echo
echo "ERROR: $DEST_DIR/docker/nginx/default.conf existe pero es un directorio (debe ser un archivo)."
ls -l "$DEST_DIR/docker/nginx" || true
else
echo
echo "Nota: no se encontró $DEST_DIR/docker/nginx/default.conf"
fi
echo "update.sh completado correctamente. Si EasyPanel aún muestra errores, revisa los logs del contenedor 'config-generator'."