<?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>Server / HomeServer &#8211; Julsens Blog</title>
	<atom:link href="https://julsen.de/thema/hobby/server-homeserver/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=6.9.4</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>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>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>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>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>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>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>Meine Backups sollen jede Nacht um 3 Uhr laufen. Dazu habe ich mir einen Service und Timer angelegt.</p>



<p>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>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>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>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>
		<item>
		<title>opnSense und Let&#8217;s Encrypt SSL Zertifikate fürs HomeLab</title>
		<link>https://julsen.de/hobby/server-homeserver/opnsense-und-lets-encrypt-ssl-zertifikate-furs-homelab/</link>
					<comments>https://julsen.de/hobby/server-homeserver/opnsense-und-lets-encrypt-ssl-zertifikate-furs-homelab/#respond</comments>
		
		<dc:creator><![CDATA[Julsen]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 14:24:48 +0000</pubDate>
				<category><![CDATA[Server / HomeServer]]></category>
		<category><![CDATA[HA Proxy]]></category>
		<category><![CDATA[Let's Encrypt]]></category>
		<category><![CDATA[opnsense]]></category>
		<category><![CDATA[SSL Zertifikate]]></category>
		<category><![CDATA[Unbound DNS]]></category>
		<guid isPermaLink="false">https://julsen.de/?p=523</guid>

					<description><![CDATA[Wer kennt es nicht, man hat massenhaft Dienste und Services im HomeLab am Laufen und muss immer die selber signierten Zertifikate erlauben oder auf jedem]]></description>
										<content:encoded><![CDATA[
<p>Wer kennt es nicht, man hat massenhaft Dienste und Services im HomeLab am Laufen und muss immer die selber signierten Zertifikate erlauben oder auf jedem System hinterlegen, um den Service nutzen zu können. In diesem Beitrag möchte ich zeigen, wie ich Let&#8217;s Encrypt bei mir im HomeLab nutze und die Zertifikate über den HA Proxy verfügbar mache. In meinem Setup wollte ich ausschließlich lokale Dienste und nichts über das Internet erreichbar machen.</p>



<p>Dazu verwende ich bei mir in der opnSense die zusätzlichen Plugins <strong>os-acme-client</strong> und <strong>os-haproxy</strong>, die unter <strong>System -&gt; Firmware -&gt; Plugins</strong> installiert werden müssen. Des Weiteren wird noch ein Domainanbieter mit API Zugriff benötigt. In meinem Fall nutze ich eine Domain von netcup und deren API. Meine Intranet URL Struktur wird später wie folgt aussehen <strong>*.intern.domain.tld</strong>.</p>



<h3 class="wp-block-heading">Domain API Passwort und Key erstellen</h3>



<p>Wie zuvor erwähnt bin ich bei netcup mit meinen Domains, hier einfach unter Stammdaten -&gt; &gt;_ API (oben rechts) oder direkt per Link <a href="https://www.customercontrolpanel.de/daten_aendern.php?sprung=api">https://www.customercontrolpanel.de/daten_aendern.php?sprung=api</a> auf <strong>API-Passwort generieren</strong> klicken und Passwort wegspeichern. Das wird nur 1x angezeigt! Auf der rechten Seite dann Nutzungsbedingungen lesen / verstehen und über die Checkbox akzeptieren und <strong>API-Key erstellen</strong> anklicken.</p>



<h3 class="wp-block-heading">ACME Client konfigurieren</h3>



<p>Unter <strong>Services -&gt; ACME Client -&gt; Settings</strong><br><img fetchpriority="high" decoding="async" width="800" height="393" class="wp-image-524" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/01-acme-client-settings.png" alt="" srcset="https://julsen.de/wp-content/uploads/2025/02/01-acme-client-settings.png 975w, https://julsen.de/wp-content/uploads/2025/02/01-acme-client-settings-300x147.png 300w, https://julsen.de/wp-content/uploads/2025/02/01-acme-client-settings-768x377.png 768w" sizes="(max-width: 800px) 100vw, 800px" /><br>Mit <strong>Apply </strong>bestätigen</p>



<p>Unter <strong>Services -&gt; ACME Client -&gt; Accounts</strong><br><img decoding="async" width="800" height="459" class="wp-image-525" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/02-acme-client-account.png" alt="" srcset="https://julsen.de/wp-content/uploads/2025/02/02-acme-client-account.png 898w, https://julsen.de/wp-content/uploads/2025/02/02-acme-client-account-300x172.png 300w, https://julsen.de/wp-content/uploads/2025/02/02-acme-client-account-768x440.png 768w" sizes="(max-width: 800px) 100vw, 800px" /><br>Hier kannst du für den Anfang und zum Testen die Test CA nutzen, musst du aber nicht. Wird später eh umgestellt. Die E-Mail Adresse sollte eine valide sein, da du von LE per Mails benachrichtigt wirst. Mit <strong>Save </strong>speichern<br><img decoding="async" width="127" height="123" class="wp-image-526" style="width: 127px;" src="https://julsen.de/wp-content/uploads/2025/02/03-acme-client-register-account.jpg" alt=""></p>



<p>Den Account registrieren lassen. Dazu auf der rechten Seite beim Eintrag auf <strong>Register account</strong> klicken.</p>



<p>Unter Services -&gt; ACME Client -&gt; Challenge Types die API Daten von deinem Domain Anbieter eintragen. In meinem Fall immer noch netcup und mit <strong>Save </strong>bestätigen<br><img loading="lazy" decoding="async" width="800" height="570" class="wp-image-527" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/04-acme-client-challenge-type.png" alt="" srcset="https://julsen.de/wp-content/uploads/2025/02/04-acme-client-challenge-type.png 893w, https://julsen.de/wp-content/uploads/2025/02/04-acme-client-challenge-type-300x214.png 300w, https://julsen.de/wp-content/uploads/2025/02/04-acme-client-challenge-type-768x547.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></p>



<p>Unter Services -&gt; ACME Client -&gt; Certificates muss nun das wildcard Zertifikat angelegt werden. <br><img loading="lazy" decoding="async" width="800" height="784" class="wp-image-529" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/05-acme-client-certificates.jpg" alt=""><br><img loading="lazy" decoding="async" width="300" height="166" class="wp-image-530" style="width: 300px;" src="https://julsen.de/wp-content/uploads/2025/02/06-acme-client-issue-certificate.jpg" alt=""><br>Der <strong>Last ACME Status</strong> sollte dann auf OK stehen.</p>



<h3 class="wp-block-heading">Die opnSense mit dem Zertifikat absichern</h3>



<p>Unter <strong>System -> Settings -> General</strong> muss auch die Domain eingetragen werden.<br><img loading="lazy" decoding="async" width="800" height="363" class="wp-image-535" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/02-opnsense-general-url.jpg" alt=""></p>



<p>Unter <strong>System -> Settings -> Administration</strong> das Zertifikat auswählen, Domain hinterlegen und den Port ändern. Der Port kann frei gewählt werden, muss aber >= 1024 sein. Alles bis 1023 sind reservierte Systemports bzw. Portnummern bekannter Netzwerkdienste. <br><img loading="lazy" decoding="async" width="800" height="499" class="wp-image-532" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/01-opnsense-admin-settings.jpg" alt=""></p>



<p>Nach dem Speichern sollte die opnSense unter der alten IP <strong>https://IP:55443</strong> und der URL <strong>https://opnsense.intern.DOMAIN.tld:55443</strong> erreichbar sein. </p>



<p>Unbound DNS Overrides</p>



<p>Falls der Unbound DNS noch nicht verwendet wird, muss dieser aktiviert und konfiguriert werden. Unter Services -> Unbound DNS -> General<br><img loading="lazy" decoding="async" width="800" height="776" class="wp-image-534" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/01-unbound-dns-general.jpg" alt=""></p>



<p>Unter System -> Settings -> Gerneral habe ich sämtliche IPs meiner opnSense eingetragen.<br><img loading="lazy" decoding="async" width="800" height="726" class="wp-image-536" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/02-opnsense-general-dns.jpg" alt=""></p>



<p>Unter <strong>Services -> Unbound DNS -> Overrides</strong> müssen wir nun für jeden Service den wir über eine Subdomain erreichen wollen, einen Override anlegen. Die IP Adresse muss auf eine IP oder opnSense zeigen (wichtig). Theoretisch ginge auch der Weg über eine virtuelle IP, der Einfachheithalber habe ich diesen Schritt weggelassen. Kann aber auch später nachgezogen oder direkt erledigt werden.<br><img loading="lazy" decoding="async" width="800" height="347" class="wp-image-537" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/03-unbound-dns-overrides.jpg" alt=""></p>



<p>Nach Änderungen an den Unbound DNS Einstellungen muss der Dienst immer neugestartet werden. <img loading="lazy" decoding="async" width="150" height="85" class="wp-image-539" style="width: 150px;" src="https://julsen.de/wp-content/uploads/2025/02/04-unbound-dns-restart.jpg" alt=""></p>



<h3 class="wp-block-heading">HAProxy konfigurieren</h3>



<p>Für jeden Service, den wir unter einer Subdomain erreichen wollen, müssen wir einen echten Server unter <strong>Services -> HAProxy -> Settings -> Real Servers -> Real Servers</strong> anlegen.<br><img loading="lazy" decoding="async" width="800" height="607" class="wp-image-541" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/01-haproxy-real-servers.jpg" alt=""><br>Wichtig ist hier die IP (FQDN or IP), der Port und ob der Service selbst schon SSL (egal, ob es ein self signed cert ist) verwendet, unter der der Service erreichbar ist. Unser Browser geht mit der Subdomain über den HAProxy und hier wird das Let&#8217;s Encrypt Zertifikat ausgespielt. Der HAProxy selbst leitet den Traffic dann intern zu unserem Service weiter. Hier wird dann wenn SSL aktiviert das selbst signierte Zertifikat oder eben kein Zertifikat verwendet.</p>



<p>Unter <strong>Services -> HAProxy -> Settings -> Virtual Services -> Backend Pools</strong> wird zu jedem Backend Server ein Backend Pool angelegt. Ausnahme: Ein Backend Pool kann jedoch mehrere Backend Server enthalten. Wird aber nur beim Load Balancing benötigt.<br><img loading="lazy" decoding="async" width="800" height="1075" class="wp-image-542" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/02-haproxy-backend-pool.jpg" alt=""></p>



<p>Unter <strong>Services -> HAProxy -> Settings -> Advanced -> Map File</strong> müssen wir doch eine Subdomain auf Backend Pool Mapping erstellen. Das Mapping nutzen wir, um nicht für jeden Backend Pool einen Public Service anlegen zu müssen. </p>



<p>Das Mapping ist einfach und setzt sich immer wie folgt zusammen<br>subdomain oder komplette domain Backend Pool<br>homeassistant HomeAssistant_Backend<br>oder<br>homeassistant.intern.domain.tld HomeAssistant_Backend<br><img loading="lazy" decoding="async" width="800" height="285" class="wp-image-543" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/03-haproxy-map-file.jpg" alt=""></p>



<p>Unter <strong>Services -> HAProxy -> Settings -> Rules &amp; Checks -> Conditions</strong> müssen eine Condition anlegen, um http zu https redirecten zu können.<br><img loading="lazy" decoding="async" width="800" height="335" class="wp-image-544" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/04-haproxy-condition-no.ssl_.jpg" alt=""></p>



<p>Unter <strong>Services -> HAProxy -> Settings -> Rules &amp; Checks -> Rules</strong> müssen wir zwei Regeln anlegen. Eine um den HTTP Traffic nach HTTPS redirecten und eine um das Domain zu Backend Pool mapping durchführen zu können.<br><img loading="lazy" decoding="async" width="800" height="522" class="wp-image-545" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/05-haproxy-rule-http-to-https.jpg" alt=""><br><img loading="lazy" decoding="async" width="800" height="560" class="wp-image-546" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/06-haproxy-rule-subdomain-mapping.jpg" alt=""></p>



<p>Wir nähern uns dem Ende und müssen nur noch zwei Frontends anlegen. Eins für HTTP und eins für HTTPS. Dies erledigen wir unter <strong>Services -> HAProxy -> Settings -> Virtual Services -> Public Services</strong>.<br><img loading="lazy" decoding="async" width="800" height="1608" class="wp-image-548" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/07-haproxy-public-service-http-to-https.jpg" alt=""><br><img loading="lazy" decoding="async" width="800" height="1972" class="wp-image-549" style="width: 800px;" src="https://julsen.de/wp-content/uploads/2025/02/08-haproxy-public-service-https.jpg" alt=""></p>



<p>Zu guter letzt noch <strong>Test syntax</strong> und wenn keine Fehler gefunden wurden auf <strong>Apply</strong> klicken und deine Services sollten in deinem lokalen Netzwerk nun über die Subdomains erreichbar sein.<br><img loading="lazy" decoding="async" width="500" height="230" class="wp-image-550" style="width: 500px;" src="https://julsen.de/wp-content/uploads/2025/02/homeassistant-mit-lets-encrypt-cert.jpg" alt=""></p>



<p>P.S.: Solltest du bei einem Service wie z.B. HomeAssistant HTTP Fehler bekommen, dann kann es daran liegen, dass du im Service den Trusted Proxy in der Config setzen musst. Bei HomeAssistant kommt, wenn man es nicht konfiguriert, ein 400 Bad Gateway Fehler.</p>



<p>HomeAssistant Bsp.</p>



<p>In der configuration.yml müssen <code>use_x_forwarded_for</code> und <code>trusted_proxies</code> eingetragen werden</p>



<pre class="wp-block-code"><code>http:
  ssl_certificate: ssl/fullchain.pem
  ssl_key: ssl/privkey.pem
  use_x_forwarded_for: true
  trusted_proxies:
    - 192.168.178.1
    - 127.0.0.1
    - ::1</code></pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://julsen.de/hobby/server-homeserver/opnsense-und-lets-encrypt-ssl-zertifikate-furs-homelab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP Link EAP613 v1 AX1800 und openWrt</title>
		<link>https://julsen.de/hobby/technik/tp-link-eap613-v1-ax1800-und-openwrt/</link>
					<comments>https://julsen.de/hobby/technik/tp-link-eap613-v1-ax1800-und-openwrt/#respond</comments>
		
		<dc:creator><![CDATA[Julsen]]></dc:creator>
		<pubDate>Thu, 13 Jun 2024 19:12:58 +0000</pubDate>
				<category><![CDATA[Server / HomeServer]]></category>
		<category><![CDATA[Technik]]></category>
		<category><![CDATA[EAP613]]></category>
		<category><![CDATA[openWrt]]></category>
		<category><![CDATA[TP-Link]]></category>
		<guid isPermaLink="false">https://julsen.de/?p=475</guid>

					<description><![CDATA[Aktuell bin ich dabei mich ein wenig mit dem Thema Netzwerk und Co auseinander zu setzen und richte mir in diesem Zuge ein neues Heimnetzwerk]]></description>
										<content:encoded><![CDATA[
<p>Aktuell bin ich dabei mich ein wenig mit dem Thema Netzwerk und Co auseinander zu setzen und richte mir in diesem Zuge ein neues Heimnetzwerk ein. Dazu gehört auch die Ablösung meiner vorhandenen Fritz! Boxen sowie Repeater. Für den ersten Schritt habe ich mir ein Aruba Instant On 1930 8G Class4 PoE 2SFP 124W Switch und den TP Link EAP613 AX1800 besorgt. Das Switch besitzt 8 PoE Ports wo von einer den EAP613 mit Strom versorgen wird.</p>



<p>Eigentlich wollte ich auch nichts übers Flashen von openWrt auf den EAP613 schreiben, jedoch hatte ich so meine Herausforderungen dabei und konnte nicht wirklich etwas dazu im Netz finden.</p>



<p>Für den Flash der openWrt Firmware waren diese drei Quellen von Relevanz für mich<br><a href="https://openwrt.org/docs/guide-quick-start/factory_installation" target="_blank" rel="noreferrer noopener nofollow">openWrt Factory Install</a><br><a href="https://openwrt.org/toh/hwdata/tp-link/tp-link_eap613_v1" target="_blank" rel="noreferrer noopener nofollow">openWrt Firmware for EAP613 v1</a><br><a href="https://git.openwrt.org/?p=openwrt/openwrt.git;a=commit;h=11588c52b47c2c3b2cdc7849ce9e4804bfdb8bb5" target="_blank" rel="noreferrer noopener nofollow">openWrt install instructions EAP613 v1</a></p>



<p>Ok, den ersten Link hatte ich erst hinterher gefunden, als ich mich auf Fehlersuche begeben hatte. Dort wird erklärt, wie die FW zu flashen und was zu beachten ist. Ich bin der Anleitung aus dem 3. Link gefolgt. Im ersten Link steht noch zusätzlich, dass die Prüfsumme der Firmware vorm Flashen geprüft werden sollte, dies hatte ich nicht gemacht, hat bei mir aber keine Probleme verursacht, da die Datei OK war, die ich geflasht hatte.</p>



<h4 class="wp-block-heading">openWrt auf den TP Link EAP613 rev. 1 flashen</h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-vivid-red-color has-text-color has-link-color has-small-font-size wp-elements-7833e0ac217ea2387b20650b7cd748b6">Disclaimer:<br>Ich übernehme keinerlei Haftung für evt. Schäden die auftreten können. Wenn du dir unsicher bis, lies dir noch mal die Infos auf den openWrt Seiten etc. durch und wäge ab, ob du deinen AP wirklich auf openWrt umstellen magst. Sollte beim installieren von openWrt etwas schief laufen, ist es ein hoher Aufwand den Ursprungszustand wiederherzustellen</p>
</blockquote>



<ol class="wp-block-list">
<li>Beim 2.  Link von oben die Firmware laden (Firmware OpenWrt Install URL &#8211; Nicht den Snapshot und auch nicht das Update! ) </li>



<li>Die Datei <code>openwrt-23.05.3-ramips-mt7621-tplink_eap613-v1-squashfs-factory.bin</code> ggf. validieren (Prüfsumme) und in <code>factory.bin </code>umbenennen.</li>



<li>EAP613 mit dem PoE Switch oder Netzteil und Router / PC verbinden und starten lassen.</li>



<li>Per Browser auf die AP IP connecten und sich mit admin:admin einloggen</li>



<li>Dort in den AP Einstellungen SSH aktivieren und speichern.</li>



<li>Per SSH auf den AP connecten (User, IP und ggf. Port anpassen)<br><code>ssh -p 22 -oHostKeyAlgorithms=+ssh-dss admin@192.168.178.145</code></li>



<li>In der SSH Console dann den Befehl <code>cliclientd stopcs</code> eingeben. Dies wird mit <code>Success</code> bestätigt.<br><img loading="lazy" decoding="async" width="600" height="384" class="wp-image-479" style="width: 600px;" src="https://julsen.de/wp-content/uploads/2024/06/EAP613-openwrt-preparations.png" alt="" srcset="https://julsen.de/wp-content/uploads/2024/06/EAP613-openwrt-preparations.png 1140w, https://julsen.de/wp-content/uploads/2024/06/EAP613-openwrt-preparations-300x192.png 300w, https://julsen.de/wp-content/uploads/2024/06/EAP613-openwrt-preparations-1024x656.png 1024w, https://julsen.de/wp-content/uploads/2024/06/EAP613-openwrt-preparations-768x492.png 768w" sizes="auto, (max-width: 600px) 100vw, 600px" /></li>



<li>Zurück im Browser in der Weboberfäche unter Firmware Update die factory.bin auswählen und auf update klick. Das Update dauert ein paar Minuten. In der Zeit das Gerät nicht vom Strom trennen und das Browserfenster offen lassen.</li>
</ol>



<h4 class="wp-block-heading">Fehler / Probleme</h4>



<p>Ich hatte bei mir die Herausforderung, dass der AP mit openWrt nicht mehr erreichbar war. Er war zwar sichtbar im Router und Switch, hatte aber keine IP. Dachte erst ich hätte ihn gebrickt, lag aber daran, dass dort die IP Configuration auf DHCP Server stand. Ich habe dann den PoE Switch, EAP613 und einen PC zusammen laufen lassen. Der EAP613 fungierte dann als DHCP Server / Router und hat die IPs verteilt. Selbst war der AP dann unter 192.168.1.1 erreichbar und ich konnte mich mit dem Benutzer root und ohne Password einloggen. Dort habe ich dann beim aktiven Interface auf DHCP client umgestellt und gespeichert. Danach konnte ich das Switch wieder ins Netzwerk hängen und der AP hat eine IP zugewiesen bekommen.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://julsen.de/hobby/technik/tp-link-eap613-v1-ax1800-und-openwrt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>E-Mails auf neuen Server umziehen / migrieren</title>
		<link>https://julsen.de/hobby/server-homeserver/e-mails-auf-neuen-server-umziehen-migrieren/</link>
					<comments>https://julsen.de/hobby/server-homeserver/e-mails-auf-neuen-server-umziehen-migrieren/#respond</comments>
		
		<dc:creator><![CDATA[Julsen]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 16:30:24 +0000</pubDate>
				<category><![CDATA[Server / HomeServer]]></category>
		<category><![CDATA[emails]]></category>
		<category><![CDATA[emails kopieren]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[imapsync]]></category>
		<category><![CDATA[migrieren]]></category>
		<guid isPermaLink="false">https://julsen.de/?p=454</guid>

					<description><![CDATA[Disclaimerich habe den Beitrag nach besten Wissen und Gewissen verfasst und übernehme keine Verantwortung für evtl. Schäden oder Verluste von E-Mails etc. Die Verwendung der]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-pullquote"><blockquote><p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Disclaimer<br>ich habe den Beitrag nach besten Wissen und Gewissen verfasst und übernehme keine Verantwortung für evtl. Schäden oder Verluste von E-Mails etc. Die Verwendung der hier bereitgestellten Informationen beruht auf eigene Gefahr!</mark></p></blockquote></figure>



<p>Muss oder möchte man seine E-Mail Postfächer von einem auf einen anderen Server umziehen und die alten Mails übernehmen, so kann dies einfach per <a href="https://github.com/imapsync/imapsync" target="_blank" rel="noreferrer noopener nofollow">imapsync</a> erledigt werden. </p>



<p>Ich persönlich habe irgendwann aufgegeben, einen eigenen Mailserver zu betreiben und habe mir hierfür den Service gemietet, damit ich muss um nichts kümmern muss. Jetzt war ich nur leider dazu gezwungen, meine Postfächer von einem auf einen anderen zu migrieren. Prinzipiell gesehen lässt sich das auch per Mail Client erledigen, dauert aber verdammt lange und ich habe auch nicht jedes verwendete Postfach selbst in Verwendung. Hier bietet es sich auch direkt an, imapsync auf einem Server im Rechenzetrum oder dem Home Server auszulagern. Eine Installation lokal auf dem eigenen PC/Notebook ist aber auch kein Problem. Dafür habe ich mir ein Dockerfile und docker-compose.yml file erstellt. Beides kann  <a href="https://github.com/julianzimmermann/docker-imapsync" target="_blank" rel="noreferrer noopener nofollow">hier</a> abgerufen werden.</p>



<p>Der Weg über imapsync in Docker setzt Docker und docker compose voraus. Beides gibts für Win, Mac sowie auch Linux. Auf eine Installation für Docker gehe ich hier nicht weiter ein, da es hierzu schon zahlreiche Anleitungen gibt und auch von Docker (<a href="https://docs.docker.com/get-docker/" target="_blank" rel="noreferrer noopener nofollow">Docker installieren</a>) selbst.</p>



<h3 class="wp-block-heading">imapsync installieren / einrichten</h3>



<p>Wenn Docker installiert und gestartet ist, werden die beiden Dateien von <a href="https://github.com/julianzimmermann/docker-imapsync" target="_blank" rel="noreferrer noopener nofollow">hier</a> benötigt. Einfach irgendwo zusammen in einem Ordner ablegen und den Pfad schon mal im CMD / Terminal öffnen.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="975" height="513" src="https://julsen.de/wp-content/uploads/2024/04/imapsync-pfad.png" alt="" class="wp-image-455" srcset="https://julsen.de/wp-content/uploads/2024/04/imapsync-pfad.png 975w, https://julsen.de/wp-content/uploads/2024/04/imapsync-pfad-300x158.png 300w, https://julsen.de/wp-content/uploads/2024/04/imapsync-pfad-768x404.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></figure>



<p>Mit dem Befehl </p>



<div class="wp-block-codesue-terminal-block" title="bash" style="--wp--default--terminal--block--color--background:#252a33;--wp--default--terminal--block--color--text:#eee;--wp--default--terminal--block--color--accent:#a2a2a2">
<p class="wp-block-codesue-terminal-command-block display-prompt" prompt="$">docker-compose up -d &#8211;build </p>
</div>



<p>wird ein Image des benötigten Debian Grundsystems geladen, die benötigten Pakete für imapsync, zsh etc. installiert.</p>



<p>Nachdem build Prozess sollte der Docker Container im Hintergrund gestartet sein. Dies kann mit folgendem Befehl geprüft werden.</p>



<div class="wp-block-codesue-terminal-block" title="bash" style="--wp--default--terminal--block--color--background:#252a33;--wp--default--terminal--block--color--text:#eee;--wp--default--terminal--block--color--accent:#a2a2a2">
<p class="wp-block-codesue-terminal-command-block display-prompt" prompt="$">docker ps -a</p>



<p class="wp-block-codesue-terminal-output-block">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br>cbeb72a63848 docker-imapsync_imapsync &#8222;tail -f /dev/null&#8220; 4 days ago Up 2 seconds imapsync</p>
</div>



<p>Der Status wichtig, hier sollte irgendwas von &#8218;<code>Up X seconds</code>&#8218; oder &#8218;<code>Up x minutes</code>&#8218; etc. stehen. Wenn hier &#8218;<code>Exited (x) x seconds ago</code>&#8218; steht, ist ein Fehler passiert und der Container konnte nicht gestartet werden. Hier hilft ein &#8218;<code>docker logs imapsync</code>&#8218; Befehl um die Logs des Containers angezeigt zu bekommen.</p>



<p>Wenn der Container gestartet ist, kann sich per Terminal verbunden werden bzw. wir können auf den Docker Container springen.</p>



<div class="wp-block-codesue-terminal-block" title="bash" style="--wp--default--terminal--block--color--background:#252a33;--wp--default--terminal--block--color--text:#eee;--wp--default--terminal--block--color--accent:#a2a2a2">
<p class="wp-block-codesue-terminal-command-block display-prompt" prompt="$">docker exec -it imapsync zsh</p>
</div>



<p>Anstelle von zsh kann auch bash oder sh als shell verwendet werden. Ich persönlich präferiere hier die Z shell.</p>



<p>Nun kann getestet werden, ob imapsync richtig installiert wurde.</p>



<div class="wp-block-codesue-terminal-block" title="bash" style="--wp--default--terminal--block--color--background:#252a33;--wp--default--terminal--block--color--text:#eee;--wp--default--terminal--block--color--accent:#a2a2a2">
<p class="wp-block-codesue-terminal-command-block display-prompt" prompt="$">./imapsync &#8211;testslive</p>
</div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="474" src="https://julsen.de/wp-content/uploads/2024/04/imapsync-test-1024x474.png" alt="" class="wp-image-457" srcset="https://julsen.de/wp-content/uploads/2024/04/imapsync-test-1024x474.png 1024w, https://julsen.de/wp-content/uploads/2024/04/imapsync-test-300x139.png 300w, https://julsen.de/wp-content/uploads/2024/04/imapsync-test-768x356.png 768w, https://julsen.de/wp-content/uploads/2024/04/imapsync-test.png 1028w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Postfächer vorbereiten</h3>



<p>Ich habe (händisch) auf dem neuen Mailserver jedes Postfach welches ich synchronieren werde, neu angelegt. Hier habe ich überall das selbe einfach Passwort wie z.B. &#8218;target123&#8242; festgelegt. Auf dem alten Mailserver habe ich von jedem Postfach das Passwort auf z.B. &#8217;source123&#8216; geändert, um den sync Vorgang etwas einfacher zu gestalten.</p>



<p>Auch ist es sinnvoll, gelösche Elemente so wie SPAMs schon vom alten Server komplett zu löschen, da es sonst sehr lange dauern kann die alle zu übernehmen.</p>



<p>Nachdem diese Vorbereitungen abgeschlossen sind, kann gesynct werden.</p>



<h3 class="wp-block-heading">Sync Vorgang starten</h3>



<div class="wp-block-codesue-terminal-block" title="bash" style="--wp--default--terminal--block--color--background:#252a33;--wp--default--terminal--block--color--text:#eee;--wp--default--terminal--block--color--accent:#a2a2a2">
<p class="wp-block-codesue-terminal-command-block display-prompt" prompt="$">./imapsync &#8211;addheader &#8211;automap &#8211;delete1 &#8211;host1 MAILSERVER1 &#8211;host2 MAILSERVER2 &#8211;password1 PASSWORTSOURCE &#8211;password2 PASSWORTTARGET &#8211;user1 LOGINSOURCE &#8211;user2 LOGINTARGET</p>
</div>



<p>Ich habe alle Mails mit dem oben angegebenen Befehl synchronisieren lassen. Eine genaue Übersicht aller Befehle kann in der imapsync Dokumentation oder man page nachgeschaut werden.</p>



<p>Folgende Platzhalter müssen angepasst werden:</p>



<pre class="wp-block-code"><code>MAILSERVER1 -&gt; IP oder Adresse vom alten Mailserver
MAILSERVER2 -&gt; IP oder Adresse vom neuen Mailserver
PASSWORTSOURCE -&gt; Login PW z.B. source123
PASSWORTTARGET -&gt; Login PW z.B. target123
LOGINSOURCE -&gt; Benutzername oder E-Mail für Login
LOGINTARGET -&gt; Benutzername oder E-Mail für Login</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Es ist auch noch wichtig zu erwähnen, dass der Parameter &#8211;delete1, alle erfolgreich synchronisierte Nachrichten von host1/MAILSERVER1 unwiderruflich löscht! Also aufpassen!</strong></p>
</blockquote>



<p>Der Befehl kann kann per STRG + C abgebrochen werden und später einfach wieder neugestartet werden. Auch kann der Befehl nach Erfolg alle paar Stunden wieder ausgeführt werden, um die restlichen noch eintreffenden Mails zu syncen. Ich hab den Sync 24h nach Erfolg das letze Mal noch gestartet (DNS Cache), um wirklich noch die letzten Mails zu syncen.</p>



<p>Der Sync dauert unterschiedlich lange, so wurden bei mir teilweise 60 Mails die Sekunde kopiert, aber auch bei sehr großen Postfächern mit 12 GB mit 60 Mails/s gestartet und dann zwischendurch runter auf 0,5 Mails/s gefallen. Ein mehrfacher Neustart brachte auch keinen Erfolg. So haben teilweise ein paar Postfächer mehrere Tage gebraucht um kopiert zu werden.</p>



<h3 class="wp-block-heading">DNS Einstellungen aktualisieren (nur, wenn E-Mail Adressen gleich bleiben)</h3>



<p>Wenn mindestens die Domain gleich bleibt, z.B. test@julsen.de sync zu test@julsen.de (julsen.de bleibt gleich), muss noch der DNS Eintrag angepasst werden. Dies ist meist in der Verwaltungsoberfläche bei dem Anbieter, wo auch die Domain gehostet wird. Es kann bis zu 24 Stunden dauern, bis überall die neuen Einträge angekommen sind und nicht mehr die alten aus dem DNS Cache gezogen werden. </p>



<p>Hier kann sicherlich auch mit der MX Priorisierung gearbeitet werden und nach Sync einfach der alte Mailserver dann gekillt werden, geht aber nur wenn man auch Zugriff auf den alten Server hat.</p>



<h3 class="wp-block-heading">Passwörter setzen</h3>



<p>Wichtig ist am Ende noch alle Passwörter wieder auf sichere Passwörter zu ändern!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://julsen.de/hobby/server-homeserver/e-mails-auf-neuen-server-umziehen-migrieren/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
