VPS-এ নিজের SimpleX chat server সেটআপ করার নিয়ম
আপনার নিজস্ব SimpleX SMP relay সার্ভার VPS-এ চালানোর পূর্ণাঙ্গ গাইড। এখানে unprivileged service user তৈরি, TLS কনফিগারেশন, প্রয়োজনীয় পোর্ট এবং ব্যাকআপ নেওয়ার সঠিক পদ্ধতি দেওয়া হলো।
একটি self-hosted SimpleX chat server যা করে
একটি SimpleX chat server self-host করার জন্য আপনাকে একটি VPS-এ একটি daemon চালাতে হবে: smp-server, যা SMP (simplex messaging protocol)-এর জন্য relay হিসেবে কাজ করে। এটি সেই message queue-গুলো ধারণ করে যেখানে আপনার পরিচিতরা লেখে এবং যেখান থেকে তারা পড়ে। xftp-server নামে একটি দ্বিতীয়, ঐচ্ছিক daemon ফাইল ট্রান্সফার relay করে। উভয়ই একই প্রজেক্ট, simplexmq থেকে আসে এবং প্রতিটি একটি single binary, একটি config file এবং একটি append-only log নিয়ে গঠিত।
এটি অ্যাপ ব্যবহারকারীর জন্য নয়, বরং অপারেটরের জন্য লেখা হয়েছে। relay-তে কোনো account, contact list বা chat history থাকে না। এটি কেবল queue, কিছু undelivered ciphertext এবং এটিকে শনাক্তকারী একটি certificate ধারণ করে। আপনাকে যা নিশ্চিত করতে হবে তা হলো uptime, সামান্য disk space এবং আপনার সার্ভারের মধ্য দিয়ে যাওয়া metadata-র ব্যবস্থাপনা।
নিচের প্রতিটি command, path, port এবং flag প্রজেক্টের নিজস্ব documentation থেকে নেওয়া হয়েছে: SMP server hosting page, XFTP server page এবং protocol security document। যেখানে কোনো সংখ্যার গুরুত্ব আছে, সেখানে তার পাশের পৃষ্ঠার নাম উল্লেখ করা হয়েছে।
কেন ব্যবহারকারীর পরিচয়হীন নেটওয়ার্কেও রিলে (relay) প্রয়োজন
SimpleX-এ কোনো ইউজারনেম, ফোন নম্বর বা অ্যাকাউন্ট আইডি নেই। একটি কন্টাক্ট হলো একমুখী কিউ (unidirectional queue): এটি কোনো রিলে-তে থাকা একটি ঠিকানা, যেখানে এক পক্ষ মেসেজ লেখে এবং অন্য পক্ষ তা পড়ে। আপনার দুটি কন্টাক্টের মধ্যে এমন কোনো পরিচয়সূচক তথ্য নেই যা দিয়ে সার্ভার তাদের সম্পর্ক স্থাপন করতে পারে।
এই কিউগুলোকে কোনো না কোনো জায়গায় থাকতে হয়, যার কারণটি খুবই সাধারণ। দুটি ফোন খুব কম সময়ই একই সময়ে অনলাইনে থাকে। তাই এমন কিছু থাকতে হয় যা এখন মেসেজটি গ্রহণ করবে এবং অন্য ডিভাইসটি না চাওয়া পর্যন্ত তা জমা রাখবে। SMP রিলে-এর পুরো কাজই হলো এটি। এর মানে হলো, দুটি ডিভাইস কখনোই সরাসরি একে অপরের সাথে সংযুক্ত হয় না, তাই কেউ কারো IP (internet protocol) অ্যাড্রেস জানতে পারে না। রিলে নিজেই এই তথ্য আদান-প্রদানের ঝুঁকি গ্রহণ করে।
রিলে-এর হোস্টনেম কিউ অ্যাড্রেসের অংশ, তাই আপনি যে আমন্ত্রণ লিঙ্কটি শেয়ার করেন, তার ভেতরেই এটি থাকে। এই বিষয়টি মাথায় রাখুন যখন আপনি শেষের দিকে থাকা থ্রেট মডেল (threat model) পড়বেন।
একটি রিলে যা দেখতে পায় এবং যা পায় না
প্রকল্পটি protocol/security.md-এ এটিকে একটি থ্রেট মডেল হিসেবে উল্লেখ করেছে। কোনো কিছু ইনস্টল করার আগে এটি পড়ে নেওয়া জরুরি, কারণ এই গাইডের পর সেই রিলেটি আপনার নিয়ন্ত্রণে থাকবে। একটি রিলে, এমনকি আক্রমণকারীর সম্পূর্ণ নিয়ন্ত্রণে থাকা রিলেও, বার্তার বিষয়বস্তু বা ধরন জানতে পারে না। এটি কোনো বার্তা শনাক্ত না করে যোগ করতে, নকল করতে বা বিকৃত করতে পারে না এবং সক্রিয় আক্রমণের মাধ্যমে এন্ড-টু-এন্ড এনক্রিপশন ভাঙতে পারে না।
একই পৃষ্ঠায় একটি রিলে কী করতে পারে তার তালিকা দেওয়া আছে। এটি জানতে পারে কখন একজন কিউ (queue) প্রাপক অনলাইনে আছেন। এটি একটি কিউ দিয়ে কতগুলো বার্তা আদান-প্রদান হচ্ছে তা গণনা করতে পারে। এটি প্রাপকের IP address জানতে পারে। এটি ভবিষ্যতে কিউ-তে আসা প্রতিটি বার্তা মুছে ফেলতে পারে অথবা সেই কিউ-এর অবস্থা সম্পর্কে মিথ্যা তথ্য দিতে পারে।
সুতরাং, বিভাজনটি স্পষ্ট। গোপনীয়তা বজায় রাখা ক্লায়েন্টের কাজ এবং সেলফ-হোস্টিং এতে কোনো প্রভাব ফেলে না। মেটাডেটা এবং প্রাপ্যতা রিলে অপারেটরের দায়িত্ব, আর সেলফ-হোস্টিং এই দুটির নিয়ন্ত্রণই আপনার হাতে তুলে দেয়।
শুরু করার আগে আপনার যা প্রয়োজন
- Ubuntu 22.04 বা 24.04 চালিত একটি VPS। এই প্রজেক্টটি শুধুমাত্র এই দুটি ভার্সনের জন্যই x86-64 এবং aarch64 আর্কিটেকচারে বিল্ড করা রিলিজ বাইনারি প্রকাশ করে।
- একটি ডোমেইন নাম যার একটি A রেকর্ড আপনার VPS-এর দিকে নির্দেশ করছে, এবং IPv6 থাকলে একটি AAAA রেকর্ডও থাকতে হবে। ডকুমেন্টেশনে উদাহরণের জন্য
smp1.example.comব্যবহার করা হয়েছে। - রুট (root) বা
sudoঅ্যাক্সেস, এবং ফায়ারওয়াল কনফিগার করার সময় ব্যবহারের জন্য একটি দ্বিতীয় SSH সেশন খোলা রাখুন। - সার্ভারের বাইরে ব্যাকআপ রাখার জন্য কোনো জায়গা, কারণ কনফিগারেশন ডিরেক্টরিটিই হলো সার্ভারের পরিচয়।
ARM ইনস্ট্যান্সের ক্ষেত্রে x86-64-এর পরিবর্তে aarch64 অ্যাসেটটি নিন। এই গাইডের অন্য কোনো কিছু পরিবর্তন হবে না, এবং ARM এবং x86 VPS প্ল্যানের মধ্যে পার্থক্য মূলত দাম এবং প্রতি কোরের গতির ওপর নির্ভর করে, এই সফটওয়্যার চলবে কি না তার ওপর নয়।
"latest" এর পরিবর্তে একটি নির্দিষ্ট রিলিজ ইনস্টল করুন
এই প্রজেক্টটি একটি ইনস্টল স্ক্রিপ্ট প্রদান করে যা বর্তমান রিলিজটি ডাউনলোড করে এবং একটি simplex-servers-update কমান্ড রেজিস্টার করে। এটি কাজ করে। তবুও ভার্সনটি পিন (pin) করে রাখুন: যদি কোনো রিলে-এর বাইনারি আপনার অজান্তে পরিবর্তিত হয়, তবে কোনো সমস্যা দেখা দিলে আপনি সেই রিলের আচরণ বিশ্লেষণ করতে পারবেন না।
2026 সালের আগস্ট মাস অনুযায়ী বর্তমান simplexmq রিলিজ হলো v6.5.0, যা 29 এপ্রিল 2026-এ প্রকাশিত হয়েছে। আপনার কাঙ্ক্ষিত ট্যাগের জন্য releases page চেক করুন এবং নিচের সব জায়গায় সেই ট্যাগটি ব্যবহার করুন।
sudo useradd -m smp
sudo install -d -o smp -g smp -m 755 /etc/opt/simplex /var/opt/simplexuseradd -m smp কোনো পাসওয়ার্ড সেট করে না, তাই কেউ সরাসরি smp হিসেবে লগইন করতে পারে না। অন্য কিছু চালানোর আগেই নিজে থেকে দুটি ডিরেক্টরি তৈরি করুন, কারণ /etc/opt ডিরেক্টরিটি root-এর মালিকানাধীন এবং এর মোড হলো 755, যার ফলে smp ব্যবহারকারী তার নিজস্ব কনফিগারেশন ডিরেক্টরি তৈরি করার জায়গা পায় না।
VER=v6.5.0
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/smp-server-ubuntu-24_04-x86-64" -o /tmp/smp-server
sha256sum /tmp/smp-serverসেই হ্যাশটিকে একই ট্যাগের রিলিজ নোটে প্রকাশিত SHA2-256 চেকসামের সাথে তুলনা করুন। প্রজেক্টটি রিলিজ চেকসামগুলোকে SimpleX Chat কি FB44AF81A45BDE327319797C85107E357D4A17FC দিয়ে স্বাক্ষরও করে, যা server page-এ নথিবদ্ধ আছে। তাই আপনি হ্যাশটি যে পেজ থেকে পড়েছেন সেটিকে বিশ্বাস করার পরিবর্তে স্বাক্ষরটি যাচাই করতে পারেন।
sudo install -m 755 -o root -g root /tmp/smp-server /usr/local/bin/smp-serverইচ্ছাকৃতভাবে এটিকে root-এর মালিকানাধীন হিসেবে ইনস্টল করুন। সার্ভিসটি smp হিসেবে চলে, তাই সার্ভিসটি কোনোভাবে কম্প্রোমাইজড হলেও এটি যে বাইনারি থেকে শুরু হয় তা পুনরায় লিখতে পারবে না।
সার্ভার এবং এর দ্বারা প্রদর্শিত দুটি সিক্রেট ইনিশিয়ালাইজ করুন
sudo su smp -c "smp-server init --yes --store-log --daily-stats --no-password --fqdn=smp1.example.com"--store-log(-l) কিউগুলোর একটি অ্যাপেন্ড-অনলি লগ/var/opt/simplex/smp-server-store.log-এ লেখে, যাতে রিস্টার্টের পরেও রিলে সচল থাকে। এটি ছাড়া রিস্টার্ট দিলে প্রতিটি কিউ মুছে যায়, যার ফলে আপনার মাধ্যমে রাউট করা প্রতিটি যোগাযোগ কাজ করা বন্ধ করে দেয়।--daily-stats(-s) কাউন্টারগুলোকে CSV ফরম্যাটে/var/opt/simplex/smp-server-stats.daily.log-এ লেখে।--fqdnআপনার ডোমেইনকে জেনারেট করা সার্টিফিকেটে যুক্ত করে। আপনার কোনো ডোমেইন না থাকলে--ipব্যবহার করুন।--no-passwordযে কাউকে আপনার রিলেতে কিউ তৈরি করার অনুমতি দেয়। এটিকে প্রাইভেট রাখতে, ইনিশিয়ালের পর/etc/opt/simplex/smp-server.ini-এর অধীনে[AUTH]-এcreate_passwordসেট করুন। কমান্ড লাইনে--passwordপাস করার চেয়ে এটি করা ভালো, কারণ কমান্ড লাইনের কমান্ড শেল হিস্ট্রি এবং প্রসেস লিস্টে দৃশ্যমান থাকে।
Init একটি সার্টিফিকেট তৈরি করে এবং দুটি ভ্যালু প্রদর্শন করে যা আপনাকে অবশ্যই সংরক্ষণ করতে হবে। প্রথমটি হলো ফিঙ্গারপ্রিন্ট, একটি base64 স্ট্রিং যা /etc/opt/simplex/fingerprint-এও লেখা থাকে। দ্বিতীয়টি হলো সম্পূর্ণ সার্ভার অ্যাড্রেস, যা ফিঙ্গারপ্রিন্ট এবং আপনার হোস্টনামের সমন্বয়ে গঠিত। উভয়ই এখনই কপি করে রাখুন।
Init /etc/opt/simplex/ca.key ফাইলটিও তৈরি করে, এবং ডকুমেন্টেশনে এই ফাইলটিকে অফলাইন স্টোরেজে সরিয়ে রাখার পরামর্শ দেওয়া হয়েছে। এর কারণটি গুরুত্বপূর্ণ: ক্লায়েন্টরা সেই সার্টিফিকেট অথরিটির ফিঙ্গারপ্রিন্ট পিন করে রাখে, তাই যার কাছে ca.key থাকবে সে একটি নতুন সার্ভার সার্টিফিকেট ইস্যু করতে পারবে যা আপনার ক্লায়েন্টরা আপনারই সার্টিফিকেট হিসেবে গ্রহণ করবে। পরবর্তীতে smp-server cert ব্যবহার করে সার্ভার সার্টিফিকেট রোটেশন করার সময় কেবল তখনই আপনার এটি প্রয়োজন হবে।
Init-কে একবারই করার মতো একটি ধাপ হিসেবে বিবেচনা করুন। আপনার অ্যাড্রেসের ফিঙ্গারপ্রিন্টটি এর দ্বারা জেনারেট করা অথরিটি থেকে আসে, তাই সেই অথরিটিকে পুনরায় জেনারেট করলে আপনি একটি ভিন্ন অ্যাড্রেস পাবেন এবং আপনার দেওয়া আগের অ্যাড্রেসটি অকার্যকর হয়ে যাবে।
systemd-এর অধীনে একটি unprivileged user হিসেবে এটি চালান
/etc/systemd/system/smp-server.service লিখুন, ঠিক যেভাবে নথিপত্রে দেওয়া আছে:
[Unit]
Description=SMP server systemd service
[Service]
User=smp
Group=smp
Type=simple
ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
LimitNOFILE=65535
KillSignal=SIGINT
TimeoutStopSec=infinity
[Install]
WantedBy=multi-user.targetআপস্ট্রিম ইউনিটে AmbientCapabilities=CAP_NET_BIND_SERVICE-ও থাকে। এই লাইনটি থাকার কারণ হলো প্রসেসটি smp হিসেবে চলে এবং 1024-এর নিচের পোর্টগুলো non-root প্রসেসের জন্য বন্ধ থাকে, তাই এটি ছাড়া ডেমোনটি 80 বা 443 পোর্টে bind করতে পারে না। আপনি যদি এই পোর্টগুলো ব্যবহার করেন তবে এটি যোগ করুন। LimitNOFILE=65535 গুরুত্বপূর্ণ কারণ প্রতিটি সাবস্ক্রাইব করা ক্লায়েন্ট একটি ওপেন TCP কানেকশন ধরে রাখে এবং ডিফল্ট লিমিট একটি ব্যস্ত রিলে-র প্রয়োজনের তুলনায় অনেক কম। ExecStopPost প্রতিবার বন্ধ করার সময় স্টোর লগটিকে একটি .bak ফাইলে কপি করে, যা আপনাকে একটি ফ্রি রোলব্যাক পয়েন্ট দেয়।
sudo systemctl daemon-reload
sudo systemctl enable --now smp-server
sudo systemctl status smp-server
sudo journalctl -fu smp-serverসফলভাবে চালু হলে সার্ভারের ঠিকানা লগ হিসেবে দেখাবে। এরপর নিশ্চিত করুন যে সকেটগুলো আসলে ওপেন আছে কি না:
sudo ss -tlnp | grep -E ':(443|5223)'উভয় লাইনেই smp-server নাম থাকা উচিত। কোনো sudo অধিকার ছাড়া নিজস্ব অ্যাকাউন্টের অধীনে ডেমোন চালানো হলো একটি VPS-এ প্রতি-সার্ভিস অ্যাকাউন্ট-এ বর্ণিত অভ্যাসের মতোই, এবং এটিই একটি নেটওয়ার্ক ডেমোনের বাগ-কে root shell-এ পরিণত হওয়া থেকে আটকায়।
কোন পোর্টগুলো খুলবেন এবং কোনটি বন্ধ রাখবেন
ডকুমেন্টেশনে তিনটি পোর্টের তালিকা দেওয়া হয়েছে: 5223/tcp, 443/tcp এবং 80/tcp। পোর্ট 5223 হলো SMP ট্রান্সপোর্ট। সফটওয়্যারের ডিফল্ট কনফিগারেশনে port: 5223,443-কে [TRANSPORT]-এর অধীনে সেট করা থাকে, তাই একই প্রোটোকল 443 পোর্টেও সাড়া দেয়। এটি গুরুত্বপূর্ণ কারণ অনেক সীমাবদ্ধ নেটওয়ার্কে শুধুমাত্র 443 পোর্ট দিয়ে আউটবাউন্ড ট্রাফিক যাওয়ার অনুমতি থাকে। পোর্ট 80 শুধুমাত্র ঐচ্ছিক ইনফরমেশন পেজ এবং সেটিকে HTTPS-এ রিডাইরেক্ট করার জন্য প্রয়োজন।
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5223/tcp
sudo ufw enable5224 পোর্টটি খুলবেন না। এটি কন্ট্রোল পোর্ট এবং ডকুমেন্টেশন অনুযায়ী সার্ভার নিজেই nc 127.0.0.1 5224 ব্যবহার করে এটিতে অ্যাক্সেস করে। এটি সার্ভারের অবস্থা প্রদর্শন করে এবং কিউ (queue) মুছে ফেলতে পারে, তাই এটি লুপব্যাক ইন্টারফেসে রাখা উচিত এবং [AUTH]-এর অধীনে অ্যাডমিন ও ব্যবহারকারীর পাসওয়ার্ড সেট করা থাকা জরুরি। আপনি যদি এই টুলটি ব্যবহারে নতুন হন, তবে VPS-এ ufw-এর মৌলিক বিষয়সমূহ নিবন্ধটি পড়ুন, যেখানে রুল অর্ডারিং এবং নিজেকে লক-আউট হওয়া থেকে বাঁচার উপায় আলোচনা করা হয়েছে।
আরও একটি নিয়ন্ত্রণ ব্যবস্থা অনেক সময় ব্যবহারকারীদের বিভ্রান্ত করে। বেশিরভাগ প্রোভাইডার সার্ভারের ভেতরে থাকা ufw থেকে আলাদা একটি নেটওয়ার্ক ফায়ারওয়াল তাদের কন্ট্রোল প্যানেলে চালায়। ফলে একটি পোর্ট ufw-তে খোলা থাকলেও আপনার কাছে পৌঁছানোর আগেই তা ড্রপ হতে পারে।
আপনার ক্লায়েন্টদের জন্য প্রয়োজনীয় সার্ভার অ্যাড্রেস
smp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]এই স্ট্রিংটিই হলো সম্পূর্ণ ক্লায়েন্ট-সাইড কনফিগারেশন। এটি অ্যাপের সার্ভার সেটিংসে পেস্ট করুন, অথবা অ্যাপে প্রদর্শিত QR কোডটি স্ক্যান করতে দিন। ডকুমেন্টেশনে উল্লেখ আছে যে, QR কোডের মধ্যে পাসওয়ার্ডটিও থাকে, তাই কেউ এটি স্ক্যান করলে সে আপনার সার্ভারের মাধ্যমে মেসেজ গ্রহণ করতে পারবে।
ডকুমেন্টেশনে বর্ণিত একটি আচরণ সবাইকে অবাক করে। অ্যাপে আপনার সার্ভার যোগ করলে তা শুধুমাত্র সেই মুহূর্ত থেকে তৈরি করা কন্টাক্টগুলোর ওপর প্রভাব ফেলে। বিদ্যমান কন্টাক্টগুলো তাদের কিউ (queue) যে রিলেতে তৈরি হয়েছিল সেখানেই থেকে যায় এবং সেগুলো মাইগ্রেট হয় না। এই কারণেই একটি রিলে প্রতিস্থাপনের পরের দিনই আপনি সেটি বন্ধ করতে পারেন না।
একটি XFTP ফাইল রিলে যোগ করা
XFTP (SimpleX file transfer protocol) হলো নেটওয়ার্কের ফাইল আদান-প্রদানের অংশ এবং এটি নিজস্ব ঠিকানা বিশিষ্ট একটি আলাদা ডেমোন। প্রজেক্টের XFTP ঘোষণা অনুযায়ী, রিলেগুলোর কাছে ফাইলের কোনো মেটাডেটা থাকে না: এগুলো কেবল 256kb, 1mb বা 4mb আকারের আলাদা আলাদা অংশ দেখতে পায়, যা বেনামী ক্রেডেনশিয়ালের মাধ্যমে অ্যাক্সেস অনুমোদিত হয়। একজন প্রেরক একটি ফাইলের অংশগুলোকে একাধিক রিলের মধ্যে ছড়িয়ে দিতে পারেন, তাই আপনার সার্ভারে পুরো ফাইল নয়, বরং ফাইলের টুকরো জমা থাকে।
sudo useradd -m xftp
sudo install -d -o xftp -g xftp -m 755 /etc/opt/simplex-xftp /var/opt/simplex-xftp /srv/xftp
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/xftp-server-ubuntu-24_04-x86-64" -o /tmp/xftp-server
sudo install -m 755 -o root -g root /tmp/xftp-server /usr/local/bin/xftp-server
sudo su xftp -c "xftp-server init -l --fqdn=xftp1.example.com -q '20gb' -p /srv/xftp/"এর কনফিগারেশন /etc/opt/simplex-xftp/-এ, স্টেট /var/opt/simplex-xftp/-এ এবং ফাইলের টুকরোগুলো -p-এ নির্ধারিত ডিরেক্টরিতে থাকে। systemd ইউনিটটি User=xftp এবং ExecStart=/usr/local/bin/xftp-server start +RTS -N -RTS-এর সাথে একই কাঠামোর। ইনিট (Init) প্রক্রিয়াটি SMP-এর মতোই একটি xftp:// ঠিকানা প্রদর্শন করে, যার নিজস্ব ফিঙ্গারপ্রিন্ট /etc/opt/simplex-xftp/fingerprint-এ থাকে।
এখানে একটি পোর্ট সংঘর্ষের (collision) বিষয়টি মাথায় রাখতে হবে। XFTP সার্ভারের জন্য নির্ধারিত পোর্ট হলো 443 এবং SMP কনফিগারেশনেও 443 পোর্টটি উল্লেখ থাকে। দুটি প্রসেস একই ঠিকানায় একই পোর্ট ব্যবহার করতে পারে না, তাই একটি VPS-এ যেকোনো একটিকে ছাড় দিতে হবে। সবচেয়ে সহজ সমাধান হলো SMP-এর [TRANSPORT] সেকশনে port: 5223 পরিবর্তন করা এবং 443 পোর্টটি ফাইল রিলের জন্য ছেড়ে দেওয়া; তবে এর ফলে সীমাবদ্ধ নেটওয়ার্ক ব্যবহারকারী ক্লায়েন্টদের জন্য 443 পোর্ট ব্যাকআপ হিসেবে কাজ করবে না। বিকল্প উপায় হলো একই VPS-এ দ্বিতীয় একটি IP ঠিকানা ব্যবহার করা অথবা দ্বিতীয় একটি VPS নেওয়া।
কোটা নির্ধারণের সময় বাস্তবসম্মত হোন। -q '20gb' হলো আপনার ডিস্কের প্রাপ্যতার একটি প্রতিশ্রুতি। ফাইল রিলে হলো সেই অংশ যা সবচেয়ে বেশি ডিস্ক এবং ব্যান্ডউইথ ব্যবহার করে। মেসেজ রিলে খুব সামান্যই ডিস্ক বা ব্যান্ডউইথ খরচ করে।
ডিস্কে কী থাকে এবং ব্যাকআপ কী পুনরুদ্ধার করে
দুটি ডিরেক্টরি গুরুত্বপূর্ণ। /etc/opt/simplex/ হলো সার্ভারের পরিচয়: smp-server.ini, সার্ভার সার্টিফিকেট ও কি (key), ca.key এবং fingerprint। /var/opt/simplex/ হলো সার্ভারের অবস্থা (state): smp-server-store.log ডিরেক্টরিতে কিউ (queues) এবং restore_messages: on সক্রিয় থাকলে ডেলিভারি না হওয়া মেসেজগুলো থাকে, সেই সাথে থাকে দৈনিক পরিসংখ্যানের ফাইল।
sudo systemctl stop smp-server
sudo tar czf /root/simplex-backup.tgz -C / etc/opt/simplex var/opt/simplex
sudo chmod 600 /root/simplex-backup.tgz
sudo systemctl start smp-serverএই আর্কাইভটি কী তা পরিষ্কারভাবে বুঝে নিন। এটি কোনো মেসেজ আর্কাইভ নয়: কিউতে থাকা আইটেমগুলো এমন কি (key) দিয়ে এনক্রিপ্ট করা সাইফারটেক্সট, যা রিলে কখনোই ধারণ করেনি, এবং সরবরাহকৃত [STORE_LOG] কনফিগারেশন অনুযায়ী 21 দিন পর মেসেজগুলো এমনিতেই মুছে যায়। এটি সার্ভারের পরিচয়ের একটি কপি, যার মধ্যে ca.key অন্তর্ভুক্ত; তাই যে কেউ এই ফাইলটি পেলে আপনার পরিচিতদের কাছে নিজেকে আপনার রিলে হিসেবে উপস্থাপন করতে পারবে। ফাইলটি এনক্রিপ্ট করুন এবং সার্ভারের বাইরে সংরক্ষণ করুন।
এর মূল সুবিধা হলো পুনরুদ্ধার। একটি নতুন VPS-এ /etc/opt/simplex ডিরেক্টরি ফিরিয়ে আনুন এবং একই DNS নাম সেটির দিকে নির্দেশ করুন। এতে ফিঙ্গারপ্রিন্ট অপরিবর্তিত থাকে, ফলে আপনার দেওয়া প্রতিটি ঠিকানা আগের মতোই কাজ করবে। এই ডিরেক্টরি হারিয়ে ফেললে কোনো পুনরুদ্ধার সম্ভব নয়: নতুন ইনস্টলেশন মানেই নতুন ফিঙ্গারপ্রিন্ট, যার অর্থ নতুন ঠিকানা, আর এর ফলে আপনার রিলের মাধ্যমে যুক্ত থাকা প্রতিটি পরিচিতি বিচ্ছিন্ন হয়ে যাবে।
TLS: দুটি ভিন্ন কাজের জন্য দুটি সার্টিফিকেট
SMP transport কোনো পাবলিক certificate authority ব্যবহার করে না। Init একটি প্রাইভেট authority এবং একটি server certificate তৈরি করে, এবং সেই authority-এর fingerprint সার্ভারের ঠিকানার ভেতরে থাকে। ক্লায়েন্ট সার্ভারের উপস্থাপিত সার্টিফিকেটটিকে সেই pinned fingerprint-এর সাথে মিলিয়ে দেখে, যা প্রজেক্টের বর্ণনা অনুযায়ী ক্লায়েন্ট থেকে সার্ভারের সংযোগকে machine-in-the-middle আক্রমণ থেকে রক্ষা করে। সেই পোর্টে চালানোর মতো কোনো ACME (automatic certificate management environment) ক্লায়েন্ট নেই, এবং rotation একটি ম্যানুয়াল smp-server cert রান, যেখানে SMP_SERVER_CFG_PATH সেট করা থাকে।
ঐচ্ছিক ইনফরমেশন পেজটি হলো অন্য সার্টিফিকেট। এর [WEB] সেকশনে static_path, https: 443, cert: /etc/opt/simplex/web.crt এবং key: /etc/opt/simplex/web.key-এর নাম উল্লেখ থাকে। ব্রাউজার আপনার প্রাইভেট authority সম্পর্কে জানে না, তাই এটিই একমাত্র জায়গা যেখানে একটি পাবলিকলি ট্রাস্টেড সার্টিফিকেট ব্যবহার করা উচিত। ডক্সের Docker quick start-এ ঠিক এই কারণেই সার্ভারের সামনে Caddy রাখা হয়, যা স্বয়ংক্রিয়ভাবে সার্টিফিকেট ইস্যু করে।
Tor-এর মাধ্যমে রিলেতে পৌঁছানো
ডকুমেন্টেশনে একটি Tor সেকশন রয়েছে যা Tor Project রিপোজিটরি থেকে Tor ইনস্টল করে এবং /etc/tor/torrc-এ একটি হিডেন সার্ভিস যোগ করে:
SOCKSPort 0
HiddenServiceNonAnonymousMode 1
HiddenServiceSingleHopMode 1
HiddenServiceDir /var/lib/tor/simplex-smp/
HiddenServicePort 5223 localhost:5223
HiddenServicePort 443 localhost:443দুটি মোড লাইন মনোযোগ দিয়ে পড়ুন। Single hop এবং non-anonymous মানে হলো রিলেটির নিজস্ব অবস্থান গোপন করা হয়নি। Onion অ্যাড্রেসটি দ্রুত এবং এটি ক্লায়েন্টদের এমন একটি পথ দেয় যা আপনার কাছে তাদের IP অ্যাড্রেস প্রকাশ করে না, কিন্তু সার্ভারটি তার পাবলিক IP-তে খুঁজে পাওয়া যায়। /var/lib/tor/simplex-smp/hostname থেকে পাওয়া onion হোস্টনামটি সার্ভার অ্যাড্রেসের শেষে কমা দিয়ে যুক্ত করতে হয়। আপনি যদি সার্ভারের অবস্থানও গোপন রাখতে চান, তবে সেটি একটি ভিন্ন কনফিগারেশন, এবং VPS-এ একটি প্রকৃত onion সার্ভিস চালানো বিষয়টি সেই পার্থক্য নিয়ে আলোচনা করে। প্রতিটি টুল কী গোপন করে তার পার্থক্য হলো VPN-এর সাথে Tor-এর তুলনা বিষয়ের মূল আলোচ্য, যা এখানে সরাসরি প্রযোজ্য।
থ্রেট মডেল: সেলফ-হোস্টিং যা পরিবর্তন করে
এটি আপনাকে যা দেয়। মেটাডেটা (কোন কিউ বিদ্যমান, কখন সেগুলো পড়া হয়, কোন ঠিকানা থেকে সংযোগ করা হয়) আপনার নিয়ন্ত্রণে থাকা একটি মেশিনে থাকে এবং আপনি নির্ধারণ করেন কতদিন সেগুলো সংরক্ষণ করা হবে। এছাড়া আপনি এমন কোনো বড় পুলের অংশ নন যেখান থেকে একসাথে তথ্য চাওয়া সম্ভব।
এটি আপনাকে যা দেয় না, তা স্পষ্টভাবে নিচে দেওয়া হলো:
- এনক্রিপশন অপরিবর্তিত থাকে। আপনি এটি তৈরি করার আগেও মেসেজগুলো এন্ড-টু-এন্ড এনক্রিপ্টেড ছিল এবং পরেও তাই থাকবে। সেলফ-হোস্টিং একটি মেটাডেটা সংক্রান্ত সিদ্ধান্ত, ক্রিপ্টোগ্রাফি সংক্রান্ত নয়।
- আপনার VPS প্রোভাইডার আপনার IP ঠিকানায় আসা ট্রাফিক দেখতে পায় এবং আপনার বিলিংয়ের তথ্য তাদের কাছে থাকে। আপনি মেসেজিং অপারেটরের ওপর থেকে আস্থা সরিয়ে হোস্টিং অপারেটরের ওপর স্থাপন করেছেন। আপনি আস্থা বা বিশ্বাসের প্রয়োজনীয়তা দূর করেননি।
- আপনার রিলে একটি ছোট গোষ্ঠী। যদি এটি একটি পরিবারের জন্য কাজ করে, তবে এর সাথে সংযোগ স্থাপন করলে সেই পরিবারকে শনাক্ত করা যায় এবং আপনার পাঠানো প্রতিটি ইনভাইটেশন লিংকের ভেতরে এর হোস্টনাম থাকে। একটি ব্যস্ত পাবলিক রিলে এই দিক থেকে আপনাকে আরও ভালোভাবে আড়াল করে, এবং এটিই প্রকৃত বিনিময়। একটি প্রাইভেট সার্চ সার্ভারের ক্ষেত্রেও একই কথা প্রযোজ্য, আর এই কারণেই আপনার নিজের VPS-এ SearXNG আসলে যা আড়াল করে তা নির্ভর করে কতজন মানুষ আপনার সাথে সেই ইনস্ট্যান্সটি ব্যবহার করছে তার ওপর।
- প্রাপ্যতা এখন আপনার দায়িত্ব। ডিস্ক পূর্ণ হয়ে গেলে বা সার্ভার বন্ধ হয়ে গেলে মেসেজ ডেলিভারি বন্ধ হয়ে যায় এবং আপনার পরিচিতদের কাছে আপনাকে এড়িয়ে অন্য কোনো পথে মেসেজ পাঠানোর উপায় থাকে না।
আপনার নিজের সার্ভারে রাখা যেকোনো প্রাইভেট সার্ভিসের ক্ষেত্রে একই যুক্তি প্রযোজ্য, তা এই রিলে হোক বা আপনার নিজের VPS-এ থাকা একটি WireGuard VPN হোক। আপনি কেবল বেছে নিচ্ছেন কোন পক্ষ আপনার মেটাডেটা দেখবে। আপনি মেটাডেটাকে অদৃশ্য করে দিচ্ছেন না।
যখন এটি কাজ করে না
সার্ভিসটি চালু হয়েই সাথে সাথে বন্ধ হয়ে যায়। sudo journalctl -u smp-server -n 50 পড়ুন। একটি bind ব্যর্থতা সেই পোর্টটির নাম উল্লেখ করে যা এটি নিতে পারেনি। এরপর sudo ss -tlnp | grep :443 চালিয়ে দেখুন কোন প্রসেসটি ইতিমধ্যে পোর্টটি দখল করে আছে; নতুন সার্ভারে সাধারণত এটি nginx, Caddy বা এক ঘণ্টা আগে আপনার ইনস্টল করা কোনো XFTP সার্ভার হয়ে থাকে।
Init তার কনফিগারেশন লিখতে পারে না। /etc/opt/simplex তৈরি হওয়ার আগে smp ইউজার হিসেবে smp-server init চালালে পারমিশন এরর দেখাবে, কারণ /etc/opt-এর মালিকানা root-এর কাছে। প্রথমে সঠিক মালিকানা দিয়ে ডিরেক্টরিটি তৈরি করুন, তারপর পুনরায় init চালান।
ক্লায়েন্টরা রিলেতে পৌঁছাতে পারে না। dig +short smp1.example.com দিয়ে নাম সঠিক ঠিকানায় resolve হচ্ছে কি না তা যাচাই করুন। এরপর সার্ভার থেকে নয়, বরং আপনার ল্যাপটপ থেকে পোর্টটি পরীক্ষা করুন: nc -vz smp1.example.com 5223। যদি বাইরে থেকে সংযোগ ব্যর্থ হয় কিন্তু ss সার্ভারে সকেটটি খোলা দেখায়, তবে বুঝতে হবে সমস্যাটি প্রোভাইডারের নেটওয়ার্ক ফায়ারওয়ালে, যা ufw থেকে আলাদা একটি নিয়ন্ত্রণ ব্যবস্থা।
কোনো কন্টাক্ট আপনার রিলের মাধ্যমে সংযোগ করতে পারছে না। আপনার শেয়ার করা ঠিকানায় থাকা ফিঙ্গারপ্রিন্ট অবশ্যই /etc/opt/simplex/fingerprint-এর বর্তমান বিষয়বস্তুর সাথে মিলতে হবে। আপনি যদি [AUTH]-এর অধীনে create_password সেট করে থাকেন, তবে ঠিকানাতেও সেই পাসওয়ার্ড থাকতে হবে, অন্যথায় ক্লায়েন্টকে কিউ (queue) তৈরি করার অনুমতি দেওয়া হবে না।
অ্যাপে সার্ভার যোগ করার পর কিছুই পরিবর্তন হয়নি। এটি স্বাভাবিক। শুধুমাত্র নতুন কন্টাক্টগুলো নতুন যোগ করা রিলে ব্যবহার করে। বিদ্যমান কন্টাক্টগুলো তাদের আগের কিউগুলোই ব্যবহার করতে থাকে।
FAQ
SimpleX সার্ভার নিজে হোস্ট করলে কি আমার মেসেজ আরও নিরাপদ হয়?
না, এবং এটি ইচ্ছাকৃতভাবেই করা হয়েছে। SimpleX ডিভাইসগুলোর মধ্যে এন্ড-টু-এন্ড এনক্রিপশন ব্যবহার করে, তাই যে-ই সার্ভার পরিচালনা করুক না কেন, রিলে সার্ভারের কাছে কোনো কি (key) থাকে না। নিজে সার্ভার হোস্ট করার মানে হলো মেসেজের মেটাডেটা কারা পর্যবেক্ষণ করছে তা নিয়ন্ত্রণ করা: যেমন কোন কিউ (queue) বিদ্যমান, কখন সেগুলো পড়া হচ্ছে এবং কোন IP অ্যাড্রেস থেকে সংযোগ করা হচ্ছে। এটি মূলত মেটাডেটার সিদ্ধান্ত। যদি আপনার নিজে হোস্ট করার কারণ হয় আরও শক্তিশালী এনক্রিপশন, তবে জেনে রাখুন সেই এনক্রিপশন আগে থেকেই বিদ্যমান ছিল।
একজন SimpleX রিলে অপারেটর আসলে কী দেখতে পায়?
প্রজেক্টের protocol/security.md-এ এটি স্পষ্টভাবে উল্লেখ করা হয়েছে। একটি রিলে মেসেজের বিষয়বস্তু বা ধরন পড়তে পারে না, কোনো মেসেজ গোপনে পরিবর্তন করতে পারে না এবং সক্রিয় আক্রমণের মাধ্যমে এন্ড-টু-এন্ড এনক্রিপশন ভাঙতে পারে না। তবে এটি দেখতে পায় কখন একজন প্রাপক অনলাইনে আছেন, কিউ দিয়ে কতগুলো মেসেজ যাচ্ছে, প্রাপকের IP অ্যাড্রেস কী, কিউতে থাকা পরবর্তী মেসেজগুলো মুছে ফেলতে পারে অথবা কিউয়ের অবস্থা সম্পর্কে ভুল তথ্য দিতে পারে। রিলে সার্ভারটি আপনার নিয়ন্ত্রণে থাকলে এই ক্ষমতাগুলো আপনার হাতেই থাকে।
আমার কি একটি ডোমেইন নাম এবং TLS সার্টিফিকেট প্রয়োজন?
ব্যবহারযোগ্য সেটআপের জন্য আপনার একটি ডোমেইন প্রয়োজন, তবে আপনার কাছে যদি সত্যিই কোনো ডোমেইন না থাকে তবে smp-server init-এ --ip ব্যবহার করা যায়। মেসেজিং পোর্টের জন্য পাবলিক অথরিটি থেকে কোনো সার্টিফিকেটের প্রয়োজন নেই: init নিজেই নিজস্ব অথরিটি তৈরি করে এবং ক্লায়েন্ট আপনার smp:// অ্যাড্রেসে থাকা ফিঙ্গারপ্রিন্টটি পিন করে রাখে। পাবলিকলি ট্রাস্টেড সার্টিফিকেট শুধুমাত্র ঐচ্ছিক ওয়েব ইনফরমেশন পেজের জন্য প্রয়োজন, যা smp-server.ini-এর [WEB] সেকশনে cert এবং key হিসেবে কনফিগার করা হয়।
/etc/opt/simplex হারিয়ে ফেললে কী হবে?
আপনার দেওয়া প্রতিটি অ্যাড্রেস কাজ করা বন্ধ করে দেবে। ওই ডিরেক্টরিতে সার্টিফিকেট অথরিটি থাকে যার ফিঙ্গারপ্রিন্ট আপনার সার্ভার অ্যাড্রেসে এমবেড করা থাকে, তাই নতুন করে তৈরি করলে ভিন্ন ফিঙ্গারপ্রিন্ট তৈরি হবে এবং ফলে সার্ভারটিও ভিন্ন হয়ে যাবে। যেসব কন্টাক্টের কিউ ওই রিলেতে ছিল, তাদের ক্লায়েন্ট সাইড থেকে ঠিক করা সম্ভব নয়। ডিরেক্টরিটির এনক্রিপ্টেড ব্যাকআপ সার্ভারের বাইরে রাখুন এবং ডকুমেন্টেশনের নির্দেশনা অনুযায়ী ca.key অফলাইনে সংরক্ষণ করুন, কারণ যার কাছে এটি থাকবে সে আপনার রিলে সার্ভারের ছদ্মবেশ ধারণ করতে পারবে।
আমি কি একই VPS-এ SMP রিলে এবং XFTP ফাইল রিলে চালাতে পারি?
হ্যাঁ, তবে একটি কনফ্লিক্ট সমাধান করতে হবে। XFTP সার্ভারের নির্ধারিত পোর্ট হলো 443 এবং ডিফল্ট SMP কনফিগারেশনে port: 5223,443 তালিকাভুক্ত থাকে, তাই উভয়ই একই সকেট ব্যবহার করতে চায়। এদের যেকোনো একটিকে 443 পোর্ট দিন: SMP সার্ভারের জন্য port: 5223 সেট করুন, অথবা ফাইল রিলেকে দ্বিতীয় কোনো IP অ্যাড্রেস বা দ্বিতীয় কোনো VPS-এ সরিয়ে নিন। এছাড়া আপনার ডিস্কে যতটুকু জায়গা আছে সেই অনুযায়ী স্টোরেজ কোটা নির্ধারণ করুন, কারণ ফাইল রিলে এমন একটি উপাদান যা ডিস্ক এবং ব্যান্ডউইথ ব্যবহার করে।