SSD Nodes Learn Hosting plans →
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-08-22

بهترین نرم‌افزار فاکتوردهی self-hosted برای کسب‌وکار

مقایسه فنی Invoice Ninja، InvoiceShelf، InvoicePlane، Kimai و ERPNext برای نصب روی VPS. بررسی قابلیت‌های فاکتور دوره‌ای، درگاه پرداخت و چالش‌های ایمیل و بک‌آپ.

کدام نرم‌افزار فاکتوردهی self-hosted را انتخاب کنید؟

نرم‌افزارهای فاکتوردهی self-hosted به پنج گزینهٔ واقع‌بینانه روی یک VPS محدود می‌شوند که جایگزین‌های نزدیکی برای یکدیگر نیستند. Invoice Ninja کامل‌ترین محصول است: فاکتورهای دوره‌ای، پورتال مشتری، درگاه‌های پرداخت و فرمت‌های فاکتور الکترونیکی، همگی از همان روز نصب کار می‌کنند. InvoiceShelf گزینهٔ سبک‌تر و کاملاً متن‌باز است. InvoicePlane یک برنامهٔ سادهٔ PHP است که نیاز به هیچ‌گونه ارکستراسیون ندارد. Kimai به جای اقلام فاکتور، ساعات کاری ردیابی‌شده را صورت‌حساب می‌کند. ERPNext یک سیستم حسابداری کامل است که قابلیت صدور فاکتور را نیز دارد.

دو مشکل، راه‌اندازی فاکتوردهی self-hosted را بسیار بیشتر از نبود یک قابلیت، با شکست مواجه می‌کنند. اولی ایمیل است. فاکتوری که در پوشهٔ اسپم قرار بگیرد، فاکتوری پرداخت‌نشده است و هیچ‌چیز به شما اطلاع نمی‌دهد که این اتفاق افتاده است. دومی پشتیبان‌گیری (backup) است. این تنها پایگاه‌دادهٔ self-hosted است که از دست دادن آن، به جای یک دردسر ساده، به یک مشکل مالیاتی تبدیل می‌شود.

پیش از خواندن لیست قابلیت‌ها، مجوز (licence) را مطالعه کنید. سه مورد از این پنج گزینه copyleft هستند، یکی permissive است و یکی source-available است که محدودیت‌های واقعی برای نحوهٔ استفاده از آن وجود دارد.

پنج گزینه موجود و مخاطب هر یک

Invoice Ninja

یک برنامه مبتنی بر Laravel که در حال حاضر در نسخه v5 قرار دارد. میزبانی شخصی (self-hosting) آن رایگان و بدون محدودیت است و شامل فاکتورهای دوره‌ای، پیش‌فاکتورها، پروژه‌ها، ردیابی زمان، هزینه‌ها، پورتال مشتری و درگاه‌های پرداخت از جمله Stripe و PayPal می‌شود. این پروژه خود را به عنوان «یک برنامه متن‌باز (source-available) برای فاکتور، پیش‌فاکتور، پروژه و ردیابی زمان ساخته‌شده با Laravel» معرفی می‌کند. تنها بخش پولی آن مربوط به برندینگ است. به گفته خود پروژه: «ما یک لایسنس white-label به قیمت 40 دلار در سال ارائه می‌دهیم تا برند Invoice Ninja از بخش‌های در معرض دید مشتری حذف شود». این قیمت تا اوت 2026 معتبر است.

اگر کامل‌ترین محصول را می‌خواهید و با اجرای یک پشته (stack) بزرگ مشکلی ندارید، این گزینه را انتخاب کنید.

InvoiceShelf

یک انشعاب (fork) از Crater که تحت مجوز GNU Affero General Public License نسخه 3 (AGPL-3.0) منتشر شده است. این برنامه فاکتورها، برآوردها، صورت‌حساب‌های دوره‌ای، هزینه‌ها، مالیات، چندارزی، پورتال مشتری و مدیریت چند شرکت را پوشش می‌دهد. ماژول‌های پرداخت و white-label در مخازن رسمی جداگانه‌ای قرار دارند که هر دو تحت مجوز AGPL-3.0 و رایگان هستند. پرداخت با کارت از طریق Stripe checkout انجام می‌شود.

اگر یک برنامه کوچک و کاملاً متن‌باز می‌خواهید و به سی درگاه پرداخت نیاز ندارید، این گزینه را انتخاب کنید.

