<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Anwendungen on private Homepage von Rainer Rose</title>
    <link>https://www.rainerrose.de/docs/howto/</link>
    <description>Recent content in Anwendungen on private Homepage von Rainer Rose</description>
    <generator>Hugo</generator>
    <language>de</language>
    <copyright>Copyright © 1998-2026 Rainer Rose. All Rights Reserved.
</copyright>
    <lastBuildDate>Mon, 24 Oct 2022 16:06:43 +0200</lastBuildDate><atom:link href="https://www.rainerrose.de/docs/howto/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Paperless-ngx: Major-Upgrade oder Wechsel der Datenbank in Docker</title>
      <link>https://www.rainerrose.de/docs/howto/paperless-postgres-mariadb-upgrades/</link>
      <pubDate>Sun, 22 Feb 2026 18:21:03 +0100</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/paperless-postgres-mariadb-upgrades/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Durch Freunde wurde ich auf das Document Management System <code>paperless</code> aufmerksam, dass im derzeit aktuellen Fork <a href="https://tools.rainerrose.de/redirect.php?id=56" target="_blank" rel="noopener noreferrer">paperless-ngx<i class="fas fa-external-link-square-alt ms-1"></i></a> weiterlebt.
In Verbindung mit einem Einzugsscanner ist es ein wahr gewordener Traum, der mich sehr in meinem Alltag entlastet.</p>
<p>Das Aktualisieren von <em>paperless-ngx</em> (im Folgenden nur noch <em>paperless</em> genannt) unter <em>Docker</em> ist zwar in der <a href="https://tools.rainerrose.de/redirect.php?id=57" target="_blank" rel="noopener noreferrer">Dokumentation<i class="fas fa-external-link-square-alt ms-1"></i></a> recht gut beschrieben, aber das Updaten der Datenbank, finde ich zu kompliziert, weil es nur auf die offizielle <em>PostgreSQL</em>-Dokumentation verweist.</p>
<p>Hier müsste ich mit den CLI-Tools wie <code>pg_dumpall</code> und <code>pg_upgrade</code>  hantieren, was arbeiten im <em>Docker</em>-Container notwendig macht und vermutlich auch doppelte <em>Docker</em>-Container-Instanzen nötig macht. Eine automagische Migration unterstützen die <em>postgres</em>-images nach meinem Wissen derzeit nicht. Also habe ich eine andere Möglichkeit gesucht und auch gefunden!</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Durch Freunde wurde ich auf das Document Management System <code>paperless</code> aufmerksam, dass im derzeit aktuellen Fork <a href="https://tools.rainerrose.de/redirect.php?id=56" target="_blank" rel="noopener noreferrer">paperless-ngx<i class="fas fa-external-link-square-alt ms-1"></i></a> weiterlebt.
In Verbindung mit einem Einzugsscanner ist es ein wahr gewordener Traum, der mich sehr in meinem Alltag entlastet.</p>
<p>Das Aktualisieren von <em>paperless-ngx</em> (im Folgenden nur noch <em>paperless</em> genannt) unter <em>Docker</em> ist zwar in der <a href="https://tools.rainerrose.de/redirect.php?id=57" target="_blank" rel="noopener noreferrer">Dokumentation<i class="fas fa-external-link-square-alt ms-1"></i></a> recht gut beschrieben, aber das Updaten der Datenbank, finde ich zu kompliziert, weil es nur auf die offizielle <em>PostgreSQL</em>-Dokumentation verweist.</p>
<p>Hier müsste ich mit den CLI-Tools wie <code>pg_dumpall</code> und <code>pg_upgrade</code>  hantieren, was arbeiten im <em>Docker</em>-Container notwendig macht und vermutlich auch doppelte <em>Docker</em>-Container-Instanzen nötig macht. Eine automagische Migration unterstützen die <em>postgres</em>-images nach meinem Wissen derzeit nicht. Also habe ich eine andere Möglichkeit gesucht und auch gefunden!</p>
<p><code>paperless</code> liefert die beiden Tools <code>document_exporter</code> und <code>document_importer</code> mit, die ein <strong>vollständiges</strong> Backup und Wiederherstellung (Restore) der kompletten Instanz bereitstellt.</p>
<p>Mit diesen beiden Tools lässt sich ein Major-Upgrade bewerkstelligen. Wie ich heute rausfand ist sogar der Wechsel der Datenbank-Engine ohne allzu große Umstände möglich.</p>

<h2 id="überblick" data-numberify>Überblick<a class="anchor ms-1" href="#überblick"></a></h2>
<p>Der grobe Pfad für ein Major-Upgrade ist daher:</p>
<ul>
<li>Zuerst ein vollständiges Backup anfertigen.</li>
<li>Alle Daten inklusive Volumes wegwerfen.</li>
<li>Die <em>PostgreSQL</em>-Version im <code>docker-compose.yml</code> anpassen.</li>
<li>Schlussendlich alle Daten wieder importieren.</li>
</ul>
<p>Das hat bisher anstandslos geklappt.</p>
<p>Der Wechsel auf eine andere Datenbank-Engine wird weiter unten beschrieben.</p>

<h2 id="voraussetzungen" data-numberify>Voraussetzungen<a class="anchor ms-1" href="#voraussetzungen"></a></h2>
<p>Es setzt voraus, dass die Daten außerhalb der Docker-Umgebung landen. Das <code>export</code> Volume ist also als Verzeichnis unterhalb der <code>docker-compose.yml</code> so wie in den <a href="https://tools.rainerrose.de/redirect.php?id=58" target="_blank" rel="noopener noreferrer">Beispielen<i class="fas fa-external-link-square-alt ms-1"></i></a> definiert.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="w">      </span>- <span class="l">./export:/usr/src/paperless/export</span><span class="w">
</span></span></span></code></pre></div><p>Wie ich ein Datenbank-Upgrade im Detail durchführe, beschreibe ich im Folgenden.</p>
<p>Zuerst sollte sichergestellt sein, dass keine Importe ins <em>Paperless</em> stattfinden. Da ich alleine auf dem System arbeite und keinen E-Mail-Import verwende, kann ich das gut sicherstellen.</p>

<h2 id="backup" data-numberify>Backup<a class="anchor ms-1" href="#backup"></a></h2>
<p>Als ersten Schritt fertige ich ein Backup an. Dies geht wunderbar mit dem bereits erwähnten <code>document_exporter</code> folgendermaßen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">docker compose <span class="nb">exec</span> -T webserver document_exporter ../export -z -zn full-backup
</span></span></code></pre></div><p>Hier sollte dann eine Datei namens <code>full-backup.zip</code> außerhalb des Docker-Umgebung entstanden sein. Dies enthält alle relevanten Informationen für ein Desaster-Recovery.</p>

<blockquote class="alert alert-success" role="alert">
    <p class="alert-heading fw-bold">
      <i class="fas fa-lightbulb me-2"></i>Tipp
    </p>
    <p>Der zusätzliche Parameter <code>--no-progress-bar</code> sorgt für weniger Ausgaben in Backup-Scripten.</p>
</blockquote>

<h2 id="zurück-auf-null" data-numberify>Zurück auf Null<a class="anchor ms-1" href="#zurück-auf-null"></a></h2>
<p>Danach fahre ich alle Container herunter und lösche gleichzeitig alle <em>Docker</em> Volumes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">docker compose down --volumes
</span></span></code></pre></div><p>Die Ausgabe sollte ungefähr so aussehen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">[+] down 8/8
</span></span><span class="line"><span class="ln">2</span><span class="cl"> ✔ Container paperless-webserver-1 Removed   5.6s
</span></span><span class="line"><span class="ln">3</span><span class="cl"> ✔ Container paperless-broker-1    Removed   0.4s
</span></span><span class="line"><span class="ln">4</span><span class="cl"> ✔ Container paperless-db-1        Removed   0.3s
</span></span><span class="line"><span class="ln">5</span><span class="cl"> ✔ Volume paperless_media          Removed   0.2s
</span></span><span class="line"><span class="ln">6</span><span class="cl"> ✔ Volume paperless_pgdata         Removed   0.0s
</span></span><span class="line"><span class="ln">7</span><span class="cl"> ✔ Volume paperless_data           Removed   0.0s
</span></span><span class="line"><span class="ln">8</span><span class="cl"> ✔ Volume paperless_redisdata      Removed   0.0s
</span></span><span class="line"><span class="ln">9</span><span class="cl"> ✔ Network paperless_default       Removed                     
</span></span></code></pre></div>
<h2 id="neue-version-wählen" data-numberify>Neue Version wählen<a class="anchor ms-1" href="#neue-version-wählen"></a></h2>
<p>Nun kann ich in der <code>docker-compose.yml</code>-Datei das Datenbank-Image auf die gewünschte Version der Datenbank hochziehen.</p>
<p>Für PostgreSQL gibt es <a href="https://tools.rainerrose.de/redirect.php?id=59" target="_blank" rel="noopener noreferrer">hier im Repo eine Vorlage<i class="fas fa-external-link-square-alt ms-1"></i></a> an der ich mich orientiert habe. Im Mai 2025 war es die Version 17.
Also änderte ich den Eintrag <code>docker-compose.yml</code> von der Version 16.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="w">  </span><span class="nt">db</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">docker.io/library/postgres:16</span><span class="w">
</span></span></span></code></pre></div><p>auf die Version 17</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="w">  </span><span class="nt">db</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">docker.io/library/postgres:17</span><span class="w">
</span></span></span></code></pre></div><p>Es empfiehlt sich eh ab und zu da mal einzuschauen, ob nicht z.B. eine neue redis-Version unterstützt wird.
Ich selbst stütze mich nur auf die Haupt (Major-Versionen). Bei Minor- oder Patch-Updates pulle ich das jeweilige neue Image und starte alle Docker-Container neu, das reicht mir und hat sich bei mir bewährt.</p>

<blockquote class="alert alert-warning" role="alert">
    <p class="alert-heading fw-bold">
      <i class="fas fa-exclamation-circle me-2"></i>Hinweis
    </p>
    <p>Aktuell ist im Repo die <em>PostgreSQL</em>-Version 18 angegeben. Leider wirft der Docker-Container <code>db-1</code> einiges an Fehlermeldungen und startet sich immer wieder neu. Eine Lösung dazu beschreibe ich weiter unten; hier soll es jetzt erst einmal mit dem Upgrade von 16 auf 17 weiter gehen; schließlich hat das Update von 15 auf 16 vor einiger Zeit genauso geklappt.</p>
