# A4W Auftrag4Works – Linux/Plesk Deployment

Diese Anleitung ersetzt die alten Auftrago-Linux-Hinweise. Das Linux-Paket heißt künftig:

```text
A4W-Auftrag4Works-Linux-Server-<version>.zip
```

## Zielbild

```text
Internet/Browser
  -> Plesk/Nginx mit HTTPS
  -> Reverse Proxy auf http://127.0.0.1:5080
  -> A4W Auftrag4Works als systemd-Dienst
```

Der Port 5080 sollte nicht öffentlich freigegeben werden. Der Zugriff erfolgt über die Domain und den Plesk/Nginx-Reverse-Proxy.

## Empfohlene Pfade

Allgemein:

```text
/var/www/a4w      Programmdateien
/var/lib/a4w      Daten
/var/log/a4w      Logs
```

Für den Testserver wird automatisch erkannt, ob dieses Verzeichnis existiert:

```text
/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/
```

Dann schlägt `install-a4w-linux.sh` beispielhaft vor:

```text
/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/a4w       Programmdateien
/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/a4w-data  Daten
/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/a4w-logs  Logs
```

## Vorbereitung Ubuntu/Plesk

Prüfen, ob .NET vorhanden ist:

```bash
dotnet --info
```

Bei framework-dependent Build wird die ASP.NET Core Runtime 8 benötigt. Falls nicht vorhanden, installieren. Auf Ubuntu erfolgt das je nach Serverstand über die Microsoft-Paketquelle oder über die verfügbaren Ubuntu-Pakete.

Typischer Paketname:

```bash
sudo apt install aspnetcore-runtime-8.0
```

## Installation

ZIP auf den Server hochladen und entpacken, zum Beispiel in einen temporären Ordner oder direkt in den Zielordner.

Dann im entpackten Ordner:

```bash
chmod +x install-a4w-linux.sh update-a4w-linux.sh a4w-maintenance.sh
sudo ./install-a4w-linux.sh
```

Nach der Installation liegt `a4w-maintenance.sh` im App-Verzeichnis:

```bash
sudo /bin/bash /var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/a4w-maintenance.sh
```

Das Menue hilft bei Status, Dienstneustart, Datensicherung, Restore und Notfall-Passwort-Reset, falls Passwort vergessen per E-Mail nicht nutzbar ist.

Das Skript fragt:

- Installationsverzeichnis
- Datenverzeichnis
- Logverzeichnis
- lokalen Kestrel-Port
- Linux-Benutzer für den Dienst

Danach wird ein systemd-Dienst `a4w.service` erzeugt und gestartet.

Der Installer fuehrt zusaetzlich Vorpruefungen aus:

- Ubuntu- und Plesk-Kontext erkennen
- haeufig benoetigte native .NET-Bibliotheken nachinstallieren, soweit ueber APT verfuegbar
- ASP.NET Core Runtime 8 installieren, wenn sie fehlt
- lokalen Port pruefen
- systemd-Service schreiben und starten
- lokalen HTTP-Test gegen `127.0.0.1:<Port>` ausfuehren
- `nginx-a4w-plesk-directives.conf` und `A4W_INSTALLATION_HINWEISE.txt` im App-Ordner ablegen

Das Installationslog liegt unter `/tmp/a4w-install-<datum>.log`.

## Dienst prüfen

```bash
sudo systemctl status a4w --no-pager
curl -I http://127.0.0.1:5080
journalctl -u a4w -n 100 --no-pager
sudo /bin/bash /var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/a4w-maintenance.sh
```

## Plesk Reverse Proxy

In Plesk:

1. Domain öffnen
2. Apache & nginx-Einstellungen
3. Falls ein eigener `location / { ... }` Block eingetragen werden soll: zuerst Proxy-Modus deaktivieren und speichern/uebernehmen
4. Danach Inhalt aus `nginx-a4w-plesk-directives.conf` einfuegen
5. SSL/Let's Encrypt fuer die Domain aktivieren