InvoicePlane

یک برنامه PHP مبتنی بر CodeIgniter که تحت مجوز MIT منتشر شده است و تنها گزینه در این لیست است که با استخراج فایل‌ها در web root نصب می‌شود. بدون نیاز به Docker و بدون مرحله build با Node. فایل‌های PDF توسط mPDF تولید می‌شوند، بنابراین قالب‌ها از نوع HTML و CSS هستند. مشتریان یک لینک مهمان برای مشاهده و پرداخت فاکتور دریافت می‌کنند.

نکته اصلی در مورد پرداخت‌ها است. مستندات به‌صراحت بیان می‌کنند که InvoicePlane 1.6 به‌صورت پیش‌فرض فقط از Stripe پشتیبانی می‌کند و سایر ارائه‌دهندگان در این نسخه حذف شده‌اند. نیازمندی‌های منتشرشده برای سری 1.6 شامل PHP 8.0 تا 8.1 و MySQL 5.5 یا MariaDB معادل آن است. یادداشت‌های مربوط به هر نسخه‌ای که دانلود می‌کنید را مطالعه کنید، زیرا سری 1.7 همچنان در حال توسعه است.

اگر از هاست اشتراکی یا یک VPS با 512 مگابایت رم استفاده می‌کنید، این گزینه را انتخاب کنید.

Kimai

یک ابزار ردیابی زمان تحت مجوز AGPL-3.0 که از روی تایم‌شیت‌ها، فاکتور صادر می‌کند. این گزینه برای هر کسی که بر اساس ساعت کار می‌کند، بهترین پاسخ است. قالب‌های فاکتور به‌صورت فایل‌های DOCX، ODS یا XLSX آپلود می‌شوند که طبق مستندات، تنها فرمت‌های پذیرفته‌شده هستند و خروجی آن‌ها به صورت PDF یا HTML ارائه می‌شود. شما به جای نوشتن CSS، فاکتور خود را در یک نرم‌افزار واژه‌پرداز طراحی می‌کنید که برای اکثر افراد ساده‌تر است.

Kimai پورتال مشتری و درگاه پرداخت ندارد، بنابراین باید فایل PDF را ایمیل کنید. فاکتور الکترونیکی ساختاریافته (e-invoicing) یک افزونه پولی در فروشگاه به نام E-Invoice Plus است که تا اوت 2026 برای نصب شخصی، 99 یورو (بدون احتساب مالیات بر ارزش افزوده) در سال قیمت‌گذاری شده است و پروفایل‌های EN16931، XRechnung، ZUGFeRD، Factur-X و Peppol را پوشش می‌دهد.

اگر فاکتور خروجیِ زمانِ ردیابی‌شده است، این گزینه را انتخاب کنید.

ERPNext

تحت مجوز GPL-3.0 و در دسته‌بندی متفاوتی از نرم‌افزار قرار دارد. فاکتور فروش تنها یک نوع سند در یک سیستم حسابداری کامل با نمودار حساب‌ها، ثبت‌های دفتر روزنامه، انبار و حقوق و دستمزد است. این گزینه زمانی مناسب است که صدور فاکتور دیگر تمام کار شما نباشد. برای یک فریلنسر با هشت مشتری، این نرم‌افزار بسیار سنگین است. راه‌اندازی آن پروژه خاص خود را دارد که در اجرای ERPNext روی یک VPS به آن پرداخته شده است.

فاکتورهای دوره‌ای به یک زمان‌بند (scheduler) وابسته هستند که قابل مشاهده نیست

برنامه‌های Invoice Ninja، InvoiceShelf، InvoicePlane و ERPNext همگی قابلیت تولید فاکتورهای دوره‌ای را دارند. Kimai در هستهٔ خود ویژگی فاکتور دوره‌ای ندارد، زیرا در آنجا فاکتور بر اساس ورودی‌های timesheet برای یک دوره ساخته می‌شود.

حالت شکست در تمام برنامه‌های مبتنی بر Laravel یکسان و بی‌صدا است. فاکتورهای دوره‌ای توسط یک وظیفهٔ زمان‌بندی‌شده به نام php artisan schedule:run ایجاد می‌شوند که باید توسط چیزی خارج از برنامه، هر دقیقه فراخوانی شود. اگر چیزی آن را فراخوانی نکند، لیست فاکتورهای دوره‌ای همچنان تاریخ ارسال بعدی را نشان می‌دهد و آن تاریخ به‌سادگی می‌گذرد. هیچ فاکتوری ایجاد نمی‌شود. هیچ خطایی هم ثبت نمی‌شود، زیرا کدی اجرا نشده است.

