SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-21

নিজের VPS-এ কোন diagram tool চালাবেন?

draw.io, Excalidraw ও Kroki-র মধ্যে কোনটির diagram আপনার server ছাড়ে না, আর কোনটি প্রতিটি diagram server-এর মধ্য দিয়ে পাঠায়, তা জেনে নিন।

কোন self-hosted diagram tool চালাবেন?

Self-hosted diagram tool সাধারণত দুই ধরনের হয়। কোন ধরনের tool তা feature list-এর চেয়ে বেশি গুরুত্বপূর্ণ। draw.io এবং Excalidraw হলো browser application: container JavaScript সরবরাহ করে, drawing আপনার browser-এ হয়, এবং server কখনো diagram দেখতে পায় না। Kroki এর বিপরীত। আপনি HTTP-এর মাধ্যমে diagram text পাঠান, আর এটি একটি image ফেরত পাঠায়। তাই প্রতিটি diagram আপনার নিজের machine-এর মধ্য দিয়ে যায়।

Wiki-এর পাশে পূর্ণাঙ্গ editor চাইলে draw.io চালান। দ্রুত sketch করার জন্য এবং যে browser-এ drawing করেছেন, তার বাইরে কিছু save না হওয়া মেনে নিতে পারলে Excalidraw চালান। আপনার diagram-এর source text যদি সেই code-এর পাশে git-এ থাকে, যা diagram-এ বর্ণনা করা হয়েছে, তাহলে Kroki চালান।

স্বয়ং হোস্টিং করলে diagram tool-এ আসলে কী পরিবর্তন হয়

আপনার সার্ভারের সঙ্গে ঠিক কোন অংশগুলো যোগাযোগ করে, তা নির্দিষ্টভাবে বুঝুন। কারণ self-hosting গোপনীয়তা দেয়, নাকি শুধু availability দেয়, তা এই একটি বিষয়ই নির্ধারণ করে।

  • draw.io browser-এ render হয়। আপনার container application code পরিবেশন করে। ফাইলটি editor-কে যেখানে save করতে বলবেন, সেখানেই যাবে।
  • Excalidraw browser-এ render হয় এবং বর্তমান scene সেই browser-এর local storage-এ রাখে। server side-এ কিছুই লেখা হয় না।
  • Kroki server-এ render হয়। diagram source এবং তৈরি হওয়া image—দুটিই আপনার container-এর ভিতরে থাকে।

শুধু তৃতীয় ক্ষেত্রেই data আপনার নিয়ন্ত্রণাধীন hardware-এ যায়। প্রথম দুই ক্ষেত্রে self-hosting আপনাকে asset control এবং availability দেয়: JavaScript আপনার host থেকে আসে। তাই কোনো third party outage-এর মুখে পড়লে, তার terms পরিবর্তন করলে বা আপনার network থেকে সেটিতে পৌঁছানো না গেলে editor কাজ চালিয়ে যায়। কিছু team-এর কাছে এর বাস্তব মূল্য আছে। তবে এটি “diagram কখনো building-এর বাইরে যায় না”—এই দাবির সমতুল্য নয়।

draw.io: কিছু সংরক্ষণ করে না—এমন অফিসিয়াল container

প্রকল্পটি নিজস্ব image প্রকাশ করে, এবং এর README-তে quick start মাত্র এক লাইনের।

docker run -it --rm --name="draw" -p 8080:8080 -p 8443:8443 jgraph/drawio

এটি box-এর সব address-এ editor প্রকাশ করে। VPS-এ published port-টি loopback-এ bind করুন এবং reverse proxy বা SSH tunnel-এর মাধ্যমে এতে পৌঁছান।

docker run -d --name drawio --restart unless-stopped -p 127.0.0.1:8080:8080 jgraph/drawio

Tunnel-এর মাধ্যমে http://127.0.0.1:8080/?offline=1&https=0 খুলুন। README-তে ?offline=1-কে “cloud storage support নিষ্ক্রিয় করে এমন security feature” বলা হয়েছে। এটি না থাকলে editor save target হিসেবে Google Drive, OneDrive এবং GitHub দেখায়। এগুলো অন্যদের server।

