# Usa una imagen base de Redis FROM redis:latest # Crear directorios necesarios RUN mkdir -p /mnt/redis-data && \ mkdir -p /usr/local/etc/redis && \ mkdir -p /usr/local/bin && \ mkdir -p /etc/ngrok && \ chmod -R 777 /mnt/redis-data /usr/local/etc/redis /usr/local/bin /etc/ngrok # Instalación de herramientas necesarias RUN apt-get update && \ apt-get install -y wget unzip python3 python3-venv python3-pip cron curl gnupg2 lsb-release # Agregar repositorio de Google Cloud y gcsfuse RUN echo "deb http://packages.cloud.google.com/apt gcsfuse-$(lsb_release -c -s) main" | tee /etc/apt/sources.list.d/gcsfuse.list && \ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ apt-get update && \ apt-get install -y gcsfuse && \ apt-get clean # Descargar e instalar ngrok v3 RUN wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz && \ tar -xvzf ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin && \ chmod +x /usr/local/bin/ngrok && \ rm ngrok-v3-stable-linux-amd64.tgz # Crear un entorno virtual para Python RUN python3 -m venv /opt/venv # Activar el entorno virtual e instalar paquetes Python RUN /opt/venv/bin/pip install --upgrade pip && \ /opt/venv/bin/pip install gcsfs google-cloud-storage # Agregar el script de montaje del bucket RUN echo '#!/bin/bash\n\ \n\ # Leer variables de entorno\n\ BUCKET_NAME="${BUCKET_NAME}"\n\ GOOGLE_APPLICATION_CREDENTIALS_JSON="${GOOGLE_APPLICATION_CREDENTIALS_JSON}"\n\ \n\ # Guardar las credenciales en un archivo temporal\n\ echo "$GOOGLE_APPLICATION_CREDENTIALS_JSON" > /opt/venv/bin/gcloud-credentials.json\n\ \n\ # Intentar montar el bucket de Google Cloud Storage\n\ gcsfuse --implicit-dirs --key-file /opt/venv/bin/gcloud-credentials.json $BUCKET_NAME /mnt/redis-data\n\ \n\ # Verificar si el bucket está montado\n\ if mountpoint -q /mnt/redis-data\n\ then\n\ echo "Bucket montado correctamente."\n\ else\n\ echo "Error al montar el bucket. Intentando nuevamente..."\n\ gcsfuse --implicit-dirs --key-file /opt/venv/bin/gcloud-credentials.json $BUCKET_NAME /mnt/redis-data\n\ fi\n' > /usr/local/bin/mount_bucket.sh # Asignar permisos de ejecución al script RUN chmod +x /usr/local/bin/mount_bucket.sh # Agregar cron job para montar el bucket y recuperar datos RUN echo "* * * * * /usr/local/bin/mount_bucket.sh" >> /etc/crontab # Configura Redis para usar Google Cloud Storage como persistencia RUN echo "dir /mnt/redis-data" >> /usr/local/etc/redis/redis.conf && \ echo "save 900 1" >> /usr/local/etc/redis/redis.conf && \ echo "save 300 10" >> /usr/local/etc/redis/redis.conf && \ echo "save 60 10000" >> /usr/local/etc/redis/redis.conf # Crear el script de recuperación RUN echo '#!/bin/bash\n\ \n\ # Leer variables de entorno\n\ BUCKET_NAME="${BUCKET_NAME}"\n\ GOOGLE_APPLICATION_CREDENTIALS_JSON="${GOOGLE_APPLICATION_CREDENTIALS_JSON}"\n\ REDIS_PASSWORD="${REDIS_PASSWORD}"\n\ \n\ # Verificar si Redis está en ejecución\n\ if pgrep redis-server > /dev/null\n\ then\n\ echo "Redis está en ejecución. Verificando datos en Redis..."\n\ \n\ # Verificar si el bucket está montado\n\ if mountpoint -q /mnt/redis-data\n\ then\n\ echo "Bucket montado correctamente. Verificando datos en Redis..."\n\ \n\ # Recuperar claves de Redis\n\ redis-cli -a ${REDIS_PASSWORD} KEYS "*" | while read key; do\n\ redis-cli -a ${REDIS_PASSWORD} GET "$key" > /dev/null || echo "Clave $key no recuperada"\n\ done\n\ else\n\ echo "Error al montar el bucket. Intentando nuevamente..."\n\ gcsfuse --implicit-dirs --key-file /opt/venv/bin/gcloud-credentials.json $BUCKET_NAME /mnt/redis-data\n\ fi\n\ else\n\ echo "Redis no está en ejecución. Intentando recuperar datos..."\n\ gcsfuse --implicit-dirs --key-file /opt/venv/bin/gcloud-credentials.json $BUCKET_NAME /mnt/redis-data\n\ redis-server /usr/local/etc/redis/redis.conf\n\ fi\n' > /usr/local/bin/recover_data.sh # Asignar permisos de ejecución al script de recuperación RUN chmod +x /usr/local/bin/recover_data.sh # Agregar cron job para monitorear fallos y recuperar datos RUN echo "* * * * * /usr/local/bin/recover_data.sh" >> /etc/crontab # Exponer el puerto necesario para Hugging Face Spaces EXPOSE 7860 # Crear y configurar el script de inicio para Redis, ngrok y configuración RUN echo '#!/bin/bash\n\ \n\ # Crear la carpeta /etc/ngrok si no existe\n\ mkdir -p /etc/ngrok\n\ touch /etc/ngrok/ngrok.yml\n\ chmod -R 777 /etc/ngrok\n\ \n\ # Iniciar Redis\n\ redis-server /usr/local/etc/redis/redis.conf &\n\ \n\ # Configurar ngrok con el token de autenticación\n\ if [ -z "$NGROK_AUTH_TOKEN" ]; then\n\ echo "No se ha proporcionado un token de autenticación para ngrok."\n\ else\n\ echo "authtoken: $NGROK_AUTH_TOKEN" > /etc/ngrok/ngrok.yml\n\ /usr/local/bin/ngrok http 7860 &\n\ fi\n\ \n\ # Mantener el contenedor en ejecución\n\ while true; do sleep 3600; done\n' > /usr/local/bin/start.sh # Asignar permisos de ejecución al script de inicio RUN chmod +x /usr/local/bin/start.sh # Configura el contenedor para ejecutar el script de inicio CMD ["/usr/local/bin/start.sh"] # Configurar el contenedor para que se reinicie siempre HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost:7860/ || exit 1