<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Backup on SecretMine.de</title><link>https://secretmine.de/tags/backup/</link><description>Recent content in Backup on SecretMine.de</description><generator>Hugo -- gohugo.io</generator><language>de-DE</language><lastBuildDate>Wed, 24 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://secretmine.de/tags/backup/index.xml" rel="self" type="application/rss+xml"/><item><title>Mein Backupkonzept - 2025 Edition</title><link>https://secretmine.de/blog/2025/2025-12-24-mein-backupkonzept-2025-edition/</link><pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-12-24-mein-backupkonzept-2025-edition/</guid><description>&lt;p&gt;Ein kleines Weihnachtsgeschenk? Naja. Wie dem auch sei.&lt;/p&gt;
&lt;p&gt;Ich habe in den letzten Monaten immer wieder an meinem Backupkonzept gefeilt, bis es in der jetzigen Form stabil und weitestgehend automatisiert läuft. Das Ganze ist ein Mix aus Proxmox-Backups und Datei-Backups mit Restic - mit Fokus auf Verschlüsselung und Praktikabilität.&lt;/p&gt;
&lt;h2 id="proxmox-cluster-zuhause"&gt;Proxmox-Cluster zuhause
&lt;/h2&gt;&lt;p&gt;Mein Haupt-Homelab läuft als Proxmox-Cluster. Alle VMs und LXC-Container werden täglich mit dem &lt;a class="link" href="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/" &gt;Proxmox Backup Server&lt;/a&gt; gesichert. Das Ziel ist eine billige große SSD im Cluster. Für kritische Systeme (Nextcloud, DNS, Reverse Proxy etc.) gibt es zusätzlich ein &lt;a class="link" href="https://secretmine.de/blog/2025/2025-09-25-proxmox-backup-server-via-s3-in-richtig/" &gt;Offsite-Backup&lt;/a&gt; über S3 zu Backblaze B2. Der Part läuft verschlüsselt, da ich keinem Anbieter 100%ig vertraue. Wichtig war mir, dass der Backup-Server dedupliziert und komprimiert, um die Kosten für den S3-Storage möglichst gering zu halten. Da Proxmox Backup Server das inzwischen nativ kann, war der Aufwand überschaubar.&lt;/p&gt;
&lt;p&gt;Neben dem automatischen täglichen Backup gibt es außerdem einen manuellen Sync auf eine externe Festplatte, die normalerweise im Keller lagert. Diese ist als &amp;ldquo;Removable Storage&amp;rdquo; im Backup Server eingehängt und dient als zusätzliche Offline-Kopie im Worst-Case. Ich habe auch einen Thin Client mit einer Festplatte und Proxmox Backup Server im Keller, zu dem ich unregelmäßig die Backups spiegele. Aufgrund der geringen Bandbreite in den Keller will ich diese Variante aber ablösen, dafür habe ich mit der externen Festplatte begonnen.&lt;/p&gt;
&lt;h2 id="nutzerdaten-nextcloud-gameserver-usw"&gt;Nutzerdaten (Nextcloud, Gameserver usw.)
&lt;/h2&gt;&lt;p&gt;Für Dienste, die viele Nutzerdaten enthalten, setze ich zusätzlich auf Restic. Nextcloud-Daten und Backups der Gameserver werden etwa alle acht Stunden auf eine Hetzner Storage Box geladen. Auch hier läuft alles verschlüsselt, und die Snapshots lassen sich im Notfall granular wiederherstellen. Restic erfüllt neben der Verschlüsselung auch hier wieder die Kriterien mit Deduplizierung und Komprimierung, damit ich möglichst effizient viele Snapshots speichern kann.&lt;/p&gt;
&lt;p&gt;Bei der Nextcloud gibt es generell die Besonderheit, dass ich alle Daten, um die Nextcloud wiederherzustellen (&lt;code&gt;www&lt;/code&gt;-Verzeichnis, Datenverzeichnis, Dump der Datenbank) via Restic sichere, die virtuelle Festplatte mit den Nextcloud-Daten wird via Proxmox Backup Server aktuell wegen des Speicherbedarfs tatsächlich nicht gesichert.&lt;/p&gt;
&lt;h2 id="nas"&gt;NAS
&lt;/h2&gt;&lt;p&gt;Im Keller steht ein &lt;a class="link" href="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/" &gt;Backup-NAS&lt;/a&gt; mit TrueNAS. Hier laufen in unregelmäßigen Abständen manuelle rsync-Jobs, die Daten vom Haupt-NAS kopieren. Über ZFS-Snapshots sind ältere Stände ebenfalls abrufbar. Die Variante mit einem zusätzlichen NAS hat hauptsächlich Kostengründe, da das Speichern von über 10TB inkl. Snapshots sonst sehr viel teurer gewesen wäre.&lt;/p&gt;
&lt;h2 id="vserver-backups"&gt;vServer-Backups
&lt;/h2&gt;&lt;p&gt;Auf meinen externen vServern (hauptsächlich Docker-Dienste, diese Website und mein Mailserver) verwende ich ebenfalls Restic mit einer Hetzner Storage Box als Ziel.&lt;/p&gt;
&lt;h2 id="sicherung-der-keys-und-monitoring"&gt;Sicherung der Keys und Monitoring
&lt;/h2&gt;&lt;p&gt;Ich hatte zwischenzeitlich die Situation, dass die Keys für alle Offsite-Backups nur in einer Keepass-Datei in meiner Nextcloud gespeichert waren - die wiederum Teil genau dieser Offsite-Backups sind. Da ich alles verschlüssele, was offsite landet, hätte ich im Worst-Case zwar Backups, aber keinen Zugang mehr zu diesen Backups gehabt. Deshalb lagern die Keys mittlerweile zusätzlich auf einem USB-Stick bei meinen Eltern, just in case.&lt;/p&gt;
&lt;p&gt;Die Backup-Scripte werden mittels &lt;a class="link" href="https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/" &gt;Healthchecks&lt;/a&gt; auf ihre Ausführung überwacht, damit nicht (schon wieder) monatelang keine Backups passieren.&lt;/p&gt;
&lt;h2 id="offene-punkte"&gt;Offene Punkte
&lt;/h2&gt;&lt;p&gt;Was ich bisher zu selten mache sind Restore-Tests. Ich habe zwar bei jeder verwendeten Technik irgendwann mal einen Test-Restore gemacht und geprüft, aber seitdem nicht wieder getestet. Ich möchte für einige wichtige Dinge wie z.B. die Nextcloud auch Langzeitbackups einführen, die einen monatlichen Stand für mehrere Jahre effizient und günstig vorhalten können. Restic nutze ich aktuell nur mit &lt;code&gt;--keep-last n&lt;/code&gt;, hier sollte ich eine bessere Retention Policy einsetzen. Mein Backup-Script loggt aktuell auch zu wenig - das ist generell ein offener Punkt.&lt;/p&gt;
&lt;p&gt;Auch eine Dokumentation, wie Dinge wiederhergestellt werden können, fehlt komplett. An dem Thema bin ich aber aktuell dran. Basis wird eine möglichst automatische Datensammlung mit Ansible, Ergänzung mit eigenen Informationen und dann Erzeugen eines Wikis mittels MKDocs. Wenn ich das irgendwann mal fertig habe, gibt es dazu auch wieder einen Post.&lt;/p&gt;
&lt;p&gt;Eine Ansible-Rolle zum Deployen vom Backup-Script wäre auch noch angenehm, aktuell passiert das komplett händisch.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Das Setup ist über die Zeit gewachsen und sicher nicht perfekt - aber es deckt die wichtigsten Fälle ab: Hardwaredefekt, Ransomware, versehentliches Löschen und kompletten Verlust vom Cluster (bspw. durch einen Brand). Und das ganze wie üblich in möglichst kosteneffizient. Einige Dinge muss ich allerdings noch nachbessern.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server 4 mit S3 Storage - ein Update nach einigen Wochen</title><link>https://secretmine.de/blog/2025/2025-12-09-proxmox-backup-server-mit-s3-aktueller-stand/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-12-09-proxmox-backup-server-mit-s3-aktueller-stand/</guid><description>&lt;p&gt;Vor einiger Zeit habe ich ja &lt;a class="link" href="https://secretmine.de/blog/2025/2025-09-25-proxmox-backup-server-via-s3-in-richtig/" &gt;Proxmox Backup Server 4 mit S3 Storage&lt;/a&gt; als Offsite-Backup eingerichtet. Hier nun also ein kleiner Zwischenbericht zur Speicherbelegung.&lt;/p&gt;
&lt;p&gt;Ich sichere aktuell 8 LXCs zu dem Backup-Repo, pro CT werden jeweils drei Backups behalten. Im Bucket liegen 11,5 GB und etwa 7500 Dateien. PBS scheint aber im Bucket nur eher wenige Aktionen durchzuführen - auf der Abrechnung von Backblaze ist nur der belegte Speicher relevant, die S3-Operationen liegen bei mir komplett im kostenfreien Bereich. Proxmox Backup Server zeigt bei dem Repo eine Belegung von 8 GB an, das scheint nur der lokal zwischengespeicherte Part zu sein. Der Deduplizierungsfaktor liegt bei etwas über 7, das entspricht grob dem Faktor, den ich auch sonst erreiche.&lt;/p&gt;
&lt;p&gt;Insgesamt sieht es für mich bisher so aus, als ob das ganze gut funktioniert. Große Restore-Tests habe ich allerdings weiterhin nicht gemacht und Stand heute ist das S3-Feature auch weiterhin nur eine Tech-Preview - also mit Vorsicht zu genießen und sollte nicht das einzige Backup sein.&lt;/p&gt;</description></item><item><title>Scriptausführung mit Healthchecks überwachen</title><link>https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/</link><pubDate>Fri, 31 Oct 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/</guid><description>&lt;p&gt;Ich nutze für regelmäßige Backups von Daten (z.B. Nextcloud) ein kleines Script, das Restic verwendet. Ich hatte allerdings schon mehrfach den Fall, dass ein Backup nicht sauber durchlief und das Backup-Repository damit gesperrt war und weitere Backups fehlschlugen, was ich dann natürlich erst Wochen (okay, Monate) später bemerkt habe.&lt;/p&gt;
&lt;p&gt;Abhilfe schafft hier das Tool Healthchecks (&lt;a class="link" href="https://github.com/healthchecks/healthchecks%29" target="_blank" rel="noopener"
 &gt;https://github.com/healthchecks/healthchecks)&lt;/a&gt;. Das funktioniert so, dass man Checks einrichtet und dafür eine Webhook-URL bekommt. In einem Script ruft man dann diese URL auf und setzt damit den Timer zurück. Sofern der Webhook nicht innerhalb der richtigen Zeit aufgerufen wird, wird ein Alert ausgelöst. Insgesamt also recht simpel.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;Ich nutze hier, wie üblich, Docker. Hier meine &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthchecks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;healthchecks/healthchecks:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;healthchecks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DB=sqlite&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DB_NAME=/data/hc.sqlite&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DEBUG=False&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DEFAULT_FROM_EMAIL=me@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_HOST=smtp.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_HOST_PASSWORD=MyMailPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_HOST_USER=me@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_PORT=587&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_USE_TLS=True&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SECRET_KEY=Hok4K0Va6EwaYltk4ah7muc223rUVmz3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SITE_ROOT=https://checks.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DISCORD_CLIENT_ID=123123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DISCORD_CLIENT_SECRET=123123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;REGISTRATION_OPEN=False&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;REGISTRATION_OPEN&lt;/code&gt; muss initial auf &lt;code&gt;True&lt;/code&gt; gestellt werden, damit man sich selbst registrieren kann, danach sollte das allerdings wieder auf &lt;code&gt;False&lt;/code&gt; gesetzt werden, damit sich keine fremden User registrieren können. Ich habe hier direkt die Discord-Integration eingerichtet, damit ich auf dem Weg auch Notifications verschicken kann. Die beiden Variablen sind aber natürlich optional.&lt;/p&gt;
&lt;p&gt;Das Datenverzeichnis muss die richtigen Zugriffsrechte haben, damit der Container starten kann. Das geht schnell mittels&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ./data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R 999:999 ./data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Danach lässt sich der Stack mit &lt;code&gt;docker compose up -d&lt;/code&gt; starten und die Seite aufrufen. Dort kann man sich dann mit einer E-Mail-Adresse registrieren.&lt;/p&gt;
&lt;h2 id="einbindung-in-ein-script"&gt;Einbindung in ein Script
&lt;/h2&gt;&lt;p&gt;Um jetzt einen Check einzurichten, muss zuerst im Webinterface ein neuer Check erstellt werden. Dabei wird auch das normale Intervall (z.B. täglich) sowie eine Karenzzeit eingestellt.&lt;/p&gt;
&lt;p&gt;Nun wird eine Check-URL angezeigt, ich nehme hier &lt;code&gt;https://checks.example.com/ping/bla-bla-blub&lt;/code&gt; als Beispiel.&lt;/p&gt;
&lt;h3 id="simpler-check"&gt;Simpler Check
&lt;/h3&gt;&lt;p&gt;Für einen einfachen Check, ob das Script gelaufen ist, reicht es, einen Befehl wie z.B.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -m &lt;span class="m"&gt;10&lt;/span&gt; --retry &lt;span class="m"&gt;5&lt;/span&gt; https://checks.example.com/ping/bla-bla-blub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;mit der Check-URL auszuführen. Der Befehl sollte im Script als letztes ausgeführt werden, damit er erst ausgeführt wird, wenn alles andere funktioniert hat.&lt;/p&gt;
&lt;h3 id="check-mit-laufzeitberechnung"&gt;Check mit Laufzeitberechnung
&lt;/h3&gt;&lt;p&gt;Healthchecks kann auch die Laufzeit eines Scripts mit prüfen. Dazu wird erst der Endpunkt &lt;code&gt;https://checks.example.com/ping/bla-bla-blub/start&lt;/code&gt; aufgerufen und nach Fertigstellung dann &lt;code&gt;https://checks.example.com/ping/bla-bla-blub&lt;/code&gt;. Hierbei sollte auch noch eine Request-ID mitgegeben werden, um die einzelnen Ausführungen voneinander unterscheiden zu können.&lt;/p&gt;
&lt;p&gt;Ich habe das bspw. so umgesetzt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;uuidgen&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HEALTHCHECK_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bla-bla-blub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -m &lt;span class="m"&gt;10&lt;/span&gt; --retry &lt;span class="m"&gt;5&lt;/span&gt; https://checks.example.com/ping/&lt;span class="nv"&gt;$HEALTHCHECK_ID&lt;/span&gt;/start?rid&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$RID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# do backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -m &lt;span class="m"&gt;10&lt;/span&gt; --retry &lt;span class="m"&gt;5&lt;/span&gt; https://checks.example.com/ping/&lt;span class="nv"&gt;$HEALTHCHECK_ID&lt;/span&gt;?rid&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$RID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Nachdem das Script ausgeführt wurde, sieht das im Webinterface so aus:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ausgeführter Check" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/images/check.png" srcset="https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/images/check_hu_5c0e8ac9055829a.png 800w, https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/images/check.png 1027w" width="1027"&gt;&lt;/p&gt;
&lt;p&gt;Sollte ein Check nicht innerhalb der eingestellten Zeit aufgerufen werden, wird eine Notification ausgelöst. So sollte ich in Zukunft fehlschlagende Backups schneller bemerken.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server 4 mit S3 Storage - diesmal in Richtig</title><link>https://secretmine.de/blog/2025/2025-09-25-proxmox-backup-server-via-s3-in-richtig/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-09-25-proxmox-backup-server-via-s3-in-richtig/</guid><description>&lt;p&gt;Proxmox Backup Server 4 hat eine erste tech preview für S3-Speicher mit drin, um offsite Backups zu speichern. Das ist durch die Deduplizierung und Komprimierung ideal, um günstig Backups zu machen. Als S3-Provider nutze ich Backblaze B2, da der Storage hier recht günstig ist (okay, ich hab auch einfach schon einen Account da). Die Backups werden auch lokal zwischengespeichert, es bedeutet also einiges an Schreibvorgängen auf der SSD/HDD.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Achtung!&lt;/strong&gt; Das ganze ist noch im Preview-Stadium und ist mit Vorsicht zu genießen!&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="bucket-erstellen"&gt;Bucket erstellen
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Im Backblaze B2 Webinterface einen neuen Bucket anlegen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bucket-Name: &lt;strong&gt;lowercase&lt;/strong&gt; (z. B. &lt;code&gt;pbsoffsite&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Endpunkt notieren, z. B.: &lt;code&gt;s3.eu-central-002.backblazeb2.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lifecycle-Einstellungen&lt;/strong&gt; für den Bucket setzen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Nur die letzte Version der Datei aufbewahren&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="application-keys-erstellen"&gt;Application Keys erstellen
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Im Menü &lt;code&gt;Application Keys&lt;/code&gt; → &lt;code&gt;Add New&lt;/code&gt; wählen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Namen definieren, z. B.: &lt;code&gt;PBSOffsiteKey&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Im Feld &lt;code&gt;Allow access to Bucket(s)&lt;/code&gt; den eben erstellten Bucket auswählen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Haken setzen bei &lt;code&gt;Allow List All Bucket Names&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Die Ausgabe enthält die benötigten Werte:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;keyID: keyIDblablablub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;applicationKey: blablablub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="s3-endpoint-im-pbs-hinzufügen"&gt;S3 Endpoint im PBS hinzufügen
&lt;/h3&gt;&lt;p&gt;Im PBS-Webinterface einen S3-Endpoint hinzufügen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ID: bspw. &lt;code&gt;backblaze&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Endpoint: ``{{bucket}}.s3.{{region}}.backblazeb2.com`&lt;/li&gt;
&lt;li&gt;Region aus dem Endpunkt ableiten, z. B. &lt;code&gt;eu-central-002&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Access Key (&lt;code&gt;keyID&lt;/code&gt;) und Secret Key (&lt;code&gt;applicationKey&lt;/code&gt;) eintragen&lt;/li&gt;
&lt;li&gt;Advanced → Provider Quirks: &lt;code&gt;Skip If-None-Match header&lt;/code&gt; aktivieren&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cache-verzeichnis-erstellen"&gt;Cache-Verzeichnis erstellen
&lt;/h3&gt;&lt;p&gt;Die Doku empfiehlt hier 64-128GB Speicher. Ich nutze LVM-Thin und habe dementsprechend auf dem Host ein neues Volume erstellt und gemountet. Das Anlegen eines neuen logischen Volumes bei LVM geht mit folgendem Befehl:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lvcreate -V 100G -T vg-data/thinpool -n pbs-s3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Gemountet habe ich das unter &lt;code&gt;/mnt/pbs-s3&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="datastore-hinzufügen"&gt;Datastore hinzufügen
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;backblaze&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Local Cache: &lt;code&gt;/mnt/pbs-s3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;S3 Endpoint ID: passenden Endpoint auswählen&lt;/li&gt;
&lt;li&gt;Bucket: den angelegten Bucket auswählen. Wenn hier nichts auftaucht oder ein Fehler erscheint, stimmt was mit den Zugangsdaten nicht oder der Bucketname ist z.B. nicht kleingeschrieben.&lt;/li&gt;
&lt;li&gt;Prune Options: &lt;em&gt;nach Bedarf konfigurieren&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="datastore-nutzen"&gt;Datastore nutzen
&lt;/h3&gt;&lt;p&gt;Ich habe nun also in Proxmox einen zweiten Proxmox Backup Server als Storage eingefügt und einen zweiten Backup-Job mit dem Offsite-Storage und nur den wichtigsten Containern und VMs angelegt. Ich lasse das aktuell erstmal nur mit eher kleinen Backups laufen, bis ich ein Gefühl dafür bekommen habe, was mich das dann am Ende so kostet. Irgendwann wird dementsprechend ein Update-Post folgen.&lt;/p&gt;
&lt;p&gt;Ein Restore-Test steht auch noch aus&amp;hellip;&lt;/p&gt;</description></item><item><title>Backup-Server für das NAS</title><link>https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/</link><pubDate>Sun, 27 Apr 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/</guid><description>&lt;p&gt;Irgendwie bin ich in letzter Zeit im Backup-Fieber&amp;hellip; Ich weiß auch nicht.&lt;/p&gt;
&lt;p&gt;Bisher wurden die Daten von meinem NAS (etwa 8TB belegt) nicht gesichert, ich habe nur die wichtigsten paar hundert GB ab und an in meine Storagebox bei Hetzner gesynct. Damit bin ich aber nicht so zufrieden, da der Datenverlust im Zweifelsfall doch deutlich wäre.&lt;/p&gt;
&lt;h2 id="festplatten"&gt;Festplatten
&lt;/h2&gt;&lt;p&gt;Irgendwo müssen solche Datenmengen hin, so viel hat man auch nicht einfach an Festplatten herumliegen. Cloud-Speicher ist in den Größenordnungen auch eher teuer, selbst wenn man Archivspeicher (z.B. S3 Glacier bei Scaleway) nutzt. Daher habe ich hierfür Festplatten gekauft. Weil es nur um Backups geht, waren refurbished Platten für mich okay, solange die in einem RAID oder ZFS laufen. Konkret wurde es eine Seagate Enterprise Capacity mit 12TB und eine Seagate Ironwolf mit 12TB. Ich habe verschiedene Modellreihen genommen, um einem gleichzeitigen Ausfall etwas vorzubeugen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die Festplatten" class="gallery-image" data-flex-basis="356px" data-flex-grow="148" height="1010" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/hdds.jpg" srcset="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/hdds_hu_6e2bb4cdee595106.jpg 800w, https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/hdds.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h3 id="benchmarks"&gt;Benchmarks
&lt;/h3&gt;&lt;p&gt;Bevor ich die Festplatten tatsächlich nutze, habe ich kurz mit CrystalDiskBench mit meinem Windows-Rechner Tests gemacht.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Benchmark Seagate Enterprise Capacity 12TB (refurbished)" class="gallery-image" data-flex-basis="328px" data-flex-grow="136" height="352" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/bench_12tb_enterprise_capacity.png" width="482"&gt;
&lt;img alt="Benchmark Seagate Ironwolf 12TB (refurbished)" class="gallery-image" data-flex-basis="328px" data-flex-grow="136" height="352" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/bench_12tb_ironwolf.png" width="482"&gt;&lt;/p&gt;
&lt;h2 id="server"&gt;Server
&lt;/h2&gt;&lt;p&gt;Ich habe aus vorhandener Hardware einen kleinen Server gebaut, der dann in den Keller kommt und bei Bedarf eingeschaltet werden kann. Die Hardware ist absolut nicht herausragend, reicht für den Zweck allerdings problemlos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: Intel Pentium G3258&lt;/li&gt;
&lt;li&gt;RAM: 4GB &lt;em&gt;(zweiter Slot vom Mainboard leider defekt)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Datenträger:
&lt;ul&gt;
&lt;li&gt;120GB SSD (TrueNAS)&lt;/li&gt;
&lt;li&gt;2x 12TB HDD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich habe dann das aktuelle TrueNAS Scale installiert und ein RAIDZ1 erstellt. Ich habe mich hier explizit für RAIDZ1 statt einem Mirror entschieden, damit ich später simpel die Kapazität mit z.B. einer weiteren 12TB-Platte erweitern kann. Das RAIDZ1 verhält sich mit zwei Festplatten eigentlich wie ein Mirror. Schade ist hierbei, dass sich so ein zdev nicht über die UI erstellen lässt, das muss per CLI passieren.&lt;/p&gt;
&lt;h2 id="datensicherung"&gt;Datensicherung
&lt;/h2&gt;&lt;p&gt;Anfangs hatte ich die Sicherungen mit &lt;code&gt;rsync&lt;/code&gt; gemacht, das funktioniert auch soweit gut. Es hat jedoch einen gravierenden Nachteil: Das Verschieben von Dateien wird nicht erkannt. Deswegen habe ich nun auf &lt;code&gt;rclone&lt;/code&gt; umgestellt, weiterhin per SFTP. Dort gibt es das Argument &lt;code&gt;--track-renames&lt;/code&gt;, was bei Dateien, die entweder nur in der Quelle oder nur im Ziel sind, versucht, ein Matching zu möglichen anderen Dateien zu machen und entsprechend umzubenennen. Das scheint auch gut zu funktionieren.&lt;/p&gt;
&lt;p&gt;Nach einem Sync lege ich händisch einen ZFS Snapshot an, um den alten Stand einzufrieren. Mein Plan ist, dass ich den kompletten Prozess automatisiere, also dann folgende Schritte in ein Script gieße:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS hochfahren&lt;/li&gt;
&lt;li&gt;Backup-NAS hochfahren&lt;/li&gt;
&lt;li&gt;Sync ausführen und abwarten&lt;/li&gt;
&lt;li&gt;ZFS-SNapshot auf Backup-NAS erstellen&lt;/li&gt;
&lt;li&gt;Backup-NAS herunterfahren&lt;/li&gt;
&lt;li&gt;NAS in Standby schicken&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das soll dann etwa 1x pro Woche erfolgen. Ich habe mich bisher mit der TrueNAS-API noch nicht auseinandergesetzt, aber ansonsten kann ich die ZFS-Snapshots auch einfach direkt per CLI erstellen.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server für den Hauptcluster</title><link>https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/</guid><description>&lt;p&gt;Ich habe schon länger darüber nachgedacht, wie ich gut und günstig meine VMs und Container sichern kann. Ich hatte in dem Zuge erst &lt;a class="link" href="https://secretmine.de/blog/2024/2024-10-22-proxmox-backup-server-via-s3/" &gt;PBS über S3&lt;/a&gt; getestet, was lief, aber nicht optimal war - und dann lange einen externen Anbieter (&lt;a class="link" href="https://secretmine.de/blog/2025/2025-03-12-proxmox-backup-server-kostenlos/" &gt;Tuxis&lt;/a&gt;) für PBS genutzt. Da bin ich mit 150GB allerdings beim Speicherplatz stark eingeschränkt.&lt;/p&gt;
&lt;h2 id="bisherige-backup-strategie"&gt;Bisherige Backup-Strategie
&lt;/h2&gt;&lt;p&gt;Bisher landen die wichtigsten VMs und Container auf einem externen PBS-Server bei Tuxis, die Dateien der Nextcloud werden mittels &lt;code&gt;restic&lt;/code&gt; auf eine Storage-Box bei Hetzner gesichert. Das deckt aber nur einen Teil der VMs und Container ab, und vor allem ist die Wiederherstellung teilweise aufwändiger. Daher habe ich schon länger den Wunsch, das ganze zu vereinfachen&lt;/p&gt;
&lt;h2 id="der-plan"&gt;Der Plan
&lt;/h2&gt;&lt;p&gt;Ich habe eine billige 1TB Sata-SSD gekauft (genauer gesagt eine Lexar NQ100 im Angebot). Diese soll in den dritten Host (der Mini-PC, Lenovo Tinkcentre M715q Tiny) kommen, damit dort dann Proxmox Backup Server laufen kann. Damit habe ich dann genügend Kapazität, um wirklich alle VMs und Container zu sichern und bei Bedarf schnell wiederherstellen zu können.&lt;/p&gt;
&lt;h2 id="die-umsetzung"&gt;Die Umsetzung
&lt;/h2&gt;&lt;p&gt;Ich habe also die SSD verbaut (nebenbei auch noch die NVMe von 240GB auf 480GB getauscht und mittels &lt;code&gt;gparted&lt;/code&gt; die bisherigen Partitionen kopiert und vergrößert).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lenovo M715q Tiny von innen" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-1.jpg" srcset="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-1_hu_9ee801ddc65896df.jpg 800w, https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-1.jpg 1500w" width="1500"&gt;
&lt;img alt="Lenovo M715q Tiny von innen - mit Sata-SSD" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-2.jpg" srcset="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-2_hu_f3984b448eda7c01.jpg 800w, https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-2.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h2 id="installation-von-pbs"&gt;Installation von PBS
&lt;/h2&gt;&lt;p&gt;Ich habe PBS direkt mit auf dem Host installiert. Da das ein Proxmox ist, war das auch nicht weiter schwierig (wäre es allerdings auf jedem Debian nicht). In der Doku befindet sich dazu auch eine Anleitung, die man recht gut befolgen kann (&lt;a class="link" href="https://pbs.proxmox.com/docs/installation.html#install-proxmox-backup-server-on-proxmox-ve%29" target="_blank" rel="noopener"
 &gt;https://pbs.proxmox.com/docs/installation.html#install-proxmox-backup-server-on-proxmox-ve)&lt;/a&gt;. Vor dem &lt;code&gt;apt&lt;/code&gt;-Befehl muss man aber noch manuell das APT-Repo hinzufügen. Die ganze Installation sieht also etwa so aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription&amp;#34;&lt;/span&gt; &amp;gt; /etc/apt/sources.list.d/pbs.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install proxmox-backup-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Die Befehle habe ich vor dem Posten nicht getestet, das habe ich jetzt im Nachhinein noch kurz zusammengesammelt.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Danach ist Proxmox Backup Server unter &lt;code&gt;https://[host]:8007&lt;/code&gt; erreichbar.&lt;/p&gt;
&lt;h2 id="lexar-nq100-für-diesen-zweck"&gt;Lexar NQ100 für diesen Zweck
&lt;/h2&gt;&lt;p&gt;Die SSD scheint soweit gut geeignet als Backup-Ziel zu sein, auch wenn ich leichte Zweifel an der Langlebigkeit dieser SSD habe. Das liegt aber eigentlich nur am Preis, mir sind generell bisher eigentlich fast keine SSDs kaputt gegangen (eine noname 32GB SSD aus Chinau und eine 240GB Billig-SSD von Toshiba).&lt;/p&gt;
&lt;h2 id="spiegel-vom-pbs-datastore"&gt;Spiegel vom PBS Datastore
&lt;/h2&gt;&lt;p&gt;Proxmox Backup Server kann Backups auf einen externen Server replizieren. Ich habe im Keller im zweiten Part vom Homelab einen Thin-Client (Fujitsu Futro S720) mit einer Sata-HDD, der als Backup-Server und Storage für die Server im Keller dient. Dorthin will ich einen (unregelmäßigen und manuellen) Sync einrichten, damit ich zumindest halb-offsite auch noch einen schnell verfügbaren Spiegel habe.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server kostenlos (bei Tuxis)</title><link>https://secretmine.de/blog/2025/2025-03-12-proxmox-backup-server-kostenlos/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-03-12-proxmox-backup-server-kostenlos/</guid><description>&lt;h2 id="was-ist-proxmox-backup-server-überhaupt"&gt;Was ist Proxmox Backup Server überhaupt?
&lt;/h2&gt;&lt;p&gt;Der Proxmox Backup Server (PBS) ist eine Open-Source-Lösung zum Sichern von virtuellen Maschinen (VMs), Containern und physikalischen Hosts. Besonders in Kombination mit Proxmox VE ist PBS ideal, um effiziente und sichere Backups zu erstellen. PBS ist in Proxmox VE direkt integriert.&lt;/p&gt;
&lt;p&gt;PBS unterstützt deduplizierte und inkrementelle Backups, was bedeutet, dass nur geänderte Daten gesichert werden, um Speicherplatz zu sparen. Backups können zudem komprimiert und verschlüsselt werden, was die Sicherheit und Effizienz erhöht.&lt;/p&gt;
&lt;h2 id="der-kostenlose-anbieter"&gt;Der kostenlose Anbieter
&lt;/h2&gt;&lt;p&gt;Durch Zufall bin ich bei Reddit in einem Kommentar darauf gestoßen, dass es einen Anbieter gibt, der Proxmox Backup Server mit 150 GB Speicherplatz komplett kostenfrei anbietet. Tuxis ist ein IT-Service-Provider mit Sitz in den Niederlanden.&lt;/p&gt;
&lt;p&gt;Der Link zum Angebot: &lt;a class="link" href="https://www.tuxis.nl/de/proxmox-backup-server/" target="_blank" rel="noopener"
 &gt;https://www.tuxis.nl/de/proxmox-backup-server/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beim Schreiben dieses Posts muss ich leider feststellen, dass es die kostenlosen Pakete zumindest Stand heute nicht verfügbar sind. Vielleicht kommen die noch wieder, vielleicht aber auch nicht.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="meine-erfahrung"&gt;Meine Erfahrung
&lt;/h2&gt;&lt;p&gt;Ich habe den kostenlosen PBS also bestellt und innerhalb weniger Minuten die Zugangsdaten bekommen. Das ganze habe ich dann auch direkt in meinem Homeserver eingerichtet, hierbei mit Verschlüsselung, da die Daten nicht in meiner Hoheit liegen. Der Backup Space funktioniert, hat bisher keinerlei Fehler geworfen und scheint auch zuverlässig zu sein. Ich nutze das ganze allerdings auch erst seit ein paar Tagen, von daher kann ich zur langfristigen Stabilität noch nichts sagen. Bei kostenlosen Angeboten wie diesen muss man natürlich auch immer damit rechnen, dass das Angebot ohne große Ankündigung eingestellt wird, daher nutze ich es auch nur als zusätzliches Offsite-Backup. Ich gebe mir dabei auch Mühe, dass ich nicht zu viel Platz belege, immerhin ist es ein kostenloses Angebot, von dem ich hoffe, dass es so schnell nicht eingestellt wird.&lt;/p&gt;
&lt;h2 id="alternativen"&gt;Alternativen
&lt;/h2&gt;&lt;p&gt;Mir sind sonst auf dem Markt nicht wirklich viele Alternativen (also bezahlt) bekannt, die PBS anbieten. Es gibt sie aber. Ansonsten geht natürlich auch ein vServer mit genügend Storage - dafür findet man auch problemlos Anbieter (teilweise auch mit kleinem SSD-Boot-Speicher und dickem HDD-Speicher dazu). Und PBS statt reinem Storage (z.B. Hetzner Storage Box oder so) hat den großen Vorteil, dass die Deduplizierung bzw. inkrementelle Sicherung greift (und damit nicht nur Speicherplatz, sondern auch Bandbreite spart). Bei mir ist das aktuell (insgesamt knapp 300 Snapshots) ein Deduplizierungsfaktor von etwa 17.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server mit S3 Storage</title><link>https://secretmine.de/blog/2024/2024-10-22-proxmox-backup-server-via-s3/</link><pubDate>Tue, 22 Oct 2024 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2024/2024-10-22-proxmox-backup-server-via-s3/</guid><description>&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Es gibt bei Proxmox mittlerweile die Option, S3 nativ zu nutzen. Dazu habe ich auch &lt;a class="link" href="https://secretmine.de/blog/2025/2025-09-25-proxmox-backup-server-via-s3-in-richtig/" &gt;hier&lt;/a&gt; einen neuen Post geschrieben.&lt;/p&gt;
&lt;h2 id="was-ist-juicefs"&gt;Was ist JuiceFS?
&lt;/h2&gt;&lt;p&gt;In einem &lt;a class="link" href="https://secretmine.de/blog/2024/2024-10-12-nextcloud-umzug-ziel/" &gt;anderen Post&lt;/a&gt; hatte ich bereits von &lt;a class="link" href="https://juicefs.com/" target="_blank" rel="noopener"
 &gt;JuiceFS&lt;/a&gt; berichtet. Das ist ein Dateisystem, was einen Object Storage mit einer Datenbank verbindet, um so möglichst Posix-Compliant zu sein. Das heißt also, dass die Dateiinhalte in einem S3-Bucket landen, die Metadaten und Verzeichnisstrukturen liegen dann in z.B. einer MariaDB.&lt;/p&gt;
&lt;p&gt;Das hatte ich erst für Nextcloud getestet, was auch soweit funktioniert hat. Zu dem Zeitpunkt war mir das ganze aber nicht geheuer, weshalb ich es produktiv dafür nicht einsetzen wollte und auch weiterhin nicht vor habe.&lt;/p&gt;
&lt;h2 id="die-kombination"&gt;Die Kombination
&lt;/h2&gt;&lt;p&gt;Im Proxmox-Forum und bei Reddit findet man Beiträge dazu, wie Leute Proxmox Backup Server (PBS) mittels rclone mit einem S3-Speicher verbunden haben, um die Backups eben in S3 zu lagern. Das hat allerdings nur so lange funktioniert, wie leere Verzeichnisse im Cache von rclone waren, da S3 prinzipbedingt nicht mit leeren Verzeichnissen umgehen kann. JuiceFS dürfte diese Lücke füllen, da durch die Trennung von Inhalts- und Metadaten die Unterstützung für alle relevanten Attribute und co wiederhergestellt wird.&lt;/p&gt;
&lt;h2 id="das-setup"&gt;Das Setup
&lt;/h2&gt;&lt;p&gt;Benötigt wird ein Debian-Server mit folgenden installierten Komponenten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxmox Backup Server (entweder von der ISO installieren oder zusätzlich installieren, siehe hier: &lt;a class="link" href="https://pbs.proxmox.com/docs/installation.html" target="_blank" rel="noopener"
 &gt;https://pbs.proxmox.com/docs/installation.html&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;MariaDB-Datenbank (in meinem Test lokal installierter Server)&lt;/li&gt;
&lt;li&gt;JuiceFS (Installation siehe hier: &lt;a class="link" href="https://juicefs.com/docs/community/getting-started/installation/" target="_blank" rel="noopener"
 &gt;https://juicefs.com/docs/community/getting-started/installation/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Ein S3-Bucket (in meinem Test MinIO, aber es geht natürlich auch alles andere)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="juicefs-storage-anlegen"&gt;JuiceFS-Storage anlegen
&lt;/h3&gt;&lt;p&gt;Ich habe also die Datenbank und ein S3-Bucket angelegt und dann mit folgendem Command den JuiceFS-Store angelegt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# diese Variable nutze ich, um die Zugangsdaten und Pfade zur Datenbank nicht jedes Mal neu angeben zu müssen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Diese Zeile muss pro SSH-Session, in der mit JuiceFS gearbeitet werden soll, neu ausgeführt werden.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;METAURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql://&lt;span class="o"&gt;[&lt;/span&gt;user&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;passwort&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;([&lt;/span&gt;datenbankserver&lt;span class="o"&gt;]&lt;/span&gt;:3306&lt;span class="o"&gt;)&lt;/span&gt;/&lt;span class="o"&gt;[&lt;/span&gt;datenbankname&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# bei mir:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# export METAURL=mysql://juicefs:pbspbspbs@(localhost:3306)/juicefs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juicefs format &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --storage s3 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --bucket &lt;span class="o"&gt;[&lt;/span&gt;bucket-url&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --access-key &lt;span class="o"&gt;[&lt;/span&gt;access-key&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --secret-key &lt;span class="o"&gt;[&lt;/span&gt;access-secret&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$METAURL&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pbsfs --trash-days&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# bei mir:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#juicefs format \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --storage s3 \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --bucket http://s3.homelab.local:9000/pbs \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --access-key pbs \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --secret-key pbspbspbs \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# $METAURL \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# pbsfs --trash-days=0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2024/10/20 10:14:59.175588 juicefs&lt;span class="o"&gt;[&lt;/span&gt;15366&lt;span class="o"&gt;]&lt;/span&gt; &amp;lt;INFO&amp;gt;: Meta address: mysql://juicefs:****@&lt;span class="o"&gt;(&lt;/span&gt;localhost:3306&lt;span class="o"&gt;)&lt;/span&gt;/juicefs &lt;span class="o"&gt;[&lt;/span&gt;interface.go:504&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2024/10/20 10:14:59.177822 juicefs&lt;span class="o"&gt;[&lt;/span&gt;15366&lt;span class="o"&gt;]&lt;/span&gt; &amp;lt;INFO&amp;gt;: Data use s3://pbs/pbsfs/ &lt;span class="o"&gt;[&lt;/span&gt;format.go:484&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2024/10/20 10:14:59.372276 juicefs&lt;span class="o"&gt;[&lt;/span&gt;15366&lt;span class="o"&gt;]&lt;/span&gt; &amp;lt;INFO&amp;gt;: Volume is formatted as &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;pbsfs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;UUID&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;97f66daa-c003-4b5b-b1ed-af4788cfbb06&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Storage&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;s3&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Bucket&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;http://s3.homelab.local:9000/pbs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;AccessKey&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;pbs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;SecretKey&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;removed&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;BlockSize&amp;#34;&lt;/span&gt;: 4096,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Compression&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;EncryptAlgo&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;aes256gcm-rsa&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;KeyEncrypted&amp;#34;&lt;/span&gt;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;TrashDays&amp;#34;&lt;/span&gt;: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;MetaVersion&amp;#34;&lt;/span&gt;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;MinClientVersion&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;1.1.0-A&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;DirStats&amp;#34;&lt;/span&gt;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;EnableACL&amp;#34;&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;format.go:521&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Damit wird nun also ein JuiceFS-Store angelegt. Die Daten für das S3-Bucket werden dabei mit im Metadaten-Speicher (also der MariaDB-Datenbank) abgelegt und müssen nicht noch mal eingegeben werden.&lt;/p&gt;
&lt;h3 id="juicefs-mounten"&gt;JuiceFS mounten
&lt;/h3&gt;&lt;p&gt;Mittels&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /mnt/jfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juicefs mount --update-fstab --background &lt;span class="nv"&gt;$METAURL&lt;/span&gt; /mnt/jfs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;können wir nun das JuiceFS unter &lt;code&gt;/mnt/jfs&lt;/code&gt; mounten, der Parameter &lt;code&gt;--update-fstab&lt;/code&gt; sorgt dafür, dass direkt auch eine neue Zeile in der &lt;code&gt;fstab&lt;/code&gt; angelgt und das JuiceFS beim Systemstart mit gemountet wird.&lt;/p&gt;
&lt;p&gt;Mit&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juicefs config &lt;span class="nv"&gt;$METAURL&lt;/span&gt; --capacity &lt;span class="m"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;lässt sich auch ein Quota festlegen, hier 100GB. Ansonsten hat ein JuiceFS theoretisch unbegrenzte Kapazität bzw. legt kein Limit fest.&lt;/p&gt;
&lt;h3 id="storage-in-pbs-einrichten"&gt;Storage in PBS einrichten
&lt;/h3&gt;&lt;p&gt;In PBS können wir nun einen neuen Datastore hinzufügen und &lt;code&gt;/mnt/jfs&lt;/code&gt; als Pfad angeben. Das Anlegen eines Storages wird allerdings eine ganze Zeit dauern, da hierbei einige Tausend Verzeichnisse erzeugt werden. In meinem Fall hat das etwa 20 Minuten gedauert, lokal ging das immer sehr viel schneller. Danach lässt sich der Storage normal in einem Proxmox VE Server einbinden und nutzen.&lt;/p&gt;
&lt;h3 id="performance"&gt;Performance
&lt;/h3&gt;&lt;p&gt;Meine Werte sind leider nur semi-aussagekräftig, da der Minio-Server, der hier als S3-Storage dient, wirklich langsam ist. Ich habe hierbei grob 5 MB/s bei Backups erreicht zeitweise auch 40 MB/s. Ich gehe davon aus, dass mit passend schnellem S3-Storage die reale Leistung eher bei den 40 MB/s liegt, sicher sagen kann ich das aber nicht.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Da die Performance soweit okay ist, kann ich mir gut vorstellen, das auf einem vServer im Rechenzentrum mit einem Backblaze B2 Bucket als Storage tatsächlich zu verwenden bzw. dem ganzen so zumindest einem Langzeittest auszusetzen. Ich habe bislang mit JuiceFS auch außerhalb von solchen kurzen Tests wenig Erfahrung.
Wenn es gut funktioniert, wäre es aber eine wirklich coole Möglichkeit, um günstig viel Speicher für Proxmox zu bekommen. Ich habe bisher allerdings auch keine Werte bzgl. Trafficnutzung und auch Anzahl der API-Calls, die beim S3-Storage entstehen, das kann schnell zu Kosten führen.&lt;/p&gt;
&lt;h2 id="update"&gt;Update
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Kleines Update:&lt;/em&gt; Ich habe das so temporär auf einem vServer mit Backblaze als Backend in Betrieb. Über etwa 1-2 Wochen hinweg habe ich nun getestet - das ganze lief stabil und mit brauchbarer Performance. Was dauert sind Operationen mit vielen kleinen Dateien, da merkt man dann die andere Speicherart. Generell kann man das nutzen, aber ich würde mich da nicht als einzige Backup-Lösung drauf verlassen - dafür fühlt sich das ganze zu sehr nach einer Bastellösung mit zu vielen beweglichen Teilen an.&lt;/p&gt;</description></item></channel></rss>