Reconstruir LumeCMS (SSG de site estático) apenas em caso de alterações, usando inotifywait

7 min

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

Olá, sou um inútil. Hoje migrei completamente para o LumeCMS. Então, vou registrar como fiz isso desta vez.

Separação da Página de Administração

No caso do LumeCMS, a página de administração e as páginas normais são diferentes. Assim, por exemplo, se você executar deno task lume cms e deno task serve com as configurações padrão, ambos serão construídos na pasta _site padrão. Nesse caso, o que acontece é que, ao editar a página de administração, a construção para _site ocorre em tempo real, e as páginas com "Draft" definido como "Yes" (páginas privadas) também são construídas. Se um servidor HTTP for iniciado com _site como diretório raiz, os artigos privados se tornam visíveis. Isso precisa ser evitado. Então, no meu caso,

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

e configurei-o para o CMS na porta 3001 do localhost. E, para permitir a edição externa, configurei um proxy reverso no Nginx para http://localhost:3001 usando um domínio descartável. Com isso, a página de administração está pronta. Image
Agora, sobre a página pública, se o diretório de construção for separado, ela não será construída imediatamente em caso de alterações em tempo real. Por outro lado, usar um cron job para a construção apenas desperdiçaria recursos e o desgaste do disco, o que é algo a ser evitado. Portanto, criei um script que monitora o sistema de arquivos usando inotify-tools(inotifywait) e executa um comando especificado quando há uma alteração.

#!/bin/bash  
  
WATCHED_DIR="/var/www/html/soulmining/src/" # Diretório a ser monitorado  
COMMAND="/home/haturatu/.deno/bin/deno task lume --dest=site" # Comando a ser executado --dest especifica o diretório de saída da construção  
COOLDOWN_TIME=60  # Tempo de espera (seg)  
  
# Registra a última vez que o comando foi executado  
LAST_RUN_FILE="/tmp/last_run.time"  
  
# Obtém a hora atual  
current_time() {  
    date +%s  
}  
  
# Obtém a última vez que o comando foi executado (retorna 0 se não existir)  
get_last_run_time() {  
    if [ -f "$LAST_RUN_FILE" ]; then  
        cat "$LAST_RUN_FILE"  
    else  
        echo 0  
    fi  
}  
  
# Registra a última vez que o comando foi executado  
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 "Alteração detectada"  
    last_run_time=$(get_last_run_time)  
    now=$(current_time)  
  
    # Determina se o comando deve ser executado novamente com base na última vez que foi executado  
    if [ $((now - last_run_time)) -ge $COOLDOWN_TIME ]; then  
        echo "Executando comando"  
        cd /var/www/html/soulmining || exit  
        $COMMAND  
        cd ~ || exit  
        set_last_run_time  
    else  
        echo "Comando não será executado"  
    fi  
done  
  

Se você puder confirmar o funcionamento, pode ser uma boa ideia comentar os echo enquanto ele estiver sendo executado em segundo plano, pois são desnecessários. Além disso, adicionei um tempo de espera (cooldown) porque, sem ele, o comando seria executado apenas para os arquivos alterados (incluindo arquivos de swap do Vim, etc.). Embora seja possível selecionar arquivos a serem excluídos, decidi por esta especificação, pois achei mais fácil e garantido que detectaria as alterações. Crie um arquivo com isso, por exemplo, chreload.sh, e execute-o com nohup sudo -u root chreload.sh &. Adicione /my/dir/chreload.sh & ao rc.local. O diretório src é onde os artigos e arquivos CSS são principalmente alterados, então deve ser suficiente detectar alterações lá. Além disso, outra coisa que precisa ser alterada é o baseUrl (o que seria o baseURL no Hugo), que por padrão permanece como localhost, então ele deve ser configurado corretamente.

$ 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;  
  

E assim, fiz com que não houvesse problemas para publicar. Além disso, como eu tinha resistência em iniciar um servidor HTTP com Deno, o diretório site (que não é a página de administração do CMS) é escutado pelo Apache, e o Nginx, que é o servidor público, faz um proxy reverso para o Apache para publicá-lo. Até a próxima. Obrigado.

Related Posts