{"id":2605,"date":"2026-03-25T16:17:23","date_gmt":"2026-03-25T16:17:23","guid":{"rendered":"https:\/\/www.mayit.eu\/?page_id=2605"},"modified":"2026-03-28T22:59:51","modified_gmt":"2026-03-28T22:59:51","slug":"debian12backup","status":"publish","type":"page","link":"https:\/\/www.mayit.eu\/en\/debian12backup\/","title":{"rendered":"Debian12BackUp"},"content":{"rendered":"\n<!doctype html>\n<html lang=\"de\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n  <title>Enterprise Runbook \u2013 YunoHost Backup &#038; Restore Strategy (MayIT)<\/title>\n  <meta name=\"author\" content=\"MayIT\" \/>\n  <meta name=\"description\" content=\"Professionelles Runbook f\u00fcr den vollst\u00e4ndigen Backup-, Restore-, Automatisierungs- und Offsite-Prozess eines YunoHost-Servers mit Nextcloud, WordPress, SOGo, MariaDB, nginx und Netdata.\" \/>\n  <style>\n    :root{\n      --bg:#0b0f14; --panel:#111827; --panel2:#0f172a;\n      --text:#e5e7eb; --muted:#9ca3af;\n      --accent:#60a5fa; --accent2:#34d399; --warn:#f59e0b; --danger:#fb7185; --ok:#22c55e;\n      --border:#1f2937; --codeborder:#1d2a3a;\n      --shadow: 0 10px 30px rgba(0,0,0,.35);\n      --radius: 16px;\n      --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n      --sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Arial, \"Apple Color Emoji\",\"Segoe UI Emoji\";\n    }\n    *{box-sizing:border-box}\n    html{scroll-behavior:smooth}\n    body{\n      margin:0; font-family:var(--sans);\n      background:\n        radial-gradient(1200px 600px at 10% -10%, rgba(96,165,250,.18), transparent 55%),\n        radial-gradient(900px 500px at 80% 0%, rgba(52,211,153,.10), transparent 50%),\n        var(--bg);\n      color:var(--text);\n    }\n    a{color:var(--accent); text-decoration:none}\n    a:hover{text-decoration:underline}\n    .layout{display:flex; min-height:100vh}\n    .toc{\n      position:sticky; top:0; height:100vh; width:360px; min-width:300px;\n      padding:22px 18px;\n      background:linear-gradient(180deg, rgba(17,24,39,.92), rgba(15,23,42,.92));\n      border-right:1px solid var(--border); overflow:auto; backdrop-filter: blur(8px);\n    }\n    .brand{\n      display:flex; gap:10px; align-items:center;\n      padding:10px 10px 14px; border:1px solid var(--border);\n      border-radius:14px; background:rgba(11,18,32,.65); box-shadow:var(--shadow);\n      margin-bottom:14px;\n    }\n    .logo{\n      width:38px; height:38px; border-radius:12px;\n      background:linear-gradient(135deg, rgba(96,165,250,.95), rgba(52,211,153,.95));\n      display:flex; align-items:center; justify-content:center;\n      color:#06101c; font-weight:900;\n    }\n    .brand h1{font-size:14px; margin:0}\n    .brand .sub{font-size:12px; color:var(--muted); margin-top:2px}\n    .pill{\n      display:inline-flex; align-items:center; gap:8px;\n      font-size:12px; color:var(--muted);\n      padding:10px 12px; border:1px solid var(--border);\n      border-radius:999px; background:rgba(11,18,32,.55);\n      margin:10px 8px 0;\n    }\n    .pill b{color:var(--text)}\n    .toc h2{font-size:12px; margin:14px 10px 8px; color:var(--muted); letter-spacing:.08em; text-transform:uppercase}\n    .toc ul{list-style:none; margin:0; padding:0 6px 14px}\n    .toc li{margin:6px 0}\n    .toc a{\n      display:block; padding:8px 10px; border-radius:12px;\n      color:var(--text); border:1px solid transparent;\n    }\n    .toc a:hover{border-color:rgba(96,165,250,.35); background:rgba(96,165,250,.10); text-decoration:none}\n    .main{flex:1; padding:28px 26px 80px}\n    .container{max-width:1120px; margin:0 auto}\n    .hero{\n      padding:22px; border-radius: var(--radius);\n      background: linear-gradient(180deg, rgba(17,24,39,.55), rgba(15,23,42,.35));\n      border:1px solid var(--border); box-shadow: var(--shadow);\n    }\n    .hero h1{font-size:28px; margin:0 0 8px}\n    .hero .meta{display:flex; flex-wrap:wrap; gap:10px; margin-top:12px}\n    .tag{\n      font-size:12px; color:var(--text);\n      padding:8px 12px; border-radius:999px;\n      border:1px solid var(--border); background:rgba(11,18,32,.55);\n    }\n    section{margin-top:18px}\n    .card{\n      padding:18px; border-radius: var(--radius);\n      border:1px solid var(--border);\n      background: rgba(11,18,32,.55);\n      box-shadow: var(--shadow);\n    }\n    .card h3{margin:0 0 10px; font-size:18px}\n    .muted{color:var(--muted)}\n    .small{font-size:12px}\n    .note, .warn, .danger, .ok{\n      border-radius:14px; padding:12px 14px; border:1px solid var(--border);\n      background: rgba(96,165,250,.08);\n    }\n    .warn{background: rgba(245,158,11,.10); border-color: rgba(245,158,11,.25)}\n    .danger{background: rgba(251,113,133,.10); border-color: rgba(251,113,133,.25)}\n    .ok{background: rgba(34,197,94,.10); border-color: rgba(34,197,94,.25)}\n    .hr{height:1px; background:var(--border); margin:14px 0}\n    .grid{display:grid; gap:14px}\n    @media (min-width: 980px){\n      .grid.cols2{grid-template-columns: 1fr 1fr}\n      .grid.cols3{grid-template-columns: 1fr 1fr 1fr}\n    }\n    table{width:100%; border-collapse:separate; border-spacing:0; overflow:hidden; border-radius:14px; border:1px solid var(--border)}\n    th, td{padding:10px; border-bottom:1px solid var(--border); vertical-align:top}\n    th{background:rgba(17,24,39,.55); text-align:left; font-size:12px; text-transform:uppercase; letter-spacing:.08em; color:var(--muted)}\n    tr:last-child td{border-bottom:none}\n    .codewrap{position:relative; margin-top:10px}\n    pre{\n      margin:0; padding:14px; overflow:auto; border-radius:14px;\n      background:linear-gradient(180deg, rgba(10,15,26,.95), rgba(10,15,26,.85));\n      border:1px solid var(--codeborder); color:var(--text);\n      font-family: var(--mono); font-size:12.8px; line-height:1.45;\n      white-space:pre-wrap; word-break:break-word;\n    }\n    .copybtn{\n      position:absolute; top:10px; right:10px;\n      border:1px solid var(--border); background:rgba(15,23,42,.70);\n      color:var(--text); padding:8px 10px; border-radius:12px;\n      cursor:pointer; font-size:12px; display:flex; align-items:center; gap:8px;\n    }\n    .copybtn:hover{border-color:rgba(96,165,250,.40); background:rgba(96,165,250,.12)}\n    .copybtn .dot{width:8px; height:8px; border-radius:99px; background:var(--accent)}\n    .step{display:flex; gap:10px; align-items:flex-start}\n    .num{\n      flex:0 0 auto; width:28px; height:28px; border-radius:10px;\n      display:flex; align-items:center; justify-content:center;\n      background:rgba(96,165,250,.12); border:1px solid rgba(96,165,250,.28);\n      color:var(--text); font-weight:700;\n    }\n    .kbd{display:inline-block; padding:2px 8px; border-radius:10px; border:1px solid var(--border); background:rgba(15,23,42,.55); font-family:var(--mono); font-size:12px}\n    .badge{display:inline-flex; align-items:center; gap:8px; padding:8px 10px; border-radius:999px; border:1px solid var(--border); background:rgba(15,23,42,.35); font-size:12px}\n    .badge .b{width:8px;height:8px;border-radius:99px;background:var(--accent2)}\n    .footer{\n      margin-top:18px; padding:16px 18px; border-radius: var(--radius);\n      border:1px solid var(--border); background:rgba(11,18,32,.45); color:var(--muted)\n    }\n    .footer b{color:var(--text)}\n    details{\n      border:1px solid var(--border); border-radius:14px; padding:10px 12px; background:rgba(15,23,42,.25)\n    }\n    summary{cursor:pointer; color:var(--text); font-weight:700}\n    details p, details ul{color:var(--muted)}\n    .print-only{display:none}\n    ul.compact{margin:8px 0 0 18px}\n    ul.compact li{margin:6px 0}\n    @media print{\n      body{background:#fff; color:#000}\n      .layout{display:block}\n      .toc{display:none}\n      .hero, .card, .footer, details{box-shadow:none; background:#fff; border:1px solid #ddd}\n      pre{background:#f7f7f7; color:#000; border:1px solid #ddd}\n      .copybtn{display:none}\n      a{color:#000; text-decoration:underline}\n      .print-only{display:block}\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"layout\">\n    <aside class=\"toc\">\n      <div class=\"brand\">\n        <div class=\"logo\">M<\/div>\n        <div>\n          <h1>Enterprise Runbook<\/h1>\n          <div class=\"sub\">Backup \u2022 Restore \u2022 Automation \u2022 DR \u2022 Autor: <b>MayIT<\/b><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"pill\"><b>Ziel:<\/b> Vollst\u00e4ndige Sicherung und Wiederherstellbarkeit des YunoHost-Servers<\/div>\n\n      <h2>Navigation<\/h2>\n      <ul>\n        <li><a href=\"#scope\">Scope &#038; Zielbild<\/a><\/li>\n        <li><a href=\"#architecture\">Backup-Architektur<\/a><\/li>\n        <li><a href=\"#phase0\">Phase 0: Voraussetzungen<\/a><\/li>\n        <li><a href=\"#phase1\">Phase 1: Manuelles YunoHost-Backup<\/a><\/li>\n        <li><a href=\"#phase2\">Phase 2: Integrit\u00e4tspr\u00fcfung<\/a><\/li>\n        <li><a href=\"#phase3\">Phase 3: Zus\u00e4tzliches System-Backup<\/a><\/li>\n        <li><a href=\"#phase4\">Phase 4: Download \/ Offsite<\/a><\/li>\n        <li><a href=\"#phase5\">Phase 5: Automatisiertes Backup<\/a><\/li>\n        <li><a href=\"#phase6\">Phase 6: Monitoring &#038; Alarmierung<\/a><\/li>\n        <li><a href=\"#phase7\">Phase 7: Restore-Test<\/a><\/li>\n        <li><a href=\"#phase8\">Phase 8: Migration \/ Serverwechsel<\/a><\/li>\n        <li><a href=\"#dr\">Disaster Recovery<\/a><\/li>\n        <li><a href=\"#checklists\">Checklisten<\/a><\/li>\n        <li><a href=\"#appendix\">Anhang<\/a><\/li>\n      <\/ul>\n\n      <h2>Quick Links<\/h2>\n      <ul>\n        <li><a href=\"#automation-script\">Backup-Skript<\/a><\/li>\n        <li><a href=\"#cronjob\">Cronjob<\/a><\/li>\n        <li><a href=\"#restoretest\">Restore-Simulation<\/a><\/li>\n        <li><a href=\"#alerts\">Alarmregeln<\/a><\/li>\n      <\/ul>\n\n      <div class=\"footer small\">\n        <div><b>Stand:<\/b> 2026-03-16<\/div>\n        <div class=\"hr\"><\/div>\n        <div>Layout: MayITEnterprise<\/div>\n      <\/div>\n    <\/aside>\n\n    <main class=\"main\">\n      <div class=\"container\">\n        <div class=\"hero\">\n          <h1>YunoHost \u2013 Complete Backup Strategy &#038; Restore Runbook<\/h1>\n          <div class=\"muted\">\n            Dieses Runbook beschreibt den vollst\u00e4ndigen Backup-Prozess f\u00fcr einen produktiven\n            <b>YunoHost-Server<\/b> mit <b>Nextcloud, WordPress, SOGo, MariaDB, nginx und Netdata<\/b>.\n            Es umfasst manuelle Sicherungen, automatisierte t\u00e4gliche Backups, Offsite-Kopien,\n            Integrit\u00e4tspr\u00fcfungen, Restore-Tests und die migrationssichere Wiederherstellung.\n          <\/div>\n          <div class=\"meta\">\n            <span class=\"tag\">Autor: MayIT<\/span>\n            <span class=\"tag\">MayITEnterprise<\/span>\n            <span class=\"tag\">Backup + Restore + DR<\/span>\n            <span class=\"tag\">Netcup \/ VPS geeignet<\/span>\n          <\/div>\n        <\/div>\n\n        <section id=\"scope\" class=\"card\">\n          <h3>Scope &#038; Zielbild<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\">\n                <b>Zielbild:<\/b> Konsistente, nachvollziehbare und regelm\u00e4\u00dfig getestete Sicherung des gesamten Systems.\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <ul class=\"compact\">\n                <li><b>Apps:<\/b> Nextcloud, WordPress, SOGo, Netdata und weitere YunoHost-Apps<\/li>\n                <li><b>System:<\/b> YunoHost-Konfiguration, Domains, SSL, nginx, Benutzer, Firewall<\/li>\n                <li><b>Daten:<\/b> MariaDB-Dumps, App-Daten, Webdaten, Konfigurationsdateien<\/li>\n                <li><b>Betrieb:<\/b> t\u00e4gliche Automatisierung, Offsite-Kopie, Monitoring, Restore-Test<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"warn\">\n                <b>Grundsatz:<\/b> Ein erfolgreich erzeugtes Archiv ist noch kein belastbarer Backup-Nachweis.\n                Erst Integrit\u00e4tspr\u00fcfung, Download und Restore-Test machen das Backup betriebssicher.\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"ok\">\n                <b>Empfohlenes Ziel:<\/b> 3-2-1-Strategie mit lokalem Backup, externem Offsite-Speicher und dokumentiertem Restore.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"architecture\" class=\"card\">\n          <h3>Backup-Architektur<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <table>\n                <thead><tr><th>Backup-Typ<\/th><th>Inhalt<\/th><th>Rhythmus<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>YunoHost Backup<\/td><td>System + Apps + DB + App-Daten<\/td><td>t\u00e4glich<\/td><\/tr>\n                  <tr><td>System-Archiv<\/td><td><span class=\"kbd\">\/etc<\/span>, <span class=\"kbd\">\/home<\/span>, <span class=\"kbd\">\/var\/www<\/span><\/td><td>t\u00e4glich oder vor Changes<\/td><\/tr>\n                  <tr><td>Offsite-Kopie<\/td><td>Transfer auf Storage Box \/ NAS \/ zweiten Server<\/td><td>t\u00e4glich<\/td><\/tr>\n                  <tr><td>Restore-Test<\/td><td>Wiederherstellung auf Testsystem<\/td><td>monatlich<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"badge\"><span class=\"b\"><\/span><b>Empfohlene Reihenfolge:<\/b> YunoHost Backup \u2192 Pr\u00fcfung \u2192 System-Archiv \u2192 Offsite \u2192 Test<\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"note\">\n                <b>Besonders relevant f\u00fcr deine Umgebung:<\/b><br>\n                Nextcloud-Datenbestand, MariaDB-Inhalte, WordPress-Webroot, SOGo-Mail-\/Groupware-Daten,\n                nginx-Konfiguration, TLS-Zertifikate und Netdata-Konfiguration.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase0\" class=\"card\">\n          <h3>Phase 0: Voraussetzungen<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Vor jedem Backup sicherstellen:<\/b><\/div>\n              <ul class=\"compact\">\n                <li>ausreichend freier Speicherplatz vorhanden<\/li>\n                <li>keine kritischen laufenden \u00c4nderungen oder Wartungsarbeiten<\/li>\n                <li>SSH-Zugang funktionsf\u00e4hig<\/li>\n                <li>YunoHost und Apps nicht in fehlerhaftem Zustand<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#pre1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"pre1\">df -h\nsudo yunohost app list\nsudo yunohost service status\nsudo yunohost diagnosis run --issues<\/pre>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase1\" class=\"card\">\n          <h3>Phase 1: Manuelles YunoHost-Backup<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\">\n                <b>Prim\u00e4rsicherung:<\/b> Das integrierte YunoHost-Backup ist die zentrale migrationsf\u00e4hige Sicherung.\n              <\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p1\">sudo yunohost backup create --system --apps --name migration-backup-$(date +%F)<\/pre>\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"muted small\">\n                Standardpfad der erzeugten Archive:\n              <\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p1a\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p1a\">\/home\/yunohost.backup\/archives\/<\/pre>\n              <\/div>\n            <\/div>\n            <div>\n              <div class=\"warn\">\n                <b>Enthaltene Bestandteile:<\/b>\n              <\/div>\n              <ul class=\"compact\">\n                <li>YunoHost-Systemkonfiguration<\/li>\n                <li>Domains und TLS-Zertifikate<\/li>\n                <li>nginx-Konfigurationen<\/li>\n                <li>MariaDB-Datenbanken<\/li>\n                <li>Nextcloud, WordPress, SOGo, Netdata und weitere Apps<\/li>\n                <li>zugeh\u00f6rige App-Daten und Restore-Metadaten<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase2\" class=\"card\">\n          <h3>Phase 2: Integrit\u00e4tspr\u00fcfung des YunoHost-Backups<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p2\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p2\">sudo yunohost backup list\nsudo yunohost backup info migration-backup-$(date +%F)<\/pre>\n              <\/div>\n              <div class=\"codewrap\" style=\"margin-top:10px\">\n                <button class=\"copybtn\" data-copy=\"#p2b\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p2b\">tar -tf \/home\/yunohost.backup\/archives\/migration-backup-$(date +%F).tar | head<\/pre>\n              <\/div>\n            <\/div>\n            <div>\n              <table>\n                <thead><tr><th>Pr\u00fcfung<\/th><th>Erwartung<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>Backup vorhanden<\/td><td>Name in <span class=\"kbd\">backup list<\/span> sichtbar<\/td><\/tr>\n                  <tr><td>Status<\/td><td>keine Fehlermeldung \/ vollst\u00e4ndiger Lauf<\/td><\/tr>\n                  <tr><td>Archiv lesbar<\/td><td><span class=\"kbd\">tar -tf<\/span> liefert Eintr\u00e4ge<\/td><\/tr>\n                  <tr><td>Gr\u00f6\u00dfe plausibel<\/td><td>abh\u00e4ngig von Nextcloud- und Webdatenbestand<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n              <div class=\"hr\"><\/div>\n              <div class=\"ok\">\n                <b>Hinweis:<\/b> Bei bestehenden Backupnamen immer einen datumsbasierten Namen verwenden, um Konflikte zu vermeiden.\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n\n          <div class=\"grid cols2\">\n            <div>\n              <h3 style=\"font-size:16px;margin-bottom:8px\">Nextcloud gezielt im Archiv pr\u00fcfen<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p2c\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p2c\">tar -tf \/home\/yunohost.backup\/archives\/migration-backup-$(date +%F).tar | grep \"apps\/nextcloud\" | head<\/pre>\n              <\/div>\n            <\/div>\n            <div>\n              <h3 style=\"font-size:16px;margin-bottom:8px\">Allgemeine Archivgr\u00f6\u00dfe pr\u00fcfen<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p2d\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p2d\">du -h \/home\/yunohost.backup\/archives\/*.tar<\/pre>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase3\" class=\"card\">\n          <h3>Phase 3: Zus\u00e4tzliches System-Backup<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\">\n                <b>Zweitsicherung:<\/b> Zus\u00e4tzlich zum YunoHost-Archiv wird ein vollst\u00e4ndiges Datei-Archiv wichtiger Serverpfade erstellt.\n              <\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p3\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p3\">sudo tar -czf \/home\/mayadm\/server-full-backup-$(date +%F).tar.gz \\\n\/etc \\\n\/home \\\n\/var\/www<\/pre>\n              <\/div>\n              <div class=\"muted small\" style=\"margin-top:10px\">\n                Diese Ablage im Home-Verzeichnis vereinfacht den sp\u00e4teren Download per SCP.\n              <\/div>\n            <\/div>\n            <div>\n              <table>\n                <thead><tr><th>Pfad<\/th><th>Zweck<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td><span class=\"kbd\">\/etc<\/span><\/td><td>System- und Dienstkonfigurationen<\/td><\/tr>\n                  <tr><td><span class=\"kbd\">\/home<\/span><\/td><td>Benutzerdaten, App-Daten, zus\u00e4tzliche Dateien<\/td><\/tr>\n                  <tr><td><span class=\"kbd\">\/var\/www<\/span><\/td><td>Webroots von Nextcloud, WordPress und weiteren Apps<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n              <div class=\"hr\"><\/div>\n              <div class=\"warn\">\n                <b>Hinweis:<\/b> Die Meldung <span class=\"kbd\">Removing leading &#8218;\/&#8216;<\/span> von <span class=\"kbd\">tar<\/span> ist normal und kein Fehler.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase4\" class=\"card\">\n          <h3>Phase 4: Download \/ Offsite-Kopie<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <h3 style=\"font-size:16px;margin-bottom:8px\">Download des YunoHost-Backups<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p4\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p4\">scp mayadm@SERVER-IP:\/home\/yunohost.backup\/archives\/migration-backup-YYYY-MM-DD.tar .<\/pre>\n              <\/div>\n\n              <h3 style=\"font-size:16px;margin:14px 0 8px\">Download des System-Archivs<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p4b\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p4b\">scp mayadm@SERVER-IP:\/home\/mayadm\/server-full-backup-YYYY-MM-DD.tar.gz .<\/pre>\n              <\/div>\n            <\/div>\n            <div>\n              <h3 style=\"font-size:16px;margin-bottom:8px\">Offsite-Kopie per rsync<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p4c\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p4c\">rsync -avz \/home\/yunohost.backup\/archives\/ user@backupserver:\/backup\/yunohost\/\nrsync -avz \/home\/mayadm\/server-full-backup-*.tar.gz user@backupserver:\/backup\/system\/<\/pre>\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"note\">\n                <b>M\u00f6gliche Ziele:<\/b><br>\n                Netcup Storage Box, zweiter Linux-Server, NAS \u00fcber VPN, Objektstorage \u00fcber zus\u00e4tzlichen Sync-Mechanismus.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase5\" class=\"card\">\n          <h3>Phase 5: Automatisiertes Backup<\/h3>\n          <div class=\"grid cols2\">\n            <div id=\"automation-script\">\n              <div class=\"note\"><b>Empfohlen:<\/b> t\u00e4gliche vollautomatische Sicherung mit Logging und Offsite-Kopie.<\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p5\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p5\">sudo nano \/usr\/local\/bin\/yunohost-backup.sh<\/pre>\n              <\/div>\n              <div class=\"codewrap\" style=\"margin-top:10px\">\n                <button class=\"copybtn\" data-copy=\"#p5script\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p5script\">#!\/bin\/bash\nset -euo pipefail\n\nDATE=$(date +%F)\nLOGFILE=\"\/var\/log\/yunohost-backup.log\"\nYH_BACKUP=\"migration-backup-$DATE\"\nSYS_BACKUP=\"\/home\/mayadm\/server-full-backup-$DATE.tar.gz\"\n\necho \"[$(date '+%F %T')] START backup\" >> \"$LOGFILE\"\n\nyunohost backup create --system --apps --name \"$YH_BACKUP\" >> \"$LOGFILE\" 2>&1\n\ntar -czf \"$SYS_BACKUP\" \/etc \/home \/var\/www >> \"$LOGFILE\" 2>&1\n\n# Optional: Offsite Sync\n# rsync -avz \/home\/yunohost.backup\/archives\/ user@backupserver:\/backup\/yunohost\/ >> \"$LOGFILE\" 2>&1\n# rsync -avz \"$SYS_BACKUP\" user@backupserver:\/backup\/system\/ >> \"$LOGFILE\" 2>&1\n\necho \"[$(date '+%F %T')] END backup\" >> \"$LOGFILE\"<\/pre>\n              <\/div>\n            <\/div>\n            <div>\n              <h3 style=\"font-size:16px;margin-bottom:8px\">Skript berechtigen<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p5b\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p5b\">sudo chmod +x \/usr\/local\/bin\/yunohost-backup.sh<\/pre>\n              <\/div>\n\n              <div class=\"hr\"><\/div>\n\n              <h3 id=\"cronjob\" style=\"font-size:16px;margin-bottom:8px\">Cronjob einrichten<\/h3>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p5c\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p5c\">sudo crontab -e<\/pre>\n              <\/div>\n              <div class=\"codewrap\" style=\"margin-top:10px\">\n                <button class=\"copybtn\" data-copy=\"#p5cron\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p5cron\">0 2 * * * \/usr\/local\/bin\/yunohost-backup.sh<\/pre>\n              <\/div>\n\n              <div class=\"hr\"><\/div>\n\n              <div class=\"warn\">\n                <b>Ausf\u00fchrung:<\/b> T\u00e4glich um 02:00 Uhr. Zeitpunkt an Wartungsfenster, IO-Last und Nutzeraktivit\u00e4t anpassen.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase6\" class=\"card\">\n          <h3>Phase 6: Monitoring &#038; Alarmierung<\/h3>\n          <div class=\"grid cols2\">\n            <div id=\"alerts\">\n              <table>\n                <thead><tr><th>Alert<\/th><th>Trigger<\/th><th>Priorit\u00e4t<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>Backup fehlgeschlagen<\/td><td>kein neuer Logabschluss \/ Fehler im Skript<\/td><td>P1<\/td><\/tr>\n                  <tr><td>Backup \u00e4lter als 48h<\/td><td>kein aktuelles Archiv vorhanden<\/td><td>P1<\/td><\/tr>\n                  <tr><td>Archivgr\u00f6\u00dfe unplausibel<\/td><td>starker Gr\u00f6\u00dfenabfall gegen\u00fcber Vortag<\/td><td>P2<\/td><\/tr>\n                  <tr><td>Offsite-Sync fehlgeschlagen<\/td><td>rsync Exit-Code \u2260 0<\/td><td>P1<\/td><\/tr>\n                  <tr><td>Disk fast voll<\/td><td>Speicherplatz > 85%<\/td><td>P1<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p6\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p6\">sudo tail -n 100 \/var\/log\/yunohost-backup.log\nsudo yunohost backup list\ndu -h \/home\/yunohost.backup\/archives\/\ndf -h<\/pre>\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"note\">\n                <b>Empfehlung:<\/b> Netdata oder externes Monitoring auf Backupalter, Logfehler und Archivgr\u00f6\u00dfe ausrichten.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase7\" class=\"card\">\n          <h3>Phase 7: Restore-Test<\/h3>\n          <div id=\"restoretest\" class=\"card\" style=\"background:rgba(15,23,42,.25); margin-top:0\">\n            <h3 style=\"font-size:16px;margin-bottom:8px\">Restore-Simulation auf Testsystem<\/h3>\n            <table>\n              <thead><tr><th>Schritt<\/th><th>Aktion<\/th><th>Ziel<\/th><\/tr><\/thead>\n              <tbody>\n                <tr><td>1<\/td><td>neuen Debian-12-Testserver bereitstellen<\/td><td>saubere Zielplattform<\/td><\/tr>\n                <tr><td>2<\/td><td>YunoHost installieren<\/td><td>kompatible Basis<\/td><\/tr>\n                <tr><td>3<\/td><td>Backup \u00fcbertragen<\/td><td>Archiv lokal verf\u00fcgbar<\/td><\/tr>\n                <tr><td>4<\/td><td>Restore ausf\u00fchren<\/td><td>vollst\u00e4ndige Wiederherstellung<\/td><\/tr>\n                <tr><td>5<\/td><td>Funktionstests durchf\u00fchren<\/td><td>Login, Upload, WebDAV, Mails, Webseiten<\/td><\/tr>\n              <\/tbody>\n            <\/table>\n\n            <div class=\"codewrap\" style=\"margin-top:10px\">\n              <button class=\"copybtn\" data-copy=\"#p7\"><span class=\"dot\"><\/span>Copy<\/button>\n              <pre id=\"p7\">scp migration-backup-YYYY-MM-DD.tar mayadm@TESTSERVER:\/home\/yunohost.backup\/archives\/\nsudo yunohost backup restore migration-backup-YYYY-MM-DD --system --apps<\/pre>\n            <\/div>\n\n            <div class=\"codewrap\" style=\"margin-top:10px\">\n              <button class=\"copybtn\" data-copy=\"#p7b\"><span class=\"dot\"><\/span>Copy<\/button>\n              <pre id=\"p7b\">sudo yunohost service status\nsudo yunohost app list\nsudo yunohost app shell nextcloud\nphp occ status<\/pre>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"phase8\" class=\"card\">\n          <h3>Phase 8: Migration \/ Serverwechsel<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Standardablauf f\u00fcr einen VPS-Wechsel:<\/b><\/div>\n              <ul class=\"compact\">\n                <li>aktuelles YunoHost-Backup erstellen<\/li>\n                <li>zus\u00e4tzliches System-Archiv erzeugen<\/li>\n                <li>beide Archive lokal und Offsite sichern<\/li>\n                <li>neuen Debian-12-Server bereitstellen<\/li>\n                <li>YunoHost installieren<\/li>\n                <li>YunoHost-Backup restoren<\/li>\n                <li>Dienste und DNS validieren<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#p8\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"p8\">sudo yunohost backup restore migration-backup-YYYY-MM-DD --system --apps<\/pre>\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"warn\">\n                <b>Vor Cutover pr\u00fcfen:<\/b> Domains, TLS, nginx, Nextcloud-Login, WordPress-Frontend,\n                SOGo-Erreichbarkeit, Netdata-Funktion und Mailfluss.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"dr\" class=\"card\">\n          <h3>Disaster Recovery (DR)<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <table>\n                <thead><tr><th>Szenario<\/th><th>Recovery-Ansatz<\/th><th>Bemerkung<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>VPS-Ausfall<\/td><td>Restore auf neuem Server<\/td><td>Offsite-Kopie entscheidend<\/td><\/tr>\n                  <tr><td>Datenkorruption<\/td><td>Rollback auf sauberes Backup<\/td><td>Version des Archivs w\u00e4hlen<\/td><\/tr>\n                  <tr><td>Fehlkonfiguration<\/td><td>System-Archiv pr\u00fcfen \/ selektiv wiederherstellen<\/td><td>besonders bei nginx, \/etc<\/td><\/tr>\n                  <tr><td>Provider-Ausfall<\/td><td>Offsite-Restore bei anderem Hoster<\/td><td>3-2-1-Strategie erforderlich<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"danger\">\n                <b>DR-Grundsatz:<\/b> Ohne getestete Restore-Kette ist selbst ein vorhandenes Backup kein belastbares Recovery-Konzept.\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#dr1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"dr1\">date\nuptime\nfree -h\ndf -h\nsudo yunohost backup list\nsudo yunohost service status<\/pre>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"checklists\" class=\"card\">\n          <h3>Checklisten<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"ok\"><b>T\u00e4glich \/ vor Changes<\/b><\/div>\n              <ul class=\"compact muted\">\n                <li>freier Speicherplatz ausreichend<\/li>\n                <li>letztes Backup erfolgreich<\/li>\n                <li>Archivgr\u00f6\u00dfe plausibel<\/li>\n                <li>Offsite-Kopie vorhanden<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"ok\"><b>Monatlich<\/b><\/div>\n              <ul class=\"compact muted\">\n                <li>Restore-Test auf Testsystem<\/li>\n                <li>Backupskript und Cronjob validieren<\/li>\n                <li>Offsite-Ziel pr\u00fcfen<\/li>\n                <li>RTO\/RPO mit realem Test abgleichen<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"appendix\" class=\"card\">\n          <h3>Anhang: Logpfade &#038; Quick Commands<\/h3>\n          <table>\n            <thead><tr><th>Komponente<\/th><th>Pfade \/ Commands<\/th><\/tr><\/thead>\n            <tbody>\n              <tr><td>YunoHost Backups<\/td><td><span class=\"kbd\">\/home\/yunohost.backup\/archives\/<\/span> \u2022 <span class=\"kbd\">sudo yunohost backup list<\/span><\/td><\/tr>\n              <tr><td>System-Archiv<\/td><td><span class=\"kbd\">\/home\/mayadm\/server-full-backup-*.tar.gz<\/span><\/td><\/tr>\n              <tr><td>Backup-Log<\/td><td><span class=\"kbd\">\/var\/log\/yunohost-backup.log<\/span><\/td><\/tr>\n              <tr><td>Nextcloud Check<\/td><td><span class=\"kbd\">sudo yunohost app shell nextcloud<\/span> \u2022 <span class=\"kbd\">php occ status<\/span><\/td><\/tr>\n              <tr><td>Services<\/td><td><span class=\"kbd\">sudo yunohost service status<\/span><\/td><\/tr>\n              <tr><td>Speicherplatz<\/td><td><span class=\"kbd\">df -h<\/span> \u2022 <span class=\"kbd\">du -h \/home\/yunohost.backup\/archives\/<\/span><\/td><\/tr>\n            <\/tbody>\n          <\/table>\n\n          <div class=\"footer\">\n            <b>Autor:<\/b> MayIT \u2022 <b>Layout:<\/b> MayITEnterprise \u2022 <b>Inhalt:<\/b> Backup, Restore, Automatisierung, Offsite, DR\n          <\/div>\n        <\/section>\n\n        <div class=\"print-only\">Autor: MayIT \u2013 YunoHost Backup &#038; Restore Runbook<\/div>\n      <\/div>\n    <\/main>\n  <\/div>\n\n  <script>\n    function copyText(text){\n      if(navigator.clipboard && window.isSecureContext){\n        return navigator.clipboard.writeText(text);\n      }\n      return new Promise((resolve, reject)=>{\n        try{\n          const ta = document.createElement('textarea');\n          ta.value = text;\n          ta.style.position = 'fixed';\n          ta.style.left = '-9999px';\n          ta.style.top = '0';\n          document.body.appendChild(ta);\n          ta.focus();\n          ta.select();\n          const ok = document.execCommand('copy');\n          document.body.removeChild(ta);\n          ok ? resolve() : reject();\n        } catch(e){ reject(e); }\n      });\n    }\n    document.querySelectorAll('.copybtn').forEach(btn=>{\n      btn.addEventListener('click', async ()=>{\n        const sel = btn.getAttribute('data-copy');\n        const pre = document.querySelector(sel);\n        if(!pre) return;\n        const text = pre.innerText.replace(\/\\u00a0\/g,' ');\n        const old = btn.innerHTML;\n        try{\n          await copyText(text);\n          btn.innerHTML = '<span class=\"dot\" style=\"background: var(--accent2)\"><\/span>Copied';\n          setTimeout(()=>btn.innerHTML = old, 1100);\n        } catch(e){\n          btn.innerHTML = '<span class=\"dot\" style=\"background: var(--warn)\"><\/span>Copy failed';\n          setTimeout(()=>btn.innerHTML = old, 1400);\n        }\n      });\n    });\n  <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Enterprise Runbook \u2013 YunoHost Backup &#038; Restore Strategy (MayIT) M Enterprise Runbook Backup \u2022 Restore \u2022 Automation \u2022 DR \u2022 Autor: MayIT Ziel: Vollst\u00e4ndige Sicherung und Wiederherstellbarkeit des YunoHost-Servers Navigation Scope &#038; Zielbild Backup-Architektur Phase 0: Voraussetzungen Phase 1: Manuelles YunoHost-Backup Phase 2: Integrit\u00e4tspr\u00fcfung Phase 3: Zus\u00e4tzliches System-Backup Phase 4: Download \/ Offsite Phase 5: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_uag_custom_page_level_css":"","site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"normal-width-container","site-content-style":"unboxed","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2605","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false},"uagb_author_info":{"display_name":"MIT","author_link":"https:\/\/www.mayit.eu\/en\/author\/markus_\/"},"uagb_comment_info":0,"uagb_excerpt":"Enterprise Runbook \u2013 YunoHost Backup &#038; Restore Strategy (MayIT) M Enterprise Runbook Backup \u2022 Restore \u2022 Automation \u2022 DR \u2022 Autor: MayIT Ziel: Vollst\u00e4ndige Sicherung und Wiederherstellbarkeit des YunoHost-Servers Navigation Scope &#038; Zielbild Backup-Architektur Phase 0: Voraussetzungen Phase 1: Manuelles YunoHost-Backup Phase 2: Integrit\u00e4tspr\u00fcfung Phase 3: Zus\u00e4tzliches System-Backup Phase 4: Download \/ Offsite Phase 5:&hellip;","_links":{"self":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/comments?post=2605"}],"version-history":[{"count":1,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2605\/revisions"}],"predecessor-version":[{"id":2606,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2605\/revisions\/2606"}],"wp:attachment":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/media?parent=2605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}