Invoice Ninja auf Ubuntu 24.04 installieren
Invoice Ninja ist eine Open-Source Rechnungssoftware auf Basis von Laravel, die es Unternehmen ermöglicht, Rechnungen zu versenden und Zahlungen nachzuverfolgen. Sie stellt eine kostenfreie Alternative zu bekannten Buchhaltungslösungen wie FreshBooks oder QuickBooks dar. Mit Invoice Ninja können Sie finanzielle Aufgaben wie die Verwaltung von Einnahmen, Ausgaben, Zahlungen sowie Zeiterfassung abwickeln.
In dieser Anleitung wird erklärt, wie Sie Invoice Ninja auf einem Ubuntu 24.04 Server bereitstellen. Sie installieren und konfigurieren die Anwendung so, dass sie für Ihre Finanzverwaltung direkt auf dem Server einsatzbereit ist.
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Folgendes vorhanden ist:
- Ein Ubuntu 24.04 Server mit einem Nicht-Root-Benutzer, der über sudo-Rechte verfügt.
- Ein eingerichteter A-Record, der auf die IP-Adresse des Servers verweist, zum Beispiel: invoiceninja.example.com.
Installation von Invoice Ninja
Invoice Ninja kann entweder über das aktuelle Release-Paket oder mit Docker installiert werden. Die Installation mit dem Release-Paket gibt Ihnen sofortigen Zugriff auf die neuesten Funktionen, während Docker die Bereitstellung vereinfacht, da keine manuellen Paketinstallationen notwendig sind. Im Folgenden wird die Installation über das Release-Paket beschrieben.
Schritt 1: Systempakete aktualisieren
$ sudo apt update
Schritt 2: Firewall konfigurieren
Erlauben Sie HTTP- und HTTPS-Datenverkehr über die Firewall:
$ sudo ufw allow http && sudo ufw allow https
Schritt 3: Benötigte Abhängigkeiten installieren
Invoice Ninja benötigt PHP 8.3 und einen LAMP- oder LEMP-Stack. Installieren Sie zunächst Nginx, MySQL und PHP:
$ sudo apt install nginx mysql-server php -y
Überprüfen Sie anschließend die installierte PHP-Version und stellen Sie sicher, dass es sich um PHP 8.3 oder höher handelt:
$ php -v
Installieren Sie danach PHP-FPM sowie alle erforderlichen Erweiterungen:
$ sudo apt install php8.3-bcmath php8.3-gmp php8.3-fileinfo \
php8.3-gd php8.3-mbstring php8.3-pdo php8.3-xml php8.3-cli \
php8.3-curl php8.3-zip php8.3-gmp php8.3-mysql php8.3-fpm -y
Aktivieren und starten Sie anschließend den Nginx-Dienst:
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
$ sudo systemctl status nginx
MySQL-Datenbank erstellen
Invoice Ninja benötigt eine MySQL-Datenbank. Gehen Sie dazu wie folgt vor:
Melden Sie sich als Root-Benutzer bei MySQL an:
$ sudo mysql -u root
Legen Sie Datenbank und Benutzer an:
mysql> CREATE DATABASE invoiceninjadb;
mysql> CREATE USER 'invoiceninja-admin'@'localhost' IDENTIFIED BY 'secure-password';
mysql> GRANT ALL PRIVILEGES ON invoiceninjadb.* TO 'invoiceninja-admin'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
Invoice Ninja herunterladen und konfigurieren
Legen Sie das Anwendungsverzeichnis an und wechseln Sie hinein:
$ sudo mkdir -p /var/www/invoiceninja
$ cd /var/www/invoiceninja
Laden Sie das aktuelle Release herunter und entpacken Sie es (hier im Beispiel Version 5.11.72):
$ sudo wget https://github.com/invoiceninja/invoiceninja/releases/download/v5.11.72/invoiceninja.tar.gz
$ sudo tar -xvf invoiceninja.tar.gz
$ sudo rm invoiceninja.tar.gz
Richten Sie die Umgebungsdatei ein und passen Sie die Berechtigungen an:
$ sudo cp .env.example .env
$ sudo chown -R www-data:www-data /var/www/invoiceninja
Cronjobs konfigurieren
Öffnen Sie den Crontab-Editor als www-data
-Benutzer:
$ sudo -u www-data crontab -e
Fügen Sie den folgenden Laravel-Scheduler hinzu:
* * * * * php8.3 /var/www/invoiceninja/artisan schedule:run >> /dev/null 2>&1
Prüfen Sie, ob der Cronjob aktiv ist:
$ sudo -u www-data crontab -l
Ausgabe:
# m h dom mon dow command
* * * * * php8.3 /var/www/invoiceninja/artisan schedule:run >> /dev/null 2>&1
Invoice Ninja konfigurieren
Damit Invoice Ninja funktioniert, muss ein virtueller Host in Nginx eingerichtet werden, um die Dateien im Verzeichnis /var/www/invoiceninja
auszuliefern. Gehen Sie dazu wie folgt vor.
Schritt 1: Virtuelle Host-Datei erstellen
Erstellen Sie eine neue Konfigurationsdatei namens invoiceninja.conf
im Verzeichnis /etc/nginx/sites-available
:
$ sudo nano /etc/nginx/sites-available/invoiceninja.conf
Fügen Sie den folgenden Nginx-Serverblock ein (ersetzen Sie invoiceninja.example.com durch Ihre Domain):
server {
listen 80;
listen [::]:80;
server_name invoiceninja.example.com;
root /var/www/invoiceninja/public;
index index.php index.html index.htm;
client_max_body_size 20M;
charset utf-8;
access_log /var/log/nginx/ininja.access.log;
error_log /var/log/nginx/ininja.error.log;
gzip on;
gzip_types application/javascript application/x-javascript text/javascript text/plain application/xml application/json;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
if (!-e $request_filename) {
rewrite ^(.+)$ /index.php?q= last;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
}
Diese Konfiguration sorgt dafür, dass die Dateien im Verzeichnis /var/www/invoiceninja/public
über Ihre Domain erreichbar sind. Alle PHP-Anfragen werden dabei an den PHP 8.3 FPM-Dienst weitergeleitet.
Schritt 2: Virtuellen Host aktivieren
Entfernen Sie die Standard-Nginx-Virtual-Host-Konfiguration:
$ sudo rm /etc/nginx/sites-enabled/default
Aktivieren Sie den neuen virtuellen Host, indem Sie ihn in das sites-enabled
-Verzeichnis verlinken:
$ sudo ln -s /etc/nginx/sites-available/invoiceninja.conf /etc/nginx/sites-enabled/invoiceninja.conf
Testen Sie die Nginx-Konfiguration auf Syntaxfehler:
$ sudo nginx -t
Ausgabe:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Starten Sie Nginx neu, um die Änderungen zu übernehmen:
$ sudo systemctl restart nginx
Invoice Ninja mit SSL absichern
Als Nächstes sichern Sie Invoice Ninja mit Let’s Encrypt SSL-Zertifikaten ab.
Installieren Sie das Certbot-Plugin für Nginx:
$ sudo apt install python3-certbot-nginx
Fordern Sie ein neues TLS-Zertifikat an. Ersetzen Sie invoiceninja.example.com durch Ihre Domain und admin@example.com durch Ihre E-Mail-Adresse:
$ sudo certbot --nginx -d invoiceninja.example.com -m admin@example.com --agree-tos
Starten Sie Nginx neu, um die neue SSL-Konfiguration zu laden:
$ sudo systemctl restart nginx
Invoice Ninja einrichten
Nachdem der Server konfiguriert ist, können Sie die Einrichtung von Invoice Ninja im Browser abschließen. Öffnen Sie die Setup-Seite:
https://invoiceninja.example.com/setup
Der Einrichtungsassistent führt Sie durch die Konfiguration:
- Tragen Sie Ihre Domain in das URL-Feld ein und lassen Sie die Option HTTPS Require aktiviert.
- Stellen Sie sicher, dass MySQL als Datenbanktreiber ausgewählt ist.
- Belassen Sie
localhost
als Host (oder geben Sie bei Bedarf einen anderen an). - Nutzen Sie den Port
3306
, sofern Ihre Datenbank nicht anders konfiguriert ist. - Geben Sie den zuvor erstellten Datenbanknamen, Benutzer und das Passwort ein.
- Klicken Sie auf Test connection, um die Datenbankverbindung zu prüfen.
- Füllen Sie das Formular mit den Administratorinformationen aus.
- Akzeptieren Sie die Nutzungsbedingungen und Datenschutzrichtlinien.
- Klicken Sie auf Submit, um die Einrichtung abzuschließen.
Invoice Ninja mit Docker Compose installieren
Sie können Invoice Ninja auch mit Docker Compose installieren. Diese Methode setzt Invoice Ninja zusammen mit allen benötigten Diensten wie Nginx, MariaDB und Redis auf. Gehen Sie dazu wie folgt vor:
Schritt 1: Docker und Abhängigkeiten installieren
Installieren Sie Docker, Docker Compose sowie Certbot mit dem Nginx-Plugin:
$ sudo apt install docker.io docker-compose certbot python3-certbot-nginx -y
Deinstallieren Sie Nginx, um Port 80 freizugeben:
$ sudo apt purge nginx -y
Schritt 2: Projektverzeichnis vorbereiten
Wechseln Sie in Ihr Home-Verzeichnis und erstellen Sie die Projektstruktur:
$ cd
$ mkdir invoiceninja
$ cd invoiceninja
$ mkdir -p storage config public
Ändern Sie die Berechtigungen für storage
und public
, damit der Container Dateien schreiben kann:
$ sudo chmod -R 777 storage public
Schritt 3: API-Schlüssel generieren
Erzeugen Sie einen neuen API-Key für Invoice Ninja:
$ sudo docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --show
Kopieren Sie den generierten Schlüssel, zum Beispiel:
base64:3OoSrTSLswQyfY/NjMvVaxoODn/NyFzzwwkjfou6JuQ=
Schritt 4: docker-compose.yml erstellen
Erstellen Sie eine neue Docker-Compose-Datei:
$ nano docker-compose.yml
Fügen Sie die folgende Konfiguration ein und passen Sie die Werte wie beschrieben an:
version: '3.7'
services:
nginx:
image: nginx
restart: unless-stopped
volumes:
- ./config/in-vhost.conf:/etc/nginx/conf.d/in-vhost.conf:ro
- ./public:/var/www/app/public:ro
- /etc/letsencrypt:/etc/letsencrypt:ro
depends_on:
- app
ports:
- "80:80"
- "443:443"
healthcheck:
test: curl -f http://localhost:80/ || exit 1
networks:
- invoice_ninja_network
db:
image: mariadb:10.4
restart: unless-stopped
volumes:
- ./data:/var/lib/mysql:rw,delegated
environment:
MARIADB_PASSWORD: ninja
MARIADB_ROOT_PASSWORD: ninja
MARIADB_DATABASE: ninja
MARIADB_USER: ninja
PUID: "1026"
PGID: "100"
networks:
- invoice_ninja_network
cache:
image: redis
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
networks:
- invoice_ninja_network
app:
image: invoiceninja/invoiceninja:5
restart: unless-stopped
volumes:
- ./public:/var/www/app/public:rw,delegated
- ./storage:/var/www/app/storage:rw,delegated
depends_on:
db:
condition: service_started
cache:
condition: service_healthy
environment:
APP_NAME: "Invoice Ninja"
APP_ENV: "production"
APP_KEY: base64:3OoSrTSLswQyfY/NjMvVaxoODn/NyFzzwwkjfou6JuQ= # Replace with your key
APP_DEBUG: "0"
APP_URL: "https://invoiceninja.example.com" # Replace with your domain
IS_DOCKER: "true"
PHANTOMJS_PDF_GENERATION: "0"
PDF_GENERATOR: "snappdf"
TRUSTED_PROXIES: "*"
MULTI_DB_ENABLED: "0"
DB_HOST: db
DB_DATABASE: ninja
DB_USERNAME: ninja
DB_PASSWORD: ninja
DB_PORT: "3306"
PUID: "1026"
PGID: "100"
CACHE_DRIVER: redis
SESSION_DRIVER: redis
REDIS_HOST: cache
MAIL_MAILER: smtp
MAIL_HOST: smtp.ionos.de
MAIL_PORT: "465"
MAIL_USERNAME: xxx@yyyy
MAIL_PASSWORD: XXX
MAIL_ENCRYPTION: SSL
MAIL_FROM_ADDRESS: "invoiceninja@example.com"
MAIL_FROM_NAME: "Max Crisp"
REQUIRE_HTTPS: "1"
NINJA_ENVIRONMENT: "selfhost"
IN_USER_EMAIL: admin@example.com
IN_PASSWORD: GEHEIM
networks:
- invoice_ninja_network
networks:
invoice_ninja_network:
driver: bridge
Stellen Sie sicher, dass Sie folgende Werte anpassen:
- APP_KEY durch den generierten API-Key ersetzen.
- APP_URL mit Ihrer Domain anpassen.
- MARIADB_*-Variablen mit Ihren eigenen Datenbankwerten füllen.
- DB_*-Variablen im App-Service mit den Werten aus dem DB-Bereich angleichen.
- MAIL_*-Variablen mit den Daten Ihres Mailservers eintragen (oder Standard belassen).
- IN_USER_EMAIL und IN_PASSWORD mit Ihren Zugangsdaten ersetzen.
Schritt 5: SSL-Zertifikate erstellen
Erzeugen Sie ein vertrauenswürdiges TLS-Zertifikat für Ihre Domain:
$ sudo certbot certonly --standalone -d invoiceninja.example.com --email invoiceninja@example.com --agree-tos --non-interactive
Die Zertifikate werden in /etc/letsencrypt/live/invoiceninja.example.com/
gespeichert. Diese Pfade verwenden Sie in der Virtual-Host-Konfiguration.
Schritt 6: Nginx Virtual Host konfigurieren
Erstellen Sie die Nginx-Konfigurationsdatei im config
-Verzeichnis:
$ nano config/in-vhost.conf
Fügen Sie die folgende Konfiguration hinzu (ersetzen Sie die Domainwerte durch Ihre eigenen):
server {
listen 80 default_server;
server_name invoiceninja.example.com; # Ersetzen mit Ihrer Domain
# Alle HTTP-Anfragen nach HTTPS umleiten
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
server_name invoiceninja.example.com; # Ersetzen mit Ihrer Domain
server_tokens off;
client_max_body_size 100M;
# SSL-Zertifikatspfade
ssl_certificate /etc/letsencrypt/live/invoiceninja.example.com/fullchain.pem; # Ersetzen mit Ihrer Domain
ssl_certificate_key /etc/letsencrypt/live/invoiceninja.example.com/privkey.pem; # Ersetzen mit Ihrer Domain
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
root /var/www/app/public/;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~* /storage/.*\.php$ {
return 503;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
}
Schritt 7: Container starten
Starten Sie alle Dienste im Hintergrund (detached mode):
$ sudo docker-compose up -d
Überprüfen Sie, ob alle Container laufen:
$ sudo docker container ls
Beispielausgabe:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2aeefe15c99c nginx "/docker-entrypoint.…" 3 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp invoiceninja_nginx_1
9fc27c288ac4 invoiceninja/invoiceninja:5 "docker-entrypoint s…" 3 minutes ago Up 3 minutes 9000/tcp invoiceninja_app_1
fa2e661a93ab redis "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 6379/tcp invoiceninja_cache_1
0a27ba745af1 mariadb:10.4 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp invoiceninja_db_1
Schritt 8: Automatische Zertifikatserneuerung aktivieren
Öffnen Sie die System-Crontab-Datei:
$ sudo nano /etc/crontab
Fügen Sie folgende Zeile hinzu, um das SSL-Zertifikat täglich automatisch zu erneuern:
0 0 * * * root certbot renew --quiet
Damit wird sichergestellt, dass Ihre TLS-Zertifikate ohne manuelles Eingreifen gültig bleiben.
Zugriff und Nutzung von Invoice Ninja
Nach der Installation können Sie wie folgt auf Invoice Ninja zugreifen und es verwenden:
Schritt 1: Anmeldung
Öffnen Sie die Login-Seite im Browser mit Ihrer Domain:
https://invoiceninja.example.com/login
Geben Sie Ihre Administrator-E-Mail-Adresse und Ihr Passwort ein und klicken Sie auf Login, um das Dashboard zu öffnen.
Schritt 2: Erste Einrichtung
Im Begrüßungsfenster Welcome to Invoice Ninja:
- Geben Sie Ihren Firmennamen ein (z. B. example-company).
- Wählen Sie die Standardwährung für Ihre Rechnungen.
Schritt 3: Firmendaten konfigurieren
Gehen Sie zu Einstellungen und vervollständigen Sie Ihre Unternehmensdaten wie Adresse, Steuernummer und weitere relevante Angaben.
Schritt 4: Neue Rechnung erstellen
Wählen Sie im Hauptmenü Rechnungen und klicken Sie auf Neue Rechnung:
- Klicken Sie auf Neuer Kunde, geben Sie die Kundendaten ein und speichern Sie diese.
- Legen Sie Rechnungsdetails fest, wie Datum, Fälligkeitsdatum, Rechnungsnummer, Bestellnummer und Rabatte.
- Klicken Sie unter Produkte auf Artikel hinzufügen, um neue Positionen einzutragen.
- Klicken Sie auf Neues Produkt, geben Sie die Produktdetails ein und speichern Sie diese.
- Tragen Sie Stückpreis und Menge ein.
Schritt 5: Zusätzliche Informationen
Wechseln Sie zwischen den Bereichen Öffentliche Notizen, Bedingungen und Fußzeile, um weitere Angaben zur Rechnung zu ergänzen.
Schritt 6: Überprüfen und Speichern
Scrollen Sie durch die Rechnungs-Vorschau und kontrollieren Sie alle Daten:
- Sie können die Rechnung direkt herunterladen oder ausdrucken.
- Klicken Sie auf Speichern, um die Rechnung in Ihren Unterlagen abzulegen.
Fazit
In diesem Tutorial haben Sie gelernt, wie Sie Invoice Ninja auf Ubuntu 24.04 sowohl über das offizielle Paket als auch mit Docker bereitstellen. Mit Invoice Ninja können Sie Rechnungen erstellen, Kunden verwalten und Finanzdaten bequem im Dashboard pflegen.
Weitere Informationen finden Sie in der offiziellen Invoice Ninja Dokumentation.