File size: 5,372 Bytes
a8861d8 9f96bd7 a8861d8 9f96bd7 a8861d8 9f96bd7 a8861d8 9f96bd7 a8861d8 9f96bd7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# 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
|