SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor

সেরা 5টি self-hosted invoicing সফটওয়্যার তুলনা

Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai এবং ERPNext-এর মতো জনপ্রিয় টুলগুলোর তুলনা দেখুন। আপনার VPS-এ recurring billing, tax ও পেমেন্ট গেটওয়ে সেটআপের খুঁটিনাটি জানুন।

কোন self-hosted invoicing সফটওয়্যারটি আপনার বেছে নেওয়া উচিত?

একটি VPS-এ চালানোর জন্য self-hosted invoicing সফটওয়্যারের ক্ষেত্রে পাঁচটি বাস্তবসম্মত বিকল্প রয়েছে, তবে এদের প্রতিটি একে অপরের থেকে ভিন্ন। Invoice Ninja হলো সবচেয়ে পূর্ণাঙ্গ পণ্য: recurring invoices, client portal, payment gateways এবং e-invoice ফরম্যাট—সবই ইনস্টল করার দিন থেকেই কাজ করে। InvoiceShelf হলো হালকা ওজনের সম্পূর্ণ open source বিকল্প। InvoicePlane একটি সাধারণ PHP অ্যাপ্লিকেশন, যাতে কোনো জটিল orchestrate করার প্রয়োজন হয় না। Kimai লাইন আইটেমের পরিবর্তে ট্র্যাক করা সময়ের (tracked hours) ভিত্তিতে বিল তৈরি করে। ERPNext হলো একটি পূর্ণাঙ্গ accounting সিস্টেম, যা দিয়ে ইনভয়েসও প্রিন্ট করা যায়।

দুটি সমস্যা self-hosted invoicing সেটআপকে ফিচারের অভাবের চেয়েও বেশি ক্ষতিগ্রস্ত করে। প্রথমটি হলো ইমেইল। একটি ইনভয়েস যদি spam ফোল্ডারে পড়ে থাকে, তবে সেটি unpaid ইনভয়েস হিসেবেই গণ্য হয় এবং এটি যে ঘটেছে তা আপনি জানতেও পারেন না। দ্বিতীয়টি হলো ব্যাকআপ। এটি এমন একটি self-hosted ডাটাবেস, যার তথ্য হারিয়ে গেলে তা কেবল অসুবিধাই নয়, বরং কর সংক্রান্ত জটিল সমস্যার কারণ হয়ে দাঁড়ায়।

ফিচারের তালিকা পড়ার আগে লাইসেন্সটি পড়ে নিন। এই পাঁচটির মধ্যে তিনটি 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) এর অধীনে লাইসেন্সকৃত। এটি ইনভয়েস, এস্টিমেট, recurring billing, খরচ, ট্যাক্স, মাল্টি-কারেন্সি, কাস্টমার পোর্টাল এবং মাল্টি-কোম্পানি সুবিধা প্রদান করে। পেমেন্ট এবং white-labelling আলাদা অফিসিয়াল মডিউল রিপোজিটরিতে থাকে, যা উভয়ই AGPL-3.0 এবং বিনামূল্যে পাওয়া যায়। কার্ড পেমেন্ট Stripe checkout-এর মাধ্যমে সম্পন্ন হয়।

আপনি যদি একটি ছোট, সম্পূর্ণ ওপেন সোর্স অ্যাপ্লিকেশন চান এবং আপনার ত্রিশটি গেটওয়ের প্রয়োজন না হয়, তবে এটি বেছে নিন।

InvoicePlane

এটি CodeIgniter-এর ওপর ভিত্তি করে তৈরি একটি PHP অ্যাপ্লিকেশন, যা MIT লাইসেন্সের অধীনে রিলিজ করা হয়েছে। এটিই একমাত্র বিকল্প যা সরাসরি web root-এ ফাইল আনজিপ করে ইনস্টল করা যায়। এতে কোনো Docker বা Node build step-এর প্রয়োজন নেই। PDF তৈরির জন্য mPDF ব্যবহৃত হয়, তাই টেমপ্লেটগুলো HTML এবং CSS দিয়ে তৈরি। ক্লায়েন্টরা গেস্ট লিঙ্কের মাধ্যমে ইনভয়েস দেখতে এবং পেমেন্ট করতে পারে।

