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