<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Borg &#8211; Julsens Blog</title>
	<atom:link href="https://julsen.de/tag/borg/feed/" rel="self" type="application/rss+xml" />
	<link>https://julsen.de</link>
	<description>Meine Hobbies und alles was mich so interessiert</description>
	<lastBuildDate>Sun, 22 Feb 2026 20:28:15 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<item>
		<title>Server Backup via Borg auf Storage Box</title>
		<link>https://julsen.de/hobby/server-homeserver/server-backup-via-borg-auf-storage-box/</link>
					<comments>https://julsen.de/hobby/server-homeserver/server-backup-via-borg-auf-storage-box/#respond</comments>
		
		<dc:creator><![CDATA[Julsen]]></dc:creator>
		<pubDate>Sun, 22 Feb 2026 20:28:15 +0000</pubDate>
				<category><![CDATA[Server / HomeServer]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Borg]]></category>
		<category><![CDATA[Hetzner]]></category>
		<category><![CDATA[Root Server Backup]]></category>
		<category><![CDATA[Storage Box]]></category>
		<guid isPermaLink="false">https://julsen.de/?p=572</guid>

					<description><![CDATA[Mein Root Server läuft jetzt schon seit mehreren Jahren durch und bislang hatte ich noch keinen Need irgendwie meine Daten zu sichern, da die Projekte]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Mein Root Server läuft jetzt schon seit mehreren Jahren durch und bislang hatte ich noch keinen Need irgendwie meine Daten zu sichern, da die Projekte eh in Repos liegen und meine Daten auch immer mit meinem lokalen Netzwerk gesynct wird. Heute wollte ich es mir aber einfacher machen, die Daten des Root Servers auch Online auf einer Storage Box zu backuppen und mehrere Versionen zur Verfügung zu haben. Dazu habe ich mir entschlossen bei Hetzner eine Storage Box zu mieten und meinen Server mit Borg dorthin zu sichern.</p>



<p class="wp-block-paragraph">Borg ist für deduplizierte, verschlüsselte, inkrementelle Backups auf SSH-Ziele optimiert und wird von Hetzner explizit unterstützt. Vorteile: starke Deduplizierung, integrierte Verschlüsselung (AES-256/ChaCha20-Poly1305), einfache Retention und Mountbarkeit als FUSE-FS zum Restore einzelner Dateien.</p>



<pre class="wp-block-code"><code>apt install borgbackup</code></pre>



<p class="wp-block-paragraph">SSH Key für die Storage Box generieren (ohne Passwort!).</p>



<pre class="wp-block-code"><code>ssh-keygen -t ed25519 -C "borg@rootserver" -f ~/.ssh/hetzner_storage</code></pre>



<p class="wp-block-paragraph">Den Key kann man beim Erstellen der Storage Box hinzufügen oder wenn schon die Box eingerichtet ist, nachträglich hinzufügen.</p>



<pre class="wp-block-code"><code>ssh-copy-id -p23 -i ~/.ssh/hetzner_storage.pub uXXXXX@uXXXXX.your-storagebox.de</code></pre>



<p class="wp-block-paragraph">Borg Repo initialisieren (REPO_NAME ersetzen, bei mir z.B. nextcloud-docker, für mein Nextcloud Backup).</p>



<pre class="wp-block-code"><code>borg init --encryption=repokey --remote-path=borg1.4 ssh://uXXXXX@uXXXXX.your-storagebox.de:23/./REPO_NAME -i ~/.ssh/hetzner_storage</code></pre>



<p class="wp-block-paragraph">Meine Nextcloud läuft in Docker und die Daten sind nur per Mount eingebunden. Die Container selbst möchte ich nicht sichern, nur die Daten und die Datenbank. Dazu habe ich mir ein Script erstellt, was mir die DB per Docker und mysqldump dumped und die Daten sichert. Mein Backup soll verschlüsselt in der Storage Box liegen, dazu habe ich den Schlüssel in der Datei /root/.borg-passphrase abgelegt.</p>



<pre class="wp-block-code"><code>#!/bin/bash
set -euo pipefail

# === KONFIG ===
export BORG_RSH='ssh -i /root/.ssh/hetzner_borg -p 23 -o StrictHostKeyChecking=no'
export BORG_PASSPHRASE=$(cat /root/.borg-passphrase)
export BORG_REMOTE_PATH="borg-1.4"
NEXTCLOUD_CLI="nextcloud_cli" 
NC_DATA="/mnt/docker/data/nextcloud/data"
NC_RELEASES="/mnt/docker/data/nextcloud/releases"
NC_OCC_PATH_IN_DOCKER="/var/www/nextcloud/releases/current/occ"
DB_CONTAINER="nextcloud_db"
DB_NAME="nextcloud"
DB_USER="root"
BORG_REPO="ssh://uXXXXX@uXXXXX.your-storagebox.de:23/./nextcloud-docker"
TMP_BACKUP="/tmp/nextcloud-$(date +%Y%m%d-%H%M%S)"
LOCK_FILE="/var/run/borg-nextcloud.lock"
LOG_FILE="/var/log/borg-nextcloud.log"

&#91; -f "$LOCK_FILE" ] &amp;&amp; { echo "Backup läuft!" >&amp;2; exit 1; }
echo $$ > "$LOCK_FILE"
trap 'rm -f "$LOCK_FILE" &amp;&amp; docker exec $NEXTCLOUD_CLI php $NC_OCC_PATH_IN_DOCKER maintenance:mode --off || true; rm -rf "$TMP_BACKUP"' EXIT INT TERM

exec > >(tee -a "$LOG_FILE") 2>&amp;1
echo "=== Nextcloud Backup start: $(date) ==="

# 1. Maintenance ON
docker exec $NEXTCLOUD_CLI php $NC_OCC_PATH_IN_DOCKER maintenance:mode --on

# 2. DB Dump (mit Passwort!)
mkdir -p "$TMP_BACKUP/sql"
DB_PASS=$(docker exec $DB_CONTAINER printenv MYSQL_ROOT_PASSWORD)
docker exec $DB_CONTAINER mysqldump --single-transaction --routines --triggers \
  --user="$DB_USER" --password="$DB_PASS" "$DB_NAME" | gzip > "$TMP_BACKUP/sql/db.sql.gz"

# 3. Config backup
docker exec $NEXTCLOUD_CLI php $NC_OCC_PATH_IN_DOCKER config:list --output=json > "$TMP_BACKUP/config.json"

# 4. Borg Create
borg create "$BORG_REPO"::nextcloud-{now:%Y-%m-%d-%H:%M} \
  "$TMP_BACKUP/" \
  "$NC_DATA" \
  "$NC_RELEASES" \
  --exclude "*/cache/*" \
  --exclude "*/tmp/*" \
  --exclude "*/updater-*" \
  --exclude "*/appdata_*/*cache*" \
  --compression lz4 --stats --progress

# 5. Prune
borg prune "$BORG_REPO" --stats \
  --keep-within=1w \
  --keep-weekly=4 \
  --keep-monthly=6 \
  --keep-yearly=2

echo "&#x2705; Backup fertig: $(date)"</code></pre>



<p class="wp-block-paragraph">Meine Backups sollen jede Nacht um 3 Uhr laufen. Dazu habe ich mir einen Service und Timer angelegt.</p>



<p class="wp-block-paragraph">Service: /etc/systemd/system/borg-nextcloud.service</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Nextcloud Borg Backup
After=network-online.target

&#91;Service]
Type=oneshot
User=root
ExecStart=/root/nextcloud_backup.sh</code></pre>



<p class="wp-block-paragraph">Timer: /etc/systemd/system/borg-nextcloud.timer</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Täglich Nextcloud Backup
Requires=borg-nextcloud.service

&#91;Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

&#91;Install]
WantedBy=timers.target</code></pre>



<p class="wp-block-paragraph">Service und Timer aktivieren</p>



<pre class="wp-block-code"><code>systemctl daemon-reload
systemctl enable --now borg-nextcloud.timer
systemctl status borg-nextcloud.timer</code></pre>



<p class="wp-block-paragraph">Kleiner Test ob alles funktioniert (Achtung, je nach Menge an Daten kann dies ein paar Stunden dauern)</p>



<pre class="wp-block-code"><code>systemctl start borg-nextcloud.service</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://julsen.de/hobby/server-homeserver/server-backup-via-borg-auf-storage-box/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