</blockquote>

<h2 id="erster-start" data-numberify>Erster Start<a class="anchor ms-1" href="#erster-start"></a></h2>
<p>Nach dem Ändern der Major-Version (bzw. des Tags) vom <em>postgres</em>-Image, können die Docker-Container von <em>paperless</em> schon wieder gestartet werden. Sofern das Image lokal noch nicht vorliegt, wird es automatisch heruntergeladen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">docker compose up -d
</span></span></code></pre></div><p>Folgendes sollte als Ausgabe zu sehen sein:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln"> 1</span><span class="cl">[+] up 22/22
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"> ✔ Image docker.io/library/postgres:18 Pulled     15.3s
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"> ✔ Network paperless_default           Created    0.0s
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"> ✔ Volume paperless_data               Created    0.0s
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"> ✔ Volume paperless_media              Created    0.0s
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"> ✔ Volume paperless_redisdata          Created    0.0s
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"> ✔ Volume paperless_pgdata             Created    0.0s
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"> ✔ Container paperless-db-1            Created    0.2s
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> ✔ Container paperless-broker-1        Created    0.2s
</span></span><span class="line"><span class="ln">10</span><span class="cl"> ✔ Container paperless-webserver-1     Created   
</span></span></code></pre></div><p>Nun muss solange gewartet, bis die Login-Maske wieder mit dem Browser besuchbar ist.</p>
<p>Da dies einer Neuinstallation entspricht und daher Datenbanken etc. eingerichtet werden müssen, dauert dies je nach Rechenpower etwas. Daher ist etwas Geduld erforderlich.</p>
<p>Zeigt&rsquo;s im Browser <code>502 Bad Gateway</code> ist noch nicht alles fertig.  Neugierige werfen ein Blick in die Docker-Logs</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">docker compose logs -f
</span></span></code></pre></div><p>Wenn ungefähr folgende Log-Einträge zu sehen sind</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span> <span class="p">[</span><span class="n">tasks</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">bulk_edit</span><span class="o">.</span><span class="n">delete</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">signals</span><span class="o">.</span><span class="n">handlers</span><span class="o">.</span><span class="n">send_webhook</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">bulk_update_documents</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">check_scheduled_workflows</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">consume_file</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">empty_trash</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">index_optimize</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">sanity_check</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">train_classifier</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">documents</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">update_document_content_maybe_archive_file</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">paperless_mail</span><span class="o">.</span><span class="n">mail</span><span class="o">.</span><span class="n">apply_mail_action</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">paperless_mail</span><span class="o">.</span><span class="n">mail</span><span class="o">.</span><span class="n">error_callback</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span>   <span class="o">.</span> <span class="n">paperless_mail</span><span class="o">.</span><span class="n">tasks</span><span class="o">.</span><span class="n">process_mail_accounts</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span> 
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span> <span class="p">[</span><span class="mi">2025</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">29</span> <span class="mi">12</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mi">03</span><span class="p">,</span><span class="mi">792</span><span class="p">]</span> <span class="p">[</span><span class="n">INFO</span><span class="p">]</span> <span class="p">[</span><span class="n">celery</span><span class="o">.</span><span class="n">worker</span><span class="o">.</span><span class="n">consumer</span><span class="o">.</span><span class="n">connection</span><span class="p">]</span> <span class="n">Connected</span> <span class="n">to</span> <span class="n">redis</span><span class="p">:</span><span class="o">//</span><span class="n">broker</span><span class="p">:</span><span class="mi">6379</span><span class="o">//</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">webserver_1</span>  <span class="o">|</span> <span class="p">[</span><span class="mi">2025</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">29</span> <span class="mi">12</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mi">03</span><span class="p">,</span><span class="mi">982</span><span class="p">]</span> <span class="p">[</span><span class="n">INFO</span><span class="p">]</span> <span class="p">[</span><span class="n">celery</span><span class="o">.</span><span class="n">apps</span><span class="o">.</span><span class="n">worker</span><span class="p">]</span> <span class="n">celery</span><span class="err">@</span><span class="mf">7e94</span><span class="n">fdb4f941</span> <span class="n">ready</span><span class="o">.</span>
</span></span></code></pre></div><p>sollte die Login-Maske zur Einrichtung des ersten Benutzerkontos verfügbar sein und es kann mit dem nächsten Schritt weiter gemacht werden.</p>
<p><picture><img class="img-fluid " alt="Paperless-ngx Anmelde-Maske zur Einrichtung des ersten Benutzerkontos" src="https://www.rainerrose.de/images/docs/paperless-login-initial.png?v=960c44cf92448b0054d81f613282f43c" loading="lazy" width="405" height="716" />
</picture>

</p>

<h2 id="daten-wieder-importieren" data-numberify>Daten wieder importieren<a class="anchor ms-1" href="#daten-wieder-importieren"></a></h2>
<p>Über den <code>document_importer</code> lässt sich nun wieder alles importieren: Alle Dokumente, alle Tags, alle Benutzeraccounts, gespeicherten Ansichten usw.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">docker compose <span class="nb">exec</span> -T webserver document_importer ../export/full-backup.zip
</span></span></code></pre></div><p>Ausgabe:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">Checking the manifest
</span></span><span class="line"><span class="ln">2</span><span class="cl">Installed 4248 object(s) from 1 fixture(s)
</span></span><span class="line"><span class="ln">3</span><span class="cl">Copy files into paperless...
</span></span><span class="line"><span class="ln">4</span><span class="cl">100%|██████████| 1014/1014 [00:04&lt;00:00, 210.59it/s]
</span></span><span class="line"><span class="ln">5</span><span class="cl">Updating search index...
</span></span><span class="line"><span class="ln">6</span><span class="cl">100%|██████████| 1014/1014 [00:10&lt;00:00, 94.50it/s] 
</span></span></code></pre></div><p>Falls im Browser Weiterleitung auf den Unterpfad <code>/accounts/signup/?next=%2F</code> stattfand, diesen Pfad löschen!
Im Browser also wieder die gewohnte URL ansurfen und es sollte wieder die gewohnte Login-Maske erscheinen.</p>

<h2 id="fertig-anmelden" data-numberify>Fertig, anmelden<a class="anchor ms-1" href="#fertig-anmelden"></a></h2>
<p>Schlussendlich stoße ich noch einmal vorsichtshalber mein Backup-Script von Paperless noch an und bin fertig.</p>

<h2 id="postgresql-18" data-numberify>PostgreSQL 18<a class="anchor ms-1" href="#postgresql-18"></a></h2>
<p>Während ich diesen Artikel schrieb, stellte ich fest, dass in den <a href="https://tools.rainerrose.de/redirect.php?id=60" target="_blank" rel="noopener noreferrer">Vorlagen im Repo<i class="fas fa-external-link-square-alt ms-1"></i></a> zu <code>docker-compose.yml</code> schon <em>PostgreSQL</em> 18 unterstützt wird.
Ich bin daher genau nach meiner Anleitung vorgegangen und musste feststellen, dass der Datenbank-Container nicht nach oben kam.</p>
<p>In den Docker-Logs entdeckte ich dann folgende Meldungen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span> <span class="n">Error</span><span class="p">:</span> <span class="ow">in</span> <span class="mi">18</span><span class="o">+</span><span class="p">,</span> <span class="n">these</span> <span class="n">Docker</span> <span class="n">images</span> <span class="n">are</span> <span class="n">configured</span> <span class="n">to</span> <span class="n">store</span> <span class="n">database</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">a</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">format</span> <span class="n">which</span> <span class="n">is</span> <span class="n">compatible</span> <span class="n">with</span> <span class="s2">&#34;pg_ctlcluster&#34;</span> <span class="p">(</span><span class="n">specifically</span><span class="p">,</span> <span class="n">using</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">major</span><span class="o">-</span><span class="n">version</span><span class="o">-</span><span class="n">specific</span> <span class="n">directory</span> <span class="n">names</span><span class="p">)</span><span class="o">.</span>  <span class="n">This</span> <span class="n">better</span> <span class="n">reflects</span> <span class="n">how</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">PostgreSQL</span> <span class="n">itself</span> <span class="n">works</span><span class="p">,</span> <span class="ow">and</span> <span class="n">how</span> <span class="n">upgrades</span> <span class="n">are</span> <span class="n">to</span> <span class="n">be</span> <span class="n">performed</span><span class="o">.</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span> 
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">See</span> <span class="n">also</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">docker</span><span class="o">-</span><span class="n">library</span><span class="o">/</span><span class="n">postgres</span><span class="o">/</span><span class="n">pull</span><span class="o">/</span><span class="mi">1259</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span> 
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">Counter</span> <span class="n">to</span> <span class="n">that</span><span class="p">,</span> <span class="n">there</span> <span class="n">appears</span> <span class="n">to</span> <span class="n">be</span> <span class="n">PostgreSQL</span> <span class="n">data</span> <span class="ow">in</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>          <span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">postgresql</span><span class="o">/</span><span class="n">data</span> <span class="p">(</span><span class="n">unused</span> <span class="n">mount</span><span class="o">/</span><span class="n">volume</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span> 
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">This</span> <span class="n">is</span> <span class="n">usually</span> <span class="n">the</span> <span class="n">result</span> <span class="n">of</span> <span class="n">upgrading</span> <span class="n">the</span> <span class="n">Docker</span> <span class="n">image</span> <span class="n">without</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">upgrading</span> <span class="n">the</span> <span class="n">underlying</span> <span class="n">database</span> <span class="n">using</span> <span class="s2">&#34;pg_upgrade&#34;</span> <span class="p">(</span><span class="n">which</span> <span class="n">requires</span> <span class="n">both</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">versions</span><span class="p">)</span><span class="o">.</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span> 
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">The</span> <span class="n">suggested</span> <span class="n">container</span> <span class="n">configuration</span> <span class="k">for</span> <span class="mi">18</span><span class="o">+</span> <span class="n">is</span> <span class="n">to</span> <span class="n">place</span> <span class="n">a</span> <span class="n">single</span> <span class="n">mount</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">at</span> <span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">postgresql</span> <span class="n">which</span> <span class="n">will</span> <span class="n">then</span> <span class="n">place</span> <span class="n">PostgreSQL</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">a</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">subdirectory</span><span class="p">,</span> <span class="n">allowing</span> <span class="n">usage</span> <span class="n">of</span> <span class="s2">&#34;pg_upgrade --link&#34;</span> <span class="n">without</span> <span class="n">mount</span> <span class="n">point</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">boundary</span> <span class="n">issues</span><span class="o">.</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span> 
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">See</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">docker</span><span class="o">-</span><span class="n">library</span><span class="o">/</span><span class="n">postgres</span><span class="o">/</span><span class="n">issues</span><span class="o">/</span><span class="mi">37</span> <span class="k">for</span> <span class="n">a</span> <span class="p">(</span><span class="n">long</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span>         <span class="o">|</span>        <span class="n">discussion</span> <span class="n">around</span> <span class="n">this</span> <span class="n">process</span><span class="p">,</span> <span class="ow">and</span> <span class="n">suggestions</span> <span class="k">for</span> <span class="n">how</span> <span class="n">to</span> <span class="k">do</span> <span class="n">so</span><span class="o">.</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="n">db</span><span class="o">-</span><span class="mi">1</span> <span class="n">exited</span> <span class="n">with</span> <span class="n">code</span> <span class="mi">1</span> <span class="p">(</span><span class="n">restarting</span><span class="p">)</span>
</span></span></code></pre></div><p>Der Downgrade auf 17 war nach der obigen Anleitung recht schnell erledigt und <em>paperless</em> lief wieder zufriedenstellend mit der Version 17 von <em>PostgreSQL</em>.</p>

<h2 id="umstellung-auf-mariadb-12" data-numberify>Umstellung auf MariaDB 12<a class="anchor ms-1" href="#umstellung-auf-mariadb-12"></a></h2>
<p>Ich nahm dies als Anlass, die Datenbank-Engine auf MariaDB umzustellen.
Im Repo des Projektes gibt es dazu ebenfalls <a href="https://tools.rainerrose.de/redirect.php?id=61" target="_blank" rel="noopener noreferrer">eine Vorlage<i class="fas fa-external-link-square-alt ms-1"></i></a>.
Es gab drei Stellen, die ich dafür anpassen musste.</p>
<p>Es mussten im Abschnitt von <code>db</code> ein paar Umgebungsvariablen und natürlich das <code>image</code> umgestellt werden; hier ist 12 gerade aktuell.</p>
<p>Weiter unten im Abschnitt <code>webserver</code> mussten ebenfalls noch ein paar Umgebungsvariablen hinzugefügt werden.</p>
<p>Als letztes musste ich den Volume-Namen im Abschnitt <code>volumes</code> umbenennen.
Danach konnte ich die Container wieder starten und die Daten importieren, wie weiter oben beschrieben.</p>
<p>Nachfolgend ein <code>diff</code> aus meinem <em>ansible</em>-Playbook. (Ja, ich habe <code>restart</code> auch noch gleich umstellt bzw. an die neue Vorlage aus dem Projekt angeglichen. )</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="gd">--- a/roles/paperless/files/docker-compose.yml
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="gd"></span><span class="gi">+++ b/roles/paperless/files/docker-compose.yml
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="gi"></span><span class="gu">@@ -28,26 +28,24 @@
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="gu"></span> 
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"> services:
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">   broker:
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="gd">-    image: docker.io/library/redis:8
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="gd">-    restart: unless-stopped
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="gd"></span><span class="gi">+    image: docker.io/library/redis:7
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="gi">+    restart: always
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="gi"></span>     volumes:
</span></span><span class="line"><span class="ln">12</span><span class="cl">       - redisdata:/data
</span></span><span class="line"><span class="ln">13</span><span class="cl"> 
</span></span><span class="line"><span class="ln">14</span><span class="cl">   db:
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="gd">-    image: docker.io/library/mariadb:12
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="gd">-    restart: unless-stopped
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="gd"></span><span class="gi">+    image: docker.io/library/postgres:17
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="gi">+    restart: always
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="gi"></span>     volumes:
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="gd">-      - dbdata:/var/lib/mysql
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="gd"></span><span class="gi">+      - pgdata:/var/lib/postgresql/data
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="gi"></span>     environment:
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="gd">-      MARIADB_HOST: paperless
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="gd">-      MARIADB_DATABASE: paperless
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="gd">-      MARIADB_USER: paperless
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="gd">-      MARIADB_PASSWORD: paperless
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="gd">-      MARIADB_ROOT_PASSWORD: paperless
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="gd"></span><span class="gi">+      POSTGRES_DB: paperless
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="gi">+      POSTGRES_USER: paperless
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="gi">+      POSTGRES_PASSWORD: paperless
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="gi"></span> 
</span></span><span class="line"><span class="ln">32</span><span class="cl">   webserver:
</span></span><span class="line"><span class="ln">33</span><span class="cl">     image: ghcr.io/paperless-ngx/paperless-ngx:latest
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="gd">-    restart: unless-stopped
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="gd"></span><span class="gi">+    restart: always
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="gi"></span>     depends_on:
</span></span><span class="line"><span class="ln">37</span><span class="cl">       - db
</span></span><span class="line"><span class="ln">38</span><span class="cl">       - broker
</span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="gu">@@ -68,13 +66,9 @@ services:
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="gu"></span>       - extra.env
</span></span><span class="line"><span class="ln">41</span><span class="cl">     environment:
</span></span><span class="line"><span class="ln">42</span><span class="cl">       PAPERLESS_REDIS: redis://broker:6379
</span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="gd">-      PAPERLESS_DBENGINE: mariadb
</span></span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="gd"></span>       PAPERLESS_DBHOST: db
</span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="gd">-      PAPERLESS_DBUSER: paperless # only needed if non-default username
</span></span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="gd">-      PAPERLESS_DBPASS: paperless # only needed if non-default password
</span></span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="gd">-      PAPERLESS_DBPORT: 3306
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="gd"></span> volumes:
</span></span><span class="line"><span class="ln">49</span><span class="cl">   data:
</span></span><span class="line"><span class="ln">50</span><span class="cl">   media:
</span></span><span class="line"><span class="ln">51</span><span class="cl"><span class="gd">-  dbdata:
</span></span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="gd"></span><span class="gi">+  pgdata:
</span></span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="gi"></span>   redisdata:
</span></span></code></pre></div>]]></content:encoded>
    <enclosure url="https://www.rainerrose.de/images/docs/paperless.png" length="8086" type="image/.png" />
    </item>
    
    <item>
      <title>pdftk - PDF Dateien bearbeiten</title>
      <link>https://www.rainerrose.de/docs/howto/pdftk/</link>
      <pubDate>Wed, 14 May 2025 18:21:53 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/pdftk/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Zur Massenbearbeitung von PDF-Dateien gibt es das schöne Tool <code>pdftk</code> oder auch manchmal <code>pdftk-java</code> genannt.</p>
<p>Mit diesem Tool lassen sich z.B. PDF-Dateien in Einzel-Dateien aufsplitten, mehrere PDF-Dateien zu einer Gesamtdatei zusammenfassen, Seiten rotieren etc.</p>
<p>Um nicht immer Suchmaschinen bedienen zu müssen, erfolgt hier eine Auflistung <strong>meiner</strong> häufig genutzten Parameter.</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Zur Massenbearbeitung von PDF-Dateien gibt es das schöne Tool <code>pdftk</code> oder auch manchmal <code>pdftk-java</code> genannt.</p>
<p>Mit diesem Tool lassen sich z.B. PDF-Dateien in Einzel-Dateien aufsplitten, mehrere PDF-Dateien zu einer Gesamtdatei zusammenfassen, Seiten rotieren etc.</p>
<p>Um nicht immer Suchmaschinen bedienen zu müssen, erfolgt hier eine Auflistung <strong>meiner</strong> häufig genutzten Parameter.</p>

<h2 id="aufruf" data-numberify>Aufruf<a class="anchor ms-1" href="#aufruf"></a></h2>
<p>Wenn <code>pdftk</code> ohne Parameter aufgerufen wird, gibt es eine Kurzhilfe mit einer groben Auflistung der Parameter.</p>
<p><code>pdftk --help</code> ist zwar schon etwas geschwätziger, aber ein paar Spezialfälle fehlen mir da; diese folgen nun.</p>

<h2 id="zusammenfügen" data-numberify>Zusammenfügen<a class="anchor ms-1" href="#zusammenfügen"></a></h2>
<p>Kommando: <code>cat</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pdftk dateien-*.pdf cat output gesamtdatei.pdf
</span></span></code></pre></div>
<h2 id="trennen" data-numberify>Trennen<a class="anchor ms-1" href="#trennen"></a></h2>
<p>Kommando: <code>burst</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pdftk gesamtdatei.pdf burst output praefix_
</span></span></code></pre></div><p>Ergibt dann bei einer vierseiten PDF-Datei:</p>
<pre><code>doc_data.txt
praefix_pg_0001.pdf
praefix_pg_0002.pdf
praefix_pg_0003.pdf
praefix_pg_0004.pdf
</code></pre>

<h2 id="seiten-abwechselnd-rotieren" data-numberify>Seiten abwechselnd rotieren<a class="anchor ms-1" href="#seiten-abwechselnd-rotieren"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pdftk <span class="nv">A</span><span class="o">=</span>PdfDatei.pdf shuffle AoddWest AevenEast output PdfDatei_Rotiert.pdf
</span></span></code></pre></div>
<h2 id="einzelseite-rotieren" data-numberify>Einzelseite rotieren<a class="anchor ms-1" href="#einzelseite-rotieren"></a></h2>
<p>Kommando: <code>burst</code></p>
<p>Der Parameter setzt sich zusammen aus</p>
<ul>
<li>der Seitenzahl, wo begonnen werden soll.</li>
<li>der Seitenzahl, bis zu welcher Seite gedreht werden soll</li>
<li>der Drehrichtung</li>
</ul>
<p>zusammen.</p>
<table>
  <thead>
      <tr>
          <th>Drehrichtung</th>
          <th style="text-align: right">Grad</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>north</td>
          <td style="text-align: right">0</td>
      </tr>
      <tr>
          <td>east</td>
          <td style="text-align: right">90</td>
      </tr>
      <tr>
          <td>south</td>
          <td style="text-align: right">180</td>
      </tr>
      <tr>
          <td>west</td>
          <td style="text-align: right">270</td>
      </tr>
      <tr>
          <td>alternativ</td>
          <td style="text-align: right"></td>
      </tr>
      <tr>
          <td>left</td>
          <td style="text-align: right">-90</td>
      </tr>
      <tr>
          <td>right</td>
          <td style="text-align: right">+90</td>
      </tr>
      <tr>
          <td>down</td>
          <td style="text-align: right">+180</td>
      </tr>
  </tbody>
</table>
<p><strong>Beispielaufruf</strong></p>
<p>Ab Seite 1 bis zur letzten Seite (zum Ende) um 270 Grad:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pdftk PdfDatei.pdf rotate 1-endwest output rotiert.pdf
</span></span></code></pre></div><p>Alternativen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pdftk <span class="nv">A</span><span class="o">=</span>out.pdf shuffle Aoddsouth output rotiert.pdf
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pdftk <span class="nv">A</span><span class="o">=</span>out1.pdf <span class="nv">B</span><span class="o">=</span>out12.pdf cat A1-3 B1-7 A8 output rotiert.pdf 
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>ssh</title>
      <link>https://www.rainerrose.de/docs/howto/ssh/</link>
      <pubDate>Thu, 03 Oct 2024 18:15:41 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/ssh/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Tipps und Tricks zur SecureShell</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Tipps und Tricks zur SecureShell</p>

<h2 id="erzeugen-des-öffentlichen-schlüssels-aus-dem-privaten-schlüssel" data-numberify>Erzeugen des öffentlichen Schlüssels aus dem privaten Schlüssel<a class="anchor ms-1" href="#erzeugen-des-öffentlichen-schlüssels-aus-dem-privaten-schlüssel"></a></h2>
<p>Um einen fehlenden public key aus dem  private key zu generieren hilft folgendes Linux-Kommando:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ ssh-keygen -y -f ~/.ssh/id_rsa &gt; ~/.ssh/id_rsa.pub
</span></span><span class="line"><span class="ln">2</span><span class="cl">Enter passphrase:
</span></span></code></pre></div>
<h2 id="halten-der-verbindung" data-numberify>Halten der Verbindung<a class="anchor ms-1" href="#halten-der-verbindung"></a></h2>
<p><code>~/.ssh/config</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">Host *
</span></span><span class="line"><span class="ln">2</span><span class="cl">  ControlPath ~/.ssh/connections/%C
</span></span><span class="line"><span class="ln">3</span><span class="cl">  ControlMaster auto
</span></span><span class="line"><span class="ln">4</span><span class="cl">  ControlPersist 30m
</span></span></code></pre></div>
<h2 id="aufteilen-der-configs" data-numberify>Aufteilen der Configs<a class="anchor ms-1" href="#aufteilen-der-configs"></a></h2>
<p><code>~/.ssh/config</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">Include config.d/*
</span></span></code></pre></div>
<h2 id="port-forwarding" data-numberify>Port-Forwarding<a class="anchor ms-1" href="#port-forwarding"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ssh -L <span class="o">[</span>&lt;locale ip&gt;:<span class="o">]</span>&lt;lokaler Port&gt;:&lt;zielhost&gt;:&lt;zielport&gt; <span class="o">[</span>user@<span class="o">]</span>zielhost
</span></span></code></pre></div>
<h2 id="jump-host" data-numberify>Jump Host<a class="anchor ms-1" href="#jump-host"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ssh -J jumphost &lt;user&gt;@&lt;zielhost&gt;
</span></span></code></pre></div>
<h2 id="kein-hinzufügen-zur-sshknown_hosts" data-numberify>Kein hinzufügen zur ~/.ssh/known_hosts<a class="anchor ms-1" href="#kein-hinzufügen-zur-sshknown_hosts"></a></h2>
<p>Nützlich z.B. beim Arbeiten mit virtuellen Maschinen unter QEMU mit <code>virt-manager</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">Host 192.0.2.*
</span></span><span class="line"><span class="ln">2</span><span class="cl">  StrictHostKeyChecking no
</span></span><span class="line"><span class="ln">3</span><span class="cl">  UserKnownHostsFile=/dev/null
</span></span></code></pre></div><p>Dann kommt folgende Meldung nicht mehr</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">The authenticity of host &#39;192.0.2.28 (192.0.2.28)&#39; can&#39;t be established.
</span></span><span class="line"><span class="ln">2</span><span class="cl">ED25519 key fingerprint is SHA256:gPyKupGXLCfzRrq8s8kfyL0Kc9HW/4L07VsWJgr5s9U.
</span></span><span class="line"><span class="ln">3</span><span class="cl">This key is not known by any other names.
</span></span><span class="line"><span class="ln">4</span><span class="cl">Are you sure you want to continue connecting (yes/no/[fingerprint])?
</span></span></code></pre></div>
<h2 id="changelog" data-numberify>Changelog<a class="anchor ms-1" href="#changelog"></a></h2>
<table>
  <thead>
      <tr>
          <th>Datum</th>
          <th>Änderung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>17.01.2024</td>
          <td>Verbindung halten. Config aufteilen</td>
      </tr>
      <tr>
          <td>28.06.2024</td>
          <td>Jump Host und Port-Forwarding</td>
      </tr>
      <tr>
          <td>03.10.2024</td>
          <td>known_hosts Tipp</td>
      </tr>
  </tbody>
</table>]]></content:encoded>
    </item>
    
    <item>
      <title>Starship - Shell Prompt mit mehr Infos</title>
      <link>https://www.rainerrose.de/docs/howto/starship/</link>
      <pubDate>Sun, 28 Jul 2024 14:45:16 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/starship/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Der Standard-Prompt ist zu langweilig? Die Befüllung der Variablen <code>PS1</code> ist zu kompliziert und unflexibel? Es sollen mehr Informationen dargestellt werden?</p>
