Пересборка LumeCMS (SSG для статических сайтов) только при изменениях с использованием inotifywait

7 min

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

Привет, я бездарь. Сегодня я полностью перешел на LumeCMS. Поэтому я записываю, как я это сделал.

Разделение страниц администрирования

В случае LumeCMS страницы администрирования и обычные страницы отличаются. Таким образом, если, например, в стандартных настройках выполнить deno task lume cms и deno task serve, то оба будут собраны в папку _site по умолчанию. В этом случае, при редактировании страницы администрирования, сборка в _site происходит в реальном времени, и страницы, для которых "Draft" установлено в "Yes" (неопубликованные страницы), также будут собраны. Если _site является корневым каталогом, то при запуске HTTP-сервера неопубликованные статьи станут видны. Этого необходимо избежать. Поэтому в моем случае

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

я настроил его для CMS на порту 3001 localhost. Затем, чтобы можно было редактировать извне, я настроил обратный прокси на Nginx для http://localhost:3001 через временный домен. Таким образом, страница администрирования готова. Image
Теперь, что касается публичных страниц, если каталог сборки отличается, то при изменении в реальном времени сборка не происходит немедленно. С другой стороны, использование cron-заданий для сборки — это пустая трата ресурсов и износ диска, чего хотелось бы избежать. Поэтому я создал скрипт, который использует inotify-tools(inotifywait) для мониторинга файловой системы и выполняет указанную команду при обнаружении изменений.

#!/bin/bash  
  
WATCHED_DIR="/var/www/html/soulmining/src/" # Каталог для мониторинга  
COMMAND="/home/haturatu/.deno/bin/deno task lume --dest=site" # Команда для выполнения --dest указывает каталог вывода сборки  
COOLDOWN_TIME=60  # Время ожидания (сек)  
  
# Запись времени последнего выполнения команды  
LAST_RUN_FILE="/tmp/last_run.time"  
  
# Получение текущего времени  
current_time() {  
    date +%s  
}  
  
# Получение времени последнего выполнения команды (возвращает 0, если не существует)  
get_last_run_time() {  
    if [ -f "$LAST_RUN_FILE" ]; then  
        cat "$LAST_RUN_FILE"  
    else  
        echo 0  
    fi  
}  
  
# Запись времени последнего выполнения команды  
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 "Изменения обнаружены"  
    last_run_time=$(get_last_run_time)  
    now=$(current_time)  
  
    # Определяем, следует ли повторно выполнить команду на основе времени последнего выполнения  
    if [ $((now - last_run_time)) -ge $COOLDOWN_TIME ]; then  
        echo "Выполнение команды"  
        cd /var/www/html/soulmining || exit  
        $COMMAND  
        cd ~ || exit  
        set_last_run_time  
    else  
        echo "Команда не будет выполнена"  
    fi  
done  
  

Если вы можете проверить работу, то во время выполнения в фоновом режиме echo бесполезно, поэтому его можно закомментировать. Кроме того, я добавил время ожидания, потому что без него команда будет выполняться только для измененных файлов (например, для swap-файлов vim). Хотя можно выбрать файлы для исключения, я решил, что этот подход проще и гарантированно обнаружит изменения, поэтому выбрал такую спецификацию. Создайте файл, например, chreload.sh, и запустите его с помощью nohup sudo -u root chreload.sh &. Добавьте /my/dir/chreload.sh & в rc.local. Поскольку каталог src — это место, где в основном изменяются статьи и CSS-файлы, достаточно отслеживать изменения в нем. Кроме того, необходимо изменить baseUrl, который в Hugo по умолчанию остается localhost, поэтому его нужно правильно настроить.

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

Таким образом, я сделал так, чтобы публикация не вызывала проблем. Кроме того, поскольку я не хотел запускать HTTP-сервер с Deno, я настроил Apache для прослушивания каталога site (части, отличной от CMS, которая является страницей администрирования), а затем использовал Nginx в качестве публичного сервера для обратного проксирования к Apache и публикации. На этом все. Спасибо за внимание.

Related Posts