使用inotifywait僅在靜態網站SSG LumeCMS有變更時重新建置
大家好,我是無能。今天我完全遷移到了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
將其設定為localhost的3001埠,首先用於CMS。然後,為了能夠在外部進行編輯,我在Nginx端使用一個臨時域名對http://localhost:3001進行了反向代理。這樣就完成了管理頁面。 
接下來是公開頁面,如果將建置目錄分開,那麼在即時更改時也不會立即建置。然而,將建置設定為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是多餘的,可以將其註釋掉。此外,如果沒有冷卻時間,命令只會對更改的檔案(例如vim的交換檔案)執行,因此我添加了它。雖然也可以選擇要排除的檔案,但我認為這種方式更簡便,並且能確保捕捉到變更,因此採用了這種設計。將此保存為chreload.sh檔案,然後使用nohup sudo -u root chreload.sh &執行。在rc.local中添加為/my/dir/chreload.sh &。由於src目錄主要是更改文章和css檔案的目錄,因此只需檢測到此處的變更即可。此外,還需要更改的是,Hugo中的baseUrl預設仍為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;
因此,我已經確保這樣發布沒有問題。此外,由於我對使用deno啟動HTTP伺服器有所顧慮,因此我將除了管理頁面(CMS)之外的site目錄在Apache端進行監聽,並通過作為公開伺服器的Nginx反向代理到Apache進行發布。那麼,下次再見。請多關照。