<p>Kein Problem, ich habe jetzt das Tool <code>Starship</code> für mich entdeckt. Es ist schnell installiert und auch recht simpel konfiguriert. Wie das funktioniert, habe ich im Nachfolgenden mal aufgeschrieben.</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Der Standard-Prompt ist zu langweilig? Die Befüllung der Variablen <code>PS1</code> ist zu kompliziert und unflexibel? Es sollen mehr Informationen dargestellt werden?</p>
<p>Kein Problem, ich habe jetzt das Tool <code>Starship</code> für mich entdeckt. Es ist schnell installiert und auch recht simpel konfiguriert. Wie das funktioniert, habe ich im Nachfolgenden mal aufgeschrieben.</p>

<h2 id="alte-welt-ps1-variable" data-numberify>Alte Welt: PS1-Variable<a class="anchor ms-1" href="#alte-welt-ps1-variable"></a></h2>
<p>Meine <code>PS1</code>-Variable, die ich in der <code>~./.bashrc</code> setze, sah bisher immer so aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">PS1</span><span class="o">=</span><span class="s1">&#39;\[\033[01;32m\][\u@\h\[\033[01;37m\]:\w\[\033[01;32m\]]\$\[\033[00m\] &#39;</span>
</span></span></code></pre></div><p>Das sieht dann z.B. so aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">mag@rainern:~/homepages/rainerrose.de
</span></span></code></pre></div>
<h2 id="das-ziel" data-numberify>Das Ziel<a class="anchor ms-1" href="#das-ziel"></a></h2>
<p><code>Starship</code> bietet die Möglichkeit noch weitere Informationen einblenden zu lassen, z.B.:</p>
<ul>
<li>aktueller Name des git-Branches</li>
<li>virtuelles Enviroment unter Python</li>
<li>aktueller Name des Openstack-Projekt</li>
</ul>
<p>Im folgenden Screenshot sieht man die potentiellen Möglichkeiten.</p>
<p><picture><img class="img-fluid " alt="Screenshot eines bunten Prommpts" src="https://www.rainerrose.de/wallpaper/docs/linux/starship-screenshot.png?v=6961075f81e888ea9f3039d26da236b7" loading="lazy" width="1647" height="116" />
</picture>