127.0.0.1-এ bind করলেই port-টি public internet থেকে আড়ালে থাকে। সাধারণ -p 8080:8080 ufw দ্বারা filter হয় না, কারণ Docker নিজস্ব iptables rule এমন chain-এর আগে বসায় যেগুলো ufw পরিচালনা করে। তাই firewall configuration সঠিক দেখালেও port-টি সবার জন্য উত্তর দেয়। ufw-এর নিয়ম এড়িয়ে Docker কীভাবে সরাসরি port প্রকাশ করে-এ প্রক্রিয়া এবং সমাধান ব্যাখ্যা করা হয়েছে।

Editor localhost-এ না থাকলেই দুটি environment variable গুরুত্বপূর্ণ হয়ে ওঠে।

services:
  drawio:
    image: jgraph/drawio
    container_name: drawio
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
    environment:
      DRAWIO_SERVER_URL: "https://drawio.example.com/"
      DRAWIO_BASE_URL: "https://drawio.example.com"

শেষের slash-টি কোনো ভুল নয়। README-তে DRAWIO_SERVER_URL-কে “শেষে trailing slash-সহ Public deployment URL” এবং DRAWIO_BASE_URL-কে “trailing slash ছাড়া একই URL” বলা হয়েছে। viewer, lightbox এবং embed code path-এ এগুলো ব্যবহৃত হয়। https://www.example.com/drawio/-এর মতো subpath-এর অধীনে editor serve করলে উভয় value-তেই সেই subpath থাকতে হবে, কারণ app এগুলো থেকে viewer এবং embed URL তৈরি করে।

Persistence নেই, এবং এটিই নকশার উদ্দেশ্য। ওই Compose file-এ কোনো volume নেই, কারণ container কোনো diagram data ধারণ করে না। .drawio file হলো XML, যা editor আপনার browser-এ পাঠায়। আপনি যে save target নির্বাচন করেন, সেটিই নির্ধারণ করে data কোথায় থাকবে: আপনার নিজের machine-এ download হিসেবে, অথবা editor-কে embed করা application-এ। সেই destination-এর backup রাখুন। যদি destination VPS-এর কোনো folder হয়, তাহলে সুরক্ষিত রাখার মতো জিনিস হলো সেই folder এবং এতে পৌঁছাতে ব্যবহৃত file manager। draw.io কোনো কিছুর copy রাখে না।

আপনার server থেকে যা এখনও বাইরে যায়। PDF-এ export করা এর সবচেয়ে স্পষ্ট উদাহরণ। README-তে DRAWIO_SELF_CONTAINED-কে এভাবে বর্ণনা করা হয়েছে: “export request সরাসরি export server-এ পাঠানোর পরিবর্তে Tomcat-এর ExportProxyServlet (/service/0)-এর মাধ্যমে পাঠাতে 1 সেট করুন।” উল্টোভাবে পড়লে বিষয়টি পরিষ্কার হয়: default অবস্থায় export call আপনার deployment-এর ভেতরে থাকে না। যারা rendering নিজের hardware-এ করতে চান, প্রকল্পটি তাদের জন্য jgraph/export-server-ও প্রকাশ করে। এটি draw.io-এর একটি “standalone image-export-server”। ENABLE_DRAWIO_PROXY default অবস্থায় বন্ধ থাকে এবং browser-এর হয়ে external image URL fetch করে এমন একটি /proxy endpoint চালু করে। প্রয়োজন না হলে এটি বন্ধ রাখুন।

Excalidraw: এর পেছনে কোনো server নেই, এটি একটি static bundle

Official image page-এ এই command দেওয়া আছে।

docker run --rm -dit --name excalidraw -p 5000:80 excalidraw/excalidraw:latest

আগের একই কারণে published port-টি loopback-এ সরিয়ে নিন।

docker run -d --name excalidraw --restart unless-stopped -p 127.0.0.1:5000:80 excalidraw/excalidraw:latest

