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

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:

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:

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:

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:

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:

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:

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.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: