SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor

Выбор 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. Это единственный вариант в списке, который устанавливается путем распаковки файлов в корневой каталог веб-сервера. Не требует 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 МБ оперативной памяти.

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

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

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

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

Выполняйте резервное копирование четырех компонентов. Базы данных. Тома хранилища, где находятся логотипы, сгенерированные 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 ведет журнал активности для каждой записи.

Структурированное электронное выставление счетов в некоторых частях ЕС стало обязательным требованием, а не просто полезным дополнением. 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 per year". Отправка электронных счетов через сеть 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. Если восстановить базу данных с новым ключом, настройки платежного шлюза станут нечитаемыми. Восстановите всё содержимое в тестовый экземпляр и откройте старый счет — это единственный способ убедиться, что резервная копия работает.

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