Container-এর ভিতরে nginx port 80-এ একটি compiled JavaScript bundle পরিবেশন করে। Published image-টির compressed আকার প্রায় 41 MB (Docker Hub, August 2026), যা দেখায় এতে কত অল্প উপাদান আছে। কোনো database নেই, session store নেই, upload directory নেই, কারণ server-এ সংরক্ষণ করার মতো কিছুই নেই।

Image page-এ সীমাবদ্ধতাটি স্পষ্টভাবে বলা আছে: "এই মুহূর্তে নিজের instance self-hosting করলে sharing বা collaboration feature সমর্থিত হয় না।" Interface-এ button-গুলো এখনও দেখা যায়, তাই কারণটি জানা দরকার। Live collaboration-এর জন্য একটি websocket server প্রয়োজন, যা excalidraw/excalidraw-room হিসেবে আলাদাভাবে প্রকাশিত। একটি share link-এর জন্য encrypted scene সংরক্ষণের storage service প্রয়োজন। উভয়টির address build time-এ Vite variable হিসেবে bundle-এর মধ্যে compile করা হয় (VITE_APP_WS_SERVER_URL, VITE_APP_BACKEND_V2_GET_URL, VITE_APP_BACKEND_V2_POST_URL), এবং repository-র production value Excalidraw-এর নিজস্ব hosted service-গুলোর দিকে নির্দেশ করে। Build চলাকালে Vite এই value-গুলো প্রতিস্থাপন করে, ফলে JavaScript-এর ভিতরে এগুলো literal string হিসেবে থাকে। Container environment variable হিসেবে এগুলো সেট করলেও কিছু পরিবর্তন হয় না, কারণ runtime-এ কোনো code এগুলো পড়ে না। Collaboration-কে নিজের room server-এ নির্দেশ করতে হলে নিজের value দিয়ে source থেকে frontend build করতে হবে। সেই server-এর বর্তমান অবস্থা যাচাই করে তারপর তার ওপর নির্ভর করে পরিকল্পনা করুন: August 2026 অনুযায়ী Docker Hub-এ থাকা excalidraw/excalidraw-room image-টি দুই বছরেরও বেশি সময় ধরে rebuild করা হয়নি।

কোনো drawing আসলে কোথায় থাকে। Scene browser-এর local storage-এ, ওই device-এ এবং ওই origin-এর জন্য সংরক্ষিত থাকে। একই URL একটি private window-এ খুললে canvas খালি থাকবে; এটি নিজে যাচাই করার দ্রুততম উপায়। Site data মুছে ফেললে drawing-ও মুছে যায়, এবং restore করার মতো কোনো server copy থাকে না। তাই ব্যবহারকারীদের "Save to..." ব্যবহার করতে শেখান এবং JSON হওয়া .excalidraw file-টি এমন জায়গায় রাখুন, যার backup নেওয়া হয়। একটি shared instance প্রতিটি ব্যক্তিকে নিজস্ব private canvas দেয়। এটিকে hosted personal sketch pad হিসেবে ব্যবহার করুন।

Kroki: diagrams as code, আপনার সার্ভারে rendered হয়

Kroki অনেক renderer-এর সামনে একটি HTTP gateway হিসেবে কাজ করে। আপনি text POST করলে এটি SVG বা PNG ফেরত দেয়। Graphviz, PlantUML, D2 এবং আরও কয়েকটি renderer gateway image-এর মধ্যে built-in থাকে। Mermaid, BPMN এবং Excalidraw rendering companion container-এ চলে, তাই এটি চালানোর জন্য Compose ব্যবহার করাই যুক্তিসংগত। এটি Kroki documentation-এর উদাহরণ।

services:
  kroki:
    image: yuzutech/kroki
    depends_on:
      - mermaid
      - bpmn
      - excalidraw
    environment:
      - KROKI_MERMAID_HOST=mermaid
      - KROKI_BPMN_HOST=bpmn
      - KROKI_EXCALIDRAW_HOST=excalidraw
    ports:
      - "8000:8000"
    tmpfs:
      - /tmp:exec
  mermaid:
    image: yuzutech/kroki-mermaid
    expose:
      - "8002"
  bpmn:
    image: yuzutech/kroki-bpmn
    expose:
      - "8003"
  excalidraw:
    image: yuzutech/kroki-excalidraw
    expose:
      - "8004"