এর সীমাবদ্ধতা হলো পেমেন্ট। ডকুমেন্টেশনে স্পষ্টভাবে বলা হয়েছে যে, 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 লেখার পরিবর্তে ওয়ার্ড প্রসেসরে ইনভয়েসের লেআউট ডিজাইন করতে হয়, যা অধিকাংশ মানুষের জন্য সহজ।

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 অন্তর্ভুক্ত থাকে। যখন ইনভয়েসিং আপনার কাজের একমাত্র অংশ থাকে না, তখন এটি সঠিক সমাধান। আটজন ক্লায়েন্টসহ একজন ফ্রিল্যান্সারের জন্য এটি অনেক বড় সফটওয়্যার। এটি সেটআপ করা নিজেই একটি বড় প্রজেক্ট, যা running ERPNext on a VPS-এ আলোচনা করা হয়েছে।

Recurring invoices একটি শিডিউলারের ওপর নির্ভর করে যা আপনি সরাসরি দেখতে পান না

Invoice Ninja, InvoiceShelf, InvoicePlane এবং ERPNext—এই সবকটি প্ল্যাটফর্মই recurring invoice তৈরি করতে পারে। Kimai-এর মূল ফিচারে recurring invoice-এর সুবিধা নেই, কারণ সেখানে invoice তৈরি হয় একটি নির্দিষ্ট সময়ের timesheet এন্ট্রি থেকে।

Laravel-ভিত্তিক প্রতিটি অ্যাপ্লিকেশনেই ব্যর্থতার ধরন একই এবং এটি নীরবে ঘটে। Recurring invoice তৈরি হয় একটি scheduled task-এর মাধ্যমে, যার নাম php artisan schedule:run। অ্যাপ্লিকেশনটির বাইরের কোনো কিছুকে প্রতি মিনিটে এই টাস্কটি কল করতে হয়। যদি কেউ এটি কল না করে, তবে recurring invoice তালিকায় পরবর্তী পাঠানোর তারিখ দেখালেও সেই তারিখটি পার হয়ে যায়। কোনো invoice তৈরি হয় না। কোনো error লগও হয় না, কারণ কোনো কোডই রান করেনি।

তাই আপনার প্রথম recurring invoice তৈরি করার পর, এর পরবর্তী পাঠানোর তারিখ কয়েক মিনিট এগিয়ে দিন এবং অপেক্ষা করুন। যদি কোনো invoice না আসে, তবে বুঝতে হবে শিডিউলারটি চলছে না। Docker ইনস্টলেশনের ক্ষেত্রে এর অর্থ সাধারণত এই যে, compose ফাইলে থাকা cron বা scheduler সার্ভিসটি শুরু হয়নি অথবা সেটি বন্ধ হয়ে গেছে।

docker compose ps
docker compose logs --tail 50

ফাইলে থাকা প্রতিটি সার্ভিসের স্ট্যাটাস running দেখানো উচিত। যে সার্ভিসটি exited অবস্থায় আছে, সেটির লগ আপনাকে পড়তে হবে।

মাল্টি-কারেন্সি এবং ট্যাক্স: কমিট করার আগে যা যাচাই করবেন

ফিচার লিস্টে "মাল্টি-কারেন্সি" কথাটির অর্থ একেক সফটওয়্যারে একেক রকম হতে পারে। আপনার ব্যবসার বাস্তব সংখ্যাগুলো ব্যবহার করে একটি ডেমো ইনস্ট্যান্সে নিচের চারটি বিষয় পরীক্ষা করে দেখুন, কারণ এখানে কোনো ভুল হলে তা আপনার নজরে আসার আগেই আপনার হিসাবরক্ষকের নজরে আসবে।

  1. ইনভয়েস কি ইস্যু করার তারিখের বিনিময় হার (exchange rate) সংরক্ষণ করে? এটি অবশ্যই করতে হবে। অ্যাপ্লিকেশনটি যদি লাইভ রেট থেকে বারবার মোট হিসাব করে, তবে প্রতিবার রিপোর্ট খোলার সময় গত কোয়ার্টারের রিপোর্ট পরিবর্তিত হয়ে যাবে এবং আপনার হিসাবের খাতা আপনার দাখিল করা রিপোর্টের সাথে মিলবে না।
  2. ট্যাক্স কি প্রতিটি লাইন আইটেমের ওপর প্রয়োগ করা হয়, নাকি পুরো ইনভয়েসের ওপর, নাকি উভয় ক্ষেত্রেই? একটি ইনভয়েস-লেভেল রেট ততক্ষণই ঠিক আছে যতক্ষণ না কোনো একটি লাইন জিরো-রেটেড (zero-rated) হচ্ছে।
  3. আপনি কি ট্যাক্সসহ (tax inclusive) এবং ট্যাক্স ছাড়া (tax exclusive) উভয়ভাবেই দাম এন্ট্রি করতে পারেন? পরে কনভার্ট করলে প্রতি লাইনে এক সেন্টের রাউন্ডিং পার্থক্য তৈরি হয় এবং সারা বছর ধরে এই সেন্টগুলো জমা হয়ে বড় অংকের পার্থক্য তৈরি করে।
  4. অন্য দেশের এমন কোনো ক্লায়েন্ট, যার ওপর কোনো 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-এর পদ্ধতিটি সেরা। আর যদি আপনি টেমপ্লেটটিকে ভার্সন কন্ট্রোলে রাখতে চান এবং সেটির পরিবর্তনগুলো ট্র্যাক করতে চান, তবে 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 দিন ধরে কোনো কমিট করা হয়নি।

