#!/bin/bash set -e echo "==========================================================" echo " INICIALIZANDO AGENT ZERO EN HUGGING FACE SPACES (ROOT)" echo "==========================================================" # 1. Asegurar que el usuario agent (UID 1000) existe if ! id -u agent >/dev/null 2>&1; then echo "📌 Creando usuario agent (UID 1000)..." groupadd -g 1000 agent useradd -u 1000 -g 1000 -m -s /bin/bash agent fi # 2. Definir rutas persistentes DATA_BASE="/data" DATA_USR="$DATA_BASE/usr" DATA_VENV_A0="$DATA_BASE/venv-a0" DATA_VENV_EXEC="$DATA_BASE/venv" DATA_REPO_DIR="$DATA_BASE/agent-zero-repo" DATA_HOME="$DATA_BASE/home" # 3. Función para persistir directorios (copia inicial o sincronización) persist_and_link() { local CONTAINER_DIR="$1" local PERSIST_DIR="$2" echo "Procesando persistencia: $CONTAINER_DIR -> $PERSIST_DIR" if [ ! -d "$PERSIST_DIR" ]; then echo " ➕ Copia inicial de $CONTAINER_DIR -> $PERSIST_DIR..." mkdir -p "$(dirname "$PERSIST_DIR")" if [ -d "$CONTAINER_DIR" ]; then cp -a "$CONTAINER_DIR" "$PERSIST_DIR" else mkdir -p "$PERSIST_DIR" fi else echo " 🔄 Sincronizando actualizaciones (sin sobrescribir existentes)..." if [ -d "$CONTAINER_DIR" ]; then cp -an "$CONTAINER_DIR"/. "$PERSIST_DIR/" 2>/dev/null || true fi fi rm -rf "$CONTAINER_DIR" ln -sfn "$PERSIST_DIR" "$CONTAINER_DIR" } # 4. Persistir directorios del agente persist_and_link "/a0/usr" "$DATA_USR" persist_and_link "/opt/venv-a0" "$DATA_VENV_A0" persist_and_link "/opt/venv" "$DATA_VENV_EXEC" persist_and_link "/home/agent" "$DATA_HOME" # 5. Purgar sockets UNIX (evita error ENXIO en self-update) echo "🧹 Eliminando sockets UNIX huérfanos en /data/usr..." find "$DATA_USR" -type s -delete 2>/dev/null || true # 6. Sincronizar repositorio de código con protección contra árbol sucio if [ ! -d "$DATA_REPO_DIR/.git" ]; then echo "📦 Clonando repositorio oficial por primera vez..." git clone https://github.com/agent0ai/agent-zero.git "$DATA_REPO_DIR" else echo "🔄 Actualizando repositorio (con Auto-Stash)..." git config --global --add safe.directory "$DATA_REPO_DIR" git -C "$DATA_REPO_DIR" stash push -u -m "a0-auto-stash-startup" 2>/dev/null || true if ! git -C "$DATA_REPO_DIR" pull origin main; then echo "⚠️ Conflicto en git pull. Restableciendo repositorio..." git -C "$DATA_REPO_DIR" reset --hard origin/main fi git -C "$DATA_REPO_DIR" stash pop 2>/dev/null || true fi rm -rf /git/agent-zero ln -sfn "$DATA_REPO_DIR" /git/agent-zero # 7. Parche para el plugin de Telegram (usa el venv persistente) if [ -f /git/agent-zero/plugins/_telegram_integration/helpers/dependencies.py ]; then sed -i 's|sys.executable,|"/opt/venv-a0/bin/python",|' \ /git/agent-zero/plugins/_telegram_integration/helpers/dependencies.py 2>/dev/null || true fi # 8. Asignar TODO /data al usuario agent (permisos finales) echo "🔧 Otorgando propiedad de /data al usuario agent (UID 1000)..." chown -R agent:agent "$DATA_BASE" chmod 755 "$DATA_BASE" # 9. Diagnóstico echo "📊 Espacio usado en /data:" du -sh "$DATA_BASE" 2>/dev/null || echo "No se pudo calcular" echo "Propietario de /data: $(stat -c %U "$DATA_BASE")" echo "==========================================================" # 10. Bajar privilegios a agent y ejecutar la UI cd /git/agent-zero export HOME=/home/agent USER=agent LOGNAME=agent PORT=${PORT:-7860} echo "🚀 Iniciando Agent Zero como usuario agent en puerto $PORT..." exec setpriv --reuid=1000 --regid=1000 --clear-groups \ /opt/venv-a0/bin/python run_ui.py --host 0.0.0.0 --port "$PORT" --dockerized=True