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-এ একটি রিভার্স প্রক্সি সেট করেছি। এতে অ্যাডমিন পৃষ্ঠা তৈরি হয়ে যায়। 
এখন, পাবলিক পৃষ্ঠাগুলির জন্য, যদি বিল্ড ডিরেক্টরি আলাদা করা হয়, তবে রিয়েল-টাইমে পরিবর্তন হলে তা সঙ্গে সঙ্গে বিল্ড হয় না। অন্যদিকে, বিল্ডকে ক্রন জব হিসাবে সেট করা কেবল সম্পদের অপচয় এবং ডিস্কের অপ্রয়োজনীয় ক্ষয়, তাই এটি এড়ানো উচিত। সুতরাং, আমি একটি স্ক্রিপ্ট তৈরি করব যা 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-এ রিভার্স প্রক্সি করে প্রকাশ করেছি। তাহলে আবার দেখা হবে। ধন্যবাদ।