Reconstruir LumeCMS, un generador de sitios estáticos (SSG), solo cuando haya cambios, utilizando inotifywait

7 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy un inútil. Hoy he migrado completamente a LumeCMS. Así que, esta vez, documentaré cómo lo hice.

Separación de páginas de administración

En el caso de LumeCMS, las páginas de administración y las páginas normales son diferentes. Por ejemplo, si ejecutas deno task lume cms y deno task serve con la configuración estándar, ambos se construirán en la carpeta _site por defecto. Lo que sucede en este caso es que, al editar una página de administración, se realiza una construcción en tiempo real en _site, y las páginas con "Draft" configurado como "Yes" (páginas no publicadas) también se construyen. Por lo tanto, si se inicia un servidor HTTP con _site como directorio raíz, incluso los artículos no publicados serían visibles. Esto debe evitarse. Así que, en mi caso,

/home/haturatu/.deno/bin/deno task lume cms --location=http://localhost:3001  
  

y lo configuré primero para el CMS en el puerto 3001 de localhost. Luego, para permitir la edición desde el exterior, configuré un proxy inverso en el lado de Nginx para http://localhost:3001 usando un dominio desechable. Con esto, la página de administración está lista. Image
Ahora, en cuanto a las páginas públicas, si se separa el directorio de construcción, no significa que se reconstruirán inmediatamente cuando se realicen cambios en tiempo real. Por otro lado, hacer que la construcción sea una tarea cron solo desperdiciaría recursos y el desgaste del disco, lo cual quiero evitar. Por lo tanto, crearé un script que monitoree el sistema de archivos usando inotify-tools(inotifywait) y ejecute un comando específico cuando se detecten cambios.

#!/bin/bash  
  
WATCHED_DIR="/var/www/html/soulmining/src/" # Directorio a monitorear  
COMMAND="/home/haturatu/.deno/bin/deno task lume --dest=site" # Comando a ejecutar --dest especifica el destino de salida de la construcción  
COOLDOWN_TIME=60  # Tiempo de espera (seg)  
  
# Registrar la última vez que se ejecutó el comando  
LAST_RUN_FILE="/tmp/last_run.time"  
  
# Obtener la hora actual  
current_time() {  
    date +%s  
}  
  
# Obtener la última hora de ejecución del comando (devuelve 0 si no existe)  
get_last_run_time() {  
    if [ -f "$LAST_RUN_FILE" ]; then  
        cat "$LAST_RUN_FILE"  
    else  
        echo 0  
    fi  
}  
  
# Registrar la última vez que se ejecutó el comando  
set_last_run_time() {  
    current_time > "$LAST_RUN_FILE"  
}  
  
inotifywait -m -r -e modify,create,delete "$WATCHED_DIR" | while read -r directory events filename; do  
    echo "Cambios detectados"  
    last_run_time=$(get_last_run_time)  
    now=$(current_time)  
  
    # Determinar si se debe ejecutar el comando nuevamente basándose en la última hora de ejecución  
    if [ $((now - last_run_time)) -ge $COOLDOWN_TIME ]; then  
        echo "Ejecutando comando"  
        cd /var/www/html/soulmining || exit  
        $COMMAND  
        cd ~ || exit  
        set_last_run_time  
    else  
        echo "Comando no ejecutado"  
    fi  
done  
  

Si puedes confirmar que funciona, quizás quieras comentar las declaraciones echo ya que son innecesarias cuando se ejecuta en segundo plano. Además, añadí un tiempo de espera (cooldown) porque, sin él, el comando se ejecutaría para cada archivo modificado (incluyendo archivos de intercambio de vim, etc.). Aunque se pueden seleccionar archivos para excluir, consideré que este método era más sencillo para mí y que sin duda detectaría los cambios, por lo que opté por esta especificación. Crea un archivo con el nombre chreload.sh (o similar) y ejecútalo con nohup sudo -u root chreload.sh &. Añádelo a rc.local como /my/dir/chreload.sh &. El directorio src es donde se modifican principalmente los artículos y los archivos CSS, por lo que debería ser suficiente con detectar los cambios allí. Además, lo que hay que cambiar es el baseUrl (como en Hugo), que por defecto sigue siendo localhost, por lo que debe configurarse correctamente.

$ cat _config.ts  
import lume from "lume/mod.ts";  
import blog from "blog/mod.ts";  
import plugins from "./plugins.ts";  
import nunjucks from "lume/plugins/nunjucks.ts";  
import basePath from "lume/plugins/base_path.ts";  
  
const site = lume({
  src: "./src",  
  location: new URL("https://soulminingrig.com"),  
});  
  
site.use(basePath());  
site.use(plugins());  
site.use(nunjucks());  
  
export default site;  
  

Así que, con esto, me aseguré de que no haya problemas al publicar. Además, como me resistía a iniciar un servidor HTTP con Deno, estoy escuchando el directorio site (la parte que no es el CMS, que es la página de administración) en el lado de Apache y publicándolo a través de un proxy inverso de Nginx (el servidor público) a Apache. Hasta la próxima. Saludos.

Related Posts