</p>
<p>Aus Gründen musste ich ein paar Informationen blurren.</p>

<h2 id="installation" data-numberify>Installation<a class="anchor ms-1" href="#installation"></a></h2>

<h3 id="schritt-1-binary-installieren" data-numberify>Schritt 1: Binary installieren<a class="anchor ms-1" href="#schritt-1-binary-installieren"></a></h3>
<p>Die Installation ist recht einfach und gut auf der <a href="https://tools.rainerrose.de/redirect.php?id=39" target="_blank" rel="noopener noreferrer">Projekt-Homepage<i class="fas fa-external-link-square-alt ms-1"></i></a> beschrieben.</p>

<h3 id="schritt-2-aktivieren" data-numberify>Schritt 2: Aktivieren<a class="anchor ms-1" href="#schritt-2-aktivieren"></a></h3>
<p>Je nach gewählter Shell, muss Starship jetzt noch gestartet werden.</p>
<p>Für die <code>bash</code>, die ich verwendet ist dies ein</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;eval &#34;$(starship init bash)&#34;&#39;</span> &gt;&gt; ~/.bashrc
</span></span></code></pre></div><p>Alle anderen Shells sind gut auf der
<a href="https://tools.rainerrose.de/redirect.php?id=40" target="_blank" rel="noopener noreferrer">Projekt-Webseite<i class="fas fa-external-link-square-alt ms-1"></i></a>
beschrieben.</p>

<h2 id="konfiguration" data-numberify>Konfiguration<a class="anchor ms-1" href="#konfiguration"></a></h2>
<p>Zu erst erstellst Du Dir am besten eine leere Konfigurationsdatei.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">mkdir -p ~/.config <span class="o">&amp;&amp;</span> touch ~/.config/starship.toml
</span></span></code></pre></div><p>danach kannst Du meine Konfigurationsdatei weiter unten auf dieser Seite als Vorlage nehmen und sie anpassen.</p>
<p>Auf der <a href="https://tools.rainerrose.de/redirect.php?id=41" target="_blank" rel="noopener noreferrer">Projekt-Webseite<i class="fas fa-external-link-square-alt ms-1"></i></a>
sind es weitere, gute Beispiele aufgeführt.
In der Regel kannst Du die Beispiele aus der Doku 1:1 in Deine Konfigurationsdatei übernehmen und musst sie ggf. nur etwas anpassen.</p>

