Invoice Ninja на Ubuntu 24.04: пошаговая установка
Если вы фрилансер или ведёте небольшую студию, рано или поздно упираетесь в вопрос: чем выставлять счета клиентам, чтобы не платить за очередной SaaS в валюте и не зависеть от блокировок зарубежных сервисов. Invoice Ninja — открытая система для выставления счетов, учёта клиентов, платежей и расходов — решает это ровно так, как нужно: ставится на свой сервер, работает под вашим доменом, и данные клиентов остаются у вас, а не в чужом облаке. Ниже — установка с нуля на Ubuntu 24.04, без Docker, классическим стеком PHP + MariaDB + Nginx, с подробностями, которые обычно всплывают только при первом реальном запуске.
Содержание
- Что нужно и почему без Docker
- Подготовка сервера: обновления, firewall, часовой пояс
- Устанавливаем PHP 8.3 и нужные расширения
- MariaDB: база данных и пользователь
- Скачиваем и разворачиваем Invoice Ninja
- Миграции, генерация ключа и первый запуск
- Nginx и SSL
- Cron: без него сломается автоматика
- Первый вход и базовая настройка компании
- Резервное копирование
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что нужно и почему без Docker
Invoice Ninja официально поставляется и как Docker-образ, и как обычное PHP-приложение (Laravel). Docker-путь проще в теории, но у него своя цена: лишний слой абстракции, отдельная головная боль с volume для хранения инвойсов и логотипов, и не всегда очевидная миграция базы при обновлениях. Для одного бизнес-приложения на выделенном VPS классическая установка часто оказывается прозрачнее — вы видите файлы, логи и процессы напрямую, обновление через git pull или архив с релизом занимает пару минут.
Минимальные требования под нагрузку "один фрилансер — сотня клиентов в месяц":
- VPS с 1-2 vCPU, 2 ГБ RAM (для growth-нагрузки — 4 ГБ, PHP-FPM с MariaDB под конкурентными запросами любит запас);
- Ubuntu 24.04 LTS чистая;
- домен или поддомен, направленный на сервер (например,
invoices.вашдомен.ru); - root или sudo-доступ по SSH.
Если сервера ещё нет — берите VPS с оплатой картой или криптой из России, важно только чтобы локация давала стабильный пинг до ваших клиентов (для СНГ-аудитории обычно достаточно RU или ближайшей европейской точки).
Подготовка сервера: обновления, firewall, часовой пояс
Начинаем с базовой гигиены системы — без неё потом придётся объяснять клиенту, почему счета выставлены не в том часовом поясе.
apt update && apt upgrade -y
apt install -y curl wget unzip git software-properties-common
timedatectl set-timezone Europe/Moscow
Замените таймзону на свою — она напрямую влияет на даты в инвойсах и напоминаниях об оплате.
Открываем firewall для SSH, HTTP и HTTPS. Если UFW ещё не настроен, разберётесь быстрее по отдельной инструкции — настройка UFW firewall на Ubuntu 24.04. Коротко:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстанавливаем PHP 8.3 и нужные расширения
Invoice Ninja v5 требует PHP 8.1+ (на практике комфортнее всего работает на 8.2-8.3). В стандартных репозиториях Ubuntu 24.04 уже есть PHP 8.3, так что PPA Ondřej Surý не обязателен, но он даёт более свежие минорные версии и удобнее для будущих апгрейдов:
add-apt-repository ppa:ondrej/php -y
apt update
apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common \
php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl \
php8.3-zip php8.3-gd php8.3-bcmath php8.3-intl php8.3-gmp
Проверяем версию и включаем сервис:
php -v
systemctl enable --now php8.3-fpm
Важный нюанс: Invoice Ninja активно использует bcmath для денежных расчётов и gmp для генерации PDF через встроенный движок — если пропустите эти расширения, приложение установится, но при попытке создать первый счёт вывалится ошибка 500 без внятного текста в интерфейсе (смотреть придётся в лог PHP-FPM).
MariaDB: база данных и пользователь
Ставим MariaDB и создаём отдельную базу и пользователя — не работайте под root MySQL, это плохая практика даже для маленького проекта. Если ставите MariaDB впервые, полезно заглянуть в установку MariaDB на Ubuntu 24.04 — там разобраны нюансы mysql_secure_installation и типичные грабли с аутентификацией root.
apt install -y mariadb-server
systemctl enable --now mariadb
mysql_secure_installation
Создаём базу:
mysql -u root -p
CREATE DATABASE ninja CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'ninja_user'@'localhost' IDENTIFIED BY 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES ON ninja.* TO 'ninja_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Пароль сгенерируйте заранее (openssl rand -base64 24) и сохраните в менеджере паролей — он понадобится через пару шагов в .env.
Скачиваем и разворачиваем Invoice Ninja
Создаём директорию под сайт и скачиваем последний релиз с GitHub. Проверьте актуальный номер версии на странице релизов проекта перед установкой — команды ниже используют плейсхолдер, замените на реальный тег.
mkdir -p /var/www/ninja
cd /var/www/ninja
wget https://github.com/invoiceninja/invoiceninja/releases/latest/download/invoiceninja.tar
tar -xf invoiceninja.tar
rm invoiceninja.tar
Права на директорию — приложение должно писать во внутренние папки storage, bootstrap/cache и public/storage:
chown -R www-data:www-data /var/www/ninja
chmod -R 755 /var/www/ninja
chmod -R 775 /var/www/ninja/storage /var/www/ninja/bootstrap/cache
Копируем пример конфига и правим .env:
cp .env.example .env
nano .env
Ключевые параметры для правки:
APP_URL=https://invoices.вашдомен.ru
APP_ENV=production
APP_DEBUG=false
DB_HOST=127.0.0.1
DB_DATABASE=ninja
DB_USERNAME=ninja_user
DB_PASSWORD=ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ
MAIL_MAILER=smtp
MAIL_HOST=smtp.вашпровайдер.ru
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
Про почту — не пропускайте этот блок. Invoice Ninja шлёт клиентам напоминания об оплате и сам инвойс по email; без рабочего SMTP приложение будет работать, но письма клиентам не уйдут, и вы узнаете об этом только когда клиент напишет "а я не получал счёт".
Миграции, генерация ключа и первый запуск
Laravel-приложениям нужен уникальный APP_KEY и накат миграций базы:
cd /var/www/ninja
php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
Если на этом шаге получаете ошибку о недостающем расширении PHP — вернитесь к списку выше, php -m | grep -i bcmath и php -m | grep -i gmp должны показать, что модули подключены. После apt install иногда нужен рестарт php8.3-fpm, чтобы расширения подхватились:
systemctl restart php8.3-fpm
Nginx и SSL
Ставим Nginx и настраиваем виртуальный хост под PHP-FPM:
apt install -y nginx
Конфиг /etc/nginx/sites-available/ninja:
server {
listen 80;
server_name invoices.вашдомен.ru;
root /var/www/ninja/public;
index index.php;
client_max_body_size 20M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
client_max_body_size 20M важен, если планируете прикреплять к счетам вложения или загружать логотип компании крупным файлом — стандартный лимит Nginx в 1 МБ вызовет глухую ошибку загрузки без объяснений в интерфейсе.
Активируем конфиг и получаем SSL-сертификат:
ln -s /etc/nginx/sites-available/ninja /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
apt install -y certbot python3-certbot-nginx
certbot --nginx -d invoices.вашдомен.ru
Если предпочитаете автоматический выпуск и обновление SSL без Certbot, посмотрите вариант с Caddy — Caddy с авто-SSL на Ubuntu 24.04: он сам получает сертификат при первом запуске и держит конфиг короче, но для уже настроенного Nginx-стека Certbot остаётся более предсказуемым выбором.
Cron: без него сломается автоматика
Это тот шаг, который чаще всего забывают, а потом удивляются, почему повторяющиеся счета (recurring invoices) не создаются сами и напоминания об оплате не уходят. Invoice Ninja, как и любое Laravel-приложение с фоновыми задачами, требует системного cron:
crontab -e -u www-data
Добавляем строку:
* * * * * php /var/www/ninja/artisan schedule:run >> /dev/null 2>&1
Проверить, что задача реально выполняется, можно через лог Laravel (storage/logs/laravel.log) — если через несколько минут там появляются записи о выполненных задачах планировщика, всё настроено верно. Если с cron на сервере раньше не сталкивались или что-то идёт не так — вот разбор настройки cron-задач на VPS с типичными причинами, почему задача не срабатывает.
Первый вход и базовая настройка компании
Открываем https://invoices.вашдомен.ru в браузере — должен появиться экран настройки. На этом шаге:
- Создаёте аккаунт администратора (email и пароль — используйте менеджер паролей, это единственная точка входа в финансовые данные клиентов);
- Заполняете профиль компании: название, реквизиты, логотип, валюту по умолчанию;
- В разделе Settings → Templates & Reminders настраиваете шаблон счёта и текст напоминаний — дефолтные англоязычные шаблоны почти наверняка придётся переписать под русский язык и вашу подпись;
- В Settings → Online Payments подключаете платёжный шлюз, если планируете принимать оплату прямо по ссылке из счёта (Invoice Ninja поддерживает несколько десятков интеграций, но для России набор рабочих вариантов ограничен — уточняйте актуальную доступность у выбранного провайдера отдельно, это не тема установки).
Резервное копирование
Self-hosted решение означает, что бэкапы — тоже ваша ответственность, и для системы с финансовыми документами клиентов это не опция, а обязательный пункт. Минимальный рабочий вариант — ежедневный дамп базы и архив директории со storage (там лежат PDF, вложения и логотипы):
#!/bin/bash
DATE=$(date +%F)
mysqldump -u ninja_user -p'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ' ninja > /backup/ninja-db-$DATE.sql
tar -czf /backup/ninja-storage-$DATE.tar.gz /var/www/ninja/storage
find /backup -mtime +14 -delete
Кладём скрипт в cron на 3-4 часа ночи, храним копии минимум 14 дней и обязательно выносим их за пределы самого сервера — на S3-совместимое хранилище или отдельный VPS. Для более серьёзной схемы с версионированием и дедупликацией имеет смысл посмотреть BorgBackup на Ubuntu 24.04 — он экономит место при ежедневных полных копиях и проще восстанавливается точечно.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Invoice Ninja бесплатен полностью или есть платные функции?
Self-hosted версия (тот же код, что мы ставим здесь) бесплатна и открыта — Enterprise-функции вроде некоторых готовых интеграций доступны в облачном SaaS-тарифе, но для выставления счетов, учёта клиентов и recurring-инвойсов self-hosted-версии достаточно почти всегда.
Можно ли перенести Invoice Ninja на другой сервер без переустановки?
Да — переносится дамп базы MariaDB и вся директория /var/www/ninja (особенно storage и .env), после чего на новом сервере достаточно поднять тот же стек PHP/Nginx и восстановить оба компонента.
Почему PDF-счета не генерируются или приходят пустыми?
Чаще всего причина в отсутствующем расширении gmp или bcmath, реже — в нехватке памяти PHP-FPM для рендеринга PDF на больших счетах; проверьте php -m и лимит memory_limit в php.ini.
Нужен ли Redis для маленькой установки?
Нет, для одного пользователя и умеренного потока счетов файлового и database-кеша Laravel достаточно; Redis имеет смысл добавлять, если счетов и клиентов становится тысячи и интерфейс начинает заметно тормозить.
Как обновлять Invoice Ninja после установки без Docker?
Скачиваете новый invoiceninja.tar с релиза, распаковываете поверх (сохраняя .env и storage), затем php artisan migrate --force и php artisan optimize:clear — процедура описана в официальном upgrade-гайде проекта под конкретную версию.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →