OpenGewerk

OpenGewerk auf dem eigenen Server

OpenGewerk läuft auf einer Maschine, die der Betrieb selbst stellt oder mietet. Start, Sicherung, Rückspielen und Update sind mitgeliefert und laufen bei jeder Änderung durch die Tests.

In vier Schritten startenHaustechnik installieren

In vier Schritten starten

  1. Das Paket der neuesten Fassung von der Release-Seite herunterladen.
  2. Auf einer Maschine mit Docker entpacken und sh docker/start.sh aufrufen.
  3. Einen Reverse Proxy mit HTTPS davorstellen, die Vorlagen liegen im Paket.
  4. Im Browser die Ersteinrichtung mit dem Einrichtungscode abschließen.

Der Start im Einzelnen

Das Paket der neuesten Fassung von der Release-Seite herunterladen, auf einer Maschine mit Docker entpacken und im Ordner opengewerk aufrufen:

sh docker/start.sh

Beim ersten Mal legt der Befehl die Konfiguration selbst an. Jedes Passwort und jeder Schlüssel entsteht auf der Maschine, dazu der Einrichtungscode, und in der Konsole stehen nur ihre Namen, nie die Werte. Gefragt wird einzig nach der Adresse, unter der OpenGewerk im Browser geöffnet wird. Danach richtet er die Datenbank ein und startet die Instanz, und jeder weitere Aufruf ist zugleich das Update.

Im Browser steht dann die Oberfläche. Solange es weder einen Betrieb noch ein Konto gibt, zeigt sie die Ersteinrichtung, und die fragt als Erstes nach dem Einrichtungscode. Er steht in docker/.env unter SETUP_CODE, zu sehen mit grep SETUP_CODE docker/.env: so richtet nur ein, wer an den Server kommt, und nicht, wer die Adresse zuerst findet. Danach folgen Name des Betriebs, Name und Adresse der Person, die ihn führt, ein Passwort und direkt danach der zweite Faktor. Am besten geschieht das gleich nach dem ersten Start. Alles Weitere, vom Briefkopf bis zum Mailserver, wird danach in der Oberfläche eingestellt.

Die Abbilder holt der Befehl fertig und signiert, für x86_64 und ARM64; gebaut wird auf der Maschine nichts. Sie kommen aus der GitHub Container Registry, und dieselben Abbilder mit denselben Signaturen liegen auch auf Docker Hub, als opengewerk/opengewerk und opengewerk/backup. Ein Update ist das Paket der nächsten Fassung an derselben Stelle, die Konfiguration bleibt dabei stehen. Wer lieber den Quelltext des Repositorys auscheckt, startet mit demselben Befehl, dann baut er die Abbilder selbst.

Davor gehört ein Reverse Proxy mit HTTPS

Die Instanz lauscht nur auf 127.0.0.1, denn eine Anwendung, die Rechnungen führt, steht nicht unverschlüsselt im Netz. Davor gehört ein Reverse Proxy mit TLS, und für die beiden üblichen liegen vollständige Vorlagen im Paket unter docker/proxy/: apache.conf für Apache und nginx.conf für nginx. Sie leiten HTTP auf HTTPS um, nehmen das Zertifikat von certbot, reichen Host, Protokoll und die Adresse des Browsers an die Instanz weiter, lassen große Anfragen nur dort durch, wo Dateien kommen, und geben einem langen Druck Zeit. Anzupassen sind der Name und, wer ihn geändert hat, der Port; jede dieser Zeilen trägt einen Kommentar.

Was darüber hinaus zu wissen ist, auch für einen anderen Proxy wie Caddy, steht in der Anleitung zum Betrieb im Abschnitt Reverse Proxy.

Was die Maschine tragen muss

DienstAbbildArbeitsspeicher im Leerlauf
Anwendung291 MB81 MiB unter einem Limit von 1 GB
PostgreSQL 18433 MB33 MiB
PDF-Renderer, abschaltbar3,9 GB342 MiB
Nächtliche Sicherung452 MB, davon 433 MB mit PostgreSQL geteilt1,8 MiB

Gemessen im September 2026 auf einer leeren Instanz. Der PDF-Renderer ist ein eigener Container, weil er allein mehr Speicher braucht als alles andere zusammen. Er startet von Haus aus mit, denn ohne ihn kommt kein Angebot und keine Rechnung als PDF heraus, und lässt sich abschalten. Zusammen bleiben die Dienste im Leerlauf unter 600 MiB.

Sicherung

Jede Nacht sichert ein eigener Dienst die Datenbank und danach den Dateispeicher, in dieser Reihenfolge. Andersherum hätte alles, was dazwischen hochgeladen wird, eine Zeile in der Sicherung und keine Datei im Archiv. Das Büro zeigt, wann die letzte fertig wurde.

Je Betrieb wird der Kopf der Audit-Hashkette mitgeschrieben. Damit ist die Sicherung der Zeuge, den die Kette braucht. Verschlüsselt wird auf Wunsch an einen öffentlichen Schlüssel, sodass die Maschine ihre eigenen älteren Sicherungen nicht lesen kann.