ChartGap since the last commit on the default branch, in days, checked 21 August 2026
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 -d

1500: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) রিলে ব্যবহার করে মেইল পাঠান। এটি সম্পূর্ণভাবে সম্পন্ন করার প্রক্রিয়াটি একটি আলাদা নির্দেশিকা, এবং sending mail reliably from a self-hosted app-এ রিলে, 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 policy

From ফিল্ডে আপনার নিজস্ব অ্যাড্রেস রাখুন এবং ক্লায়েন্টকে 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" ফ্ল্যাগ মানে কেবল এই যে, এটি মেসেজটিকে রিলের কাছে হস্তান্তর করেছে।

ব্যাকআপ: যে ডাটাবেসটি আপনি কোনোভাবেই হারাতে পারবেন না

একটি মিডিয়া সার্ভার হারিয়ে গেলে ফাইলগুলো পুনরায় ডাউনলোড করা যায়। কিন্তু ইনভয়েসিং ডাটাবেস হারিয়ে গেলে আপনি কী বিল করেছেন, কী পেমেন্ট পেয়েছেন বা কী বকেয়া আছে, তার কোনো প্রমাণ থাকবে না। তাই বিষয়টিকে সেই গুরুত্ব দিন।

চারটি জিনিসের ব্যাকআপ রাখুন। ডাটাবেস। স্টোরেজ ভলিউম, যেখানে লোগো, তৈরি করা PDF এবং খরচের রসিদ থাকে। অ্যাপ্লিকেশনের এনভায়রনমেন্ট ফাইল। এবং সাধারণ ফাইল হিসেবে রাখা রেন্ডার করা PDF, কারণ অ্যাপ্লিকেশনটি না থাকলেও 10 বছর পর একটি PDF খোলা সম্ভব।

এনভায়রনমেন্ট ফাইলটি যতটা মনে করা হয় তার চেয়েও বেশি গুরুত্বপূর্ণ। 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 ডকারকে টার্মিনাল বরাদ্দ করা থেকে বিরত রাখে, যা অন্যথায় রিডাইরেক্ট করা আউটপুটকে নষ্ট করে দিত এবং আপনি এমন একটি ডাম্প ফাইল পেতেন যা ইমপোর্ট করা যেত না।

অফ-সাইট স্টোরেজে এনক্রিপ্টেড restic ব্যাকআপ ব্যবহার করে একটি নির্দিষ্ট সময়সূচী অনুযায়ী এগুলো সার্ভারের বাইরে পাঠান এবং আপনার হিসাবরক্ষকের পরামর্শ অনুযায়ী রিটেনশন পিরিয়ড নির্ধারণ করুন।

এরপর এটি রিস্টোর করে দেখুন। একটি অস্থায়ী কন্টেইনারে ডাম্পটি চালু করুন, লগ ইন করুন এবং গত মাসের ইনভয়েসটি খুলে দেখুন। যতক্ষণ না আপনি একবার এটি করছেন, ততক্ষণ আপনি নিশ্চিত হতে পারবেন না যে ব্যাকআপটি কাজ করছে কি না।

আপনার অ্যাকাউন্ট্যান্ট আপনার কাছে যা চাইবেন

কোনো টিউটোরিয়াল থেকে ট্যাক্স সংক্রান্ত পরামর্শ নেবেন না। নিচে যা দেওয়া হলো তা এই সফটওয়্যার থেকে পাওয়া সম্ভব, তাই আপনি এই তালিকাটি আপনার পরামর্শদাতার কাছে নিয়ে যেতে পারেন।