<h2 id="nacharbeiten" data-numberify>Nacharbeiten<a class="anchor ms-1" href="#nacharbeiten"></a></h2>
<p>Auf meinen <code>Manjaro</code>-Systemen, welche ja auf <code>Arch Linux</code> basieren, musste ich das Fontspaket <code>extra/noto-fonts-emoji</code> nachinstallieren, weil sonst einige Glyphen nicht dargestellt werden konnten.</p>
<p>Um zu testen, ob es Probleme mit einigen Symbolen bzw. Emojis gibt, reichen folgende zwei Befehle:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\xf0\x9f\x90\x8d&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\xee\x82\xa0&#34;</span>
</span></span></code></pre></div><p>Das erste Symbol sollte eine Schlange darstellen, das zweite ein Strich mit einem Pfeil der daneben läuft.</p>
<p>In der
<a href="https://tools.rainerrose.de/redirect.php?id=64" target="_blank" rel="noopener noreferrer">FAQ auf der Projekt-Seite<i class="fas fa-external-link-square-alt ms-1"></i></a>
steht es nochmal genauer.</p>

<h2 id="fertig" data-numberify>Fertig<a class="anchor ms-1" href="#fertig"></a></h2>
<p>Beim nächsten Start einer <code>bash</code> oder das Sourcen der <code>~/.bashrc</code> sollte Dir den Prompt im neuen Gewand präsentieren.</p>

<h2 id="dank" data-numberify>Dank<a class="anchor ms-1" href="#dank"></a></h2>
<p>Mein Dank geht an Kevin für die Tipps und den Hinweis auf dieses Tool.</p>

<h2 id="meine-konfig-datei" data-numberify>Meine Konfig-Datei<a class="anchor ms-1" href="#meine-konfig-datei"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># https://starship.rs/config/</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c"># Get editor completions based on the config schema</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="s2">&#34;$schema&#34;</span> <span class="p">=</span> <span class="s1">&#39;https://starship.rs/config-schema.json&#39;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c"># Inserts a blank line between shell prompts</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nx">add_newline</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="p">[</span><span class="nx">directory</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nx">truncate_to_repo</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="nx">truncation_length</span> <span class="p">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">[</span><span class="nx">git_metrics</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="nx">added_style</span> <span class="p">=</span> <span class="s1">&#39;bold blue&#39;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s1">&#39;[+$added]($added_style)/[-$deleted]($deleted_style) &#39;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="p">[</span><span class="nx">git_status</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="nx">conflicted</span> <span class="p">=</span> <span class="s1">&#39;🏳&#39;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="nx">ahead</span> <span class="p">=</span> <span class="s1">&#39;🏎💨&#39;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="nx">behind</span> <span class="p">=</span> <span class="s1">&#39;😰&#39;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="nx">diverged</span> <span class="p">=</span> <span class="s1">&#39;😵&#39;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="nx">up_to_date</span> <span class="p">=</span> <span class="s1">&#39;✓&#39;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="nx">untracked</span> <span class="p">=</span> <span class="s1">&#39;🤷&#39;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="nx">stashed</span> <span class="p">=</span> <span class="s1">&#39;📦&#39;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="nx">modified</span> <span class="p">=</span> <span class="s1">&#39;📝&#39;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="nx">staged</span> <span class="p">=</span> <span class="s1">&#39;[++\($count\)](green)&#39;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="nx">renamed</span> <span class="p">=</span> <span class="s1">&#39;👅&#39;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="nx">deleted</span> <span class="p">=</span> <span class="s1">&#39;🗑&#39;</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="p">[</span><span class="nx">openstack</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s1">&#39;on [$symbol$cloud(\($project\))]($style) &#39;</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="nx">style</span> <span class="p">=</span> <span class="s1">&#39;bold yellow&#39;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="nx">symbol</span> <span class="p">=</span> <span class="s1">&#39;☁ &#39;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="p">[</span><span class="nx">hostname</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="nx">ssh_only</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s1">&#39;[$ssh_symbol](bold blue)[$hostname](bold red):&#39;</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="nx">trim_at</span> <span class="p">=</span> <span class="s1">&#39;.companyname.com&#39;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="nx">disabled</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="p">[</span><span class="nx">username</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="nx">style_user</span> <span class="p">=</span> <span class="s1">&#39;white bold&#39;</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="nx">style_root</span> <span class="p">=</span> <span class="s1">&#39;black bold&#39;</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s1">&#39;[$user]($style)@&#39;</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="nx">disabled</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="nx">show_always</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="nx">aliases</span> <span class="p">=</span> <span class="p">{</span> <span class="s2">&#34;corpuser034g&#34;</span> <span class="p">=</span> <span class="s2">&#34;matchai&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">
</span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="p">[</span><span class="nx">kubernetes</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="nx">disabled</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s1">&#39;[$symbol$context( \($namespace\))]($style) &#39;</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">
</span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="p">[[</span><span class="nx">kubernetes</span><span class="p">.</span><span class="nx">contexts</span><span class="p">]]</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="nx">context_pattern</span> <span class="p">=</span> <span class="s2">&#34;.*_(customers|infrastructure)_(?P&lt;cluster&gt;[\\w-]*)_(tooling|bootstrap).*&#34;</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl"><span class="nx">context_alias</span> <span class="p">=</span> <span class="s2">&#34;$cluster&#34;</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">
</span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="p">[</span><span class="nx">env_var</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl"><span class="nx">style</span> <span class="p">=</span> <span class="s1">&#39;red bold&#39;</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl"><span class="nx">variable</span> <span class="p">=</span> <span class="s1">&#39;KUBECONFIG&#39;</span>
</span></span></code></pre></div>
<h2 id="ansible-rolle" data-numberify>Ansible-Rolle<a class="anchor ms-1" href="#ansible-rolle"></a></h2>
<p>Update: 27.12.2024</p>
<p>Inzwischen habe ich für die Installation eine Ansible-Rolle geschrieben. Den <a href="/posts/starship-rolle/">dazugehörigen Blog-Artikel</a> findet Du <a href="/posts/starship-rolle/">hier</a>.</p>

<h2 id="kubernetes-context-lange-namen" data-numberify>Kubernetes Context (lange Namen)<a class="anchor ms-1" href="#kubernetes-context-lange-namen"></a></h2>
<p>Update 29.03.2026</p>
<p>Aktuell arbeite ich mit längeren Namen im <code>context</code> was zu sehr langen Zeilen führt, wenn man folgende Format-Syntax wählt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s1">&#39;on [☸ $user on $context](dimmed green) &#39;</span>
</span></span></code></pre></div><p>Weiterhin habe ich <code>starship</code> auf die Version <code>1.24.2</code> aktualisiert, dort kann Pattern-Matching verwendet werden.</p>
<p>Ich habe also oben im Abschnitt <code>kubernetes</code> das Format geändert und die beiden Abschnitte <code>kubernetes.contexts</code> und <code>env_var</code> hinzugefügt.</p>
<p>Über den <code>context_alias</code> kann ich nun alles für mich nicht relevante wegschneiden. Im Grunde wird mir jetzt nur noch der Name des Clusters angezeigt.</p>
<p>Beispiele:</p>
<ul>
<li><code>cluster-api</code></li>
<li><code>foo</code></li>
<li><code>bar</code></li>
</ul>

<h2 id="changelog" data-numberify>Changelog<a class="anchor ms-1" href="#changelog"></a></h2>
<table>
  <thead>
      <tr>
          <th>Datum</th>
          <th>Änderung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>25.10.2024</td>
          <td>Abschnitt kubernetes in der Konfig hinzugefügt. Synatx-Highlighting gefixed.</td>
      </tr>
      <tr>
          <td>27.12.2024</td>
          <td>Erwähnung der Ansible-Rolle <code>starship</code>.</td>
      </tr>
      <tr>
          <td>29.03.2026</td>
          <td>Kubernetes Context. Änderungen vom Format. Typos gefixed.</td>
      </tr>
  </tbody>
</table>]]></content:encoded>
    <enclosure url="https://www.rainerrose.de/wallpaper/docs/linux/starship-screenshot.png" length="27725" type="image/.png" />
    </item>
    
    <item>
      <title>GIT</title>
      <link>https://www.rainerrose.de/docs/howto/git/</link>
      <pubDate>Mon, 11 Dec 2023 22:00:11 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/git/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Notizen, Tipps und Tricks zum Versionsverwaltung <code>git</code>.</p>
<p>Änderungen siehe Changelog unten.</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Notizen, Tipps und Tricks zum Versionsverwaltung <code>git</code>.</p>
<p>Änderungen siehe Changelog unten.</p>

<h2 id="schickeres-diff" data-numberify>schickeres diff<a class="anchor ms-1" href="#schickeres-diff"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">alias</span> <span class="nv">diffogram</span><span class="o">=</span><span class="s1">&#39;git --no-pager diff --no-index&#39;</span>
</span></span></code></pre></div>
<h2 id="nur-gucken" data-numberify>nur gucken<a class="anchor ms-1" href="#nur-gucken"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git show origin/&lt;branchname&gt;:pfad/datei.name
</span></span></code></pre></div><p><strong>Beispiel</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git show origin/main:local-deb-repo/README.md
</span></span></code></pre></div>
<h2 id="master-in-main-umbenennen" data-numberify>master in main umbenennen<a class="anchor ms-1" href="#master-in-main-umbenennen"></a></h2>
<p>Wer aus <a href="/sammlung/alltags-rassisums-in-der-it">$GRUENDEN</a> seinen
<code>master</code>-Zweig in den <code>main</code>-Zweig<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> umbenennen möchte, kann das
folgendermaßen tun:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln"> 1</span><span class="cl">$ git branch -m master main
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">$ git push -u origin main
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">Gesamt <span class="m">0</span> <span class="o">(</span>Delta 0<span class="o">)</span>, Wiederverwendet <span class="m">0</span> <span class="o">(</span>Delta 0<span class="o">)</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">remote: 
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">remote: To create a merge request <span class="k">for</span> main, visit:
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">remote:   https://gitlab.com/rainerrose/unbound-tools/-/merge_requests/new?merge_request%5Bsource_branch%5D<span class="o">=</span>main
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">remote: 
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">To gitlab.com:rainerrose/unbound-tools.git
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> * <span class="o">[</span>new branch<span class="o">]</span>      main -&gt; main
</span></span><span class="line"><span class="ln">10</span><span class="cl">Branch <span class="s1">&#39;main&#39;</span> folgt nun Remote-Branch <span class="s1">&#39;main&#39;</span> von <span class="s1">&#39;origin&#39;</span>.
</span></span></code></pre></div><p>Das <code>-m</code> bewirkt, dass auch die Historie verschoben<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> wird, es bleiben
also alle Änderungen erhalten.</p>

