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 системы выставления счетов гораздо чаще, чем отсутствие какой-либо функции. Первая — это электронная почта. Счет, попавший в папку спама, — это неоплаченный счет, и ничто не уведомит вас об этом. Вторая — резервное копирование. Это та база данных, потеря которой превращается в налоговую проблему, а не просто в неудобство.

Изучите лицензию до того, как начнете читать список функций. Три из пяти этих продуктов распространяются по лицензии copyleft, один — по пермиссивной лицензии, а один является source-available с реальными ограничениями на использование.

Пять вариантов и для кого предназначен каждый из них

Invoice Ninja

Приложение на Laravel, в настоящее время версии v5. Self-hosting бесплатен и не имеет ограничений: доступны повторяющиеся счета, коммерческие предложения, проекты, учет времени, расходы, клиентский портал и платежные шлюзы, включая Stripe и PayPal. Проект позиционирует себя как «приложение с доступным исходным кодом для выставления счетов, создания коммерческих предложений, управления проектами и учета времени, построенное на Laravel». Единственный платный компонент — брендинг. По словам разработчиков: «Мы предлагаем лицензию white-label за 40 долларов в год, чтобы убрать брендинг Invoice Ninja из клиентских частей приложения». Эта цена актуальна на август 2026 года.

Выбирайте этот вариант, если вам нужен максимально функциональный продукт и вы готовы поддерживать работу довольно объемного стека.

InvoiceShelf

Форк Crater, распространяемый под лицензией GNU Affero General Public License version 3 (AGPL-3.0). Он включает счета, сметы, повторяющиеся платежи, расходы, налоги, мультивалютность, клиентский портал и поддержку нескольких компаний. Платежи и white-label реализованы в виде отдельных официальных модулей, оба распространяются под лицензией AGPL-3.0 и являются бесплатными. Оплата картами осуществляется через Stripe checkout.

Выбирайте этот вариант, если вам нужно небольшое приложение с полностью открытым исходным кодом и вам не требуется поддержка тридцати различных шлюзов.

InvoicePlane

PHP-приложение на базе CodeIgniter, выпущенное под лицензией MIT. Это единственный вариант в списке, который устанавливается путем распаковки файлов в web root. Никакого Docker и этапов сборки на Node. PDF-файлы генерируются с помощью mPDF, поэтому шаблоны представляют собой HTML и CSS. Клиенты получают гостевую ссылку для просмотра и оплаты счета.

Нюанс заключается в платежах. В документации прямо указано, что InvoicePlane 1.6 по умолчанию поддерживает только Stripe, а остальные провайдеры были удалены в этой версии. Опубликованные системные требования для ветки 1.6 — PHP 8.0–8.1 и MySQL 5.5 или соответствующая версия MariaDB. Ознакомьтесь с примечаниями к конкретному релизу, который вы скачиваете, так как ветка 1.7 находится в активной разработке.

Выбирайте этот вариант, если вы используете виртуальный хостинг или VPS с 512 MB оперативной памяти.

Kimai

Система учета времени под лицензией AGPL-3.0, которая генерирует счета на основе табелей учета рабочего времени. Это подходящее решение для тех, кто выставляет счета за отработанные часы. Шаблоны счетов загружаются в форматах DOCX, ODS или XLSX (документация подтверждает, что это единственные поддерживаемые форматы), а затем преобразуются в PDF или HTML. Вы верстаете счет в текстовом процессоре вместо написания CSS, что для большинства пользователей проще.

В Kimai нет клиентского портала и платежных шлюзов, поэтому счета отправляются по электронной почте в виде PDF-файлов. Структурированное электронное выставление счетов реализовано через платный плагин E-Invoice Plus из магазина приложений. Его стоимость на август 2026 года составляет 99 евро в год (без учета НДС) для self-hosted установки; он поддерживает профили EN16931, XRechnung, ZUGFeRD, Factur-X и Peppol.

Выбирайте этот вариант, если счет является результатом учета затраченного времени.

ERPNext

Лицензия GPL-3.0, это программное обеспечение другой категории. Счет на оплату — лишь один из типов документов в составе полноценной бухгалтерской системы с планом счетов, журналом проводок, складским учетом и расчетом заработной платы. Это правильный выбор, когда выставление счетов перестает быть единственной задачей. Для фрилансера с восемью клиентами это избыточное решение. Развертывание системы — это отдельный проект, описанный в запуске ERPNext на VPS.