Wichtig: Wenn der Proxy-Modus noch aktiv ist, erzeugt Plesk selbst bereits ein `location /`. Dann fuehrt ein eigener zweiter `location /` Block zu `duplicate location "/"`. Erst Proxy-Modus deaktivieren, speichern, dann den Block eintragen.

Warum nicht vollautomatisch in Plesk? Plesk-Installationen unterscheiden sich je nach Lizenz, Domain-Art, Apache/Nginx-Modus und Hosting-Template. Der Installer erkennt Plesk und erzeugt die passenden Direktiven, traegt sie aber bewusst nicht ungefragt in die Domain-Konfiguration ein. Dadurch bleibt die Erstinstallation wiederholbar und vermeidet kaputte Webserver-Konfigurationen.

Die Anwendung läuft intern auf `127.0.0.1:5080`. Nach außen wird nur HTTPS über die Domain verwendet.

## Update

Die Anwendung kann unter Linux das Update vorbereiten und die Update-ZIP in den lokalen Update-Cache laden.
Die eigentliche Aktualisierung der Programmdateien sollte auf dem Server per SSH/root bzw. sudo erfolgen, weil der Dienst gestoppt, Dateien ersetzt, Rechte gesetzt und der systemd-Dienst neu gestartet werden muss.

Empfohlener Aufruf:

```bash
sudo /bin/bash '/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/update-a4w-linux.sh' --yes '/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/a4w-data/Updates/A4W-Auftrag4Works-Linux-Server-<version>.zip'
```

Diagnose vor oder nach dem Update:

```bash
sudo /bin/bash '/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de/update-a4w-linux.sh' --status '/var/www/vhosts/auftrag4works.de/demo.auftrag4works.de'
journalctl -u a4w -n 100 --no-pager
```

Warum mit `bash`?

Nach dem Entpacken aus ZIP-Dateien haben `.sh`-Dateien unter Linux nicht immer ein Ausfuehrungsrecht. Der Aufruf mit `sudo /bin/bash script.sh ...` funktioniert auch ohne vorheriges `chmod +x`.

Alternativ kann man das Skript ausfuehrbar machen:

```bash
chmod +x update-a4w-linux.sh
sudo ./update-a4w-linux.sh /pfad/zum/update.zip
```

Das Update-Skript:

- erstellt ein Backup der bisherigen Programmdateien,
- stoppt den Dienst,
- ersetzt Programmdateien,
- lässt Datenordner und `appsettings.json` unangetastet,
- startet den Dienst neu.

Für automatische Updates aus der Web-App kann der Installer optional einen root-eigenen Helper `/usr/local/sbin/a4w-update` und einen engen sudoers-Eintrag einrichten:

```sudoers
www-data ALL=(root) NOPASSWD: /usr/local/sbin/a4w-update --yes *
```

Dieser Weg ist sicherer als ein sudoers-Eintrag auf ein Skript im Web-Verzeichnis. Web-gestartete Updates werden vom Skript zusätzlich als eigener `systemd-run`-Job gestartet, damit der Updateprozess nicht beendet wird, wenn `a4w` während des Updates gestoppt wird.

## Fehlerdiagnose

```bash
sudo systemctl status a4w --no-pager
journalctl -u a4w -n 200 --no-pager
curl -I http://127.0.0.1:5080
ls -la /var/lib/a4w
ls -la /var/log/a4w
```

Bei Plesk zusätzlich die Domain-Logs prüfen.

## Wichtige Hinweise

- Das Linux-ZIP ist keine PHP-Anwendung und kann nicht einfach nur in `httpdocs` kopiert werden.
- A4W Auftrag4Works läuft als ASP.NET-Core/Kestrel-Anwendung.
- Plesk/Nginx dient als Reverse Proxy.
- Der lokale Port sollte nicht öffentlich geöffnet werden.
- Daten und Programmdateien sollten getrennt bleiben.