এক্সপোর্টযোগ্য ডেটা। আপনার ইন্টারফেস থেকে কোনো ডেটাবেস ক্লায়েন্ট ছাড়াই এবং কোনো সাপোর্ট টিকিট খোলা ছাড়াই আপনার ইনভয়েস এবং পেমেন্টগুলো CSV ফরম্যাটে এক্সপোর্ট করতে পারা উচিত। একটি SQL ডাম্প হলো ব্যাকআপ, এক্সপোর্ট নয়, কারণ আপনার অ্যাকাউন্ট্যান্ট এটি খুলতে পারবেন না।

অপরিবর্তনযোগ্য নম্বর। ইনভয়েস নম্বরগুলো ক্রমানুসারে হওয়া উচিত এবং কোনো ফাঁক না রেখে কখনোই পুনরায় ব্যবহার করা উচিত নয়। একটি ইনভয়েস ডিলিট করলে একটি ফাঁক তৈরি হয় যা পরে ব্যাখ্যা করতে হয়। এর পরিবর্তে ইনভয়েস বাতিল (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 দিন ধরে কোনো নতুন commit নেই এবং এর নিজস্ব issue tracker ব্যবহারকারীদের অন্য একটি fork-এ যাওয়ার পরামর্শ দেয়। InvoiceShelf একই AGPL-3.0 লাইসেন্স এবং একই ডেটা মডেল ব্যবহার করে, তাই এদের মধ্যে পরিবর্তন করা মানে সম্পূর্ণ নতুন করে লেখা নয়, বরং একটি ডেটাবেস মাইগ্রেশন মাত্র। যে গাইডগুলোতে এখনো Crater ব্যবহারের পরামর্শ দেওয়া হচ্ছে, সেগুলো প্রকল্পটি নিষ্ক্রিয় হওয়ার আগে লেখা হয়েছিল।

আমি কি কোনো খরচ ছাড়াই আমার ব্যবসার জন্য Invoice Ninja ব্যবহার করতে পারি?

হ্যাঁ। Elastic License 2.0-এর অধীনে self-hosted Invoice Ninja কোনো খরচ ছাড়াই সম্পূর্ণ কার্যকর, যার মধ্যে recurring invoices, client portal এবং payment gateway অন্তর্ভুক্ত রয়েছে। দুটি জিনিসের জন্য খরচ হয়। ক্লায়েন্ট-ফেসিং পেজ থেকে Invoice Ninja-এর ব্র্যান্ডিং সরাতে white-label লাইসেন্স প্রয়োজন, যা আগস্ট 2026 অনুযায়ী প্রকল্পের নিজস্ব ভাষ্যমতে "প্রতি বছর $40"। Peppol নেটওয়ার্কের মাধ্যমে ই-ইনভয়েস পাঠানোর বিষয়টি আলাদাভাবে চার্জ করা হয়। লাইসেন্সটি যা নিষিদ্ধ করে তা হলো, অন্য লোকেদের জন্য হোস্ট করা পরিষেবা হিসেবে এই সফটওয়্যারটি চালানো।

আমার ইনভয়েস ইমেইলগুলো কেন স্প্যাম ফোল্ডারে যায়?

প্রায় সবসময়ই এর কারণ হলো, From ঠিকানায় থাকা ডোমেইনের জন্য বার্তাটি অথেন্টিকেটেড নয়। VPS থেকে সরাসরি না পাঠিয়ে একটি SMTP relay ব্যবহার করুন, তারপর আপনার ডোমেইনের জন্য SPF এবং DMARC রেকর্ড প্রকাশ করুন এবং আপনার রিলে যে selector দেয় তার অধীনে 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 দিয়ে সংরক্ষিত ক্রেডেনশিয়াল এনক্রিপ্ট করে, তাই নতুন তৈরি করা কী-এর পাশে ডেটাবেস রিস্টোর করলে আপনার পেমেন্ট গেটওয়ে সেটিংসগুলো পড়ার অযোগ্য হয়ে যাবে। একবার একটি অস্থায়ী ইনস্ট্যান্সে পুরো বিষয়টি রিস্টোর করুন এবং একটি পুরনো ইনভয়েস খুলে দেখুন, কারণ ব্যাকআপটি কাজ করছে কি না তা জানার এটাই একমাত্র উপায়।

#invoicing#self-hosting#small-business#docker#accounting