<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
    <title>weinboerner.de</title>
    <link>https://www.weinboerner.de</link>
    <description>Mein privater Blog zu Amateurfunk, Elektronik, Agentic Engineering und Selfhosting</description>
    <language>de-de</language>
    <lastBuildDate>Tue, 03 Nov 2026 10:30:31 GMT</lastBuildDate>
    <atom:link href="https://www.weinboerner.de/feed.xml" rel="self" type="application/rss+xml" />

    
    <item>
        <title>Direktes Transceiver Signal mit SDR Stick verarbeiten</title>
        <link>https://www.weinboerner.de/2026/10/30/direktes-transceiver-signal-mit-sdr-stick-verarbeiten/</link>
        <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://weinboerner.de/2026/10/30/direktes-transceiver-signal-mit-sdr-stick-verarbeiten/</guid>
        <description>&lt;p&gt;Es war mal wieder Zeit für den &lt;a href=&#34;https://amateurfunkmarkt.de/&#34;&gt;Dortmunder Amateurfunkmarkt in Kamen&lt;/a&gt;. Nachdem dieser in 2025 ausgefallen war, jetzt mit neuem Standort in Kamen. Ein wirklich gelungener Neustart!&lt;/p&gt;
&lt;p&gt;Ich wollte mir schon seit Längerem eine Dummy-Load mit Messausgang kaufen. Leider habe ich da bisher nie ein bezahlbares Angebot gefunden, mit dem man auch mal ein bisschen Leistung machen kann. Als Alternative hab ich in Kamen dann aber einen schönen Leistungsabschwächer von JFW aus den USA gefunden.&lt;/p&gt;
&lt;p&gt;Zusammen mit einem weiteren Abschwächer für meinen RTL-SDR v4 Stick ist daraus ein kleiner Messaufbau für meinen Icom IC-737A geworden. Ich wollte mir unbedingt das eigene Sendesignal mit vollen 100 Watt am Laptop anschauen. Den RTL-SDR v4 mit SDR++ hatte ich schon, er läuft bei mir unter macOS und Linux.&lt;/p&gt;
&lt;p&gt;Zwischen Sender und SDR sitzt jetzt der JFW 50FH-040-100-3N mit 40 dB Dämpfung und 100 Watt Dauerleistung. Dahinter hab ich noch ein 20-dB-Dämpfungsglied mit SMA-Anschlüssen gesetzt und die Verbindung zum JFW mit passenden Adaptern hergestellt. Zusammen sind das nominal 60 dB. Warum es beide Glieder braucht, lässt sich gut ausrechnen.&lt;/p&gt;
&lt;h2&gt;Vom Sender zum SDR&lt;/h2&gt;
&lt;p&gt;Hier die Strecke nochmal grafisch dargestellt:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/mermaid/21edb3f5c0ae7e52b8bc0a384fdf06e0702d4c5a2009506aeb6723f8d51deb68.png&#34; alt=&#34;Mermaid Diagram&#34; class=&#34;mermaid-diagram&#34; width=&#34;276&#34; height=&#34;606&#34;&gt;&lt;/p&gt;
&lt;p&gt;Und wieso das alles? Der Transceiver darf niemals direkt an den RTL-SDR angeschlossen werden. Die Senderleistung, selbst nur 20 Watt, kann den Eingang des SDR zerstören. &lt;/p&gt;
&lt;p&gt;Aber auch mit Dämpfung muss vor dem Anschluss klar sein, welchen Pegel der Empfänger verträgt. Denn dabei sind zwei Grenzen zu unterscheiden: Der Eingang kann schon übersteuern, lange bevor er beschädigt wird. Selbst wenn der SDR-Stick nicht sofort kaputtgeht, kann das angezeigte Signal bereits stark verfälscht sein.&lt;/p&gt;
&lt;p&gt;Der große JFW sitzt zuerst in der Kette, weil er fast die gesamte Senderleistung in Wärme umsetzen muss. Das kleine SMA-Glied kommt dahinter. Bei vertauschter Reihenfolge müsste das kleine Glied die volle Senderleistung aufnehmen. Dafür ist ein gewöhnliches SMA-Dämpfungsglied nicht ausgelegt.&lt;/p&gt;
&lt;h2&gt;Warum die 40 dB allein noch nicht reichen&lt;/h2&gt;
&lt;p&gt;Bei 100 W kommen hinter dem JFW rechnerisch noch 10 mW raus. Für einen empfindlichen Empfänger ist das weiterhin viel. Das zusätzliche 20-dB-Glied reduziert diese Leistung noch einmal auf ein Hundertstel.&lt;/p&gt;
&lt;p&gt;Die Rechnung dahinter: 10 dB Dämpfung teilen die Leistung durch zehn, 20 dB durch hundert und 40 dB durch zehntausend. Bei hintereinandergeschalteten Dämpfungsgliedern in einem angepassten System lassen sich die dB-Werte addieren:&lt;/p&gt;
&lt;div class=&#34;math-display&#34; tabindex=&#34;0&#34; role=&#34;region&#34; aria-label=&#34;Mathematische Formel&#34;&gt;&lt;span class=&#34;katex&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34; display=&#34;block&#34;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&#34;0.25em&#34; columnalign=&#34;right left&#34; columnspacing=&#34;0em&#34;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;msub&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;g&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;e&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;s&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;40&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;20&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;60&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;msub&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;u&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;e&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;i&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;g&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;e&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;s&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;/&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\begin{aligned}
A_{\mathrm{gesamt}} &amp;amp;= 40\,\mathrm{dB} + 20\,\mathrm{dB} = 60\,\mathrm{dB} \\
P_{\mathrm{aus}} &amp;amp;= P_{\mathrm{ein}} \cdot 10^{-A_{\mathrm{gesamt}}/(10\,\mathrm{dB})}
\end{aligned}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;60 dB bedeuten damit ein Millionstel der ursprünglichen Leistung. Aus 100 W werden nominal 0,1 mW.&lt;/p&gt;
&lt;p&gt;Empfängerpegel werden häufig in dBm angegeben. Das ist eine Leistungsangabe bezogen auf 1 mW. 0 dBm entsprechen genau 1 mW; bei negativen Werten liegt die Leistung darunter. Für den Leistungspegel &lt;span class=&#34;katex&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;L_P&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt; wird daraus eine einfache Subtraktion:&lt;/p&gt;
&lt;div class=&#34;math-display&#34; tabindex=&#34;0&#34; role=&#34;region&#34; aria-label=&#34;Mathematische Formel&#34;&gt;&lt;span class=&#34;katex&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34; display=&#34;block&#34;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&#34;0.25em&#34; columnalign=&#34;right left&#34; columnspacing=&#34;0em&#34;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;msub&gt;&lt;mrow&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/msub&gt;&lt;mtext&gt; ⁣&lt;/mtext&gt;&lt;mrow&gt;&lt;mo fence=&#34;true&#34;&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;W&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo fence=&#34;true&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;W&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;msub&gt;&lt;mrow&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;000&lt;/mn&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;n&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;h&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;40&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;40&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;n&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;h&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;60&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;true&#34;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;60&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mrow&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;d&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;B&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\begin{aligned}
L_P &amp;amp;= 10\log_{10}\!\left(\frac{P}{1\,\mathrm{mW}}\right)\,\mathrm{dBm} \\
L_P(100\,\mathrm{W}) &amp;amp;= 10\log_{10}(100\,000)\,\mathrm{dBm} = 50\,\mathrm{dBm} \\
L_{\mathrm{nach\ 40\,dB}} &amp;amp;= 50\,\mathrm{dBm} - 40\,\mathrm{dB} = +10\,\mathrm{dBm} \\
L_{\mathrm{nach\ 60\,dB}} &amp;amp;= 50\,\mathrm{dBm} - 60\,\mathrm{dB} = -10\,\mathrm{dBm}
\end{aligned}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Für einige Senderleistungen ergibt sich folgende Tabelle. Alle Werte sind berechnet, die dBm-Werte gerundet:&lt;/p&gt;
&lt;div aria-label=&#34;Datentabelle&#34; class=&#34;data-table-wrapper&#34; role=&#34;region&#34; tabindex=&#34;0&#34;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Leistung am JFW-Eingang&lt;/th&gt;
&lt;th&gt;Nach 40 dB&lt;/th&gt;
&lt;th&gt;Pegel nach 40 dB&lt;/th&gt;
&lt;th&gt;Nach insgesamt 60 dB&lt;/th&gt;
&lt;th&gt;Pegel nach 60 dB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5 W&lt;/td&gt;
&lt;td&gt;0,5 mW&lt;/td&gt;
&lt;td&gt;−3 dBm&lt;/td&gt;
&lt;td&gt;0,005 mW&lt;/td&gt;
&lt;td&gt;−23 dBm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 W&lt;/td&gt;
&lt;td&gt;1 mW&lt;/td&gt;
&lt;td&gt;0 dBm&lt;/td&gt;
&lt;td&gt;0,01 mW&lt;/td&gt;
&lt;td&gt;−20 dBm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 W&lt;/td&gt;
&lt;td&gt;5 mW&lt;/td&gt;
&lt;td&gt;+7 dBm&lt;/td&gt;
&lt;td&gt;0,05 mW&lt;/td&gt;
&lt;td&gt;−13 dBm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 W&lt;/td&gt;
&lt;td&gt;10 mW&lt;/td&gt;
&lt;td&gt;+10 dBm&lt;/td&gt;
&lt;td&gt;0,1 mW&lt;/td&gt;
&lt;td&gt;−10 dBm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;p&gt;Das setzt die nominale Dämpfung in einem angepassten 50-Ohm-System voraus. Die tatsächlichen Pegel hängen auch von den Bauteiltoleranzen, Kabelverlusten und Fehlanpassungen ab. Aus den 60 dB folgt deshalb keine pauschale Zusicherung, dass der SDR damit in jeder Einstellung unverzerrt arbeitet.&lt;/p&gt;
&lt;h2&gt;Wo die 100 Watt bleiben&lt;/h2&gt;
&lt;p&gt;Der JFW hat einen Eingang und einen abgeschwächten Ausgang. So ein Bauteil heißt Zweitor. Eine separate, fast ungedämpfte Verbindung zur Antenne gibt es daran nicht, wie sie etwa ein Richtkoppler hätte. In meinem Aufbau wird die Senderleistung halt einfach verheizt.&lt;/p&gt;
&lt;p&gt;Im &lt;a href=&#34;https://www.jfwindustries.com/pdf/50FH-XXX-100-3.pdf&#34;&gt;JFW-Datenblatt&lt;/a&gt; stehen für die Baureihe nominal 50 Ohm und ein Frequenzbereich von Gleichspannung bis 3 GHz. Bei der 40-dB-Ausführung beträgt die Dämpfungstoleranz ±0,75 dB, das maximale SWR ist mit 1,4:1 angegeben. Die zulässige mittlere Eingangsleistung liegt bei 100 W bei 25 °C und sinkt bei 85 °C auf 50 W.&lt;/p&gt;
&lt;p&gt;Bei 100 W am Eingang und nominal 10 mW am Ausgang bleiben im JFW rechnerisch etwa 99,99 W als Wärme. Der Kühlkörper braucht also freie Luft. Zum Ausprobieren hab ich mit wenig Leistung und kurzen Sendedurchgängen angefangen. Wird der Abschwächer heiß, muss die Leistung reduziert werden oder das Gerät abkühlen. Bei höherer Umgebungstemperatur darf man nicht mehr von 100 W Belastbarkeit ausgehen. &lt;/p&gt;
&lt;p&gt;Bei meinen mehrminütigen SSB-Sendedurchgängen mit der 100-Watt-Einstellung ist der Abschwächer nicht heiß geworden. Bei SSB schwankt die Leistung mit der Sprache, die mittlere Leistung liegt bei Sprachbetrieb gewöhnlich unter der Spitzenleistung.&lt;/p&gt;
&lt;h2&gt;Das Signal in SDR++ anschauen&lt;/h2&gt;
&lt;p&gt;Mit SDR++ lässt sich das Sendesignal im Spektrum und Wasserfall ansehen und als Audio demodulieren. So lassen sich zum Beispiel unterschiedliche Mikrofonpegel oder Einstellungen des Sprachkompressors vergleichen. Im Wasserfall sieht man, wie sich das Signal beim Sprechen verändert und welchen Frequenzbereich es einnimmt.&lt;/p&gt;
&lt;p&gt;Für den Einstieg reichen geringe Senderleistung und niedrige manuelle Empfangsverstärkung. Für vergleichbare Pegel sollten automatische Verstärkungsregelungen ausgeschaltet sein, damit sie Unterschiede nicht ausgleichen. Frequenz, Betriebsart und Empfangsbandbreite müssen zum Sendesignal passen. Die Bias-Tee-Speisung bleibt bei dieser passiven Messstrecke aus.&lt;/p&gt;
&lt;p&gt;Der V4 braucht einen passenden Treiber. Der berücksichtigt auch die interne Kurzwellenumsetzung, ein eigener Frequenzversatz ist dafür nicht nötig. Die &lt;a href=&#34;https://www.rtl-sdr.com/rtl-sdr-blog-v4-dongle-initial-release/&#34;&gt;Herstellerbeschreibung des V4&lt;/a&gt; erklärt das und die verfügbare Verstärkungsregelung auf Kurzwelle.&lt;/p&gt;
&lt;p&gt;Für einen Vergleich bietet sich folgender Ablauf an:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Einstellungen von Sender und SDR notieren und einen kurzen Ausgangszustand aufnehmen&lt;/li&gt;
&lt;li&gt;Nur eine Größe verändern, etwa den Mikrofonpegel&lt;/li&gt;
&lt;li&gt;Das Ergebnis bei unveränderten Empfangseinstellungen vergleichen&lt;/li&gt;
&lt;li&gt;Zur vorherigen Einstellung zurückkehren und den Vergleich wiederholen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tauchen zusätzliche Linien oder ein auffällig breites Signal auf, kommt auch Übersteuerung im SDR als Ursache infrage. Zur Prüfung lässt sich bei unverändertem Sendesignal und unveränderten Empfangseinstellungen zusätzliche externe Dämpfung vor den SDR setzen. Nehmen die Nebenprodukte relativ zum Nutzsignal deutlich ab, spricht das für Verzerrungen im Empfänger. Ein einzelnes Wasserfallbild reicht nicht, um sie sicher dem Sender zuzuschreiben.&lt;/p&gt;
&lt;p&gt;Für belastbare Angaben zu Oberwellenabständen oder Intermodulation braucht man eine entsprechend geprüfte Messkette. Auch eine dBm-Anzeige in der Software wird durch die vorgeschalteten Dämpfungsglieder allein noch nicht zu einer kalibrierten Leistungsmessung.&lt;/p&gt;</description>
    </item>
    
    <item>
        <title>Lokaler Caddy für SSL und DNS im LAN</title>
        <link>https://www.weinboerner.de/2026/10/13/lokaler-caddy-fuer-ssl-und-dns-im-lan/</link>
        <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://www.weinboerner.de/2026/10/13/lokaler-caddy-fuer-ssl-und-dns-im-lan/</guid>
        <description>&lt;p&gt;Ich wollte meine Dienste im Heimnetz unbedingt per HTTPS aufrufen können. Dabei ging es mir vor allem um die Bedienung. Ohne vernünftige DNS-Namen und Zertifikate, die der Browser direkt akzeptiert, fühlt sich das für mich nach Bastelei an. Der Sicherheitsgewinn war für mich eher zweitrangig.&lt;/p&gt;