<h2 id="default-branch-in-git-setzen" data-numberify>Default Branch in git setzen<a class="anchor ms-1" href="#default-branch-in-git-setzen"></a></h2>
<p>Geht wohl erst <strong>ab Version 2.28</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git config --global init.defaultBranch main
</span></span></code></pre></div><p>dann soll auch folgendes gehen</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git init --initial-branch<span class="o">=</span>main
</span></span><span class="line"><span class="ln">2</span><span class="cl">git init -b main
</span></span></code></pre></div>
<h2 id="default-branch-in-gitlab-setzen" data-numberify>Default Branch in Gitlab setzen<a class="anchor ms-1" href="#default-branch-in-gitlab-setzen"></a></h2>
<p>Anschließend lässt sich der Default-Branch in Gitlab folgenderweise auf
<code>main</code> setzen:</p>
<p><code>Allgemein</code>-&gt;<code>Einstellungen</code>-&gt;<code>Repository</code>-&gt;<code>Default-Branch</code>-&gt;<code>Aufklappen</code></p>
<p>Dort jetzt noch <code>main</code> auswählen und schlussendlich die Änderungen
abspeichern (<code>Save changes</code>).</p>

<h2 id="zwei-faktor-authentisierung-bei-gitlab" data-numberify>Zwei-Faktor-Authentisierung bei Gitlab<a class="anchor ms-1" href="#zwei-faktor-authentisierung-bei-gitlab"></a></h2>
<p>Wird die <a href="https://tools.rainerrose.de/redirect.php?id=15" target="_blank" rel="noopener noreferrer">2FA in Gitlab<i class="fas fa-external-link-square-alt ms-1"></i></a>
aktiviert, kann sich nicht mehr über HTTPS per Username/Passwort
angemeldet werden. (SSH mit Pub-Key geht weiterhin).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git pull
</span></span><span class="line"><span class="ln">2</span><span class="cl">remote: HTTP Basic: Access denied
</span></span><span class="line"><span class="ln">3</span><span class="cl">remote: You must use a personal access token with <span class="s1">&#39;read_repository&#39;</span> or <span class="s1">&#39;write_repository&#39;</span> scope <span class="k">for</span> Git over HTTP.
</span></span><span class="line"><span class="ln">4</span><span class="cl">remote: You can generate one at https://gitlab.com/-/profile/personal_access_tokens
</span></span><span class="line"><span class="ln">5</span><span class="cl">fatal: Authentication failed <span class="k">for</span> <span class="s1">&#39;https://gitlab.com/username/projekt-name.git&#39;</span>
</span></span></code></pre></div>
<h3 id="abhilfe" data-numberify>Abhilfe<a class="anchor ms-1" href="#abhilfe"></a></h3>

<h4 id="in-gitlab" data-numberify>in Gitlab<a class="anchor ms-1" href="#in-gitlab"></a></h4>
<p>In Gitlab anmelden:
<a href="https://tools.rainerrose.de/redirect.php?id=16" target="_blank" rel="noopener noreferrer">Benutzereinstellungen-&gt;Zugangs-Token<i class="fas fa-external-link-square-alt ms-1"></i></a></p>
<p>Dort ein &quot;persönliches Zugangs-Token&quot; (Add a personal access token)
generieren und Rechte vergeben <code>read_repository</code> oder <code>write_repository</code></p>

<h4 id="im-repository" data-numberify>im Repository<a class="anchor ms-1" href="#im-repository"></a></h4>
<p>Erstmal wegnehmen</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git remote remove origin
</span></span></code></pre></div><p>remote mit geheimen Token einfügen</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git remote add origin https://oauth2:HIER_GEHEIMES_TOKEN_EINFUEGEN@gitlab.com/username/projekt-name.git
</span></span></code></pre></div><p>Upstream-Branch setzen</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git branch --set-upstream-to<span class="o">=</span>origin/master master
</span></span></code></pre></div>
<blockquote class="alert alert-info" role="alert">
    <p class="alert-heading fw-bold">
      <i class="fas fa-info-circle me-2"></i>Tipp
    </p>
    <p>Falls nach <code>git pull</code> genörgelt wird, denselben Befehl im Upstream-Branch nochmal absetzen.</p>
</blockquote>

<h2 id="alle-branches-auch-remote-anzeigen" data-numberify>Alle branches (auch remote) anzeigen<a class="anchor ms-1" href="#alle-branches-auch-remote-anzeigen"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git branch -a
</span></span></code></pre></div>
<h2 id="git-remote-branch-lokal-speichern" data-numberify>git remote branch lokal speichern<a class="anchor ms-1" href="#git-remote-branch-lokal-speichern"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git checkout -b &lt;<span class="nb">local</span> branch name&gt; origin/&lt;remote branch name&gt;
</span></span><span class="line"><span class="ln">2</span><span class="cl">git checkout -b serverfix origin/serverfix
</span></span></code></pre></div>
<h2 id="branch-hochladen" data-numberify>Branch hochladen<a class="anchor ms-1" href="#branch-hochladen"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git push origin &lt;Name des Branch&gt;
</span></span></code></pre></div>
<h2 id="mit-anderem-ssh-key-anmelden" data-numberify>mit anderem ssh-key anmelden<a class="anchor ms-1" href="#mit-anderem-ssh-key-anmelden"></a></h2>
<p>In der SSH-Konfiguration einen neuen Eintrag anlegen</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ cat ~/.ssh/config
</span></span><span class="line"><span class="ln">2</span><span class="cl">Host gutMerkbarerName
</span></span><span class="line"><span class="ln">3</span><span class="cl">  HostName der.gitlab.host.name.fqdn
</span></span><span class="line"><span class="ln">4</span><span class="cl">  User rose
</span></span><span class="line"><span class="ln">5</span><span class="cl">  IdentityFile /home/rose/.ssh/id_ed25519.rose
</span></span><span class="line"><span class="ln">6</span><span class="cl">  IdentitiesOnly yes
</span></span></code></pre></div><p>Jetzt kann noch ein neues Remote-Ziel angelegt werden</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git remote add rose ssh://git@gutMerkbarerName:22/rose/project.git
</span></span></code></pre></div><p>jetzt kann mit</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git push rose
</span></span></code></pre></div><p>hochgeladen werden und git fragt nach dem anderen key</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">Enter passphrase <span class="k">for</span> key <span class="s1">&#39;/home/rose/.ssh/id_ed25519.rose&#39;</span>:
</span></span></code></pre></div><p>statt</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git push origin
</span></span><span class="line"><span class="ln">2</span><span class="cl">Enter passphrase <span class="k">for</span> key <span class="s1">&#39;/home/rose/.ssh/id_ed25519&#39;</span>:
</span></span></code></pre></div>
<h2 id="als-anderer-committen" data-numberify>als anderer committen<a class="anchor ms-1" href="#als-anderer-committen"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ git config --local user.name <span class="s2">&#34;Rainer Rose&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">$ git config --local user.email <span class="s2">&#34;email@adresse&#34;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">$ git commit
</span></span><span class="line"><span class="ln">4</span><span class="cl">$ git config --local --unset user.name
</span></span><span class="line"><span class="ln">5</span><span class="cl">$ git config --local --unset user.email
</span></span></code></pre></div><p>Alternativen zu <code>--local</code>:</p>

<h2 id="git-config-user--email" data-numberify>Git Config User / Email<a class="anchor ms-1" href="#git-config-user--email"></a></h2>
<table>
  <thead>
      <tr>
          <th>Parameter</th>
          <th>Ort</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--local</code></td>
          <td><code>.git/config</code></td>
      </tr>
      <tr>
          <td><code>--global</code></td>
          <td><code>~/.gitconfig</code></td>
      </tr>
      <tr>
          <td><code>--system</code></td>
          <td><code>/etc/gitconfig</code></td>
      </tr>
  </tbody>
</table>

<h2 id="tags-pushen" data-numberify>Tags pushen<a class="anchor ms-1" href="#tags-pushen"></a></h2>

<h3 id="einzelner" data-numberify>einzelner<a class="anchor ms-1" href="#einzelner"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git push origin v0.42
</span></span></code></pre></div>
<h3 id="alle" data-numberify>alle<a class="anchor ms-1" href="#alle"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git push origin --tags
</span></span></code></pre></div>
<h2 id="lokale-branches-löschen" data-numberify>lokale Branches löschen<a class="anchor ms-1" href="#lokale-branches-löschen"></a></h2>

<blockquote class="alert alert-info" role="alert">
    <p class="alert-heading fw-bold">
      <i class="fas fa-info-circle me-2"></i>Hinweis
    </p>
    <p><strong>Außer</strong> den aktuellen Branch, der ausgechecked ist!</p>
</blockquote>

<h3 id="nur-die-die-gemerged-sind" data-numberify>nur die, die gemerged sind<a class="anchor ms-1" href="#nur-die-die-gemerged-sind"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git branch --merged <span class="p">|</span> grep -v <span class="se">\*</span> <span class="p">|</span> xargs git branch -D
</span></span></code></pre></div>
<h3 id="alle-1" data-numberify>alle<a class="anchor ms-1" href="#alle-1"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git branch <span class="p">|</span> grep -v <span class="se">\*</span> <span class="p">|</span> xargs git branch -D
</span></span></code></pre></div>
<h2 id="letzten-commit-rückgängig-machen" data-numberify>letzten Commit rückgängig machen<a class="anchor ms-1" href="#letzten-commit-rückgängig-machen"></a></h2>
<p>Wenn man z.B. aus Versehen auf <code>main</code> committed hat&hellip;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git reset --soft HEAD~1
</span></span></code></pre></div>
<h2 id="letzte-commit-message-ändern" data-numberify>Letzte Commit-Message ändern<a class="anchor ms-1" href="#letzte-commit-message-ändern"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git commit --amend
</span></span></code></pre></div>
<h2 id="changelog" data-numberify>Changelog<a class="anchor ms-1" href="#changelog"></a></h2>
<table>
  <thead>
      <tr>
          <th>Datum</th>
          <th>Änderung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>11.10.2023</td>
          <td>zwei neue Tipps: &ldquo;schickeres diff&rdquo; &amp; &ldquo;Nur gucken&rdquo;</td>
      </tr>
      <tr>
          <td>06.12.2023</td>
          <td>git remote branch lokal speichern</td>
      </tr>
      <tr>
          <td>11.12.2023</td>
          <td>Branch hochladen</td>
      </tr>
      <tr>
          <td>29.04.2025</td>
          <td>Neuer Abschnitt <code>Git Config User / Email</code></td>
      </tr>
      <tr>
          <td>15.05.2025</td>
          <td>lokale Branches löschen</td>
      </tr>
      <tr>
          <td>22.09.2025</td>
          <td>letzten Commit rückgängig machen</td>
      </tr>
      <tr>
          <td>12.03.2026</td>
          <td>Letzte Commit-Message ändern</td>
      </tr>
  </tbody>
