diff --git a/README.md b/README.md index 461a6d9..628af9c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ es steht deshalb **kein Passwort, kein Token und keine Kundenangabe** in diesem | `autoinstall/` | NoCloud-Seed für die Basis-VM (`user-data`, `meta-data`) | | `rmm-tasks/` | Skripte, die als Task im ConnectWise RMM hinterlegt sind (Quelle für Änderungen) | | `bin/` | Skripte, die auf der VM unter `/srv/espo/bin/` liegen und von Tasks aufgerufen werden | -| `docker/` | je Ring ein Ordner mit der `docker-compose.yml` dieses Standes, dazu die EspoCRM-Grundeinstellungen (`config-override.php`) | +| `docker/` | je Ring ein Ordner mit dem Stand dieses Rings: `docker-compose.yml` und `config-override.php` | Konzept, Entscheidungen und Runbooks liegen im internen Repository `espoCRM/espo-fleet-ops`. @@ -28,7 +28,8 @@ Das Semikolon muss maskiert werden – in GRUB trennt ein unmaskiertes `;` zwei | `docker/1 - Pilotkunde/` | 1 | freigegebener Stand für Pilotkunden | | `docker/2 - Produktivkunde/` | 2 | freigegebener Stand für den Regelbetrieb | -Jeder Ordner enthält eine vollständige `docker-compose.yml` mit genau einem Platzhalter: `__FQDN__`. +Jeder Ordner enthält den vollständigen Stand dieses Rings: eine `docker-compose.yml` mit genau einem +Platzhalter (`__FQDN__`) und die `config-override.php` mit den EspoCRM-Grundeinstellungen. **Eine Freigabe ist das Kopieren dieser Datei in den nächsten Ordner** – damit steht in jedem `git diff`, welche Instanzen den neuen Stand bekommen. diff --git a/docker/config-override.php b/docker/0 - intern/config-override.php similarity index 100% rename from docker/config-override.php rename to docker/0 - intern/config-override.php diff --git a/docker/1 - Pilotkunde/config-override.php b/docker/1 - Pilotkunde/config-override.php new file mode 100644 index 0000000..6703522 --- /dev/null +++ b/docker/1 - Pilotkunde/config-override.php @@ -0,0 +1,67 @@ + 'de_DE', + 'timeZone' => 'Europe/Berlin', + 'dateFormat' => 'DD.MM.YYYY', + 'timeFormat' => 'HH:mm', + 'weekStart' => 1, // Montag + 'fiscalYearShift' => 0, // Geschäftsjahr = Kalenderjahr + 'thousandSeparator' => '.', + 'decimalMark' => ',', + + // Währung + 'currencyList' => ['EUR'], + 'defaultCurrency' => 'EUR', + 'baseCurrency' => 'EUR', + 'currencyFormat' => 3, // "1.000,00 €" (Symbol nach dem Betrag) + 'currencyDecimalPlaces' => 2, + + // Adressen und Telefon + 'addressFormat' => 2, // Straße / PLZ Ort / Land + 'addressStateList' => [ + 'Baden-Württemberg', 'Bayern', 'Berlin', 'Brandenburg', 'Bremen', 'Hamburg', 'Hessen', + 'Mecklenburg-Vorpommern', 'Niedersachsen', 'Nordrhein-Westfalen', 'Rheinland-Pfalz', 'Saarland', + 'Sachsen', 'Sachsen-Anhalt', 'Schleswig-Holstein', 'Thüringen', + ], + 'addressCityList' => [], + 'phoneNumberPreferredCountryList' => ['de'], + 'phoneNumberInternational' => true, // E.164-Speicherung/-Validierung + + // Listen + 'recordsPerPage' => 50, + 'recordsPerPageSmall' => 10, + 'recordsPerPageSelect' => 20, + 'recordsPerPageKanban' => 10, + + // E-Mail und Export + 'emailMessageMaxSize' => 25, // MB + 'exportDelimiter' => ';', // CSV-Export für deutsches Excel + + // Sicherheit (betrifft Espo-Passwörter: Admins, API-Benutzer; bei LDAP-Kunden die Nicht-LDAP-Konten) + 'passwordStrengthLength' => 12, + 'passwordStrengthBothCases' => true, + 'passwordStrengthNumberCount' => 1, + 'passwordStrengthSpecialCharacterCount' => 1, + 'passwordGenerateLength' => 16, + 'passwordRecoveryNoExposure' => true, // Passwort-Reset verrät nicht, ob eine Adresse existiert + 'auth2FA' => true, // 2FA anbieten (nicht erzwingen: auth2FAForced) + + // Authentifizierung: 'LDAP' nur zusammen mit den ldap*-Parametern der Kundeninstanz setzen + // (ldapHost, ldapPort, ldapSecurity, ldapUsername, ldapPassword, ldapBaseDn, ldapUserLoginFilter, ...). + // Ohne erreichbaren LDAP-Server können sich nur noch Admins anmelden. Dev-/Integrationsinstanz: 'Espo'. + // 'authenticationMethod' => 'LDAP', +]; diff --git a/docker/2 - Produktivkunde/config-override.php b/docker/2 - Produktivkunde/config-override.php new file mode 100644 index 0000000..6703522 --- /dev/null +++ b/docker/2 - Produktivkunde/config-override.php @@ -0,0 +1,67 @@ + 'de_DE', + 'timeZone' => 'Europe/Berlin', + 'dateFormat' => 'DD.MM.YYYY', + 'timeFormat' => 'HH:mm', + 'weekStart' => 1, // Montag + 'fiscalYearShift' => 0, // Geschäftsjahr = Kalenderjahr + 'thousandSeparator' => '.', + 'decimalMark' => ',', + + // Währung + 'currencyList' => ['EUR'], + 'defaultCurrency' => 'EUR', + 'baseCurrency' => 'EUR', + 'currencyFormat' => 3, // "1.000,00 €" (Symbol nach dem Betrag) + 'currencyDecimalPlaces' => 2, + + // Adressen und Telefon + 'addressFormat' => 2, // Straße / PLZ Ort / Land + 'addressStateList' => [ + 'Baden-Württemberg', 'Bayern', 'Berlin', 'Brandenburg', 'Bremen', 'Hamburg', 'Hessen', + 'Mecklenburg-Vorpommern', 'Niedersachsen', 'Nordrhein-Westfalen', 'Rheinland-Pfalz', 'Saarland', + 'Sachsen', 'Sachsen-Anhalt', 'Schleswig-Holstein', 'Thüringen', + ], + 'addressCityList' => [], + 'phoneNumberPreferredCountryList' => ['de'], + 'phoneNumberInternational' => true, // E.164-Speicherung/-Validierung + + // Listen + 'recordsPerPage' => 50, + 'recordsPerPageSmall' => 10, + 'recordsPerPageSelect' => 20, + 'recordsPerPageKanban' => 10, + + // E-Mail und Export + 'emailMessageMaxSize' => 25, // MB + 'exportDelimiter' => ';', // CSV-Export für deutsches Excel + + // Sicherheit (betrifft Espo-Passwörter: Admins, API-Benutzer; bei LDAP-Kunden die Nicht-LDAP-Konten) + 'passwordStrengthLength' => 12, + 'passwordStrengthBothCases' => true, + 'passwordStrengthNumberCount' => 1, + 'passwordStrengthSpecialCharacterCount' => 1, + 'passwordGenerateLength' => 16, + 'passwordRecoveryNoExposure' => true, // Passwort-Reset verrät nicht, ob eine Adresse existiert + 'auth2FA' => true, // 2FA anbieten (nicht erzwingen: auth2FAForced) + + // Authentifizierung: 'LDAP' nur zusammen mit den ldap*-Parametern der Kundeninstanz setzen + // (ldapHost, ldapPort, ldapSecurity, ldapUsername, ldapPassword, ldapBaseDn, ldapUserLoginFilter, ...). + // Ohne erreichbaren LDAP-Server können sich nur noch Admins anmelden. Dev-/Integrationsinstanz: 'Espo'. + // 'authenticationMethod' => 'LDAP', +]; diff --git a/rmm-tasks/ESPO-03-First-Deploy.sh b/rmm-tasks/ESPO-03-First-Deploy.sh index c70adc2..910e87e 100755 --- a/rmm-tasks/ESPO-03-First-Deploy.sh +++ b/rmm-tasks/ESPO-03-First-Deploy.sh @@ -38,7 +38,16 @@ done umask 022 # 4. Grundeinstellungen bereitlegen, bevor EspoCRM zum ersten Mal startet. -curl -fsSL "$BASIS_URL/docker/config-override.php" -o /srv/espo/data/config-override.php || fehler "config-override.php nicht abrufbar" +# Sie gehoeren zum Stand des Rings, liegen also im selben Ordner wie die Compose. +# Dieselbe Zuordnung steht in bin/espo-compose-rendern - beide zusammen halten. +case "$RING" in + 0) RINGORDNER="0%20-%20intern" ;; + 1) RINGORDNER="1%20-%20Pilotkunde" ;; + 2) RINGORDNER="2%20-%20Produktivkunde" ;; + *) fehler "unbekannter Ring '$RING' (erwartet 0, 1 oder 2)" ;; +esac +curl -fsSL "$BASIS_URL/docker/$RINGORDNER/config-override.php" -o /srv/espo/data/config-override.php \ + || fehler "config-override.php fuer Ring '$RING' nicht abrufbar" # 5. Compose aus dem Stand des Rings schreiben. curl -fsSL "$BASIS_URL/bin/espo-compose-rendern" -o /srv/espo/bin/espo-compose-rendern || fehler "Render-Skript nicht abrufbar"