بنابراین پس از ایجاد اولین فاکتور دوره‌ای، تاریخ ارسال بعدی آن را چند دقیقه جلوتر تنظیم کنید و منتظر بمانید. اگر چیزی ارسال نشد، یعنی زمان‌بند در حال اجرا نیست. در نصب Docker، این معمولاً به این معنی است که سرویس cron یا scheduler در فایل compose هرگز شروع نشده یا از کار افتاده است.

docker compose ps
docker compose logs --tail 50

هر سرویس در فایل باید وضعیت running را گزارش کند. سرویسی که در وضعیت exited قرار دارد، همان سرویسی است که باید لاگ‌های آن را بررسی کنید.

ارز چندگانه و مالیات: مواردی که باید پیش از نهایی‌سازی بررسی کنید

لیست ویژگی‌های نرم‌افزارها از عبارت «ارز چندگانه» (multi-currency) معانی بسیار متفاوتی برداشت می‌کنند. این چهار مورد را روی یک نمونه نمایشی (demo) و با استفاده از اعداد واقعی کسب‌وکار خود آزمایش کنید؛ چرا که اشتباه در این بخش، به‌جای شما توسط حسابدارتان کشف خواهد شد.

  1. آیا فاکتور، نرخ ارز اعمال‌شده در تاریخ صدور را ذخیره می‌کند؟ این الزامی است. اگر برنامه، مجموع مبالغ را بر اساس نرخ لحظه‌ای بازمحاسبه کند، گزارش‌های فصل گذشته با هر بار باز کردن تغییر می‌کنند و دفاتر حسابداری شما دیگر با آنچه قبلاً ثبت کرده‌اید، مطابقت نخواهند داشت.
  2. آیا مالیات بر اساس هر ردیف کالا، بر اساس کل فاکتور، یا هر دو اعمال می‌شود؟ نرخ واحد برای کل فاکتور تا زمانی که یکی از ردیف‌ها مشمول نرخ صفر نباشد، مشکلی ایجاد نمی‌کند.
  3. آیا می‌توانید قیمت‌ها را هم به‌صورت «شامل مالیات» و هم «بدون مالیات» وارد کنید؟ تبدیل قیمت‌ها پس از ثبت، باعث ایجاد اختلاف گرد کردن به اندازه یک سنت در هر ردیف می‌شود و این سنت‌ها در طول یک سال انباشته خواهند شد.
  4. سند برای مشتری در کشور دیگری که مشمول مالیات بر ارزش افزوده (VAT) نیست، چه چیزی را نشان می‌دهد؟ شما به درج یادداشت معافیت مالیاتی روی فاکتور نیاز دارید، نه فقط یک عدد صفر در ستون مالیات.

نرم‌افزارهای Invoice Ninja و ERPNext هر چهار مورد را پوشش می‌دهند. InvoiceShelf مالیات و ارز چندگانه را در لیست ویژگی‌های خود دارد. InvoicePlane و Kimai ساده‌تر هستند، بنابراین آن‌ها را با پیچیده‌ترین فاکتور خود آزمایش کنید، نه با ساده‌ترین آن‌ها.

پورتال مشتری و درگاه‌های پرداخت

پورتال مشتری صفحه‌ای است که در آن مشتری فاکتورهای خود را مشاهده می‌کند، فایل PDF را دانلود کرده و پرداخت را انجام می‌دهد. اهمیت این موضوع بیش از آن چیزی است که به نظر می‌رسد، زیرا پیگیری پرداخت از طریق ایمیل، زمان بیشتری نسبت به صدور خودِ فاکتور از شما می‌گیرد.

Invoice Ninja در این زمینه قدرتمندترین گزینه است؛ این ابزار دارای یک پورتال کامل، درگاه‌های پرداخت متعدد، قابلیت ذخیره‌سازی روش‌های پرداخت و صدور خودکار صورت‌حساب برای فاکتورهای دوره‌ای است. InvoiceShelf دارای پورتال مشتری است و از طریق ماژول پرداخت خود، امکان استفاده از Stripe checkout را نیز فراهم می‌کند. InvoicePlane برای هر فاکتور یک لینک مهمان ارائه می‌دهد و از Stripe پشتیبانی می‌کند. Kimai هیچ‌کدام از این قابلیت‌ها را ندارد، بنابراین فایل PDF باید به صورت پیوست ارسال شود.