Регулярные счета зависят от планировщика, который скрыт от глаз

Invoice Ninja, InvoiceShelf, InvoicePlane и ERPNext поддерживают создание регулярных счетов. В Kimai функция регулярных счетов отсутствует в базовой версии, так как там счет формируется на основе записей в табеле учета рабочего времени за определенный период.

Тип сбоя одинаков для всех приложений на базе Laravel, и он протекает незаметно. Регулярные счета создаются запланированной задачей php artisan schedule:run, которую должен вызывать внешний по отношению к приложению процесс каждую минуту. Если вызов не происходит, в списке регулярных счетов по-прежнему отображается дата следующей отправки, которая просто наступает и проходит. Счет не создается. Ошибки не записываются в лог, так как код не выполнялся.

Поэтому после создания первого регулярного счета установите дату следующей отправки на несколько минут вперед и подождите. Если счет не пришел, значит, планировщик не запущен. При установке через Docker это обычно означает, что сервис cron или scheduler в файле compose не запустился или завершил работу.

docker compose ps
docker compose logs --tail 50

Каждый сервис в файле должен иметь статус running. Если сервис находится в состоянии exited, именно его логи вам необходимо изучить.

Мультивалютность и налоги: что проверить перед внедрением

Списки функций часто содержат пункт «мультивалютность», но под ним могут скрываться совершенно разные возможности. Выполните эти четыре проверки на демонстрационном экземпляре, используя реальные цифры вашего бизнеса, так как ошибки в расчетах обнаружит бухгалтер, а не вы.

  1. Сохраняет ли счет обменный курс, действовавший на дату его выставления? Это обязательно. Если приложение пересчитывает итоговые суммы по текущему курсу, отчеты за прошлый квартал будут меняться при каждом открытии, и ваша отчетность перестанет соответствовать уже поданным документам.
  2. Применяется ли налог к каждой позиции отдельно, ко всему счету целиком или к обоим вариантам? Единая ставка на весь счет подходит до тех пор, пока одна из позиций не окажется не облагаемой налогом.
  3. Можно ли вводить цены как с учетом налога, так и без него? Конвертация постфактум приводит к погрешностям округления в один цент на позицию, и за год эти центы накапливаются.
  4. Что отображается в документе для клиента из другой страны, который не платит НДС? Вам необходимо, чтобы на счете печаталось примечание об освобождении от налога, а не просто ноль в колонке налогов.

Invoice Ninja и ERPNext поддерживают все четыре пункта. InvoiceShelf указывает налоги и мультивалютность в списке своих функций. InvoicePlane и Kimai проще, поэтому тестируйте их на самом сложном счете, а не на самом простом.

Клиентский портал и платежные шлюзы

Клиентский портал — это страница, на которой клиент просматривает свои счета, скачивает PDF-файлы и производит оплату. Это важнее, чем кажется на первый взгляд, так как попытки получить оплату через электронную почту отнимают больше времени, чем создание самого счета.

Invoice Ninja лидирует в этом аспекте: он предлагает полноценный портал, поддержку множества шлюзов, сохранение способов оплаты и автоматическое выставление счетов по расписанию. InvoiceShelf предоставляет клиентский портал и добавляет возможность оплаты через Stripe Checkout с помощью модуля платежей. InvoicePlane предоставляет гостевую ссылку для каждого счета и поддерживает Stripe. В Kimai такой функционал отсутствует, поэтому PDF-файлы отправляются в виде вложений.

Один момент часто вызывает путаницу. Самостоятельный хостинг приложения для выставления счетов не означает хранение номеров банковских карт. При использовании Stripe Checkout клиент перенаправляется на сайт Stripe, вводит данные карты там, и ваш VPS никогда не получает доступ к этим номерам. Ваша зона ответственности по стандарту PCI (индустрия платежных карт) остается минимальной именно потому, что вы не создавали форму для ввода платежных данных. Если в будущем вам потребуется более одного процессора или маршрутизация платежей в зависимости от страны, это следует реализовать на отдельном уровне, например, через self-hosted payment orchestration with Hyperswitch.

