# PatternAlign Studio — Deployment Guide এই প্যাকেজটি সম্পূর্ণ static: কোনো build step, Node runtime, environment variable বা database ছাড়াই চলে। এতে **পাঁচটি অ্যাপ** আছে: PatternAlign Studio, ভূমি ইঞ্জিন, KMZ দাগ ম্যাপার, AnyShape Divider এবং ম্যাপ জয়েন্ট (v4)। সবগুলো একই ফোল্ডারে রাখলে টুল হাব ও এমবেডেড ভিউয়ার কাজ করবে। ## 1. প্যাকেজে কী আছে | ফাইল | কাজ | |---|---| | `index.html` | PatternAlign Studio — প্রধান অ্যাপ (editor, geometry, IndexedDB, export) | | `bhumi-engine.html` | ভূমি পরিমাপ ও ভাগবণ্টন ইঞ্জিন (প্রোটোটাইপ) | | `kmz-engine.html` | স্যাটেলাইট দাগ ম্যাপার ও Google Earth KMZ Maker | | `anyshape-divider.html` | AnyShape Divider — যেকোনো আকৃতির জমি ভাগ, রাস্তা ও রিপোর্ট | | `map-joint.html` | ভূমি ইঞ্জিন v4 — ম্যাপ জয়েন্ট (মাল্টি-শিট পointing, স্টিচিং, QC) | | `joint-sw.js` | ম্যাপ জয়েন্টের offline service worker | | `sw.js` | Service worker — অফলাইন ক্যাশ ও PWA | | `manifest.webmanifest` | PWA নাম, আইকন, shortcuts, theme | | `icons/icon.svg` | অরিজিনাল অ্যাপ আইকন (runtime-এ PNG আইকনও তৈরি হয়) | | `404.html` | ব্র্যান্ডেড নট-ফাউন্ড পেজ | | `_headers` | Netlify / Cloudflare Pages security ও cache headers | | `netlify.toml` | Netlify publish config | | `vercel.json` | Vercel cache/security headers | | `.htaccess` | Apache / cPanel cache, MIME ও SPA-related config | | `.nojekyll` | GitHub Pages যেন ফাইল/ফোল্ডার বাদ না দেয় | | `wrangler.toml` | Cloudflare Pages CLI config | | `README.md` | ফিচার, ইঞ্জিন, সীমাবদ্ধতা | | `DEPLOY.md` | এই নির্দেশিকা | | `BUILD-INFO.txt` | ZIP তৈরির সময় স্বয়ংক্রিয়ভাবে তৈরি: সংস্করণ, সময়, ২০ ফাইলের তালিকা ও কোনটি live/fallback/missing | | `make-zip.sh` | পাঁচটি অ্যাপসহ পূর্ণ deployment ZIP তৈরির স্ক্রিপ্ট (`bash make-zip.sh`) | ## 2. Cloudflare Pages বনাম Netlify — কোনটি বেছে নেবেন? এই অ্যাপটি **সম্পূর্ণ static** (কোনো সার্ভার কোড, database বা build step নেই)। তাই দুটোই চলে, কিন্তু অগ্রাধিকার আলাদা। | বিষয় | Cloudflare Pages (Free) | Netlify (Free) | |---|---|---| | Static bandwidth | **আনলিমিটেড** | ১০০ GB/মাস, এরপর সাইট পজ হতে পারে | | Static requests | আনলিমিটেড | সীমার মধ্যে | | Build | ৫০০/মাস (এই অ্যাপে build লাগেই না) | ৩০০ build মিনিট/মাস | | ফাইল সীমা | ২০,০০০ ফাইল, প্রতি ফাইল ২৫ MiB | সাধারণত যথেষ্ট | | CDN | ৩০০+ POP, ঢাকায় POP আছে | ভালো, তবে এশিয়ায় তুলনামূলক কম POP | | Custom domain + SSL | ফ্রি | ফ্রি | | Analytics | Cloudflare Web Analytics ফ্রি | আলাদা पेড অ্যাড-অন | | DDoS সুরক্ষা | ডিফল্ট, খুব শক্তিশালী | ভালো | | ডিপ্লয়ের সহজতা | ড্র্যাগ করে আপলোড বা CLI | **সবচেয়ে সহজ Drag & Drop (Netlify Drop)** | | পেমেন্ট/কার্ড | ফ্রি প্ল্যানে লাগে না | ফ্রি প্ল্যানে লাগে না | | কমার্শিয়াল ব্যবহার | অনুমোদিত | অনুমোদিত (Vercel Hobby-তে নয়) | **এই প্রজেক্টের সুপারিশ:** 1. দীর্ঘমেয়াদি/পাবলিক প্রোডাকশনের জন্য **Cloudflare Pages**—আনলিমিটেড ব্যান্ডউইথ, বাংলাদেশে ভালো গতি, ফ্রি অ্যানালিটিক্স। 2. শুধু দ্রুত ডেমো/ক্লায়েন্টকে লিংক দেখানোর জন্য **Netlify Drop**—৩০ সেকেন্ডে লাইভ। 3. দুটোতেই একই ZIP ব্যবহার করুন; কোনো কোড বদলাতে হবে না। > গুরুত্বপূর্ণ: অ্যাপে সব ইমেজ প্রসেসিং ক্লায়েন্টে হয়, তাই হোস্টিংয়ে কোনো ইউজার ফাইল যায় না। বড় ট্রাফিকেও Cloudflare-এ বিল আসবে না, কারণ static asset unmetered। ## 2.1 Cloudflare Pages-এ ডিপ্লয় (প্রস্তাবিত) **পদ্ধতি A — ড্যাশবোর্ড (সহজ):** 1. **Settings → ডিপ্লয় প্যাকেজ → ZIP ডাউনলোড** চাপুন। 2. → **Workers & Pages** → **Create** → **Pages** → **Upload assets**। 3. প্রকল্পের নাম দিন (যেমন `patternalign-studio`) → ZIP বা unzipped ফোল্ডার আপলোড করুন। 4. **Deploy site** → `https://patternalign-studio.pages.dev` লিংক পাবেন। 5. **Custom domain** → নিজের ডোমেইন যোগ করুন; SSL অটো। **পদ্ধতি B — CLI:** ```bash # unzip করা ফোল্ডারে npx wrangler pages deploy . ``` `wrangler.toml` ইতিমধ্যে আছে (`pages_build_output_dir = "."`)। **Cloudflare সেটিংস:** - Build command: ফাঁকা - Build output directory: `/` বা `.` - Framework preset: None - `_headers` স্বয়ংক্রিয়ভাবে পড়বে (sw.js no-cache, security headers) **লক্ষ্য রাখুন:** Cloudflare নতুন ফুল-স্ট্যাক প্রজেক্টের জন্য Workers static assets-এ যাচ্ছে। আমাদের অ্যাপের জন্য Pages এখনো পুরোপুরি ঠিক আছে এবং কোনো Function ব্যবহার করছে না। ## 2.2 Netlify-তে ডিপ্লয় (দ্রুত ডেমো) 1. খুলুন। 2. ZIP ফাইলটি (বা unzipped ফোল্ডার) ড্র্যাগ করুন। 3. লাইভ HTTPS URL পাওয়ার সাথে সাথে PWA ইনস্টল ও service worker কাজ করবে। 4. দরকার হলে **Site settings → Domain management** থেকে কাস্টম ডোমেইন যোগ করুন। > ZIP-এর ভেতরে ফাইলগুলো root-এ থাকা দরকার। এই প্যাকেজে `index.html` root-এ আছে, তাই সরাসরি ড্র্যাগ করা যাবে। ## 3. Vercel ```bash # unzip করার পর ফোল্ডারের ভিতরে npx vercel --prod ``` - Framework preset: **Other** - Build command: ফাঁকা - Output directory: `.` - `vercel.json` ইতিমধ্যে `sw.js` no-cache ও নিরাপত্তা হেডার দেয়। ## 4. GitHub Pages ```bash git init git add index.html sw.js manifest.webmanifest icons README.md DEPLOY.md 404.html git commit -m "Deploy PatternAlign Studio" git branch -M main git remote add origin https://github.com/USERNAME/REPO.git git push -u origin main ``` GitHub → **Settings → Pages → Build and deployment → Deploy from a branch → main / root**। সমস্যা প্রতিরোধ: - `index.html`-এ manifest ও service worker **relative path** ব্যবহার করে, তাই subpath (`/repo-name/`) কাজ করে। - `.nojekyll` ফাইল যোগ করলে GitHub Pages underscore-শুরু ফাইল/ফোল্ডার বাদ দেবে না: ```bash touch .nojekyll ``` (ZIP প্যাকেজে এটি নেই; দরকার হলে যোগ করুন।) - GitHub Pages HTTPS দেয়, তাই install prompt আসবে। ## 5. Cloudflare Pages - Framework preset: **None** - Build command: ফাঁকা - Build output directory: `/` (রুট) - `_headers` স্বয়ংক্রিয়ভাবে পড়া হবে। ## 6. cPanel / Apache (shared hosting) 1. ZIP unzip করুন যেন `index.html` `public_html/`-এ থাকে। 2. `icons/` ফোল্ডার ও বাকি ফাইলও আপলোড করুন। 3. `index.html` ঠিক আছে কি না দেখুন: `https://example.com/` 4. SSL ইনস্টল করে `https://` চালু করুন। `.htaccess`-এ কমেন্ট করা HTTPS redirect চালু করতে পারেন। 5. `.htaccess` ফাইলটি hidden; File Manager-এ "Show Hidden Files" চালু করুন। ## 7. Nginx (নমুনা) ```nginx server { listen 443 ssl http2; server_name example.com; root /var/www/patternalign; index index.html; location = /sw.js { add_header Cache-Control "no-cache, no-store, must-revalidate"; add_header Service-Worker-Allowed "/"; try_files $uri =404; } location = /manifest.webmanifest { types { } default_type application/manifest+json; add_header Cache-Control "public, max-age=3600"; } location /icons/ { add_header Cache-Control "public, max-age=604800, immutable"; } location = /index.html { add_header Cache-Control "public, max-age=0, must-revalidate"; } location / { try_files $uri $uri/ =404; } } ``` ## 8. PWA ও অফলাইন - **HTTPS বা localhost** ছাড়া service worker ইনস্টল হয় না। `file://`-এ খুললে অ্যাপ চলবে, কিন্তু offline cache ও install prompt আসবে না। - প্রথমবার অনলাইনে লোড হলে ফন্ট, PDF লাইব্রেরি ও অ্যাপ শেল ক্যাশ হয়। এরপর সম্পাদনা ও লোকাল সেভ অফলাইনে কাজ করে। - নতুন সংস্করণ deploy করলে `sw.js`-এর `VERSION` বদলান (যেমন `pa-v1.1.0` → `pa-v1.2.0`)। পুরোনো ক্যাশ activate-এ পরিষ্কার হবে। - Install prompt ব্রাউজার-নির্ভর। Settings → ইনস্টলেশন-এ Android/iOS/Desktop নির্দেশনা আছে। ## 9. ডেটা ও প্রাইভেসি - প্রকল্প, ছবি, মাস্ক, মাপ—সব **এই ব্রাউজারের IndexedDB**-তে। কোনো সার্ভার বা অ্যাকাউন্ট নেই। - ব্রাউজার ডেটা মুছে ফেললে বা private window বন্ধ করলে লোকাল কাজ হারাতে পারে। নিয়মিত **Project JSON** export/backup নিন। - ছবি বা নমুনা কোনো তৃতীয় পক্ষের সার্ভারে আপলোড হয় না। - CDN নির্ভরতা: Google Fonts, Tailwind browser CDN, jsPDF (PDF-এর জন্য)। এগুলো blocked থাকলে মূল CSS/ইঞ্জিন এখনো কাজ করবে; PDF না হলে ব্রাউজার-প্রিন্ট ফলব্যাক রয়েছে। ## 10. হেডার ও ক্যাশিং `_headers` / `vercel.json` / `.htaccess` ইতিমধ্যে Includes: - `X-Content-Type-Options: nosniff` - `X-Frame-Options: SAMEORIGIN` - `Referrer-Policy`, `Permissions-Policy` - `index.html`: must-revalidate - `sw.js`: no-cache - `manifest`: `application/manifest+json` - `icons`: 7 দিন cache CSP যোগ করলে inline script/style ও CDN API অনুমতি দিতে হবে; ভুল CSP দিলে অ্যাপ ভেঙে যাবে, তাই ইচ্ছাকৃতভাবে বাদ দেওয়া হয়েছে। ## 11. আপডেট ও রোলব্যাক - স্ট্যাটিক হোস্টে পুরোনো ZIP/ফোল্ডার রেখে শুধু `index.html`, `sw.js` ও প্রয়োজনীয় ফাইল replace করুন। - `sw.js` version না বদলালে ব্যবহারকারী পুরোনো ক্যাশ পেতে পারে। - ভাঙা deploy হলে আগের ZIP পুনরায় upload করুন; লোকাল проект ডেটা ব্রাউজারে থেকেই যাবে। ## 12. ডিপ্লয়ের আগে চেকলিস্ট - [ ] `index.html` root-এ আছে - [ ] `sw.js` root-এ আছে (index.html-এর পাশে) - [ ] `manifest.webmanifest` ও `icons/icon.svg` আছে - [ ] HTTPS সক্রিয় - [ ] DevTools → Application → Manifest: কোনো error নেই - [ ] DevTools → Application → Service Workers: activated - [ ] হোম স্ক্রিনে install করে অফলাইনে খোলা যায় - [ ] নতুন প্রকল্প → দুটি ডিজাইন → রঙিন ওভারলে → PNG/PDF export - [ ] JSON export করে অন্য ব্রাউজারে import ## 13. ইন-অ্যাপ ZIP ডাউনলোড — সম্পূর্ণতা যাচাই অ্যাপের **Dashboard → ডিপ্লয় প্যাকেজ** বা **Settings → ডিপ্লয় প্যাকেজ → ZIP ডাউনলোড** চেপে `bhumiporimap-suite-deploy.zip` নামান। এতে **২০টি ফাইল ও পাঁচটি অ্যাপ** থাকে: ``` index.html bhumi-engine.html kmz-engine.html anyshape-divider.html map-joint.html sw.js joint-sw.js manifest.webmanifest icons/icon.svg 404.html _headers netlify.toml vercel.json .htaccess .nojekyll wrangler.toml README.md DEPLOY.md make-zip.sh BUILD-INFO.txt ``` ডাউনলোডের পর: 1. ZIP-এর ভেতরের **`BUILD-INFO.txt`** খুলুন। 2. `VERSION: 1.5.0` এবং `APPS: 5` আছে কি না দেখুন। 3. শেষ লাইনে `OK: all five product apps are included` আছে কি না দেখুন। 4. কোনো অ্যাপ `WARNING`-এ থাকলে **Settings → আলাদা ফাইল ডাউনলোড** ব্যবহার করুন, অথবা প্রকল্প ফোল্ডারে `bash make-zip.sh` চালান। কোনো build service বা Node.js ছাড়াই ZIP তৈরি হয়; এটি ZIP-এর store মেথড (BEGIN/END signature, CRC32) ব্যবহার করে, তাই ফাইলটি যেকোনো unzip টুলে খোলে। যদি কোনো হোস্ট sibling ফাইল fetch করতে ব্লক করে, অ্যাপ এখন জোরালোভাবে সেটি জানায় এবং BUILD-INFO-তে তালিকাভুক্ত করে—নীরবে অসম্পূর্ণ প্যাকেজ দেয় না। CLI পদ্ধতি (যদি রিপো ক্লোন করা থাকে): ```bash bash make-zip.sh ``` লাইসেন্স/ব্র্যান্ড: এই অ্যাপের কোড, UI ও ডেমো আর্টওয়ার্ক অরিজিনাল। কোনো বিদ্যমান পণ্যের ব্র্যান্ড, লোগো বা মালিকানাধীন অ্যাসেট ব্যবহার করা হয়নি।