یک نکته همواره باعث سردرگمی می‌شود: میزبانی شخصی (self-hosting) برنامهٔ صدور فاکتور به معنای نگهداری شماره کارت‌های بانکی نیست. با استفاده از Stripe checkout، مشتری به سایت Stripe هدایت می‌شود، اطلاعات کارت را در آنجا وارد می‌کند و VPS شما هرگز آن شماره را نمی‌بیند. محدودهٔ انطباق شما با استانداردهای PCI (صنعت کارت‌های پرداخت) دقیقاً به این دلیل کوچک باقی می‌ماند که شما فرم پرداخت را طراحی نکرده‌اید. اگر بعداً به بیش از یک پردازشگر نیاز داشتید یا خواستید پرداخت‌ها را بر اساس کشور هدایت کنید، این کار در لایهٔ جداگانه‌ای مانند ارکستراسیون پرداخت به صورت self-hosted با Hyperswitch قرار می‌گیرد.

کیفیت PDF و قالبی که در نهایت ویرایش خواهید کرد

شما باید قالب را ویرایش کنید. تمام تنظیمات پیش‌فرض در اینجا، آدرس شما را در مکان نادرستی برای کشورتان قرار می‌دهند.

Invoice Ninja برای تبدیل قالب‌های HTML و CSS به PDF از یک نسخه headless مرورگر Chromium استفاده می‌کند که درون ایمیج بسته‌بندی شده است؛ به همین دلیل حجم کانتینر زیاد است. برای آن حافظه کافی در نظر بگیرید: مرورگر headless سنگین‌ترین پردازش در این پشته است، بنابراین یک VPS با 1 GB رم برای آن بسیار محدود است. InvoicePlane از mPDF استفاده می‌کند که کاملاً مبتنی بر PHP و سبک است، اما به قیمت نادیده گرفتن برخی ویژگی‌های مدرن CSS. رویکرد Kimai متفاوت است و از شما می‌خواهد یک فایل DOCX یا ODS آپلود کنید؛ بنابراین طراحی توسط کسی انجام می‌شود که با LibreOffice یا Word کار می‌کند و هرگز استایل‌شیت ننوشته است.

اگر طراحی فاکتور برای شما اهمیت دارد و CSS اهمیتی ندارد، رویکرد Kimai برنده است. اگر می‌خواهید قالب در کنترل نسخه (version control) باشد و بتوان تفاوت‌های آن را بررسی (diff) کرد، HTML گزینه بهتری است.

آیا مجوز اجازه استفاده تجاری را می‌دهد؟

هر پنج مورد به شما اجازه می‌دهند برای مشتریان خود فاکتور صادر کنید. تفاوت‌ها زمانی آشکار می‌شوند که فراتر از این کار انجام دهید.

نرم‌افزار Invoice Ninja تحت مجوز Elastic License 2.0 ارائه شده است. دو بند در اینجا اهمیت دارند:

شما نمی‌توانید این نرم‌افزار را به‌عنوان یک سرویس میزبانی‌شده یا مدیریت‌شده به اشخاص ثالث ارائه دهید، به‌طوری‌که آن سرویس به کاربران امکان دسترسی به مجموعه قابل‌توجهی از ویژگی‌ها یا عملکردهای نرم‌افزار را بدهد.
شما نمی‌توانید قابلیت کلید مجوز در نرم‌افزار را جابه‌جا، تغییر، غیرفعال یا دور بزنید.

بنابراین، اجرای آن برای کسب‌وکار شخصی خودتان بلامانع است، اما اجرای نمونه‌های آن برای مشتریان به‌عنوان یک محصول مجاز نیست. بند دوم دلیل این است که حذف برندینگ مستلزم پرداخت 40 دلار برای مجوز است، نه اعمال یک پچ روی سورس‌کد.