</table>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>ist ja nichts anderes als ein <code>Branch</code>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>moved2&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content:encoded>
    </item>
    
    <item>
      <title>Powershell</title>
      <link>https://www.rainerrose.de/docs/howto/powershell/</link>
      <pubDate>Fri, 30 Jun 2023 16:24:51 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/powershell/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Ein paar Powershell-Helferlein, Einzeiler, Dinge, die ich ab und zu brauche.</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Ein paar Powershell-Helferlein, Einzeiler, Dinge, die ich ab und zu brauche.</p>

<h2 id="sowas-wie-netstat-bzw-lsof" data-numberify>sowas wie netstat bzw. lsof<a class="anchor ms-1" href="#sowas-wie-netstat-bzw-lsof"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">Get-Process</span> <span class="n">-Id</span> <span class="p">(</span><span class="nb">Get-NetTCPConnection</span> <span class="n">-LocalPort</span> <span class="p">&lt;</span><span class="n">Port</span><span class="p">&gt;).</span><span class="py">OwningProcess</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>SSL / TLS</title>
      <link>https://www.rainerrose.de/docs/howto/ssl/</link>
      <pubDate>Thu, 08 Jun 2023 17:42:10 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/ssl/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Ein paar Befehle, die ich immer wieder im Umfeld von TLS bzw. SSL benötige.</p>

<h2 id="selbst-signiertes-zertifikat" data-numberify>selbst signiertes Zertifikat<a class="anchor ms-1" href="#selbst-signiertes-zertifikat"></a></h2>
<p>Alles erstellen (CSR, private key, sign) in einem Schritt:</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Ein paar Befehle, die ich immer wieder im Umfeld von TLS bzw. SSL benötige.</p>

<h2 id="selbst-signiertes-zertifikat" data-numberify>selbst signiertes Zertifikat<a class="anchor ms-1" href="#selbst-signiertes-zertifikat"></a></h2>
<p>Alles erstellen (CSR, private key, sign) in einem Schritt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl req -new -days <span class="m">999</span> -newkey rsa:4096bits -sha512 -x509 -nodes -out server.crt -keyout server.key
</span></span></code></pre></div>
<blockquote class="alert alert-success" role="alert">
    <p class="alert-heading fw-bold">
      <i class="fas fa-lightbulb me-2"></i>Hinweis
    </p>
    <p>Die <code>999</code> Tage sollte man ggf. ändern. Dateien werden überschrieben, also Obacht!</p>
</blockquote>

<h2 id="öffentlichen--privaten-schlüssel-extrahieren-pkcs12" data-numberify>öffentlichen / privaten Schlüssel extrahieren (PKCS12)<a class="anchor ms-1" href="#öffentlichen--privaten-schlüssel-extrahieren-pkcs12"></a></h2>

<h3 id="privater-schlüssel" data-numberify>privater Schlüssel<a class="anchor ms-1" href="#privater-schlüssel"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl pkcs12 -in P12Datei.pfx -nocerts -out privateKey.pem
</span></span></code></pre></div>
<h3 id="öffentlicher-schlüssel--zertifikat" data-numberify>öffentlicher Schlüssel / Zertifikat<a class="anchor ms-1" href="#öffentlicher-schlüssel--zertifikat"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl pkcs12 -in P12Datei.pfx -clcerts -nokeys -out publicKey.pem
</span></span></code></pre></div>
<h3 id="zertifikat-als-plain-text-ausgeben--infos-anzeigen" data-numberify>Zertifikat als plain-text ausgeben / Infos anzeigen<a class="anchor ms-1" href="#zertifikat-als-plain-text-ausgeben--infos-anzeigen"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl  x509 -noout -text -purpose -in Zertifikat.pem 
</span></span></code></pre></div>
<h3 id="aufbau-datei" data-numberify>Aufbau Datei<a class="anchor ms-1" href="#aufbau-datei"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">-----BEGIN CERTIFICATE----
</span></span><span class="line"><span class="ln">2</span><span class="cl">... eigentliches Zertifikat ... 
</span></span><span class="line"><span class="ln">3</span><span class="cl">-----END CERTIFICATE-----
</span></span></code></pre></div>
<h2 id="konvertieren" data-numberify>Konvertieren<a class="anchor ms-1" href="#konvertieren"></a></h2>

<h3 id="pem-nach-der" data-numberify>PEM nach DER<a class="anchor ms-1" href="#pem-nach-der"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl x509 -outform der -in Zertfikikat.pem -out Zertfikikat.der
</span></span></code></pre></div>
<h3 id="pem-nach-p7b" data-numberify>PEM nach P7B<a class="anchor ms-1" href="#pem-nach-p7b"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl crl2pkcs7 -nocrl -certfile Zertfikikat.cer -out Zertfikikat.p7b -certfile CAZertifikat.cer
</span></span></code></pre></div>
<h3 id="pem-nach-pfx" data-numberify>PEM nach PFX<a class="anchor ms-1" href="#pem-nach-pfx"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl pkcs12 -export -out Zertfikikat.pfx -inkey privateKey.key -in Zertfikikat.crt -certfile CAZertifikat.crt
</span></span></code></pre></div>
<h3 id="der-nach-pem" data-numberify>DER nach PEM<a class="anchor ms-1" href="#der-nach-pem"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl x509 -inform der -in Zertfikikat.cer -out Zertfikikat.pem
</span></span></code></pre></div>
<h3 id="p7b-nach-pem" data-numberify>P7B nach PEM<a class="anchor ms-1" href="#p7b-nach-pem"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl pkcs7 -print_certs -in Zertfikikat.p7b -out Zertfikikat.cer
</span></span></code></pre></div>
<h3 id="pfxpkcs12-nach-pem" data-numberify>PFX(PKCS#12) nach PEM<a class="anchor ms-1" href="#pfxpkcs12-nach-pem"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl pkcs12 -in Zertfikikat.pfx -nodes -out Zertfikikat.cer
</span></span></code></pre></div>
<h2 id="dhparam-erzeugen" data-numberify>dhparam erzeugen<a class="anchor ms-1" href="#dhparam-erzeugen"></a></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl dhparam -out /etc/ssl/dhparam.pem <span class="m">4096</span>
</span></span></code></pre></div>
<h2 id="changelog" data-numberify>Changelog<a class="anchor ms-1" href="#changelog"></a></h2>
<table>
  <thead>
      <tr>
          <th>Datum</th>
          <th>Änderung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>27.03.2025</td>
          <td>dhparam erzeugen</td>
      </tr>
  </tbody>
</table>]]></content:encoded>
    </item>
    
    <item>
      <title>Dokuwiki</title>
      <link>https://www.rainerrose.de/docs/howto/dokuwiki/</link>
      <pubDate>Tue, 05 Oct 2021 16:41:57 +0100</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/dokuwiki/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Notizen zur Webanwendung Dokuwiki.</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Notizen zur Webanwendung Dokuwiki.</p>

<h2 id="urls" data-numberify>URLs<a class="anchor ms-1" href="#urls"></a></h2>
<ul>
<li><a href="https://tools.rainerrose.de/redirect.php?id=4" target="_blank" rel="noopener noreferrer">https://www.dokuwiki.org/de:rewrite<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
</ul>

<h2 id="plugins" data-numberify>Plugins<a class="anchor ms-1" href="#plugins"></a></h2>
<ul>
<li><a href="https://tools.rainerrose.de/redirect.php?id=5" target="_blank" rel="noopener noreferrer">https://www.dokuwiki.org/plugin:ifauthex<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li>Backlinks</li>
<li>Bureaucracy Plugin</li>
<li><a href="https:*tools.rainerrose.de/redirect.php?id=6">catlist</a></li>
<li>ckgedit</li>
<li>Cloud Plugin</li>
<li>Color Plugin</li>
<li>Color Picker</li>
<li>Flowchartjs Plugin</li>
<li>include plugin</li>
<li>Indexmenu Plugin</li>
<li>keyboard</li>
<li>Lightbox for images</li>
<li>Move plugin</li>
<li>Note Plugin</li>
<li>Page Index</li>
<li>Pagelist Plugin</li>
<li>Inline Page Modifier</li>
<li>PageQuery Plugin</li>
<li>sortablejs</li>
<li>Tag Plugin</li>
<li>ToDo</li>
<li>widearea plugin</li>
<li>Wrap Plugin</li>
</ul>