Качество PDF и шаблон, который вам предстоит редактировать

Вам предстоит редактировать шаблон. Все настройки по умолчанию в нем размещают ваш адрес некорректно для вашей страны.

Invoice Ninja преобразует HTML и CSS шаблоны в PDF с помощью headless Chromium, встроенного в образ, из-за чего контейнер имеет большой размер. Выделите для него достаточно оперативной памяти: headless-браузер — самый ресурсоемкий процесс в стеке, поэтому на VPS с 1 GB памяти работать будет сложно. InvoicePlane использует mPDF — это чистое PHP-решение, оно легкое, но игнорирует некоторые современные возможности CSS. Kimai использует другой подход: вы загружаете файл DOCX или ODS, поэтому верстку выполняет кто-то в LibreOffice или Word, не написав ни строчки кода стилей.

Если для вас важен дизайн счета, а не CSS, подход Kimai лучше. Если вы хотите хранить шаблон в системе контроля версий и иметь возможность отслеживать изменения, HTML — лучший выбор.

Разрешает ли лицензия коммерческое использование?

Все пять продуктов позволяют выставлять счета вашим клиентам. Различия возникают, если вы планируете что-то большее.

Invoice Ninja распространяется по лицензии Elastic License 2.0. Важны два пункта.

Вы не имеете права предоставлять программное обеспечение третьим лицам в качестве хостинг-услуги или управляемого сервиса, если такой сервис предоставляет пользователям доступ к существенному набору функций или возможностей программного обеспечения.
Вы не имеете права перемещать, изменять, отключать или обходить функциональность лицензионного ключа в программном обеспечении.

Таким образом, использование для собственного бизнеса допустимо, а запуск экземпляров для клиентов в качестве продукта — нет. Второй пункт объясняет, почему удаление брендинга требует покупки лицензии за 40 долларов, а не внесения правок в исходный код.

InvoiceShelf, Kimai и Crater используют лицензию AGPL-3.0. Коммерческое использование бесплатно, и над вами нет никаких уровней ограничений. Обязательство содержится в разделе 13: если вы модифицируете код и предоставляете другим людям доступ к своей изменённой версии по сети, вы обязаны предоставить им исходный код ваших изменений. Неизменённый экземпляр уже покрывается публичным исходным кодом от разработчиков, поэтому большинство тех, кто размещает ПО на своих серверах, с этим не сталкиваются.

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 и с той же моделью данных, поэтому переход на него является миграцией данных, а не переписыванием системы. Устанавливайте InvoiceShelf, а не Crater.

Установка каждого приложения на 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

Скопируйте этот ключ в файл env в репозитории вместе с вашим реальным APP_URL. Затем установите права владения, которые ожидает образ, и запустите его.

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 внутри контейнера. Установите перед ним reverse proxy с TLS (transport layer security), прежде чем направлять на него хотя бы одного клиента.

Файл compose для продакшн-версии 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;"

Загрузите архив со страницы релизов проекта, распакуйте его в корневой каталог вашего веб-сервера, скопируйте ipconfig.php.example в ipconfig.php и укажите ваш URL внутри, следуя комментариям в этом файле. Затем откройте https://your-domain.example/index.php/setup и пройдите через мастер установки.

Почему ваши счета попадают в папку «Спам»

Это сбой, который стоит вам денег, при этом приложение будет успешно отчитываться об отправке счета.

Не отправляйте почту со счетов с собственного IP-адреса VPS. У нового IP-адреса VPS нет истории отправки, и крупные почтовые провайдеры по умолчанию считают подозрительным первое сообщение, пришедшее с неизвестного адреса из диапазона хостинг-провайдера. Используйте 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 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-запись отсутствует или опубликована под неверным именем, поэтому каждое отправленное вами сообщение не пройдет проверку подписи.

Затем отправьте реальный счет на свой аккаунт у крупного провайдера и изучите исходные заголовки письма. Только значения dkim=pass и spf=pass в заголовке Authentication-Results являются доказательством успешной доставки. Статус «отправлено» в самом приложении означает лишь то, что оно передало сообщение релею.

Резервные копии: единственная база данных, которую нельзя потерять

