セルフホスト請求書ソフト5製品を比較
1台のVPSで使えるInvoice Ninja、InvoiceShelf、InvoicePlane、Kimai、ERPNextを比較します。定期請求、税、顧客ポータル、決済、ライセンスの違いがわかります。
セルフホスト型の請求書ソフトウェアはどれを選ぶべきか
1 台の VPS で現実的に選べるセルフホスト型の請求書ソフトウェアは5つあります。ただし、これらは同等の代替製品ではありません。Invoice Ninja は最も完成度の高い製品です。定期請求書、顧客ポータル、決済ゲートウェイ、電子請求書形式が、インストールした日からすべて機能します。InvoiceShelf は、より軽量な完全オープンソースの選択肢です。InvoicePlane は、調整が必要な要素がないシンプルな PHP アプリケーションです。Kimai は明細項目ではなく、記録した作業時間を請求します。ERPNext は、請求書の発行機能も備えた完全な会計システムです。
セルフホスト型の請求書環境では、機能不足よりも2つの問題が原因で、はるかに頻繁に運用が破綻します。1つ目はメールです。迷惑メールフォルダーに入った請求書は、未払いの請求書と同じです。しかも、そのことを知らせる仕組みはありません。2つ目はバックアップです。このデータベースを失うと、単なる不便ではなく、税務上の問題になります。
機能一覧を見る前に、ライセンスを確認してください。この5つのうち3つはコピーレフト、1つは許容型ライセンスです。残りの1つはソースコードを利用できますが、使用方法には実質的な制限があります。
5 つの選択肢と、それぞれに適した用途
Invoice Ninja
現在 v5 系で提供されている Laravel アプリケーションです。セルフホスティングは無料で、機能制限もありません。定期請求書、見積書、プロジェクト、タイムトラッキング、経費、クライアントポータル、Stripe や PayPal などの決済ゲートウェイを利用できます。プロジェクト自身は「Laravel で構築された、ソースコードが公開された請求書、見積書、プロジェクト、タイムトラッキング用アプリ」と説明しています。有料なのはブランディングだけです。プロジェクトの説明では、「アプリのクライアント向け部分から Invoice Ninja のブランディングを削除するホワイトラベルライセンスを、年間 $40 で提供しています」とされています。この価格は August 2026 時点のものです。
最も機能が充実した製品を求めており、大規模なスタックの運用を受け入れられる場合に適しています。
InvoiceShelf
GNU Affero General Public License version 3 (AGPL-3.0) の Crater フォークです。請求書、見積書、定期請求、経費、税金、複数通貨、顧客ポータル、複数会社に対応しています。決済とホワイトラベル機能は、別々の公式モジュールリポジトリで提供されています。どちらも AGPL-3.0 で、無料です。カード決済は Stripe checkout を経由します。
小規模で完全にオープンソースのアプリケーションを求めており、30 種類のゲートウェイを必要としない場合に適しています。
InvoicePlane
MIT licence で公開されている CodeIgniter ベースの PHP アプリケーションです。この中で唯一、ファイルを Web ルートに解凍してインストールできます。Docker も Node のビルド手順も必要ありません。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 のタイムトラッカーです。時間単位で請求する場合に適しています。請求書テンプレートは DOCX、ODS、XLSX ファイルとしてアップロードします。ドキュメントによると、受け付けられる形式はこの 3 つだけです。テンプレートは PDF または HTML に変換されます。CSS を記述する代わりにワープロソフトで請求書のレイアウトを作成できるため、多くのユーザーにとって扱いやすい方法です。
Kimai にはクライアントポータルも決済ゲートウェイもないため、PDF をメールで送信します。構造化された電子請求書機能は、E-Invoice Plus という有料のストアプラグインで提供されます。セルフホスト環境向けインストールでは、August 2026 時点で VAT を除き年間 99 EUR です。EN16931、XRechnung、ZUGFeRD、Factur-X、Peppol の各プロファイルに対応します。
請求書がタイムトラッキングの成果物である場合に適しています。
ERPNext
GPL-3.0 で提供される、別のカテゴリのソフトウェアです。販売請求書は、勘定科目表、仕訳、在庫、給与を備えた完全な会計システム内の 1 つの文書種別です。請求業務が中心ではなくなった場合に適しています。クライアントが 8 社のフリーランサー 1 人には、機能が多すぎます。導入自体が 1 つのプロジェクトになり、その手順は VPS 上で ERPNext を実行する で説明しています。
定期請求書は、見えないスケジューラーに依存します
Invoice Ninja、InvoiceShelf、InvoicePlane、ERPNext は、いずれも定期請求書を生成します。Kimai のコアには定期請求書の機能がありません。Kimai の請求書は、期間内のタイムシートエントリから作成されるためです。
Laravel ベースの製品では、どれも同じ静かな失敗が起きます。定期請求書はスケジュールタスク php artisan schedule:run によって作成されます。このタスクは、アプリケーション外部の何らかの仕組みが毎分呼び出す必要があります。呼び出されなければ、定期請求書の一覧には次回送信日が表示されたまま、その日付だけが過ぎていきます。請求書は作成されません。コードが実行されていないため、エラーも記録されません。
そのため、最初の定期請求書を作成したら、次回送信日を数分後に設定して、実行されるか待ちます。何も届かなければ、スケジューラーが動作していません。Docker 環境では通常、compose ファイルの cron または scheduler サービスが起動していないか、終了しています。
docker compose ps
docker compose logs --tail 50ファイル内のすべてのサービスは running を報告する必要があります。exited 状態のサービスが、ログを確認すべき対象です。
多通貨と税金: 導入を決める前に確認すること
機能一覧にある「多通貨」は、製品によって意味が大きく異なります。自社の実際の取引額を使って、デモ環境で次の4項目を確認してください。この部分の誤りは、あなたではなく会計担当者が発見することになります。
- 請求書には、発行日に適用された為替レートが保存されますか。保存される必要があります。アプリケーションが現在の為替レートから合計額を再計算すると、前四半期のレポートを開くたびに内容が変わり、すでに申告した帳簿と一致しなくなります。
- 税は明細行ごと、請求書ごと、それとも両方に適用されますか。請求書単位の税率だけでも、ある明細が税率0%になるまでは問題ありません。
- 税込価格と税抜価格の両方を入力できますか。後から変換すると、明細ごとに1セント単位の丸め差が生じ、その差が1年間で積み重なります。
- VATを支払う必要がない別の国の顧客について、帳票には何が表示されますか。税額欄の0だけでなく、免税理由を請求書に印刷する必要があります。
Invoice Ninja と ERPNext は、4項目すべてに対応しています。InvoiceShelf は、機能として税金と多通貨を挙げています。InvoicePlane と Kimai はより単純なため、最も簡単な請求書ではなく、最も扱いにくい請求書を使ってテストしてください。
クライアントポータルと決済ゲートウェイ
クライアントポータルは、クライアントが請求書を確認し、PDF をダウンロードして支払うためのページです。見た目以上に重要です。メールで支払いを催促する時間のほうが、請求書の作成にかかった時間より長くなるためです。
Invoice Ninja はこの用途に最も適しています。完全なポータル、多数のゲートウェイ、保存済みの決済手段、定期請求書の自動請求に対応しています。InvoiceShelf には顧客ポータルがあり、payments module を通じて Stripe checkout も利用できます。InvoicePlane では各請求書にゲストリンクが付与され、Stripe に対応しています。Kimai にはこのどちらの機能もないため、PDF を添付ファイルとして送信します。
常に混同される点があります。請求アプリケーションをセルフホストしても、カード番号を保管することにはなりません。Stripe checkout を使用すると、クライアントは Stripe にリダイレクトされ、そこでカード情報を入力します。VPS がカード番号を受け取ることはありません。決済フォームを自分で構築していないため、PCI (payment card industry) の対応範囲を小さく保てます。後から複数の決済事業者が必要になった場合や、国別に決済先を振り分けたい場合は、Hyperswitch を使ったセルフホスト型決済オーケストレーション のような別の層で対応します。
PDF の品質と、最終的に編集するテンプレート
このテンプレートを編集します。ここにあるデフォルト設定では、どれもお住まいの国に合わない位置に住所が配置されます。
Invoice Ninja は、イメージに同梱されたヘッドレス Chromium を使用して HTML と CSS のテンプレートを PDF に変換します。そのため、コンテナのサイズが大きくなります。ヘッドレスブラウザーはスタック内で最も負荷の高いプロセスなので、メモリを確保してください。1 GB の VPS では余裕がありません。InvoicePlane は mPDF を使用します。これは純粋な PHP 実装で軽量ですが、一部の最新 CSS は無視されます。Kimai は逆の方式を採用しており、DOCX または ODS ファイルをアップロードします。そのため、レイアウトはスタイルシートを書いたことのない担当者が LibreOffice または Word で作成することになります。
デザインされた請求書が重要で、CSS は重視しない場合は、Kimai の方式が適しています。テンプレートをバージョン管理し、差分を確認できるようにしたい場合は、HTML が適しています。
商用利用はライセンスで認められていますか?
5 つとも、自分の顧客に請求書を発行できます。違いが生じるのは、それを超える利用をする場合です。
Invoice Ninja は Elastic License 2.0 の下で提供されています。重要な条項は 2 つあります。
ソフトウェアの機能または性能のうち、実質的な範囲をユーザーが利用できるサービスとして、ホスティングまたは管理サービスの形で第三者にソフトウェアを提供してはなりません。
ソフトウェアのライセンスキー機能を移動、変更、無効化、または回避してはなりません。
そのため、自社の業務で実行することは問題ありません。一方、顧客向けの製品としてインスタンスを実行することは認められません。ブランディングの削除に $40 のライセンスが必要であり、ソースコードへのパッチではない理由は、この 2 つ目の条項にあります。
InvoiceShelf、Kimai、Crater は AGPL-3.0 です。商用利用は無償で、上位の料金プランもありません。義務は第 13 条にあります。コードを変更し、ネットワーク経由で他の人に変更後のバージョンを利用させる場合、その変更部分のソースコードを提供する必要があります。変更していないインスタンスは、上流プロジェクトが公開しているソースコードですでに対象となるため、多くの self-hosting ユーザーがこの対応を行うことはありません。
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 件のプロジェクトのうち、過去 1 週間以内にコミットがあったのは 5 件でした。InvoiceShelf は Crater の開発を引き継いだフォークです。AGPL-3.0 ライセンスとデータモデルも同じなので、移行は作り直しではなくデータ移行で済みます。Crater ではなく InvoiceShelf をインストールしてください。
VPS にそれぞれインストールする
InvoicePlane 以外は、Docker Compose で実行するのが最も簡単です。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そのキーをリポジトリ内の env ファイルに、実際に使用する APP_URL とともにコピーします。次に、イメージが想定する所有者を設定して起動します。
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 になっています。初回ログイン前に、3 つすべてへ実際に使用するホスト名を設定する必要があります。その後、起動します。
docker compose up -dホストのポート 8090 を公開し、コンテナ内では 8080 でサービスを提供します。クライアントからの接続を 1 件でも受け付ける前に、TLS(transport layer security)対応のリバースプロキシを前段に置いてください。
プロジェクトのドキュメントにある 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;"プロジェクトのリリースページからアーカイブをダウンロードし、Web ルートに展開します。ipconfig.php.example を ipconfig.php にコピーし、そのファイル内のコメントに従って URL を設定します。次に https://your-domain.example/index.php/setup を開き、インストーラーの手順を進めてください。
請求書メールが迷惑メールフォルダーに入る理由
これは金銭的な損失につながる障害です。アプリケーションは請求書を送信済みとして問題なく報告します。
VPS 自身の IP アドレスから請求書メールを送信しないでください。新しい VPS の IP には送信履歴がありません。大規模なメールサービスは、ホスティング事業者の IP 範囲にある未知のアドレスから最初に届いたメッセージを、標準で不審なものとして扱います。認証済みのドメイン上にある SMTP(simple mail transfer protocol)リレー経由で送信してください。これを最初から最後まで構成する手順は独立したガイドが必要です。自己ホスト型アプリからメールを確実に送信するでは、リレー、DNS レコード、テストについて説明しています。
請求書の構成で最も問題が起きやすいのは From アドレスです。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.com1 つ目の問い合わせでは、リレーを指定した SPF(sender policy framework)レコードが返るはずです。2 つ目では、DMARC(domain-based message authentication, reporting and conformance)ポリシーが返るはずです。3 つ目は、リレーから指定された selector に依存します。空の応答になる場合、DKIM レコードが存在しないか、誤った名前で公開されています。そのため、送信するすべてのメッセージが署名検証に失敗します。
次に、大規模なプロバイダーで自分が所有するアカウントへ実際の請求書を送信し、raw headers を確認してください。Authentication-Results ヘッダー内の dkim=pass と spf=pass だけが、確認の根拠になります。アプリケーションの "sent" フラグは、メッセージをリレーへ渡したことだけを示します。
バックアップ: 失うことのできない唯一のデータベース
メディアサーバーを失っても、ファイルを再度ダウンロードすれば済みます。PhotoPrism や Immich などの自己ホスト型写真サーバーであっても、通常は撮影に使ったスマートフォンにオリジナルが残っており、2 つ目のコピーを保持しています。請求データベースを失うと、何を請求したか、いくら支払われたか、いくら未払いかを確認できません。相応に扱ってください。
4 つをバックアップします。データベース。ロゴ、生成済み PDF、経費の領収書を保持するストレージボリューム。アプリケーションの環境ファイル。そして、通常のファイルとして保存されている生成済み PDF です。PDF は、それを生成したアプリケーションがなくても 10 年後に開けるためです。
環境ファイルは、想定以上に重要です。Laravel は、決済ゲートウェイの認証情報など、保存された機密値を、そのファイル内の APP_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 は Docker に端末を割り当てないようにします。端末を割り当てると、リダイレクトされた出力が破損し、インポートできないダンプファイルが生成される可能性があります。
暗号化した restic バックアップをオフサイトストレージへ保存する設定で、スケジュールに従ってサーバー外へ送信してください。保持期間は、会計担当者が指定する期間をカバーできる長さに設定します。
次に復元します。使い捨てのコンテナでダンプを起動し、ログインして、先月の請求書を開きます。一度でもこれを実行するまでは、バックアップが機能するかどうかは分かりません。
会計担当者から求められるもの
チュートリアルを根拠に税務上の判断をしないでください。以下は、このソフトウェアで生成できるものです。会計や税務の助言を受ける相手に、この一覧を提示できます。
エクスポート可能なデータ。 インターフェースから、データベースクライアントを使ったり、サポートチケットを作成したりせずに、請求書と支払いを CSV にエクスポートできる必要があります。SQL ダンプはバックアップであってエクスポートではありません。会計担当者は SQL ダンプを開けないためです。
変更できない採番。 請求書番号は連番で進み、一度使用した番号を再利用せず、欠番も生じないことが望まれます。請求書を削除すると欠番が生じ、その理由を説明しなければなりません。代わりに取消またはクレジット処理を使用してください。ここで扱うすべてのアプリケーションが対応しています。欠番のない採番が必要かどうかは、登録地によって異なります。早い段階で確認するとよいでしょう。
保存期間。 データベースダンプと生成済みの PDF は、規則で定められた期間だけ保存してください。PDF は実際に送付した書類であり、請求書に異議が申し立てられた場合に重要となる成果物です。
変更履歴。 誰がいつ請求書を編集したかを示せる機能は有用です。この点は、これらのアプリケーション間で最も差が出ます。Invoice Ninja はレコードごとのアクティビティログを保持します。
EU の一部では、構造化された電子請求書が、あると便利な追加機能ではなく、実際の要件になっています。Invoice Ninja は一般的な形式を生成でき、ZUGFeRD、XRechnung、Facturae、FatturaPA、汎用 EN16931 に対応しています。自己ホスト型インスタンスから Peppol ネットワーク経由で送信する場合は、Invoice Ninja 独自のアクセスポイントを経由します。Invoice Ninja に事業体を登録し、送信ごとにクレジットを購入する必要があります。そのため、2026年8月時点では有料サービスです。Kimai も有料プラグインを使用すれば同じ形式に対応できます。残りの3つは、現在、構造化された電子請求書をまったく生成できません。EU 域内で請求書を発行する場合、Invoice Ninja を選ぶ最大の理由はこの点です。
FAQ
Crater と InvoiceShelf のどちらをインストールすべきですか?
InvoiceShelf です。2026年8月21日時点で、Crater のデフォルトブランチには 741 日間コミットがなく、Crater 自身の issue tracker でも fork が案内されています。InvoiceShelf は同じ AGPL-3.0 ライセンスと同じデータモデルを採用しているため、両者の移行は書き直しではなくデータベース移行で済みます。現在も Crater を推奨しているガイドは、プロジェクトの更新が止まる前に書かれたものです。
支払いなしで自分の事業に Invoice Ninja を使用できますか?
はい。Self-hosted Invoice Ninja は Elastic License 2.0 の下で、定期請求、クライアントポータル、決済ゲートウェイを含め、無料で完全に使用できます。費用がかかる点は2つあります。クライアント向けページから Invoice Ninja のブランド表示を削除するには white-label licence が必要です。2026年8月時点で、プロジェクトの説明では「1年あたり$40」です。Peppol ネットワーク経由の e-invoice 送信には別途従量料金がかかります。ライセンスで禁止されているのは、他者向けのホスティングサービスとしてソフトウェアを運用することです。
請求書メールが spam フォルダーに入るのはなぜですか?
ほとんどの場合、From アドレスのドメインに対してメッセージが認証されていないことが原因です。VPS から直接送信せず、SMTP relay 経由で送信してください。そのうえで、ドメインに SPF と DMARC のレコードを公開し、relay から指定された 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 です。Kimai はまず time tracker なので、承認済みの timesheet エントリから請求書を生成し、明細には記録した作業が表示されます。テンプレートは DOCX、ODS、XLSX ファイルで、word processor で作成できます。CSS を編集するより簡単です。一方、Kimai にはクライアントポータルも決済ゲートウェイもありません。そのため、PDF をメールで送信し、銀行振込などで支払いを受けます。Invoice Ninja も時間を記録でき、ポータルも備えています。timesheet の詳細よりオンラインでのカード決済を重視するなら、Invoice Ninja を選んでください。
具体的に何をバックアップする必要がありますか?
データベース、ロゴと生成済み PDF を保持する storage volume、environment file、プレーンファイルとして保存している生成済み PDF をバックアップします。environment file は見落とされやすい対象です。Invoice Ninja や InvoiceShelf などの Laravel アプリケーションは、保存された認証情報を APP_KEY で暗号化します。そのため、新しく生成した key とデータベースを復元すると、決済ゲートウェイの設定を読み取れなくなります。すべてを一度 throwaway instance に復元し、古い請求書を開いてください。バックアップが機能することを確認する唯一の方法です。