expose host-এ কোনো port publish করে না, তাই companion-গুলো শুধু Compose network-এর gateway থেকে পৌঁছানো যায়। এটাই প্রত্যাশিত আচরণ। Wiki যে host-এ চলছে সেটি আলাদা না হলে gateway-এর line-টি "127.0.0.1:8000:8000"-এ পরিবর্তন করুন। আপনি আগে কোনো server-এ Compose file না লিখে থাকলে VPS-এ Docker Compose চালানো file layout এবং docker compose up -d cycle ব্যাখ্যা করে।

দুটি smoke test এই ক্রমে চালান, কারণ এগুলো ভিন্ন কারণে ব্যর্থ হয়।

curl -s -X POST http://127.0.0.1:8000/graphviz/svg \
  -H 'Content-Type: text/plain' \
  --data-binary 'digraph G {Hello->World}' | head -c 60

Graphviz gateway-এর ভিতরে চলে, তাই এখানকার SVG document gateway নিজে সুস্থ আছে কি না তা নিশ্চিত করে। এবার container অতিক্রম করা path পরীক্ষা করুন।

curl -s -X POST http://127.0.0.1:8000/mermaid/svg \
  -H 'Content-Type: text/plain' \
  --data-binary 'graph TD; A-->B;' | head -c 60

দ্বিতীয় command-এর SVG প্রমাণ করে যে KROKI_MERMAID_HOST resolve হয়েছে এবং companion উত্তর দিয়েছে। প্রথমটি কাজ করলেও দ্বিতীয়টি কাজ না করলে ত্রুটিটি দুই container-এর মধ্যবর্তী অংশে। তাই diagram syntax পরিবর্তন করার আগে docker compose logs kroki পড়ুন।

GET form diagram-কে URL-এ encode করে। কোনো plugin ছাড়াই wiki যেভাবে image embed করে, এটি সেই পদ্ধতি। Documentation-এ এই encoder দেওয়া আছে।

cat hello.dot | python -c "import sys; import base64; import zlib; print(base64.urlsafe_b64encode(zlib.compress(sys.stdin.read().encode('utf-8'), 9)).decode('ascii'))"

Ubuntu-তে এটি python: command not found print করে, কারণ system-এ python3 রয়েছে এবং version ছাড়া python নেই। python3 ব্যবহার করুন। Output-টি /{diagram-type}/{output-format}/{encoded-diagram} আকারের URL-এর শেষে বসে, এবং যেকোনো <img> tag সেটিতে point করতে পারে। এর একটি সীমা আছে: KROKI_MAX_URI_LENGTH-এর default 4096 bytes, তাই দীর্ঘ diagram POST-এর মাধ্যমে পাঠাতে হবে।

Kroki-কে আপনি যে text পাঠান, সেটিই এটি পড়ে; তাই এর security settings-ই গুরুত্বপূর্ণ। KROKI_SAFE_MODE-এর default হলো SECURE, যা তিনটি level-এর মধ্যে সবচেয়ে restrictive, এবং KROKI_PLANTUML_ALLOW_INCLUDE-এর default হলো false। এই default-গুলো রাখা হয়েছে কারণ PlantUML-এর !include directive renderer-এর দৃষ্টিকোণ থেকে file এবং URL পড়ে। সবার জন্য উন্মুক্ত endpoint-এ এগুলো শিথিল করলে আপনার container-এর ভিতরে চলা একটি file reader Internet-এর হাতে তুলে দেওয়া হয়। কোন include path প্রয়োজন তা নিশ্চিত না হওয়া পর্যন্ত এগুলো অপরিবর্তিত রাখুন। প্রয়োজন হলে KROKI_PLANTUML_INCLUDE_PATH দিয়ে সেই path নির্দিষ্ট করুন।

ছোট VPS-এ কোনটি বেশি মেমরি ব্যবহার করে