نرم‌افزارهای InvoiceShelf، Kimai و Crater تحت مجوز AGPL-3.0 هستند. استفاده تجاری از آن‌ها رایگان است و هیچ سطح کاربری بالاتری نسبت به شما وجود ندارد. تعهد اصلی در بخش 13 ذکر شده است: اگر کد را تغییر دهید و به دیگران اجازه دهید از نسخه تغییریافته شما از طریق شبکه استفاده کنند، باید سورس‌کد تغییرات خود را به آن‌ها ارائه دهید. یک نمونه تغییرنیافته، خودبه‌خود تحت پوشش سورس‌کد عمومی بالادستی (upstream) قرار دارد، بنابراین اکثر کسانی که خودشان میزبانی (self-host) می‌کنند، هرگز با این مورد درگیر نمی‌شوند.

نرم‌افزار InvoicePlane تحت مجوز MIT است که سبک‌ترین تعهد را در این گروه دارد، هرچند در فایل README آن ذکر شده که نام و لوگو متعلق به پروژه باقی می‌مانند.

نرم‌افزار ERPNext تحت مجوز GPL-3.0 است. تغییراتی که توزیع می‌کنید باید به اشتراک گذاشته شوند و اجرای خصوصی آن هیچ تعهدی ایجاد نمی‌کند.

این شرح متن مجوزهاست و توصیه حقوقی محسوب نمی‌شود.

آیا این پروژه همچنان پشتیبانی می‌شود؟ لاگ commitها را بررسی کنید

Crater برای چندین سال یک برنامه متن‌باز محبوب برای صدور فاکتور بود و هنوز راهنماهای بسیاری آن را توصیه می‌کنند. شاخه پیش‌فرض (default branch) این پروژه برای 741 روز هیچ commit جدیدی نداشته است.

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 پروژه‌ای که در آن بلوک قرار دارند، پنج مورد در هفته گذشته commit داشته‌اند. InvoiceShelf همان forkای است که کار Crater را با همان مجوز AGPL-3.0 و همان مدل داده ادامه داده است؛ بنابراین انتقال به آن، یک مهاجرت داده محسوب می‌شود و نه بازنویسی کامل. به جای Crater، برنامه InvoiceShelf را نصب کنید.

نصب هر یک روی یک VPS

همه سرویس‌ها به‌جز InvoicePlane به‌سادگی تحت Docker Compose اجرا می‌شوند. اگر با این ابزار آشنا نیستید، با اولین استک Docker Compose روی یک VPS شروع کنید و سپس به اینجا بازگردید.

Invoice Ninja مخزن compose اختصاصی خود را ارائه می‌دهد.

git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --show

