Maintenance - Wartungsmodus | Keywords: Wartung, Downtime, Whitelist, IP-Filter, Domain-Sperrung, Ankündigung, Console, Zugriffskontrolle
Übersicht: Aktiviert Wartungsmodus für Frontend/Backend mit mehrstufigem Whitelist-System (IP, Domain, YRewrite-Domain), Authentifizierung (URL-Parameter, Passwort), Fragment-basierten Wartungsseiten, Ankündigungssystem und Console-Commands.
Wartungsmodus-Typen
| Typ | Beschreibung |
|---|---|
Frontend |
Nur Frontend blockieren |
Backend |
Nur Backend blockieren |
Both |
Frontend + Backend blockieren |
Whitelist-Ebenen
| Ebene | Prüfung | Beispiel |
|---|---|---|
IP-Whitelist |
IP-Adresse | 192.168.1.100, 10.0.0.5 |
Domain-Whitelist |
Host/Domain | dev.example.com, staging.local |
YRewrite-Whitelist |
YRewrite-Domain | domain1\|domain2\|domain3 |
Authentifizierung
| Methode | Beschreibung |
|---|---|
URL-Parameter |
?maintenance_secret=xyz |
Passwort-Formular |
Login-Seite mit Passwort |
2FA |
Integration mit 2factor_auth |
Console-Commands
| Command | Beschreibung |
|---|---|
maintenance:mode on |
Wartungsmodus aktivieren |
maintenance:mode off |
Wartungsmodus deaktivieren |
maintenance:status |
Status abfragen |
Praxisbeispiele
Beispiel 1: Wartungsmodus aktivieren
Backend unter System > Maintenance:
- Frontend-Wartung: Aktiv
- Backend-Wartung: Inaktiv
- Speichern
Frontend ist nun gesperrt, Backend erreichbar.
Beispiel 2: IP-Whitelist
// Im Backend unter Maintenance > IP-Whitelist:
192.168.1.100, 192.168.1.101, 10.0.0.5
// Diese IPs können trotz Wartungsmodus zugreifen
Beispiel 3: Domain-Whitelist
// Im Backend unter Maintenance > Domain-Whitelist:
dev.example.com, staging.example.com, localhost
// Nur auf diesen Domains ist Zugriff erlaubt
Beispiel 4: YRewrite-Domain-Whitelist
// Im Backend unter Maintenance > YRewrite-Domains:
domain1.com|domain2.com|domain3.com
// Pipe-separated für mehrere YRewrite-Domains
Beispiel 5: URL-Secret konfigurieren
// Im Backend unter Maintenance > Secret:
maintenance_secret = mein-geheimer-code
// Zugriff via URL:
https://example.com/?maintenance_secret=mein-geheimer-code
// User erhält Session und kann navigieren
Beispiel 6: Passwort-Authentifizierung
// Im Backend unter Maintenance > Passwort:
wartung2024
// Frontend zeigt Passwort-Formular
// Nach korrekter Eingabe wird Session erstellt
Beispiel 7: Custom Wartungsseite (Fragment)
// Fragment: maintenance/frontend.php
<!DOCTYPE html>
<html>
<head>
<title>Wartungsarbeiten</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
padding: 100px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
h1 { font-size: 48px; }
</style>
</head>
<body>
<h1>🔧 Wartungsarbeiten</h1>
<p>Wir führen gerade Wartungsarbeiten durch.</p>
<p>Bitte versuchen Sie es in 30 Minuten erneut.</p>
</body>
</html>
Beispiel 8: Backend-Wartungsseite
// Fragment: maintenance/backend.php
<!DOCTYPE html>
<html>
<head>
<title>Backend-Wartung</title>
<link rel="stylesheet" href="<?= rex_url::assets('core/bootstrap.min.css') ?>">
</head>
<body>
<div class="container" style="margin-top: 100px;">
<div class="alert alert-warning">
<h2>Backend-Wartung</h2>
<p>Das Backend ist vorübergehend nicht verfügbar.</p>
</div>
</div>
</body>
</html>
Beispiel 9: Console-Aktivierung
# Wartungsmodus aktivieren
php redaxo/bin/console maintenance:mode on
# Wartungsmodus deaktivieren
php redaxo/bin/console maintenance:mode off
# Status abfragen
php redaxo/bin/console maintenance:status
Beispiel 10: Programmatische Aktivierung
use Alexplusde\Maintenance\Maintenance;
// Aktivieren
Maintenance::enable();
// Deaktivieren
Maintenance::disable();
// Status prüfen
if (Maintenance::isEnabled()) {
echo 'Wartungsmodus aktiv';
}
Beispiel 11: IP-Prüfung
use Alexplusde\Maintenance\Maintenance;
$client_ip = $_SERVER['REMOTE_ADDR'];
if (Maintenance::isIpAllowed($client_ip)) {
// IP auf Whitelist - Zugriff erlaubt
} else {
// IP nicht erlaubt - Wartungsseite anzeigen
}
Beispiel 12: Domain-Prüfung
$host = $_SERVER['HTTP_HOST'];
if (Maintenance::isHostAllowed($host)) {
// Domain erlaubt
} else {
// Domain gesperrt
}
Beispiel 13: YRewrite-Domain-Prüfung
$domain = rex_yrewrite::getCurrentDomain();
if (Maintenance::isYrewriteDomainAllowed($domain)) {
// YRewrite-Domain auf Whitelist
} else {
// Domain gesperrt
}
Beispiel 14: Secret-Prüfung
// URL: ?maintenance_secret=xyz
$secret = rex_request::get('maintenance_secret', 'string');
if (Maintenance::isSecretAllowed($secret)) {
// Secret korrekt - Session erstellen
$_SESSION['maintenance_bypass'] = true;
}
Beispiel 15: User-Prüfung (Backend)
// Prüft ob User eingeloggt ist
if (Maintenance::isUserAllowed()) {
// Backend-User - Zugriff erlaubt
} else {
// Kein User - Wartungsseite
}
Beispiel 16: Ankündigung erstellen
Im Backend unter Maintenance > Ankündigung:
- Titel: Geplante Wartung
- Text: Am 31.12.2024 von 22:00 - 02:00 Uhr
- Startdatum: 2024-12-30 00:00
- Enddatum: 2024-12-31 23:59
- Aktiv: Ja
Zeigt Ankündigung im Frontend vor Wartungsbeginn.
Beispiel 17: Ankündigung im Template
use Alexplusde\Maintenance\Announcement;
$announcement = Announcement::getCurrent();
if ($announcement && $announcement->isActive()) {
echo '<div class="alert alert-info">';
echo '<strong>' . $announcement->getTitle() . '</strong><br>';
echo $announcement->getText();
echo '</div>';
}
Beispiel 18: Extension Point nutzen
rex_extension::register('MAINTENANCE_CHECK', function($ep) {
$is_maintenance = $ep->getSubject();
// Custom Logic
if (date('H') >= 22 && date('H') < 6) {
// Nachts automatisch Wartungsmodus
return true;
}
return $is_maintenance;
});
Beispiel 19: Media-Dateien freigeben
// Extension Point: MAINTENANCE_MEDIA_UNBLOCK_LIST
rex_extension::register('MAINTENANCE_MEDIA_UNBLOCK_LIST', function($ep) {
$unblock = $ep->getSubject();
// Bestimmte Medien trotz Wartung erlauben
$unblock[] = 'logo.png';
$unblock[] = 'favicon.ico';
return $unblock;
});
Beispiel 20: 2FA-Integration
// Prüft ob 2factor_auth Addon installiert und User authentifiziert
if (rex_addon::get('2factor_auth')->isAvailable()) {
if (Maintenance::isTwoFactorAuthenticated()) {
// User mit 2FA - Zugriff erlaubt
}
}
Beispiel 21: Frontend + Backend gleichzeitig
// Beide Modi aktivieren
Maintenance::enableFrontend();
Maintenance::enableBackend();
// Oder zusammen:
Maintenance::enable(true, true); // (frontend, backend)
Beispiel 22: Nur für bestimmte Artikel
rex_extension::register('MAINTENANCE_CHECK', function($ep) {
$article = rex_article::getCurrent();
// Nur bestimmte Artikel sperren
if (in_array($article->getId(), [1, 5, 10])) {
return true; // Wartungsmodus für diese Artikel
}
return false;
});
Beispiel 23: Countdown-Timer
// Fragment: maintenance/frontend.php
<?php
$end_time = strtotime('2024-12-31 02:00:00');
$now = time();
$remaining = $end_time - $now;
?>
<!DOCTYPE html>
<html>
<head>
<title>Wartung</title>
<script>
// Countdown in JavaScript
let remaining = <?= $remaining ?>;
setInterval(() => {
remaining--;
const hours = Math.floor(remaining / 3600);
const minutes = Math.floor((remaining % 3600) / 60);
document.getElementById('countdown').innerText =
hours + 'h ' + minutes + 'm';
}, 1000);
</script>
</head>
<body>
<h1>Wartungsarbeiten</h1>
<p>Verfügbar in: <span id="countdown"></span></p>
</body>
</html>
Beispiel 24: Logging
rex_extension::register('MAINTENANCE_ENABLED', function($ep) {
rex_logger::logNotice('maintenance', 'Wartungsmodus aktiviert von: ' . rex::getUser()->getLogin());
});
rex_extension::register('MAINTENANCE_DISABLED', function($ep) {
rex_logger::logNotice('maintenance', 'Wartungsmodus deaktiviert von: ' . rex::getUser()->getLogin());
});
Beispiel 25: Cronjob-Integration
// Automatischer Wartungsmodus via Cronjob
class MaintenanceCronjob extends rex_cronjob
{
public function execute()
{
$start = strtotime('2024-12-31 22:00:00');
$end = strtotime('2024-12-31 02:00:00');
$now = time();
if ($now >= $start && $now < $end) {
Maintenance::enable();
$this->setMessage('Wartungsmodus aktiviert');
} else {
Maintenance::disable();
$this->setMessage('Wartungsmodus deaktiviert');
}
return true;
}
public function getTypeName()
{
return 'Automatischer Wartungsmodus';
}
}
// Registrieren
rex_cronjob_manager::registerType('MaintenanceCronjob');
Integration: YRewrite (Domain-basierte Whitelist), Fragments (maintenance/frontend.php, maintenance/backend.php), Console (maintenance:mode Commands), Extension Points (MAINTENANCE_CHECK, MAINTENANCE_ENABLED, MAINTENANCE_DISABLED, MAINTENANCE_MEDIA_UNBLOCK_LIST), Session-Management (Bypass-Session), 2factor_auth (2FA-Integration), rex_logger (Logging), Cronjob (Automatische Aktivierung/Deaktivierung), IP/Domain-Filtering