প্রতিটি container কী চালায় তা জানলে ক্রমটি সহজেই বোঝা যায়।

  • Excalidraw image static file পরিবেশনকারী nginx। তিনটির মধ্যে এটি অনেক কম মেমরি ব্যবহার করে।
  • draw.io Tomcat চালায়, যা একটি Java application server। তাই কেউ diagram আঁকুক বা না আঁকুক, এর সঙ্গে একটি JVM (Java virtual machine) যুক্ত থাকে।
  • Kroki gateway-ও একটি Java service। Manual install-এর জন্য এটি একটি jar হিসেবে সরবরাহ করা হয়।
  • mermaid companion সবচেয়ে বেশি মেমরি ব্যবহার করে। এর Dockerfile Chromium install করে এবং PUPPETEER_EXECUTABLE_PATH=/usr/lib/chromium/chrome সেট করে, কারণ Mermaid একটি প্রকৃত browser engine-এ render করে।

তাই idle অবস্থার সংখ্যা খুব বেশি তথ্য দেয় না। গুরুত্বপূর্ণ সংখ্যা হলো diagram render করার সময়ের spike। KROKI_MERMAID_MAX_CONCURRENCY-এর default মান 6, তাই একই সময়ে 6টি browser render চলতে পারে। প্রকাশিত কোনো সংখ্যার ওপর নির্ভর না করে নিজের server-এ মাপুন।

docker stats --no-stream
docker system df

সবকিছু idle থাকা অবস্থায় প্রথম command-টি চালান। এরপর loop-এর মধ্যে একটি বড় mermaid diagram render করার সময় আবার চালান। ছোট plan-এ spike অস্বস্তিকর হলে অনুমান না করে সীমা নির্ধারণ করুন: Compose service-এ memory limit নির্ধারণ-এ syntax এবং container তার সীমায় পৌঁছালে কী ঘটে তা দেখানো হয়েছে। mermaid companion বাদ দেওয়াও একটি বৈধ সমাধান, কারণ gateway তার মধ্যে built-in থাকা প্রতিটি renderer দিয়ে পরিবেশন চালিয়ে যায়।

এগুলোর কোনোটিতেই user model নেই। তাই সামনে একটি বসান

draw.io-তে কোনো account নেই। Excalidraw-এও কোনো account নেই। Kroki-তে যে request পৌঁছায়, সেটিই এটি প্রক্রিয়া করে। যেকোনো login proxy থেকেই দিতে হবে।

sudo apt update && sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd alice

htpasswd -c ফাইলটি তৈরি করে এবং আগে থেকে থাকা ফাইল overwrite করে। তাই প্রথমবার -c দিন, এরপর আর কখনো নয়।