<h2 id="sidebar" data-numberify>sidebar<a class="anchor ms-1" href="#sidebar"></a></h2>
<pre><code>{{indexmenu&gt;:#1|js#thread navbar context tsort}}
</code></pre>

<h2 id="edit-button" data-numberify>edit-Button<a class="anchor ms-1" href="#edit-button"></a></h2>
<pre><code>&lt;ifauth @user&gt;
[[:dokuwiki_doku.php?id=sidebar&amp;do=edit|{{:edit.png?nolink&amp;16}}]] [[:sidebar|Edit Sidebar]]
&lt;/ifauth&gt;
</code></pre>

<h2 id="tags-verwenden" data-numberify>TAGs verwenden<a class="anchor ms-1" href="#tags-verwenden"></a></h2>
<pre><code>{{tag&gt;[list of tags]}}
</code></pre>

<h2 id="auflistung-verwendeter-tags" data-numberify>Auflistung verwendeter TAGs<a class="anchor ms-1" href="#auflistung-verwendeter-tags"></a></h2>
<pre><code>{{searchtags}}
</code></pre>

<h2 id="tagcloud" data-numberify>TAGCLOUD<a class="anchor ms-1" href="#tagcloud"></a></h2>
<pre><code>~~TAGCLOUD~~
</code></pre>

<h2 id="sequenzdiagramme" data-numberify>Sequenzdiagramme<a class="anchor ms-1" href="#sequenzdiagramme"></a></h2>
<p>Basieren auf der Bibliothek
<a href="https://tools.rainerrose.de/redirect.php?id=7" target="_blank" rel="noopener noreferrer">js-sequence-diagrams<i class="fas fa-external-link-square-alt ms-1"></i></a>.</p>

<h2 id="code" data-numberify>Code<a class="anchor ms-1" href="#code"></a></h2>
<pre><code>&lt;sequencediagram&gt;
  Title: Der Titel
  A-&gt;B: Normale Linie
  B--&gt;C: Gestrichelte Linie
  C-&gt;&gt;D: Pfeilspitze offen
  Note right of D: Und wieder zurück
  D--&gt;&gt;A: Gestrichelte Linie Pfeilspitze offen
&lt;/sequencediagram&gt;
</code></pre>

<h2 id="tastenkürzel--tastenkombi" data-numberify>Tastenkürzel / Tastenkombi<a class="anchor ms-1" href="#tastenkürzel--tastenkombi"></a></h2>
<p>This displays the keys <code>ALT</code> + <code>H</code> .</p>
<pre><code>This displays the keys &lt;kbd&gt;ALT&lt;/kbd&gt; + &lt;kbd&gt;H&lt;/kbd&gt;.
</code></pre>
<p>Kürzer:</p>
<pre><code>This displays the keys &lt;kbd&gt;ALT+H&lt;/kbd&gt;.
</code></pre>
<p>Tipp: <code>ALT+-</code></p>
<pre><code>&lt;kbd&gt;ALT+-&lt;/kbd&gt;
</code></pre>

<h2 id="hinweisboxen-anlegen" data-numberify>Hinweisboxen anlegen<a class="anchor ms-1" href="#hinweisboxen-anlegen"></a></h2>

<h3 id="beispiele" data-numberify>Beispiele<a class="anchor ms-1" href="#beispiele"></a></h3>
<p>Classic</p>
<pre><code>&lt;note&gt; Classic &lt;/note&gt;
</code></pre>
<p>Important</p>
<pre><code>&lt;note important&gt; Important &lt;/note&gt;
</code></pre>
<p>Warning</p>
<pre><code>&lt;note warning&gt; Warning &lt;/note&gt;
</code></pre>
<p>Tip</p>
<pre><code>&lt;note tip&gt; Tip &lt;/note&gt;
</code></pre>

<h2 id="farben" data-numberify>Farben<a class="anchor ms-1" href="#farben"></a></h2>
<table>
  <thead>
      <tr>
          <th>Im Editor einzugeben</th>
          <th>Erläuterung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>&lt;color green&gt;text&lt;/color&gt;</code></td>
          <td>Nur Textfarbe ändern</td>
      </tr>
      <tr>
          <td><code>&lt;color blue/lightgrey&gt;text&lt;/color&gt;</code></td>
          <td>Textfarbe und Texthintergrund ändern</td>
      </tr>
      <tr>
          <td><code>&lt;color /lightgrey&gt;text&lt;/color&gt;</code></td>
          <td>nur Texthintergrund ändern</td>
      </tr>
      <tr>
          <td><code>&lt;color #FF0000&gt;text&lt;/color&gt;</code></td>
          <td>Angabe in RGB-Notation</td>
      </tr>
      <tr>
          <td><code>&lt;color /#FFff00&gt;text&lt;/color&gt;</code></td>
          <td>Texthintergrund ändern in RGB-Notation</td>
      </tr>
  </tbody>
</table>

<h2 id="flowcharts" data-numberify>Flowcharts<a class="anchor ms-1" href="#flowcharts"></a></h2>
<p>Die Flowcharts basieren auf der Bibliothek
<a href="https://tools.rainerrose.de/redirect.php?id=8" target="_blank" rel="noopener noreferrer">http://flowchart.js.org<i class="fas fa-external-link-square-alt ms-1"></i></a></p>

<h3 id="code-1" data-numberify>Code<a class="anchor ms-1" href="#code-1"></a></h3>
<pre><code>&lt;flowchartjs default&gt;
  st=&gt;start: Start
  e=&gt;end: Ende
  con1=&gt;condition: Kennste 
  Flowcharts?
  con2=&gt;condition: Weißte wie
  es geht?
  op1=&gt;operation: Informieren (Klick):&gt;https://de.wikipedia.org/wiki/Programmablaufplan[blank]
  op2=&gt;operation: Informieren (Klick):&gt;http://flowchart.js.org[blank]
  io1=&gt;inputoutput: Flowchart tippen
  op3=&gt;operation: Freuen
  
  st-&gt;con1
  con1(no)-&gt;op1-&gt;con2
  con1(yes)-&gt;con2
  con2(no)-&gt;op2-&gt;io1-&gt;op3-&gt;e
  con2(yes)-&gt;io1
&lt;/flowchartjs&gt;
</code></pre>]]></content:encoded>
    </item>
    
    <item>
      <title>Thunderbird</title>
      <link>https://www.rainerrose.de/docs/howto/thunderbird/</link>
      <pubDate>Sat, 09 May 2020 15:02:34 +0200</pubDate>
      <guid>https://www.rainerrose.de/docs/howto/thunderbird/</guid>
      <description><![CDATA[<!-- Anreißer -->
<p>Tipps und Tricks zum Mail-Programm Thunderbird</p>]]></description>
      <content:encoded><![CDATA[<!-- Anreißer -->
<p>Tipps und Tricks zum Mail-Programm Thunderbird</p>

<h2 id="konto-reihenfolge-bzw-position-ändern" data-numberify>Konto-Reihenfolge bzw. Position ändern<a class="anchor ms-1" href="#konto-reihenfolge-bzw-position-ändern"></a></h2>
<p>Die <code>prefs.js-Datei</code> muss geändert werden; sie liegt im jeweiligen
Profil-Pfad von Thunderbird.</p>
<p><code>${HOME}/.thunderbird/&lt;profil-id&gt;.default/prefs.js</code></p>
<pre><code>user_pref(&quot;mail.accountmanager.accounts&quot;, &quot;account3,account1,account2&quot;);
</code></pre>
<p>Hier kann die Reihenfolge der Kontendarstellung festgelegt werden. Es
muss nur die Account-Bezeichnung an die gewünschte Stelle gesetzt
werden. Der &quot;Lokale Ordner&quot; hat ebenfalls eine Account-Nummer. Mit
grep und co findet man die richtige Account-Nummer raus. Getestet mit
Thunderbird 68.7.0 :!:</p>

<blockquote class="alert alert-danger" role="alert">
    <p class="alert-heading fw-bold">
      <i class="fas fa-exclamation-triangle me-2"></i>Wichtig!
    </p>
    <p>Thunderbird <strong>vorher schließen</strong>!</p>
</blockquote>
<p>Während der Änderung muss <strong>Thunderbird geschlossen</strong> sein, ansonsten werden die Änderungen wieder
überschrieben.</p>
<p>Am einfachsten geht es, wenn der Benutzername zum Anmelden am Server
genommen wird:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ grep &lt;benutzername&gt; prefs.js<span class="p">|</span> grep userName
</span></span><span class="line"><span class="ln">2</span><span class="cl">user_pref<span class="o">(</span><span class="s2">&#34;mail.server.server5.userName&#34;</span>, <span class="s2">&#34;&lt;benutzername&gt;&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">$ grep &lt;benutzername&gt; prefs.js<span class="p">|</span> grep userName  <span class="p">|</span> cut -d <span class="s2">&#34;.&#34;</span> -f <span class="m">3</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">server5
</span></span></code></pre></div><p>Mit der Angabe geht's weiter, hier beim Suchen einen <strong>Punkt hinten
anfügen</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ grep server5. prefs.js  <span class="p">|</span> grep account
</span></span><span class="line"><span class="ln">2</span><span class="cl"> user_pref<span class="o">(</span><span class="s2">&#34;mail.account.account5.server&#34;</span>, <span class="s2">&#34;server5&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">$ grep server5. prefs.js  <span class="p">|</span> grep account <span class="p">|</span> cut -d <span class="s2">&#34;.&#34;</span> -f <span class="m">3</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">account5
</span></span></code></pre></div><p><code>account5</code> jetzt merken.</p>
<p>Jetzt den anderen Account:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ grep &lt;benutzername-der-umsortiert-werden-soll&gt; prefs.js<span class="p">|</span> grep userName <span class="p">|</span> cut -d <span class="s2">&#34;.&#34;</span> -f <span class="m">3</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">server11
</span></span></code></pre></div><p>Jetzt noch die Account-Nummer rausfinden:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ grep server11. prefs.js  <span class="p">|</span> grep account <span class="p">|</span> cut -d <span class="s2">&#34;.&#34;</span> -f <span class="m">3</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">account11
</span></span></code></pre></div><p>jetzt geht's ans Tauschen. Sieht vorher so aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ grep mail.accountmanager.accounts prefs.js
</span></span><span class="line"><span class="ln">2</span><span class="cl">user_pref<span class="o">(</span><span class="s2">&#34;mail.accountmanager.accounts&#34;</span>, <span class="s2">&#34;account1,account2,account3,account4,account5,account6,account7,account8,account9,account10,account11&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span></code></pre></div><p>und nach dem Editieren mit einem beliebigen Text-Editor so</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">$ grep mail.accountmanager.accounts prefs.js
</span></span><span class="line"><span class="ln">2</span><span class="cl">user_pref<span class="o">(</span><span class="s2">&#34;mail.accountmanager.accounts&#34;</span>, <span class="s2">&#34;account1,account2,account3,account4,account5,account11,account6,account7,account8,account9,account10&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span></code></pre></div>]]></content:encoded>
    <enclosure url="https://www.rainerrose.de/wallpaper/thunderbird.png" length="25860" type="image/.png" />
    </item>
    
  </channel>
</rss>