آن کلید را به همراه APP_URL واقعی خود در فایل env در مخزن کپی کنید. سپس مالکیت (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

پیش از اجرا، آن فایل را باز کنید. تمام رمزهای عبور موجود در آن صرفاً جای‌نگهدار (placeholder) هستند و خود فایل نیز در توضیحاتش به این موضوع اشاره کرده است. مقادیر APP_URL، SESSION_DOMAIN و SANCTUM_STATEFUL_DOMAINS همگی به‌صورت پیش‌فرض localhost هستند و هر سه باید پیش از اولین ورود، با نام میزبان (hostname) واقعی شما تنظیم شوند. سپس آن را بالا بیاورید.

docker compose up -d

این سرویس پورت 8090 را روی میزبان منتشر می‌کند و در داخل کانتینر روی پورت 8080 سرویس‌دهی می‌کند. پیش از آنکه حتی یک کلاینت را به سمت آن هدایت کنید، یک reverse proxy با TLS (امنیت لایه انتقال) در مقابل آن قرار دهید.

فایل compose برای محیط production برنامه Kimai، برگرفته از مستندات پروژه
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;"

آرشیو را از صفحه releases پروژه دانلود کنید، آن را در ریشه وب (web root) خود استخراج کنید، ipconfig.php.example را به ipconfig.php کپی کنید و طبق توضیحات موجود در آن فایل، URL خود را در آن تنظیم کنید. سپس https://your-domain.example/index.php/setup را باز کرده و مراحل نصب را دنبال کنید.

چرا فاکتور شما به پوشه اسپم می‌رود

این همان شکستی است که برای شما هزینه مالی دارد، در حالی که برنامه با خوشحالی گزارش می‌دهد که فاکتور ارسال شده است.

ایمیل‌های فاکتور را از آدرس IP خود VPS ارسال نکنید. یک IP جدید VPS هیچ سابقه ارسالی ندارد و سرویس‌دهنده‌های بزرگ، اولین پیام از یک آدرس ناشناس در محدوده IPهای میزبانی را به‌طور پیش‌فرض مشکوک تلقی می‌کنند. ارسال را از طریق یک SMTP (پروتکل انتقال ساده نامه) relay روی دامنه‌ای که احراز هویت کرده‌اید انجام دهید. انجام این کار به‌صورت سرتاسری راهنمای خاص خود را دارد و ارسال مطمئن ایمیل از یک برنامه self-hosted به بررسی relay، رکوردهای DNS و تست کردن می‌پردازد.

آدرس From جایی است که اکثر تنظیمات صدور فاکتور در آن دچار اشتباه می‌شوند. این آدرس باید روی دامنه‌ای باشد که شما کنترل می‌کنید و دامنه‌ای باشد که relay شما آن را با DKIM (ایمیل شناسایی‌شده با کلید دامنه) امضا می‌کند. قرار دادن آدرس خودِ مشتری در بخش 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 (چارچوب سیاست فرستنده) را برگرداند که نام relay شما در آن ذکر شده باشد. دستور دوم باید یک سیاست DMARC (احراز هویت، گزارش‌دهی و انطباق پیام مبتنی بر دامنه) را برگرداند. دستور سوم به selectorای که relay به شما داده بستگی دارد؛ پاسخ خالی به این معناست که رکورد DKIM وجود ندارد یا با نام اشتباه منتشر شده است، بنابراین هر پیامی که ارسال می‌کنید در بررسی امضا شکست خواهد خورد.

سپس یک فاکتور واقعی به حسابی که در یک سرویس‌دهنده بزرگ دارید ارسال کنید و هدرهای خام را بخوانید. مقادیر dkim=pass و spf=pass در هدر Authentication-Results تنها مدرک معتبری است که اهمیت دارد. پرچم "sent" در خود برنامه فقط به این معناست که پیام را به relay تحویل داده است.

پشتیبان‌گیری: تنها پایگاه‌داده‌ای که نباید از دست بدهید

از دست دادن یک مدیا سرور به معنای دانلود مجدد فایل‌هاست. حتی یک سرویس میزبانی شخصی عکس مانند PhotoPrism یا Immich معمولاً نسخه‌ای ثانویه از فایل‌های اصلی را نگه می‌دارد که همچنان روی گوشی موبایلی که آن‌ها را ثبت کرده، موجود است. اما از دست دادن پایگاه‌دادهٔ صورت‌حساب‌ها به این معناست که نمی‌توانید مشخص کنید چه چیزی را صورت‌حساب کرده‌اید، چه مبلغی دریافت کرده‌اید یا چه بدهی‌هایی باقی مانده است. با آن متناسب با اهمیتش برخورد کنید.

از چهار مورد پشتیبان تهیه کنید: پایگاه‌داده، volume ذخیره‌سازی که لوگوها، PDFهای تولیدشده و رسیدهای هزینه را در خود نگه می‌دارد، فایل environment برنامه، و در نهایت PDFهای نهایی که به صورت فایل‌های معمولی ذخیره شده‌اند؛ زیرا یک فایل PDF حتی پس از ده سال، بدون برنامه‌ای که آن را تولید کرده است، باز می‌شود.

اهمیت فایل environment بیش از آن چیزی است که تصور می‌شود. لاراول مقادیر حساس ذخیره‌شده، از جمله اعتبارنامه‌های درگاه پرداخت را با استفاده از APP_KEY موجود در آن فایل رمزنگاری می‌کند. اگر پایگاه‌داده را در کنار یک کلید تازه تولیدشده بازیابی کنید، آن مقادیر رمزگشایی نخواهند شد. صورت‌حساب‌های شما موجود خواهند بود، اما تنظیمات درگاه پرداخت غیرقابل خواندن می‌شوند.

یک خروجی (dump) از پشته 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 بدون قفل کردن آن‌ها می‌گیرد، بنابراین برنامه در حین اجرای عملیات dump همچنان به سرویس‌دهی ادامه می‌دهد. -T از تخصیص ترمینال توسط داکر جلوگیری می‌کند؛ در غیر این صورت خروجی تغییر مسیر داده شده (redirected) خراب می‌شود و فایل dump حاصل، قابل import نخواهد بود.

این فایل را طبق یک زمان‌بندی با استفاده از پشتیبان‌های رمزنگاری‌شده restic به فضای ذخیره‌سازی خارج از سایت از سرور خارج کنید و دوره نگهداری (retention) را به اندازه‌ای طولانی تنظیم کنید که بازهٔ زمانی مورد نظر حسابدارتان را پوشش دهد.

سپس آن را بازیابی کنید. dump را در یک کانتینر موقت بالا بیاورید، وارد شوید و صورت‌حساب ماه گذشته را باز کنید. تا زمانی که این کار را یک بار انجام نداده‌اید، نمی‌دانید که آیا پشتیبان‌گیری واقعاً کار می‌کند یا خیر.

آنچه حسابدار شما درخواست خواهد کرد

از یک راهنمای آموزشی، مشاوره مالیاتی نگیرید. آنچه در ادامه می‌آید، قابلیت‌های خروجی این نرم‌افزار است تا بتوانید این فهرست را به مشاور خود ارائه دهید.

داده‌های قابل استخراج. شما باید بتوانید فاکتورها و پرداخت‌های خود را از طریق رابط کاربری و به فرمت CSV استخراج کنید، بدون اینکه نیاز به کلاینت دیتابیس داشته باشید یا تیکت پشتیبانی باز کنید. یک SQL dump صرفاً یک نسخه پشتیبان است، نه یک خروجی قابل استفاده، زیرا حسابدار شما نمی‌تواند آن را باز کند.

شماره‌گذاری تغییرناپذیر. شماره فاکتورها باید به ترتیب باشند، هرگز دوباره استفاده نشوند و هیچ شکافی در آن‌ها وجود نداشته باشد. حذف یک فاکتور باعث ایجاد شکافی می‌شود که بعداً باید برای آن توضیح ارائه دهید. به‌جای حذف، از قابلیت لغو (Cancel) یا اعتبار (Credit) استفاده کنید که تمامی برنامه‌های معرفی‌شده در اینجا از آن پشتیبانی می‌کنند. اینکه آیا شماره‌گذاری بدون شکاف برای شما الزامی است یا خیر، به محل ثبت کسب‌وکار شما بستگی دارد و بهتر است از همان ابتدا در این مورد پرس‌وجو کنید.

نگهداری. نسخه‌های پشتیبان دیتابیس و فایل‌های PDF نهایی‌شده را تا زمانی که قوانین شما ایجاب می‌کند، نگهداری کنید. فایل PDF همان سندی است که در واقعیت ارسال شده است و در صورت بروز اختلاف بر سر یک فاکتور، این همان مدرک معتبری است که اهمیت دارد.

تاریخچه تغییرات. امکان مشاهده اینکه چه کسی فاکتور را ویرایش کرده و در چه زمانی، قابلیتی ارزشمند است که در برنامه‌های مختلف تفاوت زیادی دارد. Invoice Ninja یک لاگ فعالیت برای هر رکورد نگهداری می‌کند.

صدور فاکتور الکترونیک ساختاریافته در بخش‌هایی از اتحادیه اروپا به یک الزام واقعی تبدیل شده است، نه صرفاً یک قابلیت جانبی. Invoice Ninja فرمت‌های رایج از جمله ZUGFeRD، XRechnung، Facturae، FatturaPA و فرمت عمومی EN16931 را تولید می‌کند. ارسال از طریق شبکه Peppol در یک نمونه self-hosted از طریق نقطه دسترسی اختصاصی Invoice Ninja انجام می‌شود: شما باید موجودیت خود را نزد آن‌ها ثبت کنید و برای هر ارسال اعتبار خریداری کنید، بنابراین تا اوت 2026 این یک سرویس پولی محسوب می‌شود. Kimai از طریق پلاگین پولی خود به همین فرمت‌ها دسترسی پیدا می‌کند. سه برنامه دیگر در حال حاضر هیچ‌گونه فاکتور الکترونیک ساختاریافته‌ای تولید نمی‌کنند که این مهم‌ترین دلیل برای انتخاب Invoice Ninja در صورت صدور فاکتور در اتحادیه اروپا است.

FAQ

آیا باید Crater را نصب کنم یا InvoiceShelf؟

InvoiceShelf را انتخاب کنید. شاخه پیش‌فرض Crater تا تاریخ 21 اوت 2026 به مدت 741 روز هیچ commit جدیدی نداشته است و سیستم ردیابی مشکلات (issue tracker) خودِ پروژه، کاربران را به سمت یک fork هدایت می‌کند. InvoiceShelf از همان مجوز AGPL-3.0 و همان مدل داده استفاده می‌کند، بنابراین انتقال بین آن‌ها بیشتر شبیه به یک migration دیتابیس است تا بازنویسی کامل. هر راهنمایی که همچنان Crater را توصیه می‌کند، پیش از توقف فعالیت این پروژه نوشته شده است.

آیا می‌توانم از Invoice Ninja برای کسب‌وکار خودم بدون پرداخت هزینه استفاده کنم؟

بله. نسخه self-hosted نرم‌افزار Invoice Ninja تحت مجوز Elastic License 2.0 کاملاً کاربردی و رایگان است؛ این شامل فاکتورهای دوره‌ای، پورتال مشتریان و درگاه‌های پرداخت می‌شود. دو مورد هزینه دارند: حذف برند Invoice Ninja از صفحات مشتری نیازمند مجوز white-label است که طبق اعلام خود پروژه در اوت 2026، هزینه آن "$40 per year" است. ارسال فاکتورهای الکترونیکی از طریق شبکه Peppol نیز به‌صورت جداگانه محاسبه می‌شود. آنچه این مجوز منع می‌کند، اجرای نرم‌افزار به‌عنوان یک سرویس میزبانی‌شده (SaaS) برای دیگران است.

چرا ایمیل‌های فاکتور من به پوشه اسپم می‌روند؟

تقریباً همیشه به این دلیل است که پیام برای دامنه موجود در آدرس From احراز هویت نشده است. به‌جای ارسال مستقیم از VPS، از یک SMTP relay استفاده کنید، سپس رکوردهای SPF و DMARC را برای دامنه خود منتشر کرده و رکورد DKIM را بر اساس selector ارائه‌شده توسط relay خود اضافه کنید. آدرس خود را در فیلد From نگه دارید و آدرس مشتری را در Reply-To قرار دهید. تنظیم آدرس مشتری به‌عنوان فرستنده باعث می‌شود Gmail پیام را با خطای 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy رد کند. با یافتن dkim=pass و spf=pass در هدر Authentication-Results یک پیام آزمایشی، صحت اصلاحات را تأیید کنید.

اگر بر اساس ساعت صورت‌حساب صادر می‌کنم، کدام را انتخاب کنم؟

Kimai. این نرم‌افزار در درجه اول یک ابزار زمان‌سنجی (time tracker) است؛ بنابراین فاکتور از روی ورودی‌های تأییدشده در timesheet تولید می‌شود و اقلام فاکتور همان کارهایی هستند که ثبت کرده‌اید. قالب‌ها فایل‌های DOCX، ODS یا XLSX هستند که در یک واژه‌پرداز طراحی می‌کنید؛ این کار بسیار ساده‌تر از ویرایش CSS است. نکته اینجاست که Kimai پورتال مشتری و درگاه پرداخت ندارد، بنابراین باید PDF را ایمیل کرده و وجه را از طریق حواله دریافت کنید. Invoice Ninja نیز زمان را ردیابی می‌کند و دارای پورتال است؛ پس اگر پرداخت آنلاین با کارت برای شما مهم‌تر از جزئیات timesheet است، آن را انتخاب کنید.

دقیقاً از چه چیزی باید نسخه پشتیبان تهیه کنم؟

دیتابیس، volume ذخیره‌سازی که لوگوها و PDFهای تولیدشده را نگه می‌دارد، فایل environment و PDFهای نهایی که به‌عنوان فایل‌های ساده ذخیره شده‌اند. فایل environment همان چیزی است که معمولاً فراموش می‌شود: برنامه‌های Laravel مانند Invoice Ninja و InvoiceShelf، اعتبارنامه‌های ذخیره‌شده را با APP_KEY رمزنگاری می‌کنند؛ بنابراین اگر دیتابیس را در کنار یک کلید جدید بازیابی کنید، تنظیمات درگاه پرداخت شما غیرقابل خواندن خواهد بود. کل مجموعه را یک‌بار در یک نمونه (instance) آزمایشی بازیابی کنید و یک فاکتور قدیمی را باز کنید؛ این تنها راه اطمینان از صحت نسخه پشتیبان است.