# Konfigurationsreferenz (Server) ## Überblick Alle Konstanten stehen in `config.php`, kopiert aus `config.sample.php`. Jede hat einen Standardwert in `includes/bootstrap.php`; eine minimale `config.php` braucht nur `MANAGE_PUBLIC_URL` und `MANAGE_ADMIN_PASSWORD_HASH`. Die Konstanten des **Clients** stehen in [../client-package/docs/03_CONFIG_REFERENCE.md](../client-package/docs/03_CONFIG_REFERENCE.md). ## Produkt | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_PRODUCT_NAME` | `"Managed Application"` | Anzeigename in der Oberfläche | | `MANAGE_PACKAGE_PREFIX` | `"release"` | Dateinamenspräfix gespeicherter Pakete: `-vX.Y.Z.zip` | ## Öffentliche URL | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_PUBLIC_URL` | `""` | Absolute Basis-URL dieser Installation, ohne Schrägstrich am Ende | Aus diesem Wert wird die Download-URL gebildet, die Clients im Manifest erhalten. Er wird bewusst nicht aus dem `Host`-Header abgeleitet: Ein gefälschter Header könnte einen Client sonst auf einen fremden Server umlenken. Ist der Wert leer, meldet die Übersicht eine Warnung und `manifest.php` antwortet mit einem Fehler. ## Anmeldung | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_ADMIN_PASSWORD_HASH` | – | bcrypt-Hash, mit `password_verify()` geprüft | | `MANAGE_ADMIN_PASSWORD` | – | Klartext-Alternative, mit `hash_equals()` geprüft | Der Hash hat Vorrang. Er wird ignoriert, solange er noch den Platzhalter aus `config.sample.php` enthält – so scheitert eine unfertige Konfiguration sichtbar, statt eine offene Anmeldung zu erlauben. ```bash php -r 'echo password_hash("ein-langes-passwort", PASSWORD_DEFAULT), PHP_EOL;' ``` In einfache Anführungszeichen setzen, ein bcrypt-Hash enthält `$`. ## Speicher | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_STORAGE_DIR` | `__DIR__ . "/storage/"` | Wurzel für Instanzen, Releases, Backups, Protokolle | Alle weiteren Pfade leiten sich davon ab und müssen nicht einzeln gesetzt werden: `storage/instances.json`, `storage/settings.json`, `storage/releases/manifest.json`, `storage/releases/packages/`, `storage/backups/`, `storage/logs/`. Das Verzeichnis darf nicht über das Web erreichbar sein. ## Backups | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_BACKUP_RETENTION` | `30` | Lokale Backups pro Instanz. Minimum 1 | | `MANAGE_BACKUP_MAX_UPLOAD_BYTES` | `0` | Zusätzliches Größenlimit; `0` deaktiviert | Der in der Oberfläche gespeicherte Wert (`storage/settings.json`) hat Vorrang vor `MANAGE_BACKUP_RETENTION`, sobald er einmal gespeichert wurde. `MANAGE_BACKUP_MAX_UPLOAD_BYTES` liegt **über** den PHP-Grenzen: `upload_max_filesize` und `post_max_size` greifen ohnehin und sind meist niedriger. ## S3-Archiv | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_S3_ENABLED` | `false` | Archivierung einschalten | | `MANAGE_S3_ENDPOINT` | `""` | z. B. `https://fsn1.your-objectstorage.com` | | `MANAGE_S3_REGION` | `""` | Region für die Signatur | | `MANAGE_S3_BUCKET` | `""` | Bucket-Name | | `MANAGE_S3_PREFIX` | `""` | Schlüsselpräfix im Bucket, darf leer sein | | `MANAGE_S3_ACCESS_KEY` | `""` | Access Key | | `MANAGE_S3_SECRET_KEY` | `""` | Secret Key | | `MANAGE_S3_PATH_STYLE` | `false` | `false` = virtual-hosted, `true` = path-style | | `MANAGE_S3_TIMEOUT` | `120` | Sekunden je HTTP-Anfrage | | `MANAGE_S3_RETENTION` | `365` | S3-Backups pro Instanz | Das Archiv gilt nur als aktiv, wenn `MANAGE_S3_ENABLED` gesetzt **und** Endpunkt, Region, Bucket, Access Key und Secret Key gefüllt sind. Eine halbe Konfiguration bleibt wirkungslos statt bei jedem Upload zu scheitern. Verhalten und Fehlersuche: [SERVER_SETUP](SERVER_SETUP.md). ## Ratenbegrenzung | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_LOGIN_RATE_LIMIT_MAX` | `10` | Fehlversuche an der Oberfläche je Zeitfenster und IP | | `MANAGE_LOGIN_RATE_LIMIT_WINDOW` | `900` | Zeitfenster in Sekunden | | `MANAGE_API_RATE_LIMIT_MAX` | `240` | Fehlgeschlagene API-Authentifizierungen je Fenster und IP | | `MANAGE_API_RATE_LIMIT_WINDOW` | `300` | Zeitfenster in Sekunden | Der Zustand liegt in `storage/ratelimit/`. Eine erfolgreiche Authentifizierung setzt den Zähler der IP zurück. Ist der Zustand nicht schreibbar, lässt die Begrenzung bewusst durch, statt alle auszusperren. ## Protokolle | Konstante | Standard | Bedeutung | |---|---|---| | `MANAGE_LOG_MAX_BYTES` | `1048576` | Rotation ab dieser Größe | | `MANAGE_LOG_KEEP_FILES` | `5` | Anzahl rotierter Dateien | | `MANAGE_LOG_MAX_AGE_SECONDS` | `2592000` | Rotierte Dateien danach löschen (30 Tage) | Gilt für `access.log` und `error.log`. `s3.log` wächst unbegrenzt und wird bei Bedarf von Hand gekürzt. ## Beispiel für eine minimale config.php ```php