Rückspielen

Ein zweiter Lauf spielt eine Sicherung zurück, ein dritter prüft sie gegen die laufende Datenbank. Verglichen werden dabei die Prüfsummen der Dateien.

Während des Rückspielens wird der Anwendung die Anmeldung an der Datenbank entzogen, damit nichts dazwischen schreibt.

Update

Derselbe Befehl wie beim ersten Start: erst migrieren, dann tauschen. Schlägt die Migration fehl, läuft die alte Fassung einfach weiter.

Alle ausstehenden Migrationen laufen in einer einzigen Transaktion. Ein abgebrochenes Update lässt die Datenbank deshalb auf dem Stand davor und braucht kein Rückspielen.

Keine Cloud, kein Anbieter

Es gibt keinen Anbieter, bei dem Daten zwischengespeichert würden, keine Telemetrie und keinen Lizenzserver, der eine Instanz freischaltet. Wer eine Auftragsverarbeitung nach Art. 28 DSGVO prüfen muss, prüft den Hoster des Servers und nicht OpenGewerk.

Mehrere Betriebe auf einer Instanz sind möglich und schon in der Datenbank voneinander getrennt. Diese Trennung gilt auch für die Rolle, mit der die Anwendung arbeitet: sie darf am Schema nichts ändern, und eine Instanz, die sich mit den Zugangsdaten des Eigentümers anmelden will, startet gar nicht erst.

Zwei Rollen in der Datenbank

opengewerk_owner besitzt die Tabellen und führt die Migrationen aus. opengewerk_app ist die Rolle der Anwendung, für sie gilt die Mandantentrennung.

Der Grund: Für den Eigentümer einer Tabelle greift die Trennung nur mit einem zusätzlichen Schalter. Eine Anwendung, die als Eigentümer verbindet, wäre ohne ihn nicht getrennt.

OpenGewerk Haustechnik auf derselben Maschine

OpenGewerk Haustechnik startet genauso, mit sh docker/start.sh aus dem Paket einer Fassung von ihrer Release-Seite, und bringt dieselbe Ersteinrichtung, dieselbe nächtliche Sicherung und dasselbe Update mit. Seit 0.1.0 vom 15.10.2026 sind ihre Abbilder signiert, gebaut wird auf der Maschine nichts. Sie hat ein eigenes Compose-Projekt, einen eigenen Port, eine eigene Datenbank und eigene Volumes und läuft deshalb neben der Handwerkersoftware auf demselben Server.

Davor gehört ein eigener Hostname: ein Browser hält Cookies je Hostname und nicht je Port, zwei Anwendungen unter einem Namen würden sich gegenseitig abmelden.

Auch die Haustechnik bringt Vorlagen für den Reverse Proxy im Paket mit, apache.conf und nginx.conf, schon mit eigenem Namen, eigenem Port und den Grenzen für ihre Fotos, Nachweise und Tabellen. Was dabei zu wissen ist, steht in ihrer Anleitung zum Betrieb im Abschnitt Reverse Proxy.

Häufige Fragen zum Betrieb

Welchen Server braucht OpenGewerk?

Eine Maschine mit Docker, auf x86_64 oder ARM64. Anwendung und Datenbank zusammen bleiben im Leerlauf unter 120 MiB Arbeitsspeicher, gemessen mit einem Limit von einem Gigabyte, mit dem PDF-Renderer unter 600 MiB. Ein kleiner virtueller Server reicht für einen Betrieb aus, ein Gerät im eigenen Netz ebenso.

Wie werden die Daten gesichert?

Jede Nacht von selbst. Ein mitgelieferter Dienst sichert erst die Datenbank und dann den Dateispeicher, hält dabei je Betrieb den Kopf der Audit-Hashkette fest und verschlüsselt das Archiv auf Wunsch an einen öffentlichen Schlüssel. Das Büro zeigt, wann die letzte Sicherung fertig wurde, und warnt nach zwei Tagen ohne. Ein zweiter Lauf spielt eine Sicherung zurück, ein dritter prüft sie gegen die laufende Datenbank.

Wie läuft ein Update?

Mit demselben Befehl wie der erste Start. Er migriert zuerst in einem eigenen Lauf und tauscht erst danach die Container; andersherum wäre die laufende Instanz schon entfernt, wenn die Migration anfängt, und ein Fehlschlag ließe sie unten. Mit den Releases kommt die neue Fassung als Paket mit fertigen, signierten Abbildern, und auf der Maschine wird nichts mehr gebaut.

Sendet OpenGewerk Daten nach außen?

Nein. Es gibt keine Telemetrie, keinen Lizenzserver und keine Registrierung. Die Instanz spricht mit niemandem, mit dem der Betrieb sie nicht sprechen lässt.

Was bedeutet die AGPL für meinen Betrieb?

Für die Nutzung im eigenen Betrieb nichts. Die Pflicht, Änderungen zurückzugeben, greift, wenn jemand OpenGewerk verändert und als Dienst für andere betreibt. Wer die Software nur benutzt, auch gewerblich, ist davon nicht berührt.

Anleitung im RepositoryStand des Projekts