নিজের 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/drawioTunnel-এর মাধ্যমে http://127.0.0.1:8080/?offline=1&https=0 খুলুন। README-তে ?offline=1-কে “cloud storage support নিষ্ক্রিয় করে এমন security feature” বলা হয়েছে। এটি না থাকলে editor Google Drive, OneDrive এবং GitHub-কে save target হিসেবে দেখায়; এগুলো অন্য পক্ষের server।
127.0.0.1-এ bind করলেই port-টি public internet থেকে আড়ালে থাকে। সাধারণ -p 8080:8080 ufw দ্বারা filter হয় না, কারণ Docker নিজস্ব iptables rule এমন chain-এর আগে বসায় যেগুলো ufw পরিচালনা করে। ফলে firewall সঠিক দেখালেও port-টি সবার জন্য সাড়া দেয়। Docker কীভাবে ufw-এর নিয়ম এড়িয়ে সরাসরি 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-কে “শেষে slash-সহ public deployment URL” এবং DRAWIO_BASE_URL-কে “শেষে slash ছাড়া একই URL” হিসেবে সংজ্ঞায়িত করা হয়েছে। viewer, lightbox এবং embed code path-এ এগুলো ব্যবহার করা হয়। আপনি যদি https://www.example.com/drawio/-এর মতো subpath-এর অধীনে editor পরিবেশন করেন, তবে দুটি value-তেই সেই subpath থাকতে হবে, কারণ app এগুলো থেকে viewer এবং embed URL তৈরি করে।
Persistence নেই, এবং এটিই নকশা। ওই Compose file-এ কোনো volume নেই, কারণ container-এ diagram data সংরক্ষিত হয় না। একটি .drawio file হলো XML, যা editor আপনার browser-এ পাঠায়। আপনি যে save target বেছে নেন, file সেখানেই যায়: আপনার নিজের machine-এ download হিসেবে, অথবা editor-কে embed করা application-এ। সেই destination-এর backup নিন। যদি destination VPS-এর কোনো folder হয়, তাহলে সুরক্ষিত রাখার মতো গুরুত্বপূর্ণ জিনিস হলো সেই folder এবং সেখানে পৌঁছাতে ব্যবহৃত file manager; কারণ draw.io কোনো কিছুর copy রাখে না।
আপনার server থেকে এখনও যা বাইরে যায়। আগের তুলনায় কম, কারণ export এখন আর কোথাও পাঠানো হয় না। README-তে এখন EXPORT_URL এবং DRAWIO_SELF_CONTAINED-কে অপসারিত variable হিসেবে তালিকাভুক্ত করা হয়েছে; এগুলোর কোনো প্রভাব নেই। এগুলো editor-কে আলাদা jgraph/export-server image-এর দিকে নির্দেশ করত, যেটি “end of life-এ পৌঁছেছে”। এখন entrypoint window.EXPORT_URL = null-কে PreConfig.js-এ লেখে। এর অর্থ editor-কে জানানো যে কোনো export service নেই। বাস্তবে Export as > PDF নির্বাচন করলে browser-এর print dialog খোলে। তাই PDF-এর জন্য diagram-এর copy অন্তর্ভুক্ত করার option দেখানো হয় না, এবং server-rendered PNG ও JPEG export আড়াল থাকে। Browser-এ rendered PNG, JPEG এবং SVG export এখনও কাজ করে। ENABLE_DRAWIO_PROXY default হিসেবে বন্ধ থাকে এবং এমন একটি /proxy endpoint সক্রিয় করে, যা browser-এর হয়ে external image URL fetch করে। তাই প্রয়োজন না হলে এটি বন্ধ রাখুন।
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:latestContainer-এর ভিতরে nginx port 80-এ একটি compiled JavaScript bundle serve করে। Published image-টি compressed অবস্থায় প্রায় 41 MB (Docker Hub, October 2026)। এতে কত কম উপাদান আছে, তা থেকেই বিষয়টি বোঝা যায়। কোনো database নেই, session store নেই, upload directory নেই, কারণ server-এ সংরক্ষণ করার মতো কিছু নেই।
Image page-এ সীমাবদ্ধতাটি স্পষ্টভাবে বলা আছে: "At the moment, self-hosting your own instance doesn't support sharing or collaboration features." Interface-এ button-গুলো এখনও দেখা যায়, তাই কারণটি জানা দরকার। Live collaboration-এর জন্য একটি websocket server প্রয়োজন, যা আলাদাভাবে excalidraw/excalidraw-room হিসেবে published। Share link-এর জন্য encrypted scene রাখার একটি storage service প্রয়োজন। উভয়টির address build time-এ Vite variable (VITE_APP_WS_SERVER_URL, VITE_APP_BACKEND_V2_GET_URL, VITE_APP_BACKEND_V2_POST_URL) হিসেবে bundle-এ সংকলিত হয়, এবং 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-এর বর্তমান অবস্থা যাচাই করে তারপর তার ওপর পরিকল্পনা করুন: October 2026 অনুযায়ী, Docker Hub-এ excalidraw/excalidraw-room image-এর সর্বশেষ push December 2023-এ হয়েছিল।
একটি drawing আসলে কোথায় থাকে। Scene-টি browser-এর local storage-এ, সেই device-এ এবং সেই origin-এর জন্য সংরক্ষিত থাকে। একই URL একটি private window-এ খুললে canvas খালি থাকে। এটি নিজে যাচাই করার দ্রুততম উপায়। Site data মুছে ফেললে drawing-টিও মুছে যায়, এবং পুনরুদ্ধারের জন্য 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 60Graphviz 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 alicehtpasswd -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-এর ব্যাখ্যা-এ এই snippet-এ বাদ থাকা header block এবং certificate path ব্যাখ্যা করা হয়েছে।
Kroki-এর জন্য Basic authentication সঠিক উপায় নয়। এর কারণ বোঝা গুরুত্বপূর্ণ। একটি wiki page <img> tag দিয়ে Kroki image embed করে। পাঠকের browser সেই URL-টি cross-origin subresource হিসেবে fetch করে। Kroki host-এর জন্য আগে থেকে সংরক্ষিত Basic credential থাকলে browser সেগুলো পাঠাবে। কিন্তু বর্তমান browser-গুলো cross-origin image-এর জন্য login prompt দেখায় না। তাই যে পাঠক সরাসরি Kroki host-এ sign in করেননি, তিনি 401 পাবেন এবং 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=1Query 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 diagram data-এর জন্য অপেক্ষা করছে। proto=json ব্যবহার করলে editor প্রস্তুত হলে একটি init event পাঠায় এবং জবাবে diagram বহনকারী একটি load action প্রত্যাশা করে। তাই এই আদান-প্রদান সম্পন্ন না হলে spinner চলতেই থাকে। আপনার DRAWIO value-তে embed=1&proto=json&spin=1 উপস্থিত আছে কি না পরীক্ষা করুন। Host অংশে বানান ভুল আছে কি না তাও দেখুন।
HTTPS wiki-তে editor frame ফাঁকা থাকে। Browser console mixed content-এর error দেখায় এবং https://-এর ভিতরে http:// load করার কথা জানায়। Browser frame-টি block করে, তাই draw.io কখনো চালু হয় না। Editor-কে HTTPS-এর মাধ্যমে serve করুন।
Kroki 413 Request Entity Too Large ফেরত দেয়। nginx এই error-টির জন্য ঠিক এই wording ব্যবহার করে। তাই প্রথমে proxy পরীক্ষা করুন। তবে Kroki নিজেও 413 পাঠাতে পারে। Kroki-এর documentation-এ এটিকে Content Too Large বলা হয়েছে। nginx-এর client_max_body_size default হলো 1 MB। বড় PlantUML source এই সীমায় পৌঁছে যায়, কারণ gateway-এর ভিতরেই PlantUML render হয়। Kroki-এর নিজস্ব KROKI_MAX_BODY_SIZE-এর default-ও 1mb। তবে এটি শুধু diagrams.net, Excalidraw এবং Mermaid companion container-এ প্রযোজ্য। তাই বড় Mermaid source যেকোনো একটি সীমায় পৌঁছাতে পারে। প্রথমে client_max_body_size-এর মান বাড়ান। Diagram কোনো companion-এর মাধ্যমে গেলে সেই companion-এ KROKI_MAX_BODY_SIZE-এর মানও বাড়ান।
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 তৈরি করে সেটিকে 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 কোথায় save করছেন এবং কোন outbound call চালু রাখছেন তার ওপর। Cloud storage target বন্ধ করতে ?offline=1 ব্যবহার করুন এবং ENABLE_DRAWIO_PROXY বন্ধ রাখুন। Export-ও কোনো data বাইরে পাঠায় না: image-এ কোনো export service configure করা নেই, তাই PDF browser-এর print dialog-এর মাধ্যমে তৈরি হয় এবং DRAWIO_SELF_CONTAINED-এর আর কোনো প্রভাব থাকে না।
self-hosted Excalidraw-এ collaboration কাজ করে না কেন?
Official image page-এ বলা আছে যে self-hosting “sharing বা collaboration feature সমর্থন করে না”। Live collaboration-এর জন্য আলাদা excalidraw/excalidraw-room websocket server দরকার, আর share link-এর জন্য storage service দরকার। উভয়ের address build time-এ Vite variable হিসেবে JavaScript bundle-এ compile করা থাকে, যেমন VITE_APP_WS_SERVER_URL। তাই চলমান container-এ environment variable সেট করলে কোনো প্রভাব পড়ে না। নিজের room server ব্যবহার করতে হলে নিজের value দিয়ে source থেকে frontend build করতে হবে।
নিজের server-এ Mermaid diagram কীভাবে render করব?
Kroki তার mermaid companion container-সহ চালান এবং KROKI_MERMAID_HOST-এ সেই service-এর নাম সেট করুন। এরপর diagram text /mermaid/svg-এ POST করে response থেকে SVG পড়ুন। অথবা diagram-টি একটি GET URL-এ encode করে কোনো <img> tag-কে সেই URL-এ নির্দেশ করুন। Mermaid-এর browser engine প্রয়োজন, তাই companion Puppeteer-এর মাধ্যমে Chromium চালায়। সেই কারণে memory পরিকল্পনা করে বরাদ্দ করুন: KROKI_MERMAID_MAX_CONCURRENCY-এর default একসঙ্গে sixটি render।
এই tool-গুলোর সামনে কি password দিতে হবে?
হ্যাঁ, কারণ কোনোটিতেই account নেই। draw.io এবং Excalidraw URL খুঁজে পাওয়া যে কাউকে পূর্ণ editor দেয়, আর Kroki-তে পাঠানো যেকোনো text render হয়। দুই editor-এর জন্য reverse proxy-তে basic authentication যথেষ্ট। Kroki-কে wiki-এর সঙ্গে shared Docker network-এ unpublished রাখুন। কারণ অন্য origin-এর <img>-এর জন্য reader-এর browser login prompt দেখাবে না। ফলে Kroki-তে সরাসরি sign in না করা যে কারও জন্য embedded diagram কাজ করবে না।