Потеря медиасервера означает лишь необходимость повторной загрузки файлов. Даже self-hosted фотосервер, такой как PhotoPrism или Immich, обычно хранит вторую копию оригиналов, которые всё ещё находятся на телефоне, с которого они были сняты. Потеря базы данных с выставленными счетами означает, что вы не сможете подтвердить, что вы выставили, что вам оплатили и что вам всё ещё должны. Относитесь к этому соответствующим образом.

Выполняйте резервное копирование четырёх компонентов. Базы данных. Тома хранилища, где находятся логотипы, созданные PDF-файлы и квитанции о расходах. Файла окружения приложения. И готовых PDF-файлов, хранящихся как обычные файлы, поскольку PDF откроется и через десять лет без приложения, которое его создало.

Файл окружения важнее, чем принято считать. 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 ведет журнал активности для каждой записи.

Структурированное электронное выставление счетов в некоторых частях ЕС стало обязательным требованием, а не просто дополнительной функцией. Invoice Ninja генерирует распространенные форматы, включая ZUGFeRD, XRechnung, Facturae, FatturaPA и стандарт EN16931. Доставка через сеть Peppol из self-hosted инстанса осуществляется через собственную точку доступа Invoice Ninja: вам нужно зарегистрировать свою организацию и покупать кредиты для каждой отправки, поэтому по состоянию на август 2026 года это платная услуга. Kimai поддерживает те же форматы через платный плагин. Остальные три приложения на сегодняшний день вообще не создают структурированные электронные счета, что является самым веским аргументом в пользу выбора Invoice Ninja, если вы выставляете счета внутри ЕС.

FAQ

Что выбрать: Crater или InvoiceShelf?

Выбирайте InvoiceShelf. В основной ветке Crater не было коммитов в течение 741 дней по состоянию на 21 августа 2026 года, а в баг-трекере проекта пользователей перенаправляют на форк. InvoiceShelf использует ту же лицензию AGPL-3.0 и ту же модель данных, поэтому переход между ними требует лишь миграции базы данных, а не переписывания системы. Любое руководство, рекомендующее Crater, было написано до того, как проект перестал развиваться.

Можно ли использовать Invoice Ninja для своего бизнеса бесплатно?

Да. Self-hosted версия Invoice Ninja полностью функциональна и бесплатна согласно условиям Elastic License 2.0, включая регулярные счета, клиентский портал и платежные шлюзы. Платить нужно за две вещи. Удаление брендинга Invoice Ninja со страниц, доступных клиентам, требует лицензии white-label, которая, по словам разработчиков на август 2026 года, стоит "$40 в год". Отправка электронных счетов через сеть Peppol оплачивается отдельно. Лицензия запрещает использовать это ПО как хостинг-сервис для других лиц.

Почему мои счета попадают в спам?

Почти всегда это происходит из-за отсутствия аутентификации домена в поле From. Отправляйте почту через SMTP-релей, а не напрямую с VPS. Опубликуйте 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. Проверьте корректность настройки, найдя dkim=pass и spf=pass в заголовке Authentication-Results тестового письма.

Что выбрать для почасовой оплаты?

Kimai. Это в первую очередь трекер времени, поэтому счет формируется на основе утвержденных записей в табеле, а позиции счета — это выполненная вами работа. Шаблоны представляют собой файлы DOCX, ODS или XLSX, которые вы создаете в текстовом процессоре, что проще, чем редактировать CSS. Обратная сторона в том, что у Kimai нет клиентского портала и платежного шлюза, поэтому вы отправляете PDF по электронной почте и получаете оплату переводом. Invoice Ninja также отслеживает время и имеет портал, поэтому выбирайте его, если онлайн-оплата картой для вас важнее, чем детализация табеля.

Что именно нужно резервировать?

Базу данных, том с хранилищем логотипов и сгенерированных PDF, файл окружения и сами PDF-файлы. Файл окружения — это то, что часто забывают: приложения на Laravel, такие как Invoice Ninja и InvoiceShelf, шифруют сохраненные учетные данные с помощью APP_KEY. Если восстановить базу данных с новым ключом, настройки платежного шлюза станут нечитаемыми. Восстановите всё на тестовом экземпляре и откройте старый счет: это единственный способ убедиться, что резервная копия работает.