সেরা 5টি self-hosted invoicing সফটওয়্যার তুলনা
Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai এবং ERPNext-এর মধ্যে কোনটি আপনার ব্যবসার জন্য উপযুক্ত? রিকারিং বিলিং, ট্যাক্স এবং পেমেন্ট গেটওয়ে ফিচারের বিস্তারিত তুলনা দেখুন।
কোন self-hosted invoicing software আপনার বেছে নেওয়া উচিত?
একটি VPS-এ self-hosted invoicing software ব্যবহারের ক্ষেত্রে পাঁচটি বাস্তবসম্মত বিকল্প রয়েছে, তবে এদের কার্যকারিতা একে অপরের থেকে সম্পূর্ণ আলাদা। Invoice Ninja হলো সবচেয়ে পূর্ণাঙ্গ সফটওয়্যার: এটি ইনস্টল করার প্রথম দিন থেকেই recurring invoices, client portal, payment gateways এবং e-invoice ফরম্যাটগুলো সঠিকভাবে কাজ করে। InvoiceShelf হলো তুলনামূলক হালকা এবং সম্পূর্ণ open source বিকল্প। InvoicePlane হলো একটি সাধারণ PHP অ্যাপ্লিকেশন, যার জন্য কোনো জটিল orchestration-এর প্রয়োজন হয় না। Kimai সরাসরি line item-এর পরিবর্তে tracked hours-এর ভিত্তিতে বিল তৈরি করে। ERPNext হলো একটি পূর্ণাঙ্গ accounting system, যা দিয়ে ইনভয়েসও তৈরি করা যায়।
self-hosted invoicing সেটআপে ফিচারের অভাবের চেয়েও দুটি সমস্যা বেশি প্রকট। প্রথমটি হলো ইমেইল। কোনো ইনভয়েস যদি spam ফোল্ডারে পড়ে থাকে, তবে সেটি unpaid হিসেবেই থেকে যায় এবং আপনি তা জানতেও পারেন না। দ্বিতীয়টি হলো ব্যাকআপ। এটি এমন একটি self-hosted database, যার তথ্য হারিয়ে গেলে তা কেবল অসুবিধাই নয়, বরং কর সংক্রান্ত জটিলতার কারণ হয়ে দাঁড়ায়।
ফিচার লিস্ট পড়ার আগে লাইসেন্সটি পড়ে নিন। এই পাঁচটির মধ্যে তিনটি copyleft, একটি permissive এবং একটি source-available, যার ব্যবহারের ওপর সুনির্দিষ্ট সীমাবদ্ধতা রয়েছে।
পাঁচটি বিকল্প এবং কার জন্য কোনটি উপযুক্ত
Invoice Ninja
এটি একটি Laravel অ্যাপ্লিকেশন, যা বর্তমানে v5 লাইনে রয়েছে। এর self-hosting সম্পূর্ণ বিনামূল্যে এবং কোনো সীমাবদ্ধতা নেই: এতে recurring invoices, quotes, projects, time tracking, expenses, একটি client portal এবং Stripe ও PayPal সহ বিভিন্ন payment gateway রয়েছে। প্রজেক্টটি নিজেকে "Laravel দিয়ে তৈরি একটি source-available ইনভয়েস, কোট, প্রজেক্ট এবং টাইম-ট্র্যাকিং অ্যাপ" হিসেবে পরিচয় দেয়। এর একমাত্র পেইড অংশটি হলো branding। প্রজেক্টের নিজস্ব ভাষায়: "আমরা বছরে 40 ডলারের একটি white-label লাইসেন্স অফার করি, যা অ্যাপের ক্লায়েন্ট-ফেসিং অংশ থেকে Invoice Ninja-এর ব্র্যান্ডিং সরিয়ে ফেলে"। আগস্ট 2026 অনুযায়ী এই মূল্য কার্যকর।
আপনি যদি সবচেয়ে পূর্ণাঙ্গ প্রোডাক্টটি চান এবং বড় স্ট্যাক চালাতে রাজি থাকেন, তবে এটি বেছে নিন।
InvoiceShelf
এটি Crater-এর একটি fork, যা GNU Affero General Public License version 3 (AGPL-3.0) এর অধীনে লাইসেন্সকৃত। এটি invoices, estimates, recurring billing, expenses, taxes, multi-currency, একটি customer portal এবং multi-company সুবিধা প্রদান করে। পেমেন্ট এবং white-labelling আলাদা অফিসিয়াল মডিউল রিপোজিটরিতে থাকে, যার উভয়ই AGPL-3.0 এবং বিনামূল্যে। কার্ড পেমেন্ট Stripe checkout-এর মাধ্যমে সম্পন্ন হয়।
আপনি যদি একটি ছোট, সম্পূর্ণ open source অ্যাপ্লিকেশন চান এবং আপনার ত্রিশটি গেটওয়ের প্রয়োজন না হয়, তবে এটি বেছে নিন।
InvoicePlane
এটি CodeIgniter-এর ওপর ভিত্তি করে তৈরি একটি PHP অ্যাপ্লিকেশন, যা MIT লাইসেন্সের অধীনে রিলিজ করা হয়েছে। এটিই একমাত্র বিকল্প যা সরাসরি web root-এ ফাইল unzip করে ইনস্টল করা যায়। এতে কোনো Docker বা Node build step-এর প্রয়োজন নেই। PDF তৈরির জন্য mPDF ব্যবহৃত হয়, তাই টেমপ্লেটগুলো HTML এবং CSS দিয়ে তৈরি। ক্লায়েন্টরা একটি guest link-এর মাধ্যমে ইনভয়েস দেখতে এবং পেমেন্ট করতে পারে।
এর সীমাবদ্ধতা হলো পেমেন্ট। ডকুমেন্টেশনে স্পষ্টভাবে বলা হয়েছে যে, InvoicePlane 1.6 ডিফল্টভাবে শুধুমাত্র Stripe সাপোর্ট করে এবং এই ভার্সনে অন্যান্য প্রোভাইডারদের সরিয়ে ফেলা হয়েছে। 1.6 লাইনের জন্য প্রকাশিত প্রয়োজনীয়তা হলো PHP 8.0 থেকে 8.1 এবং MySQL 5.5 অথবা সমমানের MariaDB। আপনি যে রিলিজটি ডাউনলোড করবেন তার নোটগুলো পড়ে নিন, কারণ 1.7 লাইনটি এখনো উন্নয়নের পর্যায়ে রয়েছে।
আপনি যদি shared hosting বা 512 MB VPS ব্যবহার করেন, তবে এটি বেছে নিন।
Kimai
এটি একটি AGPL-3.0 টাইম ট্র্যাকার যা timesheet থেকে ইনভয়েস তৈরি করে। যারা ঘণ্টার হিসেবে বিল করেন, তাদের জন্য এটি সঠিক সমাধান। ইনভয়েস টেমপ্লেটগুলো DOCX, ODS বা XLSX ফাইল হিসেবে আপলোড করতে হয়, যা ডকুমেন্টেশন অনুযায়ী একমাত্র গ্রহণযোগ্য ফরম্যাট এবং এগুলো PDF বা HTML-এ রেন্ডার হয়। আপনি CSS না লিখে word processor-এ ইনভয়েস লেআউট তৈরি করতে পারেন, যা অধিকাংশ মানুষের জন্য সহজ।
Kimai-তে কোনো client portal বা payment gateway নেই, তাই আপনাকে PDF ইমেইল করতে হবে। স্ট্রাকচার্ড ই-ইনভয়েসিংয়ের জন্য E-Invoice Plus নামে একটি পেইড স্টোর প্লাগইন রয়েছে। আগস্ট 2026 অনুযায়ী, self-hosted ইনস্টলেশনের জন্য এর বার্ষিক মূল্য 99 ইউরো (VAT ব্যতীত)। এটি EN16931, XRechnung, ZUGFeRD, Factur-X এবং Peppol প্রোফাইলগুলো কভার করে।
যদি ইনভয়েস আপনার ট্র্যাক করা সময়ের আউটপুট হয়, তবে এটি বেছে নিন।
ERPNext
এটি GPL-3.0 লাইসেন্সভুক্ত এবং সম্পূর্ণ ভিন্ন ক্যাটাগরির সফটওয়্যার। একটি sales invoice হলো একটি পূর্ণাঙ্গ অ্যাকাউন্টিং সিস্টেমের অংশ, যেখানে chart of accounts, journal entries, stock এবং payroll রয়েছে। যখন ইনভয়েসিং আপনার কাজের একমাত্র অংশ থাকে না, তখন এটি সঠিক সমাধান। একজন ফ্রিল্যান্সার যার আটজন ক্লায়েন্ট আছে, তার জন্য এটি অনেক বেশি জটিল সফটওয়্যার। এটি সেটআপ করা নিজেই একটি বড় প্রজেক্ট, যা VPS-এ ERPNext চালানো অংশে আলোচনা করা হয়েছে।
পুনরাবৃত্তিমূলক ইনভয়েস একটি অদৃশ্য শিডিউলারের ওপর নির্ভরশীল
Invoice Ninja, InvoiceShelf, InvoicePlane এবং ERPNext—এই সবকটিই পুনরাবৃত্তিমূলক (recurring) ইনভয়েস তৈরি করতে পারে। Kimai-এর মূল ফিচারে কোনো পুনরাবৃত্তিমূলক ইনভয়েস সুবিধা নেই, কারণ সেখানে একটি নির্দিষ্ট সময়ের টাইমশিট এন্ট্রি থেকে ইনভয়েস তৈরি হয়।
Laravel-ভিত্তিক প্রতিটি অ্যাপ্লিকেশনেই ব্যর্থতার ধরন একই এবং এটি নীরবে ঘটে। পুনরাবৃত্তিমূলক ইনভয়েসগুলো একটি নির্ধারিত টাস্ক বা php artisan schedule:run দ্বারা তৈরি হয়, যা অ্যাপ্লিকেশনটির বাইরের কোনো কিছুকে প্রতি মিনিটে কল করতে হয়। যদি কোনো কিছু এটিকে কল না করে, তবে পুনরাবৃত্তিমূলক ইনভয়েসের তালিকায় পরবর্তী পাঠানোর তারিখ দেখালেও সেই তারিখটি কেবল পার হয়ে যায়। কোনো ইনভয়েস তৈরি হয় না। কোনো ত্রুটি লগ করা হয় না, কারণ কোনো কোডই কার্যকর হয়নি।
তাই আপনার প্রথম পুনরাবৃত্তিমূলক ইনভয়েসটি তৈরি করার পর, এর পরবর্তী পাঠানোর তারিখটি কয়েক মিনিট এগিয়ে দিন এবং অপেক্ষা করুন। যদি কিছুই না আসে, তবে বুঝতে হবে শিডিউলারটি চলছে না। Docker ইনস্টলেশনের ক্ষেত্রে এর অর্থ সাধারণত এই যে, compose ফাইলে থাকা cron বা scheduler সার্ভিসটি শুরু হয়নি অথবা সেটি বন্ধ হয়ে গেছে।
docker compose ps
docker compose logs --tail 50ফাইলটিতে থাকা প্রতিটি সার্ভিসের অবস্থা running দেখানো উচিত। যে সার্ভিসটি exited অবস্থায় আছে, তার লগগুলোই আপনাকে পড়তে হবে।
মাল্টি-কারেন্সি এবং ট্যাক্স: কমিট করার আগে যা যাচাই করবেন
ফিচার লিস্টে "মাল্টি-কারেন্সি" কথাটি থাকলেও এর অর্থ ভিন্ন ভিন্ন হতে পারে। আপনার ব্যবসার বাস্তব সংখ্যা ব্যবহার করে একটি ডেমো ইনস্ট্যান্সে এই চারটি পরীক্ষা চালিয়ে দেখুন, কারণ এখানে কোনো ভুল হলে তা আপনার পরিবর্তে আপনার অ্যাকাউন্ট্যান্ট খুঁজে পাবেন।
- ইনভয়েস কি ইস্যু করার তারিখের বিনিময় হার (exchange rate) সংরক্ষণ করে? এটি অবশ্যই করতে হবে। অ্যাপ্লিকেশনটি যদি লাইভ রেট থেকে বারবার মোট হিসাব করে, তবে প্রতিবার রিপোর্ট খোলার সময় গত কোয়ার্টারের রিপোর্ট পরিবর্তিত হয়ে যাবে এবং আপনার বুকস বা হিসাবের সাথে দাখিল করা রিপোর্টের অমিল দেখা দেবে।
- ট্যাক্স কি প্রতিটি লাইন আইটেমের ওপর প্রয়োগ করা হয়, নাকি পুরো ইনভয়েসের ওপর, নাকি উভয়ই? একটি ইনভয়েস-লেভেল রেট ততক্ষণই ঠিক থাকে যতক্ষণ না কোনো একটি লাইন জিরো-রেটেড হয়।
- আপনি কি ট্যাক্সসহ (tax inclusive) এবং ট্যাক্স ছাড়া (tax exclusive) উভয়ভাবেই দাম এন্ট্রি করতে পারেন? পরে কনভার্ট করলে প্রতি লাইনে এক সেন্টের রাউন্ডিং পার্থক্য তৈরি হয় এবং সারা বছর ধরে এই সেন্টগুলো জমা হয়ে বড় অংকের পার্থক্য তৈরি করে।
- অন্য দেশের কোনো ক্লায়েন্ট যার কোনো VAT দেওয়ার প্রয়োজন নেই, তার ডকুমেন্টে কী দেখা যায়? আপনার ইনভয়েসে শুধুমাত্র ট্যাক্স কলামে শূন্য থাকা যথেষ্ট নয়, বরং সেখানে একটি এক্সাম্পশন নোট (exemption note) প্রিন্ট হওয়া প্রয়োজন।
Invoice Ninja এবং ERPNext এই চারটি বিষয়ই হ্যান্ডেল করতে পারে। InvoiceShelf তাদের ফিচারের তালিকায় ট্যাক্স এবং মাল্টি-কারেন্সির কথা উল্লেখ করে। InvoicePlane এবং Kimai তুলনামূলক সহজ, তাই সেগুলোকে আপনার সবচেয়ে সহজ ইনভয়েস দিয়ে নয়, বরং সবচেয়ে জটিল ইনভয়েস দিয়ে পরীক্ষা করুন।
ক্লায়েন্ট পোর্টাল এবং পেমেন্ট গেটওয়ে
ক্লায়েন্ট পোর্টাল হলো এমন একটি পেজ যেখানে ক্লায়েন্ট তাদের ইনভয়েস দেখতে পায়, PDF ডাউনলোড করতে পারে এবং পেমেন্ট সম্পন্ন করতে পারে। এটি শুনতে যতটা সাধারণ মনে হয়, তার চেয়ে অনেক বেশি গুরুত্বপূর্ণ, কারণ ইমেইলের মাধ্যমে পেমেন্টের জন্য তাগাদা দেওয়া ইনভয়েস তৈরির চেয়েও বেশি সময় নষ্ট করে।
Invoice Ninja এই ক্ষেত্রে সবচেয়ে শক্তিশালী, কারণ এতে একটি পূর্ণাঙ্গ পোর্টাল, অনেকগুলো গেটওয়ে, পেমেন্ট মেথড সেভ করে রাখার সুবিধা এবং রিকারিং ইনভয়েসের জন্য অটো-বিলিং ব্যবস্থা রয়েছে। InvoiceShelf-এ একটি কাস্টমার পোর্টাল আছে এবং এর পেমেন্ট মডিউলের মাধ্যমে Stripe checkout যুক্ত করা যায়। InvoicePlane প্রতিটি ইনভয়েসের জন্য একটি গেস্ট লিঙ্ক প্রদান করে এবং Stripe সাপোর্ট করে। Kimai-তে এর কোনোটিই নেই, তাই PDF ফাইলটি ইমেইলের সাথে অ্যাটাচমেন্ট হিসেবে পাঠাতে হয়।
একটি বিষয় নিয়ে প্রায়ই বিভ্রান্তি তৈরি হয়। ইনভয়েসিং অ্যাপ্লিকেশন সেলফ-হোস্ট করার মানে এই নয় যে আপনাকে কার্ড নম্বর সংরক্ষণ করতে হবে। Stripe checkout ব্যবহার করলে ক্লায়েন্টকে Stripe-এর পেজে রিডাইরেক্ট করা হয়, তারা সেখানেই কার্ডের তথ্য টাইপ করে এবং আপনার VPS কখনোই সেই নম্বর দেখতে পায় না। আপনার PCI (payment card industry) স্কোপ ছোট থাকে ঠিক এই কারণেই যে আপনি নিজে পেমেন্ট ফর্ম তৈরি করেননি। যদি পরবর্তীতে আপনার একাধিক প্রসেসরের প্রয়োজন হয়, অথবা দেশ অনুযায়ী পেমেন্ট রাউট করতে চান, তবে সেটি Hyperswitch দিয়ে সেলফ-হোস্টেড পেমেন্ট অর্কেস্ট্রেশন-এর মতো একটি আলাদা স্তরে রাখা উচিত।
PDF-এর গুণমান এবং যে টেমপ্লেটটি আপনি শেষ পর্যন্ত এডিট করবেন
আপনি টেমপ্লেটটি এডিট করবেন। এখানে থাকা প্রতিটি ডিফল্ট সেটিংস আপনার দেশের জন্য ভুল ঠিকানায় আপনার ঠিকানা বসিয়ে দেয়।
Invoice Ninja ইমেজটির সাথে যুক্ত একটি headless Chromium ব্যবহার করে HTML এবং CSS টেমপ্লেটকে PDF-এ রূপান্তর করে, যার কারণে কন্টেইনারটির আকার বড় হয়। এর জন্য মেমোরি বরাদ্দ রাখুন: একটি headless browser এই স্ট্যাকের সবচেয়ে ভারী প্রসেস, তাই 1 GB-এর VPS-এ এটি চালানো বেশ কঠিন। InvoicePlane mPDF ব্যবহার করে, যা সম্পূর্ণ PHP-ভিত্তিক এবং হালকা, তবে এর বিনিময়ে এটি আধুনিক CSS-এর কিছু অংশ সাপোর্ট করে না। Kimai বিপরীত পদ্ধতি অনুসরণ করে এবং আপনাকে একটি DOCX বা ODS ফাইল আপলোড করতে দেয়, তাই লেআউটটি এমন কেউ LibreOffice বা Word-এ তৈরি করতে পারেন যিনি কখনো স্টাইলশিট লেখেননি।
যদি আপনার কাছে ডিজাইন করা ইনভয়েস গুরুত্বপূর্ণ হয় কিন্তু CSS না হয়, তবে Kimai-এর পদ্ধতিটি সেরা। যদি আপনি টেমপ্লেটটিকে ভার্সন কন্ট্রোলে রাখতে চান এবং সেটির পার্থক্য (diff) দেখতে চান, তবে HTML পদ্ধতিটি সেরা।
এই লাইসেন্স কি বাণিজ্যিক ব্যবহারের অনুমতি দেয়?
এই পাঁচটি সফটওয়্যারই আপনি আপনার ক্লায়েন্টদের ইনভয়েস করার কাজে ব্যবহার করতে পারবেন। এর বাইরে অন্য কিছু করতে গেলেই পার্থক্যগুলো সামনে আসে।
Invoice Ninja-এর লাইসেন্স হলো Elastic License 2.0। এখানে দুটি শর্ত গুরুত্বপূর্ণ।
আপনি এই সফটওয়্যারটিকে কোনো hosted বা managed service হিসেবে তৃতীয় পক্ষকে প্রদান করতে পারবেন না, যদি সেই সার্ভিসের মাধ্যমে ব্যবহারকারীরা সফটওয়্যারটির উল্লেখযোগ্য কোনো ফিচার বা কার্যকারিতা ব্যবহারের সুযোগ পায়।
আপনি সফটওয়্যারের লাইসেন্স কি (license key) সংক্রান্ত কার্যকারিতা সরাতে, পরিবর্তন করতে, নিষ্ক্রিয় করতে বা এড়িয়ে যেতে পারবেন না।
সুতরাং, নিজের ব্যবসার জন্য এটি চালানো সম্পূর্ণ বৈধ, কিন্তু ক্লায়েন্টদের জন্য পণ্য হিসেবে এর instance চালানো যাবে না। দ্বিতীয় শর্তটির কারণেই ব্র্যান্ডিং সরানোর জন্য সোর্স কোডে প্যাচ না লাগিয়ে 40 ডলারের লাইসেন্স কিনতে হয়।
InvoiceShelf, Kimai এবং Crater-এর লাইসেন্স হলো AGPL-3.0। বাণিজ্যিক ব্যবহার এখানে সম্পূর্ণ ফ্রি এবং আপনার উপরে কোনো বাধ্যবাধকতা নেই। তবে এর 13 নম্বর সেকশনে একটি শর্ত আছে: আপনি যদি কোড পরিবর্তন করেন এবং সেই পরিবর্তিত সংস্করণটি নেটওয়ার্কের মাধ্যমে অন্যদের ব্যবহারের সুযোগ দেন, তবে তাদের কাছে আপনার করা পরিবর্তনের সোর্স কোড সরবরাহ করতে হবে। কোনো পরিবর্তন না করা instance-এর ক্ষেত্রে আপস্ট্রিমের পাবলিক সোর্স কোডই যথেষ্ট, তাই বেশিরভাগ self-hoster-দের এই বিষয়টি নিয়ে চিন্তা করতে হয় না।
InvoicePlane-এর লাইসেন্স হলো MIT, যা এই তালিকার সবচেয়ে নমনীয়। তবে এর README ফাইলে উল্লেখ আছে যে, নাম এবং লোগো প্রজেক্টটির নিজস্ব সম্পত্তি হিসেবেই থাকবে।
ERPNext-এর লাইসেন্স হলো GPL-3.0। আপনি যদি কোনো পরিবর্তন বিতরণ করেন, তবে তা অবশ্যই শেয়ার করতে হবে। তবে ব্যক্তিগতভাবে এটি ব্যবহার করার ক্ষেত্রে কোনো বাধ্যবাধকতা নেই।
এটি শুধুমাত্র লাইসেন্স টেক্সটের বর্ণনা, কোনো আইনি পরামর্শ নয়।
প্রকল্পটি কি এখনও রক্ষণাবেক্ষণ করা হচ্ছে? কমিট লগ পরীক্ষা করুন
Crater বেশ কয়েক বছর ধরে একটি জনপ্রিয় ওপেন সোর্স ইনভয়েসিং অ্যাপ্লিকেশন ছিল এবং এখনও অনেক নির্দেশিকায় এটি ব্যবহারের পরামর্শ দেওয়া হয়। এর ডিফল্ট ব্রাঞ্চে 741 দিন ধরে কোনো কমিট করা হয়নি।
The data behind this chart
[
{
"label": "ERPNext",
"commit_gap": 0
},
{
"label": "Invoice Ninja",
"commit_gap": 1
},
{
"label": "Kimai",
"commit_gap": 1
},
{
"label": "InvoicePlane",
"commit_gap": 3
},
{
"label": "InvoiceShelf",
"commit_gap": 4
},
{
"label": "Crater",
"commit_gap": 741
}
]সেই ব্লকের 6 টি প্রকল্পের মধ্যে পাঁচটিতে গত এক সপ্তাহের মধ্যে কমিট করা হয়েছে। InvoiceShelf হলো সেই ফর্ক যা Crater-এর কাজকে এগিয়ে নিয়ে যাচ্ছে, একই AGPL-3.0 লাইসেন্সের অধীনে এবং একই ডেটা মডেল ব্যবহার করে। তাই এতে স্থানান্তর করা মানে নতুন করে লেখা নয়, বরং কেবল ডেটা মাইগ্রেশন। Crater নয়, InvoiceShelf ইনস্টল করুন।
প্রতিটি অ্যাপ্লিকেশন একটি VPS-এ ইনস্টল করা
InvoicePlane ছাড়া বাকি সবকিছু Docker Compose-এর মাধ্যমে চালানো সবচেয়ে সহজ। আপনি যদি এটিতে নতুন হন, তবে প্রথমে একটি VPS-এ প্রথম Docker Compose স্ট্যাক তৈরি করা শিখুন এবং তারপর এখানে ফিরে আসুন।
Invoice Ninja-এর নিজস্ব compose রিপোজিটরি রয়েছে।
git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --showসেই কি (key) টি রিপোজিটরির env ফাইলে আপনার আসল APP_URL-এর সাথে কপি করুন। এরপর ইমেজটি যে মালিকানা (ownership) প্রত্যাশা করে তা সেট করুন এবং এটি চালু করুন।
chmod 755 docker/app/public
sudo chown -R 1500:1500 docker/app
docker compose up -d1500:1500 মালিকানাটি ইমেজের ভেতরের ব্যবহারকারীর সাথে মিলে যায়। এটি বাদ দিলে অ্যাপ্লিকেশনটি তার ক্যাশ বা তৈরি করা PDF ফাইলগুলো লিখতে পারবে না। সেটআপ উইজার্ডে ডাটাবেস হোস্ট হিসেবে db দিন, কারণ এটি compose নেটওয়ার্কে সার্ভিসটির নাম। সেখানে localhost অ্যাপ্লিকেশন কন্টেইনারটিকে নির্দেশ করে।
InvoiceShelf ডাটাবেস ইঞ্জিন অনুযায়ী আলাদা আলাদা রেডি-টু-ইউজ compose ফাইল প্রকাশ করে।
curl -fLO https://raw.githubusercontent.com/InvoiceShelf/docker/master/docker-compose.mysql.yml
mv docker-compose.mysql.yml docker-compose.ymlচালু করার আগে ফাইলটি খুলুন। এতে থাকা প্রতিটি পাসওয়ার্ড একটি প্লেসহোল্ডার এবং ফাইলের কমেন্টেই তা উল্লেখ করা আছে। APP_URL, SESSION_DOMAIN এবং SANCTUM_STATEFUL_DOMAINS ডিফল্টভাবে localhost থাকে, তাই প্রথমবার লগইন করার আগে এই তিনটিতেই আপনার আসল হোস্টনাম সেট করতে হবে। এরপর এটি চালু করুন।
docker compose up -dএটি হোস্টের 8090 পোর্ট প্রকাশ করে এবং কন্টেইনারের ভেতরে 8080 পোর্টে সার্ভিস দেয়। কোনো ক্লায়েন্টকে পাঠানোর আগে এর সামনে TLS (transport layer security) সহ একটি reverse proxy বসান।
Kimai প্রোডাকশন compose ফাইল, প্রজেক্ট ডকুমেন্টেশন থেকে
services:
sqldb:
image: mysql:8.3
volumes:
- mysql:/var/lib/mysql
environment:
- MYSQL_DATABASE=kimai
- MYSQL_USER=kimaiuser
- MYSQL_PASSWORD=kimaipassword
- MYSQL_ROOT_PASSWORD=changemeplease
command: --default-storage-engine innodb
restart: unless-stopped
healthcheck:
test: mysqladmin -uroot -p$$MYSQL_ROOT_PASSWORD ping -h 127.0.0.1 --silent
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
kimai:
image: kimai/kimai2:stable
depends_on:
sqldb:
condition: service_healthy
restart: true
volumes:
- data:/opt/kimai/var/data
- plugins:/opt/kimai/var/plugins
ports:
- 8001:8001
environment:
- APP_SECRET=your-fantastic-long-random-and-ultra-secure-secret
- TRUSTED_HOSTS=kimai.example.com
- ADMINMAIL=admin@example.com
- ADMINPASS=changemeplease
- DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai?charset=utf8mb4&serverVersion=8.3.0
restart: unless-stopped
volumes:
data:
mysql:
plugins:APP_SECRET-কে আপনার নিজের একটি দীর্ঘ র্যান্ডম স্ট্রিংয়ে সেট করুন এবং TRUSTED_HOSTS-কে সেই ডোমেইনে সেট করুন যা আপনি বাস্তবে ব্যবহার করবেন। ADMINMAIL এবং ADMINPASS প্রথমবার বুট করার সময় প্রথম অ্যাডমিনিস্ট্রেটর তৈরি করে, তাই পরবর্তীতে ইন্টারফেস থেকে সেই পাসওয়ার্ড পরিবর্তন করুন এবং ফাইল থেকে তা মুছে ফেলুন।
InvoicePlane-এর কোনো কন্টেইনার নেই। প্রথমে একটি খালি ডাটাবেস তৈরি করুন।
sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"প্রজেক্টের রিলিজ পেজ থেকে আর্কাইভটি ডাউনলোড করুন, এটিকে আপনার ওয়েব রুটে এক্সট্র্যাক্ট করুন, ipconfig.php.example ফাইলটিকে ipconfig.php-এ কপি করুন এবং ফাইলের কমেন্ট অনুসরণ করে আপনার URL সেট করুন। এরপর https://your-domain.example/index.php/setup খুলুন এবং ইনস্টলারের ধাপগুলো সম্পন্ন করুন।
কেন আপনার ইনভয়েস স্প্যাম ফোল্ডারে চলে যায়
এই ব্যর্থতাটি আপনার আর্থিক ক্ষতির কারণ হতে পারে, অথচ অ্যাপ্লিকেশনটি সফলভাবে ইনভয়েস পাঠানো হয়েছে বলে রিপোর্ট করবে।
VPS-এর নিজস্ব IP অ্যাড্রেস থেকে ইনভয়েস মেইল পাঠাবেন না। একটি নতুন VPS IP-এর কোনো সেন্ডিং হিস্ট্রি থাকে না এবং বড় ইমেইল প্রোভাইডাররা হোস্টিং রেঞ্জের কোনো অজানা অ্যাড্রেস থেকে আসা প্রথম মেসেজকে ডিফল্টভাবেই সন্দেহজনক মনে করে। আপনার অথেন্টিকেট করা কোনো ডোমেইনের SMTP (simple mail transfer protocol) রিলে ব্যবহার করে মেইল পাঠান। এটি সম্পূর্ণভাবে সম্পন্ন করার প্রক্রিয়াটি বেশ বড়, এবং self-hosted অ্যাপ থেকে নির্ভরযোগ্যভাবে মেইল পাঠানো গাইডে রিলে, DNS রেকর্ড এবং টেস্টিং সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে।
From অ্যাড্রেসটি হলো সেই জায়গা যেখানে বেশিরভাগ ইনভয়েসিং সেটআপ ভুল হয়। এটি অবশ্যই আপনার নিয়ন্ত্রণাধীন একটি ডোমেইনের হতে হবে এবং আপনার রিলে যেটিকে DKIM (domainkeys identified mail) দিয়ে সাইন করে। From ফিল্ডে ক্লায়েন্টের নিজস্ব অ্যাড্রেস ব্যবহার করা সৌজন্যমূলক মনে হলেও এটি ডেলিভারি নষ্ট করে দেয়, কারণ রিসিভিং সার্ভার যাচাই করে যে From ডোমেইনটি সেই ডোমেইনের সাথে মিলছে কি না যেটি মেসেজটিকে অথেন্টিকেট করেছে। Gmail এই অমিল থাকলে সরাসরি মেসেজ রিজেক্ট করে দেয়:
550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policyFrom ফিল্ডে আপনার নিজের অ্যাড্রেস রাখুন এবং ক্লায়েন্টের অ্যাড্রেসটি Reply-To ফিল্ডে দিন। কোনো বাস্তব ইনভয়েস পাঠানোর আগে আপনার পাবলিশ করা রেকর্ডগুলো চেক করে নিন।
dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.comপ্রথম কমান্ডটি আপনার রিলের নাম উল্লেখ করে একটি SPF (sender policy framework) রেকর্ড রিটার্ন করবে। দ্বিতীয়টি একটি DMARC (domain-based message authentication, reporting and conformance) পলিসি রিটার্ন করবে। তৃতীয়টি আপনার রিলের দেওয়া সিলেক্টরের ওপর নির্ভর করে; যদি কোনো উত্তর না আসে, তার মানে DKIM রেকর্ডটি অনুপস্থিত অথবা ভুল নামে পাবলিশ করা হয়েছে, যার ফলে আপনার পাঠানো প্রতিটি মেসেজের সিগনেচার চেক ব্যর্থ হবে।
এরপর একটি বড় প্রোভাইডারে আপনার নিজের কোনো অ্যাকাউন্টে একটি বাস্তব ইনভয়েস পাঠান এবং raw হেডারগুলো পড়ুন। Authentication-Results হেডারে dkim=pass এবং spf=pass থাকাই হলো একমাত্র গ্রহণযোগ্য প্রমাণ। অ্যাপ্লিকেশনের নিজস্ব "sent" ফ্ল্যাগ মানে কেবল এই যে, এটি মেসেজটিকে রিলের কাছে হস্তান্তর করেছে।
ব্যাকআপ: যে ডাটাবেসটি আপনি কোনোভাবেই হারাতে পারবেন না
একটি মিডিয়া সার্ভার হারিয়ে ফেলা মানে হলো ফাইলগুলো পুনরায় ডাউনলোড করা। এমনকি PhotoPrism বা Immich-এর মতো কোনো self-hosted ফটো সার্ভার সাধারণত অরিজিনাল ফাইলের একটি দ্বিতীয় কপি ধরে রাখে, যা সেগুলো তোলা ফোনটিতেও বিদ্যমান থাকে। কিন্তু আপনার ইনভয়েসিং ডাটাবেস হারিয়ে ফেলা মানে হলো আপনি কী বিল করেছেন, কী পেমেন্ট পেয়েছেন বা আপনার কী পাওনা আছে, তা আর দেখাতে পারবেন না। তাই এটিকে সেই গুরুত্ব দিন।
চারটি জিনিসের ব্যাকআপ রাখুন। ডাটাবেস। স্টোরেজ ভলিউম, যেখানে লোগো, জেনারেট করা PDF এবং খরচের রসিদ থাকে। অ্যাপ্লিকেশনের environment file। এবং সাধারণ ফাইল হিসেবে রাখা রেন্ডার করা PDF, কারণ কোনো অ্যাপ্লিকেশন ছাড়াই 10 বছর পর একটি PDF খোলা সম্ভব।
Environment file-টি মানুষ যতটা মনে করে তার চেয়ে অনেক বেশি গুরুত্বপূর্ণ। Laravel পেমেন্ট গেটওয়ে ক্রেডেনশিয়ালসহ সংবেদনশীল সংরক্ষিত মানগুলোকে সেই ফাইলের APP_KEY ব্যবহার করে এনক্রিপ্ট করে। নতুন জেনারেট করা কী (key)-এর পাশে ডাটাবেস রিস্টোর করলে সেই মানগুলো আর ডিক্রিপ্ট হবে না। আপনার ইনভয়েসগুলো সব ঠিক থাকলেও গেটওয়ে সেটিংসগুলো আর পড়া যাবে না।
InvoiceShelf স্ট্যাক থেকে একটি ডাম্প দেখতে এমন হয়। এর ডাটাবেস সার্ভিস mariadb:10 চালায়, তাই কন্টেইনারের ভেতরের টুলটি হলো mariadb-dump।
docker compose exec -T database mariadb-dump \
--user=root --password=YOUR_ROOT_PASSWORD \
--single-transaction --databases invoiceshelf > invoiceshelf.sql--single-transaction কোনো লক ছাড়াই InnoDB টেবিলগুলোর একটি সামঞ্জস্যপূর্ণ স্ন্যাপশট নেয়, ফলে ডাম্প চলার সময়ও অ্যাপ্লিকেশনটি সচল থাকে। -T ডকারকে টার্মিনাল বরাদ্দ করা থেকে বিরত রাখে, যা অন্যথায় রিডাইরেক্ট করা আউটপুটকে নষ্ট করে দিত এবং আপনি এমন একটি ডাম্প ফাইল পেতেন যা ইমপোর্ট করা যেত না।
encrypted restic backups to off-site storage ব্যবহার করে একটি নির্দিষ্ট সময়সূচী অনুযায়ী সার্ভারের বাইরে ব্যাকআপ পাঠান এবং আপনার হিসাবরক্ষক যে সময়কাল উল্লেখ করেছেন, তা কভার করার মতো পর্যাপ্ত রিটেনশন সেট করুন।
এরপর এটি রিস্টোর করুন। একটি অস্থায়ী কন্টেইনারে ডাম্পটি চালু করুন, লগ ইন করুন এবং গত মাসের ইনভয়েসটি খুলুন। যতক্ষণ না আপনি একবার এটি করছেন, ততক্ষণ আপনি নিশ্চিত হতে পারবেন না যে ব্যাকআপটি কাজ করছে কি না।
আপনার অ্যাকাউন্ট্যান্ট আপনার কাছে যা চাইবেন
কোনো টিউটোরিয়াল থেকে ট্যাক্স সংক্রান্ত পরামর্শ নেবেন না। নিচে যা দেওয়া হলো তা এই সফটওয়্যার থেকে পাওয়া সম্ভব, যাতে আপনি আপনার পরামর্শদাতাকে এই তালিকাটি দেখাতে পারেন।
এক্সপোর্টযোগ্য ডেটা। আপনার ইনভয়েস এবং পেমেন্টগুলো কোনো ডেটাবেস ক্লায়েন্ট ব্যবহার না করেই বা সাপোর্ট টিকেট না খুলেই ইন্টারফেস থেকে CSV ফরম্যাটে এক্সপোর্ট করতে পারা উচিত। একটি SQL dump হলো ব্যাকআপ, এক্সপোর্ট নয়, কারণ আপনার অ্যাকাউন্ট্যান্ট এটি খুলতে পারবেন না।
অপরিবর্তনযোগ্য নাম্বারিং। ইনভয়েস নম্বরগুলো ক্রমানুসারে থাকা উচিত এবং কোনো ফাঁক রাখা ছাড়াই কখনোই পুনরায় ব্যবহার করা উচিত নয়। একটি ইনভয়েস মুছে ফেললে একটি ফাঁক তৈরি হয় যা পরে ব্যাখ্যা করতে হয়। এর পরিবর্তে ইনভয়েস বাতিল (cancel) বা ক্রেডিট (credit) করুন, যা এখানে উল্লিখিত প্রতিটি অ্যাপ্লিকেশন সমর্থন করে। আপনার নিবন্ধনের স্থানের ওপর নির্ভর করে গ্যাপলেস নাম্বারিং প্রয়োজন কি না, তা আগেই জেনে নেওয়া ভালো।
সংরক্ষণ। আপনার নিয়ম অনুযায়ী যতদিন প্রয়োজন ততদিন ডেটাবেস ডাম্প এবং তৈরি করা PDF ফাইলগুলো সংরক্ষণ করুন। PDF হলো সেই ডকুমেন্ট যা প্রকৃতপক্ষে পাঠানো হয়েছিল, এবং কোনো ইনভয়েস নিয়ে বিরোধ দেখা দিলে এই ডকুমেন্টটিই গুরুত্বপূর্ণ প্রমাণ হিসেবে কাজ করে।
পরিবর্তনের ইতিহাস। কে কখন একটি ইনভয়েস এডিট করেছে তা দেখার সুবিধা থাকা জরুরি, এবং এই অ্যাপ্লিকেশনগুলোর মধ্যে এই ফিচারে পার্থক্য রয়েছে। Invoice Ninja প্রতিটি রেকর্ডের জন্য একটি অ্যাক্টিভিটি লগ রাখে।
ইউরোপীয় ইউনিয়নের কিছু অংশে স্ট্রাকচার্ড ই-ইনভয়েসিং এখন আর বাড়তি সুবিধা নয়, বরং একটি বাস্তব প্রয়োজনীয়তা। Invoice Ninja সাধারণ ফরম্যাটগুলো তৈরি করতে পারে, যার মধ্যে ZUGFeRD, XRechnung, Facturae, FatturaPA এবং জেনেরিক EN16931 অন্তর্ভুক্ত। সেলফ-হোস্টেড ইনস্ট্যান্স থেকে Peppol নেটওয়ার্কের মাধ্যমে ডেলিভারি Invoice Ninja-এর নিজস্ব অ্যাক্সেস পয়েন্টের মাধ্যমে সম্পন্ন হয়: আপনাকে তাদের কাছে আপনার এন্টারপ্রাইজ নিবন্ধন করতে হবে এবং প্রতিটি সাবমিশনের জন্য ক্রেডিট কিনতে হবে, তাই আগস্ট 2026 অনুযায়ী এটি একটি পেইড সার্ভিস। Kimai তাদের পেইড প্লাগইনের মাধ্যমে একই ফরম্যাটগুলো তৈরি করতে পারে। অন্য তিনটি অ্যাপ্লিকেশন বর্তমানে কোনো স্ট্রাকচার্ড ই-ইনভয়েস তৈরি করে না, যা ইউরোপীয় ইউনিয়নের ভেতরে ইনভয়েস করার ক্ষেত্রে Invoice Ninja বেছে নেওয়ার সবচেয়ে বড় কারণ।
FAQ
আমার কি Crater নাকি InvoiceShelf ইনস্টল করা উচিত?
InvoiceShelf ইনস্টল করুন। 21 আগস্ট 2026 অনুযায়ী Crater-এর ডিফল্ট ব্রাঞ্চে 741 দিন ধরে কোনো নতুন কমিট নেই এবং এর নিজস্ব ইস্যু ট্র্যাকার ব্যবহারকারীদের অন্য একটি ফর্কের দিকে নির্দেশ করে। InvoiceShelf একই AGPL-3.0 লাইসেন্স এবং একই ডেটা মডেল ব্যবহার করে, তাই এদের মধ্যে পরিবর্তন করা মানে সম্পূর্ণ নতুন করে লেখা নয়, বরং একটি ডেটাবেস মাইগ্রেশন মাত্র। যে গাইডগুলো এখনো Crater ব্যবহারের পরামর্শ দেয়, সেগুলো প্রকল্পটি নিষ্ক্রিয় হওয়ার আগে লেখা হয়েছিল।
আমি কি কোনো খরচ ছাড়াই আমার ব্যবসার জন্য Invoice Ninja ব্যবহার করতে পারি?
হ্যাঁ। সেলফ-হোস্টেড Invoice Ninja-এর Elastic License 2.0-এর অধীনে কোনো খরচ ছাড়াই সব ফিচার ব্যবহার করা যায়, যার মধ্যে রয়েছে রিকারিং ইনভয়েস, ক্লায়েন্ট পোর্টাল এবং পেমেন্ট গেটওয়ে। দুটি ক্ষেত্রে খরচ হতে পারে। ক্লায়েন্টদের জন্য তৈরি পেজ থেকে Invoice Ninja-এর ব্র্যান্ডিং সরাতে হোয়াইট-লেবেল লাইসেন্স প্রয়োজন, যা আগস্ট 2026 অনুযায়ী প্রজেক্টের ভাষ্যমতে "প্রতি বছর $40"। Peppol নেটওয়ার্কের মাধ্যমে ই-ইনভয়েস পাঠানোর জন্য আলাদা চার্জ প্রযোজ্য। লাইসেন্সটি যা নিষেধ করে তা হলো, অন্য লোকেদের জন্য হোস্টেড সার্ভিস হিসেবে এই সফটওয়্যারটি চালানো।
আমার ইনভয়েস ইমেইলগুলো কেন স্প্যাম ফোল্ডারে যায়?
প্রায় সব ক্ষেত্রেই এর কারণ হলো From অ্যাড্রেসে থাকা ডোমেইনের জন্য মেসেজটি অথেন্টিকেটেড নয়। VPS থেকে সরাসরি না পাঠিয়ে একটি SMTP relay ব্যবহার করুন, তারপর আপনার ডোমেইনের জন্য SPF এবং DMARC রেকর্ড পাবলিশ করুন এবং আপনার রিলে থেকে দেওয়া সিলেক্টরের অধীনে DKIM রেকর্ড যোগ করুন। From ফিল্ডে নিজের অ্যাড্রেস রাখুন এবং Reply-To ফিল্ডে ক্লায়েন্টের অ্যাড্রেস দিন। ক্লায়েন্টের অ্যাড্রেস সেন্ডার হিসেবে সেট করলে Gmail মেসেজটিকে 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy দিয়ে রিজেক্ট করে দেয়। একটি টেস্ট মেসেজের Authentication-Results হেডারে dkim=pass এবং spf=pass খুঁজে বের করে সমাধানটি নিশ্চিত করুন।
আমি যদি ঘণ্টার হিসেবে বিল করি, তবে কোনটি বেছে নেব?
Kimai। এটি মূলত একটি টাইম ট্র্যাকার, তাই ইনভয়েস তৈরি হয় অনুমোদিত টাইমশিট এন্ট্রি থেকে এবং লাইন আইটেমগুলো হয় আপনার লগ করা কাজের বিবরণ। এর টেমপ্লেটগুলো হলো DOCX, ODS বা XLSX ফাইল, যা আপনি ওয়ার্ড প্রসেসরে ডিজাইন করতে পারেন, যা CSS এডিট করার চেয়ে সহজ। এর সীমাবদ্ধতা হলো Kimai-তে কোনো ক্লায়েন্ট পোর্টাল বা পেমেন্ট গেটওয়ে নেই, তাই আপনাকে PDF ইমেইল করতে হবে এবং ট্রান্সফারের মাধ্যমে পেমেন্ট নিতে হবে। Invoice Ninja-ও সময় ট্র্যাক করে এবং এতে পোর্টাল আছে, তাই যদি টাইমশিট ডিটেইলের চেয়ে অনলাইন কার্ড পেমেন্ট আপনার কাছে বেশি গুরুত্বপূর্ণ হয়, তবে সেটি বেছে নিন।
ব্যাকআপ হিসেবে ঠিক কী কী রাখা প্রয়োজন?
ডেটাবেস, লোগো ও তৈরি করা PDF ধারণকারী স্টোরেজ ভলিউম, এনভায়রনমেন্ট ফাইল এবং সাধারণ ফাইল হিসেবে রাখা PDF-গুলো। এনভায়রনমেন্ট ফাইলটি মানুষ সাধারণত ভুলে যায়: Invoice Ninja এবং InvoiceShelf-এর মতো Laravel অ্যাপ্লিকেশনগুলো APP_KEY ব্যবহার করে সংরক্ষিত ক্রেডেনশিয়াল এনক্রিপ্ট করে, তাই নতুন জেনারেট করা কি (key)-এর পাশে ডেটাবেস রিস্টোর করলে আপনার পেমেন্ট গেটওয়ে সেটিংস পড়া সম্ভব হবে না। একবার একটি অস্থায়ী ইনস্ট্যান্সে পুরো বিষয়টি রিস্টোর করুন এবং একটি পুরনো ইনভয়েস ওপেন করে দেখুন, কারণ ব্যাকআপটি কাজ করছে কি না তা জানার একমাত্র উপায় এটিই।