server {
    listen 443 ssl;
    server_name drawio.example.com;

    location / {
        auth_basic "diagrams";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

sudo nginx -t && sudo systemctl reload nginx দিয়ে এটি প্রয়োগ করুন। nginx -t অংশটিই গুরুত্বপূর্ণ: configuration ত্রুটিপূর্ণ থাকলে reload পুরোনো configuration চালু রাখে। ফলে site কাজ করতে থাকে, কিন্তু আপনার পরিবর্তন কার্যকর হয় না। Reverse proxy configuration, প্রতিটি line-এর ব্যাখ্যা-এ header block এবং এই snippet-এ বাদ থাকা certificate path ব্যাখ্যা করা হয়েছে।

Kroki-এর জন্য Basic authentication সঠিক উপায় নয়। এর কারণ বোঝা গুরুত্বপূর্ণ। একটি wiki page <img> tag ব্যবহার করে Kroki image embed করে। পাঠকের browser সেই URL-টি subresource হিসেবে fetch করে। ভিন্ন origin-এ browser আপনার credentials পাঠায় না। তাই request 401 status নিয়ে ফেরে এবং page-এর প্রতিটি diagram broken image হিসেবে দেখা যায়। এর পরিবর্তে Kroki-কে public Internet থেকে দূরে রাখুন। এটিকে wiki container-এর একই Docker network-এ রাখুন এবং wiki-কে service name ব্যবহার করে সেখানে পৌঁছাতে দিন। host-এ কিছুই publish করবেন না। Compose network কীভাবে service name resolve করে-এ এই পদ্ধতিটি কাজ করার মূল বিষয়টি ব্যাখ্যা করা হয়েছে।

একটি self-hosted wiki-এর পাশে থাকা diagram

সাধারণত এই কারণেই মানুষ এ ধরনের ব্যবস্থা চায়। একটি wiki page-এ ছবি প্রয়োজন হয়, এবং কেউই চায় না ছবিটি কারও laptop থেকে নেওয়া screenshot হোক।

BookStack-এ self-hosted editor সংযুক্ত করার জন্য সরাসরি integration hook রয়েছে। এর default embed URL হলো https://embed.diagrams.net/?embed=1&proto=json&spin=1&configure=1, এবং .env-এ একটি লাইন পরিবর্তন করলেই এটি আপনার container-এ পাঠানো যায়।

DRAWIO=https://drawio.example.com/?embed=1&proto=json&spin=1&configure=1

Query string-টি হুবহু কপি করুন। BookStack-এর documentation-এ বলা হয়েছে, embed=1&proto=json&spin=1 “BookStack-এর সঙ্গে integration কাজ করার জন্য প্রয়োজনীয়”, কারণ এগুলো দুই page-এর পারস্পরিক যোগাযোগে ব্যবহৃত JSON message protocol নির্বাচন করে। একই page-এ stealth=1-এর উল্লেখ আছে, “আপনি যদি অন্য external service ব্যবহার করতে না চান”; self-hosting করার উদ্দেশ্য যদি outbound call বন্ধ করা হয়, তাহলে এই option-টি যোগ করুন। এভাবে configuration করার পর BookStack drawing-টি page-এর পাশে নিজের image storage-এ সংরক্ষণ করে। তাই আপনি যে wiki backup ইতিমধ্যে নেন, সেটিই diagram-এর backup হিসেবেও কাজ করে।

wiki নিজেই যদি এখনো নির্ধারিত না হয়, আগে সেটি ঠিক করুন। BookStack, Wiki.js এবং Outline-এর মধ্যে নির্বাচন হলো আগের সিদ্ধান্ত, কারণ একটি diagram কীভাবে page-এ যুক্ত হবে এবং তাই কোন tool-টি এর সঙ্গে যুক্ত করবেন, তা wiki নির্ধারণ করে।

ব্যর্থতার ধরন এবং যে স্ট্রিংগুলো আপনি দেখবেন

BookStack-এ drawing editor খুলে অনির্দিষ্টকাল ঘুরতে থাকে। Spinner-টি spin=1 এমন একটি handshake-এর অপেক্ষায় থাকে, যা কখনো আসে না। আপনার DRAWIO মানে embed=1&proto=json&spin=1 আছে কি না এবং host অংশে কোনো বানানভুল আছে কি না পরীক্ষা করুন।

HTTPS wiki-তে editor frame ফাঁকা থাকে। Browser console mixed content-এর প্রতিবেদন দেয় এবং https://-এর ভিতরে http:// load করার চেষ্টা দেখায়। Browser frame-টি block করে, তাই draw.io কখনো চালু হয় না। Editor-টি HTTPS-এর মাধ্যমে পরিবেশন করুন।

Kroki 413 Request Entity Too Large ফেরত দেয়। এই string Kroki থেকে নয়, nginx থেকে আসে। nginx-এর client_max_body_size default হলো 1 MB, আর Kroki-র নিজস্ব KROKI_MAX_BODY_SIZE default হলো 1mb। তাই বড় PlantUML source যেটির limit কম, সেটিতে গিয়ে আটকে যায়। উভয় limit বাড়ান।

graphviz কাজ করলেও Mermaid ব্যর্থ হয়। Gateway সচল, কিন্তু companion-এ অনুরোধ পৌঁছাচ্ছে না। docker compose ps দিয়ে service সচল আছে কি না পরীক্ষা করুন। এরপর KROKI_MERMAID_HOST service name-এর সঙ্গে মেলে কি না পরীক্ষা করুন, কারণ এর default হলো 127.0.0.1। gateway container-এর ভিতরে এর অর্থ gateway নিজেই।

Excalidraw collaboration কখনো সংযুক্ত হয় না। আপনি যদি নিজের room server-এর বিরুদ্ধে frontend build করে সেটিকে nginx-এর পেছনে রাখেন, proxy-কে proxy_set_header Upgrade $http_upgrade; এবং proxy_set_header Connection "upgrade"; ব্যবহার করে connection upgrade করতে হবে। এগুলো না থাকলে websocket handshake-এর উত্তর সাধারণ HTTP request হিসেবে দেওয়া হয় এবং session কখনো শুরু হয় না।

Browser cleanup-এর পরে canvas ফাঁকা থাকে। Scene-টি ওই device-এর local storage-এ ছিল এবং server-এ এর কোনো copy নেই। সমাধানটি কোনো setting নয়, বরং একটি অভ্যাস: সংরক্ষণযোগ্য যেকোনো কিছুর জন্য .excalidraw file export করুন।

FAQ

self-hosting করলে draw.io কি আমার diagram ব্যক্তিগত রাখে?

এতে application code আপনার server-এ থাকে। কিন্তু data ব্যক্তিগত থাকা আলাদা বিষয়। draw.io আপনার browser-এ render করে, তাই container-এ কোনো diagram থাকেই না। Privacy নির্ভর করে আপনি file কোথায় সংরক্ষণ করছেন এবং কোন outbound call সক্রিয় রাখছেন তার ওপর। Cloud storage target নিষ্ক্রিয় করতে ?offline=1 ব্যবহার করুন। মনে রাখবেন, DRAWIO_SELF_CONTAINED=1 সেট না করে এবং jgraph/export-server নিজে চালু না করলে export request একটি export server-এ যায়।

আমার self-hosted Excalidraw-এ collaboration কেন কাজ করে না?

Official image page-এ বলা আছে যে self-hosting "sharing or collaboration features" সমর্থন করে না। Live collaboration-এর জন্য আলাদা excalidraw/excalidraw-room websocket server প্রয়োজন। Share link-এর জন্য একটি storage service প্রয়োজন। উভয়টির address build time-এ Vite variable হিসেবে JavaScript bundle-এর মধ্যে compile করা হয়, যেমন VITE_APP_WS_SERVER_URL। তাই running container-এ environment variable সেট করলে কোনো প্রভাব পড়ে না। নিজের room server ব্যবহার করতে হলে আপনার নির্ধারিত value দিয়ে source থেকে frontend build করতে হবে।

নিজের server-এ Mermaid diagram কীভাবে render করব?

Kroki-এর সঙ্গে mermaid companion container চালান এবং KROKI_MERMAID_HOST-এ সেই service name সেট করুন। এরপর diagram text /mermaid/svg-এ POST করুন এবং response থেকে SVG পড়ুন। বিকল্পভাবে diagram-টি একটি GET URL-এ encode করে <img> tag-এ সেই URL দিন। Mermaid-এর browser engine প্রয়োজন বলে companion containerটি Puppeteer-এর মাধ্যমে Chromium চালায়। তাই memory-এর জন্য পরিকল্পনা করুন: KROKI_MERMAID_MAX_CONCURRENCY-এর default একসঙ্গে sixটি render।

এই tool-গুলোর সামনে কি password প্রয়োজন?

হ্যাঁ, কারণ এগুলোর কোনো account নেই। যে কেউ URL পেলে draw.io এবং Excalidraw তাকে পূর্ণ editor ব্যবহার করতে দেয়। Kroki-তে পাঠানো যেকোনো text-ই এটি render করে। দুইটি editor-এর জন্য reverse proxy-তে basic authentication যথেষ্ট। Kroki-এর ক্ষেত্রে এটিকে wiki-এর সঙ্গে shared Docker network-এ unpublished রাখুন। কারণ কোনো <img> request reader-এর browser থেকে অন্য origin-এ credentials বহন করবে না। ফলে প্রতিটি embedded diagram নষ্ট হবে।

#diagrams#drawio#excalidraw#mermaid#kroki#docker