Reconstruir LumeCMS (SSG de site estático) apenas em caso de alterações, usando inotifywait
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. 
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.