&lt;p&gt;Meine E-Book-Bibliothek mit Calibre-Web sollte deshalb unter &lt;code&gt;bib.lab.weinboerner.de&lt;/code&gt; erreichbar sein. Die Domain &lt;code&gt;weinboerner.de&lt;/code&gt; habe ich schon lange, sie ist meine persönliche Adresse im Internet. Damit haben auch die lokalen Dienste einen Namen mit Wiedererkennungswert, und ich muss mir keine IP-Adresse mit Port merken.&lt;/p&gt;
&lt;p&gt;Caddy kannte ich bereits aus anderen Projekten als Reverse Proxy. lego ist im Laufe der Recherche dazugekommen, um für die internen Dienste öffentlich vertrauenswürdige Zertifikate zu bekommen. Zusammen mit AdGuard Home ist daraus mein Zugang zur Bibliothek geworden.&lt;/p&gt;
&lt;h2&gt;Aufbau&lt;/h2&gt;
&lt;p&gt;AdGuard Home beantwortet im Heimnetz die DNS-Anfrage für &lt;code&gt;bib.lab.weinboerner.de&lt;/code&gt; mit der internen Adresse meines Caddy-Servers. Der Browser verbindet sich anschließend per HTTPS mit Caddy auf Port 443. Caddy liefert das Zertifikat aus und leitet die Anfrage an Calibre-Web weiter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/mermaid/c311f82b10d76766e56d995db377cd36047a78a909aa2b5357a35d3216d7919f.png&#34; alt=&#34;Mermaid Diagram&#34; class=&#34;mermaid-diagram&#34; width=&#34;501&#34; height=&#34;350&#34;&gt;&lt;/p&gt;
&lt;p&gt;Caddy ist hier der Reverse Proxy. Der DNS-Server bleibt AdGuard Home. Für das öffentlich vertrauenswürdige Zertifikat übernimmt lego die Prüfung über die DNS-API von United-Domains. Das Zertifikat landet anschließend als Datei bei Caddy.&lt;/p&gt;
&lt;p&gt;Damit die Bibliothek intern bleibt, müssen die Firewallregeln dazu passen. Ein fehlender öffentlicher DNS-Eintrag verhindert keinen Zugriff auf eine anderweitig erreichbare Adresse. Das gilt für IPv4 und IPv6, mögliche Portweiterleitungen und andere Zugangswege. Auch die Anmeldung an der Bibliothek bleibt erforderlich; ein gültiges Zertifikat ersetzt keine Zugriffskontrolle.&lt;/p&gt;
&lt;h2&gt;Voraussetzungen&lt;/h2&gt;
&lt;p&gt;Meine Domain liegt schon seit langer Zeit bei United-Domains. Mit dem Anbieter habe ich gute Erfahrungen gemacht. Für diesen Aufbau war es praktisch, dass es dort eine DNS-API gibt und lego den passenden Adapter mitbringt. Die Einrichtung hat bei mir sehr gut funktioniert.&lt;/p&gt;
&lt;p&gt;Für die automatische Zertifikatsausstellung muss lego einen DNS-Nachweis in der öffentlichen Zone setzen können. Die &lt;a href=&#34;https://www.united-domains.de/domain-dnsapi/&#34;&gt;DNS-API von United-Domains&lt;/a&gt; muss dafür im Portfolio hinzugebucht sein, und die Zone muss über die Nameserver des Anbieters verwaltet werden. Eine dort registrierte Domain mit externen Nameservern reicht für diesen API-Weg nicht aus.&lt;/p&gt;
&lt;p&gt;Auch die lego-Version ist relevant. Der &lt;a href=&#34;https://go-acme.github.io/lego/dns/uniteddomains/&#34;&gt;United-Domains-Adapter&lt;/a&gt; heißt &lt;code&gt;uniteddomains&lt;/code&gt; und ist seit Version 4.29.0 enthalten. Das reguläre &lt;a href=&#34;https://packages.debian.org/trixie/lego&#34;&gt;Debian-13-Paket&lt;/a&gt; liegt zum Recherchestand vom 2. November 2026 noch bei 4.9.1-2. Ein &lt;code&gt;apt install lego&lt;/code&gt; aus dieser Quelle bringt den benötigten Adapter deshalb nicht mit. Dafür braucht man eine passende neuere Version, beispielsweise aus den offiziellen Releases.&lt;/p&gt;
&lt;p&gt;Der Adapter erwartet den Schlüssel in &lt;code&gt;UNITEDDOMAINS_API_KEY&lt;/code&gt;. Mit &lt;code&gt;UNITEDDOMAINS_API_KEY_FILE&lt;/code&gt; lässt sich stattdessen auf eine geschützte Datei verweisen. Der Wert hat das Format &lt;code&gt;prefix.secret&lt;/code&gt; und gehört weder ins Repository noch in eine offen lesbare Crontab.&lt;/p&gt;
&lt;p&gt;United-Domains erlaubt laut eigener Dokumentation keine Beschränkung dieses Zugangs auf eine einzelne Domain. Der Schlüssel gilt für das gesamte Portfolio. Die Secretdatei sollte deshalb nur für den Prozess lesbar sein, der lego ausführt. Caddy braucht den DNS-API-Schlüssel zum Ausliefern des Zertifikats nicht.&lt;/p&gt;
&lt;p&gt;Meine ältere Konfigurationsnotiz verwendet die lego-v4-Syntax mit getrenntem &lt;code&gt;run&lt;/code&gt; und &lt;code&gt;renew&lt;/code&gt;. Die &lt;a href=&#34;https://go-acme.github.io/lego/index.print.html&#34;&gt;lego-Dokumentation&lt;/a&gt; beschreibt bereits die v5-Umstellung auf &lt;code&gt;run&lt;/code&gt; für beide Aufgaben sowie geänderte Optionen und Ablagepfade. Die Befehle und ein späterer Erneuerungsjob müssen zur tatsächlich installierten Version passen. Deshalb lassen sich alte Cronzeilen und aktuelle Beispiele nicht beliebig mischen.&lt;/p&gt;
&lt;h2&gt;DNS-Konfiguration&lt;/h2&gt;
&lt;p&gt;Für den Zugriff im LAN zeigt die &lt;a href=&#34;https://adguard-dns.io/kb/adguard-home/configuration/#filtering&#34;&gt;DNS-Umschreibung in AdGuard Home&lt;/a&gt; auf Caddy. Als Beispiel verwende ich hier &lt;code&gt;192.168.10.10&lt;/code&gt; für den Proxy:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;table class=&#34;codehilitetable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span class=&#34;normal&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;bib.lab.weinboerner.de -&amp;gt; 192.168.10.10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Das ist ein Beispielwert, keine Abschrift meiner laufenden Netzkonfiguration. Die Antwort enthält die Adresse des Proxys. Adresse und Port von Calibre-Web werden erst in Caddy hinterlegt.&lt;/p&gt;
&lt;p&gt;Für die Bibliothek reicht der einzelne Name. Eine Umschreibung für &lt;code&gt;*.lab.weinboerner.de&lt;/code&gt; kann auch mehrere Dienstnamen auf denselben Proxy zeigen lassen. Für jeden Dienst braucht Caddy dann die passende Weiterleitung.&lt;/p&gt;
&lt;p&gt;Mit dieser Umschreibung findet der Browser den richtigen Server. Für eine vertrauenswürdige HTTPS-Verbindung fehlt noch das Zertifikat für den angefragten Namen.&lt;/p&gt;
&lt;h2&gt;Zertifikatsausstellung&lt;/h2&gt;
&lt;p&gt;Für das Zertifikat verwende ich DNS-01. Dabei prüft die Zertifizierungsstelle, ob ich einen vorgegebenen TXT-Eintrag im öffentlichen DNS setzen kann. lego erledigt das über die United-Domains-API. Die lokale Antwort von AdGuard Home ist an diesem Nachweis nicht beteiligt.&lt;/p&gt;
&lt;p&gt;Für ein Zertifikat nur für &lt;code&gt;bib.lab.weinboerner.de&lt;/code&gt; lautet der Nachweisname:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;table class=&#34;codehilitetable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span class=&#34;normal&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;_acme-challenge.bib.lab.weinboerner.de
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;lego setzt den geforderten Wert, wartet auf dessen Verfügbarkeit und lässt ihn prüfen. Anschließend wird der Challenge-Eintrag wieder entfernt. &lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&#34;&gt;Let&#39;s Encrypt beschreibt DNS-01&lt;/a&gt; ausdrücklich als Verfahren für Dienste, deren Webserver nicht aus dem Internet erreichbar ist. Dafür braucht mein Caddy keine Portfreigabe. Ein öffentlicher A- oder AAAA-Eintrag für die Bibliothek ist ebenfalls nicht nötig.&lt;/p&gt;
&lt;p&gt;Meine Konfigurationsnotiz umfasst &lt;code&gt;lab.weinboerner.de&lt;/code&gt; und &lt;code&gt;*.lab.weinboerner.de&lt;/code&gt; in einem Zertifikat. Das Wildcard deckt Namen wie &lt;code&gt;bib.lab.weinboerner.de&lt;/code&gt; ab. Für den Basisnamen &lt;code&gt;lab.weinboerner.de&lt;/code&gt; selbst gilt es nicht; dieser steht deshalb zusätzlich im Zertifikat. Weitere Ebenen wie &lt;code&gt;test.bib.lab.weinboerner.de&lt;/code&gt; sind ebenfalls nicht abgedeckt. Beim Wildcard-Nachweis liegt der TXT-Eintrag unter &lt;code&gt;_acme-challenge.lab.weinboerner.de&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Öffentlich vertrauenswürdig bedeutet allerdings auch, dass die Zertifikatsnamen sichtbar werden können. Let&#39;s Encrypt veröffentlicht ausgestellte Zertifikate in &lt;a href=&#34;https://letsencrypt.org/docs/ct-logs/&#34;&gt;Certificate-Transparency-Logs&lt;/a&gt;. Ein Einzelzertifikat nennt dort den Bibliotheksnamen, ein Wildcard-Zertifikat den Wildcard-Namen. Die einzelnen damit verwendeten Dienstnamen stehen dadurch nicht automatisch im Log. Der Dienst selbst muss dafür weiterhin nicht öffentlich erreichbar sein.&lt;/p&gt;
&lt;h2&gt;Caddy-Konfiguration&lt;/h2&gt;
&lt;p&gt;Nach der Ausstellung braucht Caddy das Zertifikat mit der Zwischenzertifikatskette und den passenden privaten Schlüssel als PEM-Dateien. Ein DNS-Provider-Modul in Caddy ist dafür nicht nötig, weil lego die ACME-Verwaltung übernimmt.&lt;/p&gt;
&lt;p&gt;Die Dateien müssen vor dem Laden vorhanden und für den Caddy-Prozess lesbar sein. Der private Schlüssel braucht entsprechend enge Rechte. Auch die Verzeichnisse im Pfad müssen den Zugriff erlauben. Bei einem Container müssen die Dateien unter dem dort angegebenen Pfad erreichbar sein.&lt;/p&gt;
&lt;p&gt;Ein reduziertes Beispiel für die Bibliothek sieht so aus. Die Backendadresse &lt;code&gt;192.168.10.30:8083&lt;/code&gt; und die Dateipfade sind ebenfalls Beispielwerte:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;table class=&#34;codehilitetable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span class=&#34;normal&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;normal&#34;&gt;2&lt;/span&gt;
&lt;span class=&#34;normal&#34;&gt;3&lt;/span&gt;
&lt;span class=&#34;normal&#34;&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;bib.lab.weinboerner.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;tls&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/caddy/certs/lab.fullchain.pem&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/caddy/certs/lab.key
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;reverse_proxy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http://192.168.10.30:8083
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Damit kann Caddy die HTTPS-Anfrage für &lt;code&gt;bib.lab.weinboerner.de&lt;/code&gt; an Calibre-Web weitergeben. Im Beispiel ist die Verbindung vom Browser zu Caddy verschlüsselt; zum Backend geht es über HTTP. Soll auch diese Strecke verschlüsselt werden, braucht sie eine passende HTTPS-Konfiguration mit geprüfter Zertifikatskette.&lt;/p&gt;
&lt;p&gt;Caddy erneuert diese ausdrücklich geladenen Zertifikate standardmäßig nicht selbst. Das beschreibt die &lt;a href=&#34;https://caddyserver.com/docs/caddyfile/directives/tls&#34;&gt;TLS-Dokumentation&lt;/a&gt;. Für den dauerhaften Betrieb muss deshalb auch die Erneuerung über lego funktionieren.&lt;/p&gt;
&lt;h2&gt;Zertifikatserneuerung&lt;/h2&gt;
&lt;p&gt;Bei mir übernimmt ein Cronjob die regelmäßige Zertifikatserneuerung. Damit läuft der Aufbau im Alltag sehr gut. Die Erneuerung gehört also genauso zur Einrichtung wie der erste Aufruf der Bibliothek.&lt;/p&gt;
&lt;p&gt;Als Intervall für die Prüfung bietet sich beispielsweise ein täglicher Lauf an. So bleibt Zeit für weitere Versuche, wenn DNS-Anbieter oder Zertifizierungsstelle vorübergehend nicht erreichbar sind. Ein neues Zertifikat wird dabei nur benötigt, wenn eine Erneuerung ansteht.&lt;/p&gt;
&lt;p&gt;Nach erfolgreicher Erneuerung müssen Zertifikat und Schlüssel als zusammengehöriges Paar an den vorgesehenen Ort gelangen. Beide Dateien müssen vollständig vorliegen und die Rechte stimmen, bevor Caddy neu geladen wird. Bei einem Fehler sollten die bisherigen funktionierenden Dateien erhalten bleiben. Fehlgeschlagene Läufe müssen auffallen, bevor das bisherige Zertifikat abläuft.&lt;/p&gt;
&lt;p&gt;Zum erneuten Einlesen manuell geladener Zertifikate dokumentiert Caddy &lt;code&gt;--force&lt;/code&gt;. Bei einer üblichen lokalen Installation mit aktivierter Admin-Schnittstelle lautet der Aufruf beispielsweise:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;table class=&#34;codehilitetable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span class=&#34;normal&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;caddy&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;reload&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/caddy/Caddyfile&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--adapter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;caddyfile&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--force
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Der &lt;a href=&#34;https://caddyserver.com/docs/command-line#caddy-reload&#34;&gt;Force-Reload&lt;/a&gt; berücksichtigt, dass sich Zertifikatsdateien ändern können, obwohl die Konfiguration gleich bleibt. Ein &lt;code&gt;systemctl reload caddy&lt;/code&gt; genügt dafür nur, wenn die hinterlegte Serviceaktion das ebenfalls berücksichtigt. Anschließend muss Caddy das neue Zertifikat tatsächlich über HTTPS ausliefern. Das Ablaufdatum einer Datei auf der Platte allein sagt darüber nichts aus.&lt;/p&gt;
&lt;p&gt;Ohne Internet können die lokale DNS-Auflösung und der Zugriff auf die lokal laufende Bibliothek mit noch gültigem Zertifikat weiter funktionieren. Für Ausstellung und Erneuerung benötigt lego dagegen die öffentlichen DNS- und ACME-Dienste.&lt;/p&gt;
&lt;h2&gt;Funktionsprüfung&lt;/h2&gt;
&lt;p&gt;Ob die Einrichtung das ursprüngliche Ziel erfüllt, lässt sich am vollständigen Zugriff prüfen: Der Name muss auf Caddy zeigen, der Browser muss dessen Zertifikat akzeptieren und hinter dem Proxy muss die Bibliothek antworten. Bei Problemen lassen sich diese Schritte einzeln untersuchen.&lt;/p&gt;
&lt;p&gt;Für eine gezielte DNS-Abfrage steht im folgenden Beispiel &lt;code&gt;192.168.10.2&lt;/code&gt; für AdGuard Home:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;table class=&#34;codehilitetable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span class=&#34;normal&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;normal&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dig&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;@192.168.10.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bib.lab.weinboerner.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;A
dig&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;@192.168.10.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bib.lab.weinboerner.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;AAAA
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Die Antworten müssen zur vorgesehenen Proxyadresse passen. Auch ein unerwarteter AAAA-Eintrag ist relevant, weil ein Client über IPv6 sonst ein anderes Ziel erreichen kann. Die lokale DNS-Umschreibung wirkt außerdem nur, wenn das Gerät den vorgesehenen Resolver verwendet. Ein Browser mit externem DNS-over-HTTPS kann daran vorbeifragen; das beschreibt auch die &lt;a href=&#34;https://support.mozilla.org/en-US/kb/firefox-dns-over-https&#34;&gt;Firefox-Dokumentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mit der Beispieladresse von Caddy lässt sich anschließend DNS für einen gezielten HTTPS-Test übergehen. Hostname und Zertifikatsprüfung bleiben dabei erhalten:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;table class=&#34;codehilitetable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span class=&#34;normal&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;normal&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--resolve&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bib.lab.weinboerner.de:443:192.168.10.10&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;https://bib.lab.weinboerner.de/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Klappt dieser Zugriff, während der normale Aufruf scheitert, ist die Namensauflösung ein naheliegender Ansatzpunkt. Bei einem Zertifikatsfehler kommen Name, Vertrauenskette, Gültigkeit und ein vergessenes Neuladen infrage. Antwortet Caddy mit &lt;code&gt;502 Bad Gateway&lt;/code&gt;, ist unter anderem zu prüfen, ob er Calibre-Web an der hinterlegten Adresse und am richtigen Port erreicht. Beim normalen Browseraufruf sollte schließlich die erwartete Bibliotheksoberfläche oder deren Anmeldung erscheinen.&lt;/p&gt;
&lt;p&gt;Für den Aufruf meiner Bibliothek bleibt damit &lt;code&gt;https://bib.lab.weinboerner.de&lt;/code&gt;. IP-Adresse und Backendport stehen in der Konfiguration; im Browser habe ich den vertrauten Namen mit akzeptiertem Zertifikat. Genau so wollte ich meine Bibliothek im Heimnetz benutzen.&lt;/p&gt;</description>
    </item>
    

</channel>
</rss>