Restart nach Deploy erzwingen
Test & Deploy Hugo Docker CMS / test-and-deploy (push) Has been cancelled

This commit is contained in:
jonnybravo
2026-09-10 10:21:19 +02:00
parent 86466f539e
commit 87c52bccbe
26 changed files with 12 additions and 3658 deletions
+12
View File
@@ -115,6 +115,18 @@
changed_when: "'Starting' in compose_result.stdout or 'Creating' in compose_result.stdout"
when: molecule_test is not defined
# WICHTIG: geänderte Volume-Dateien (entrypoint.sh, layouts, assets, Caddyfile)
# werden von `up -d` NICHT neu geladen – ein laufender Container wird nicht
# neu gestartet. Expliziter Restart nötig, damit z.B. der neue entrypoint
# (Pagefind-Install) tatsächlich ausgeführt wird.
- name: Container neu starten (geänderte Dateien neu laden)
ansible.builtin.command:
cmd: docker compose restart
chdir: "{{ deploy_path }}"
register: restart_result
changed_when: true
when: molecule_test is not defined
- name: Warten bis Caddy lauscht
ansible.builtin.wait_for:
port: "{{ target_port }}"
@@ -1,132 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Empfehlungen für AstroVim – Hugo Docker CMS</title>
<meta name="description" content="Empfehlungen für AstroVim 1. Tastenkürzel kennenlernen (Which‑Key) AstroVim nutzt which‑key für kontextsensitive Key‑Menüs. Drücke &lt;leader&gt; (Standard: …">
<meta property="og:title" content="Empfehlungen für AstroVim – Hugo Docker CMS">
<meta property="og:description" content="Empfehlungen für AstroVim 1. Tastenkürzel kennenlernen (Which‑Key) AstroVim nutzt which‑key für kontextsensitive Key‑Menüs. Drücke &lt;leader&gt; (Standard: …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/astro-vim-recommendations/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Empfehlungen für AstroVim</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#1-tastenkürzel-kennenlernen-whichkey">1. Tastenkürzel kennenlernen (Which‑Key)</a></li>
<li><a href="#2-dateiexplorer-neotree">2. Dateiexplorer (Neo‑Tree)</a></li>
<li><a href="#3-fuzzyfinder-telescope">3. Fuzzy‑Finder (Telescope)</a></li>
<li><a href="#4-bufferverwaltung">4. Buffer‑Verwaltung</a></li>
<li><a href="#5-gitintegration-lazygit--gitsigns">5. Git‑Integration (LazyGit / Gitsigns)</a></li>
<li><a href="#6-terminal-im-editor">6. Terminal im Editor</a></li>
<li><a href="#7-snippets-luasnip">7. Snippets (LuaSnip)</a></li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="empfehlungen-für-astrovim">Empfehlungen für AstroVim</h1>
<h2 id="1-tastenkürzel-kennenlernen-whichkey">1. Tastenkürzel kennenlernen (Which‑Key)</h2>
<p>AstroVim nutzt <strong>which‑key</strong> für kontextsensitive Key‑Menüs.
Drücke <code>&lt;leader&gt;</code> (Standard: Leertaste) und warte kurz, um das Menü
zu sehen. So erkennst du schnell verfügbare Aktionen.</p>
<h2 id="2-dateiexplorer-neotree">2. Dateiexplorer (Neo‑Tree)</h2>
<p>AstroVim bringt <strong>neo‑tree</strong> als Dateibaum mit.</p>
<ul>
<li><code>&lt;leader&gt; e</code> öffnet / schließt den Explorer.</li>
<li><code>a</code> legt eine neue Datei an, <code>d</code> löscht, <code>r</code> benennt um.</li>
<li><code>H</code> blendet ausgeblendete Dateien ein / aus.</li>
</ul>
<h2 id="3-fuzzyfinder-telescope">3. Fuzzy‑Finder (Telescope)</h2>
<p><strong>Telescope</strong> ist der Fuzzy‑Finder.</p>
<ul>
<li><code>&lt;leader&gt; f f</code> : Dateien im Projekt suchen</li>
<li><code>&lt;leader&gt; f g</code> : live‑grep im Projekt</li>
<li><code>&lt;leader&gt; f b</code> : geöffnete Buffer durchsuchen</li>
<li><code>&lt;leader&gt; f h</code> : Hilfe‑Tags durchsuchen</li>
</ul>
<h2 id="4-bufferverwaltung">4. Buffer‑Verwaltung</h2>
<ul>
<li><code>&lt;leader&gt; c</code> schließt den aktuellen Buffer.</li>
<li><code>[ b</code> / <code>] b</code> wechselt zum vorherigen / nächsten Buffer.</li>
<li><code>&lt;leader&gt; b</code> zeigt eine Liste offener Buffer.</li>
</ul>
<h2 id="5-gitintegration-lazygit--gitsigns">5. Git‑Integration (LazyGit / Gitsigns)</h2>
<ul>
<li><strong>LazyGit</strong> startest du mit <code>&lt;leader&gt; g g</code> – eine vollwertige
Git‑TUI direkt im Terminal‑Fenster.</li>
<li><strong>Gitsigns</strong> zeigt Änderungen in der Sign‑Spalte.
<ul>
<li><code>] c</code> / <code>[ c</code> springt zur nächsten / vorherigen Änderung.</li>
<li><code>&lt;leader&gt; h s</code> stage a hunk, <code>&lt;leader&gt; h r</code> reset hunk.</li>
</ul>
</li>
</ul>
<h2 id="6-terminal-im-editor">6. Terminal im Editor</h2>
<ul>
<li><code>&lt;leader&gt; t f</code> öffnet ein floatendes Terminal.</li>
<li><code>&lt;leader&gt; t h</code> / <code>&lt;leader&gt; t v</code> teilt horizontal / vertikal
mit einem Terminal.</li>
<li><code>Ctrl+\ Ctrl+n</code> wechselt in den Normal‑Modus innerhalb des Terminals.</li>
</ul>
<h2 id="7-snippets-luasnip">7. Snippets (LuaSnip)</h2>
<p>AstroVim verwendet <strong>LuaSnip</strong>. Du kannst eigene Snippets unter
<code>~/.config/nvim/lua/user/snippets/</code> ablegen. Beispiel‑Datei
<code>python.lua</code>:</p>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
@@ -1,209 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Rundeck und AWX Installation mit Docker – Hugo Docker CMS</title>
<meta name="description" content="Rundeck und AWX Installation mit Docker Diese Anleitung zeigt, wie man Rundeck und AWX in Docker-Containern installiert, wobei alle wichtigen Daten persistent …">
<meta property="og:title" content="Rundeck und AWX Installation mit Docker – Hugo Docker CMS">
<meta property="og:description" content="Rundeck und AWX Installation mit Docker Diese Anleitung zeigt, wie man Rundeck und AWX in Docker-Containern installiert, wobei alle wichtigen Daten persistent …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/awx_und_rundeck_install/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Rundeck und AWX Installation mit Docker</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#voraussetzungen">Voraussetzungen</a></li>
<li><a href="#rundeck-installation">Rundeck Installation</a></li>
<li><a href="#awx-installation">AWX Installation</a></li>
<li><a href="#persistenz-und-autostart">Persistenz und Autostart</a></li>
<li><a href="#wichtige-hinweise">Wichtige Hinweise</a></li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="rundeck-und-awx-installation-mit-docker">Rundeck und AWX Installation mit Docker</h1>
<p>Diese Anleitung zeigt, wie man Rundeck und AWX in Docker-Containern installiert, wobei alle wichtigen Daten persistent gespeichert werden.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Docker und Docker-Compose installiert</li>
<li>Ausreichend Speicherplatz (mindestens 2GB empfohlen)</li>
<li>Ports 4440 und 8052 frei</li>
</ul>
<h2 id="rundeck-installation">Rundeck Installation</h2>
<ol>
<li>
<p>Verzeichnis für persistente Daten erstellen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/rundeck_data
</span></span></code></pre></div></li>
<li>
<p>Rundeck Container starten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl"> -p 4440:4440 <span class="se">\
</span></span></span><span class="line"><span class="cl"> -v ~/rundeck_data:/home/rundeck/server/data <span class="se">\
</span></span></span><span class="line"><span class="cl"> --name rundeck <span class="se">\
</span></span></span><span class="line"><span class="cl"> rundeck/rundeck:latest
</span></span></code></pre></div></li>
<li>
<p>Zugriff:</p>
<ul>
<li>URL: http://<deine-ip>:4440</li>
<li>Login: admin/admin</li>
</ul>
</li>
</ol>
<h2 id="awx-installation">AWX Installation</h2>
<ol>
<li>
<p>Verzeichnisse für persistente Daten erstellen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/awx_data/postgres ~/awx_data/projects
</span></span></code></pre></div></li>
<li>
<p>docker-compose.yml erstellen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOL &gt; ~/awx_data/docker-compose.yml
</span></span></span><span class="line"><span class="cl"><span class="s">version: &#39;3&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">services:
</span></span></span><span class="line"><span class="cl"><span class="s"> postgres:
</span></span></span><span class="line"><span class="cl"><span class="s"> image: postgres:13
</span></span></span><span class="line"><span class="cl"><span class="s"> volumes:
</span></span></span><span class="line"><span class="cl"><span class="s"> - ~/awx_data/postgres:/var/lib/postgresql/data
</span></span></span><span class="line"><span class="cl"><span class="s"> environment:
</span></span></span><span class="line"><span class="cl"><span class="s"> POSTGRES_DB: awx
</span></span></span><span class="line"><span class="cl"><span class="s"> POSTGRES_USER: awx
</span></span></span><span class="line"><span class="cl"><span class="s"> POSTGRES_PASSWORD: awxpass
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"> awx:
</span></span></span><span class="line"><span class="cl"><span class="s"> image: ansible/awx:latest
</span></span></span><span class="line"><span class="cl"><span class="s"> depends_on:
</span></span></span><span class="line"><span class="cl"><span class="s"> - postgres
</span></span></span><span class="line"><span class="cl"><span class="s"> ports:
</span></span></span><span class="line"><span class="cl"><span class="s"> - &#34;8052:8052&#34;
</span></span></span><span class="line"><span class="cl"><span class="s"> volumes:
</span></span></span><span class="line"><span class="cl"><span class="s"> - ~/awx_data/projects:/var/lib/awx/projects
</span></span></span><span class="line"><span class="cl"><span class="s"> environment:
</span></span></span><span class="line"><span class="cl"><span class="s"> DATABASE_USER: awx
</span></span></span><span class="line"><span class="cl"><span class="s"> DATABASE_PASSWORD: awxpass
</span></span></span><span class="line"><span class="cl"><span class="s"> DATABASE_NAME: awx
</span></span></span><span class="line"><span class="cl"><span class="s"> DATABASE_HOST: postgres
</span></span></span><span class="line"><span class="cl"><span class="s">EOL</span>
</span></span></code></pre></div></li>
<li>
<p>AWX starten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/awx_data
</span></span><span class="line"><span class="cl">docker-compose up -d
</span></span></code></pre></div></li>
<li>
<p>Zugriff:</p>
<ul>
<li>URL: http://<deine-ip>:8052</li>
<li>Login: admin/password</li>
</ul>
</li>
</ol>
<h2 id="persistenz-und-autostart">Persistenz und Autostart</h2>
<p>Um sicherzustellen, dass die Container nach einem Neustart automatisch starten, können Systemd-Services eingerichtet werden:</p>
<ol>
<li>
<p>Für Rundeck:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo bash -c <span class="s1">&#39;cat &lt;&lt;EOL &gt; /etc/systemd/system/rundeck-docker.service
</span></span></span><span class="line"><span class="cl"><span class="s1">[Unit]
</span></span></span><span class="line"><span class="cl"><span class="s1">Description=Rundeck Docker Container
</span></span></span><span class="line"><span class="cl"><span class="s1">After=docker.service
</span></span></span><span class="line"><span class="cl"><span class="s1">
</span></span></span><span class="line"><span class="cl"><span class="s1">[Service]
</span></span></span><span class="line"><span class="cl"><span class="s1">Restart=always
</span></span></span><span class="line"><span class="cl"><span class="s1">ExecStart=/usr/bin/docker start -a rundeck
</span></span></span><span class="line"><span class="cl"><span class="s1">ExecStop=/usr/bin/docker stop -t 2 rundeck
</span></span></span><span class="line"><span class="cl"><span class="s1">
</span></span></span><span class="line"><span class="cl"><span class="s1">[Install]
</span></span></span><span class="line"><span class="cl"><span class="s1">WantedBy=multi-user.target
</span></span></span><span class="line"><span class="cl"><span class="s1">EOL&#39;</span>
</span></span></code></pre></div></li>
<li>
<p>Für AWX:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo bash -c <span class="s1">&#39;cat &lt;&lt;EOL &gt; /etc/systemd/system/awx-docker.service
</span></span></span><span class="line"><span class="cl"><span class="s1">[Unit]
</span></span></span><span class="line"><span class="cl"><span class="s1">Description=AWX Docker Container
</span></span></span><span class="line"><span class="cl"><span class="s1">After=docker.service
</span></span></span><span class="line"><span class="cl"><span class="s1">
</span></span></span><span class="line"><span class="cl"><span class="s1">[Service]
</span></span></span><span class="line"><span class="cl"><span class="s1">WorkingDirectory=/home/$(whoami)/awx_data
</span></span></span><span class="line"><span class="cl"><span class="s1">Restart=always
</span></span></span><span class="line"><span class="cl"><span class="s1">ExecStart=/usr/local/bin/docker-compose up
</span></span></span><span class="line"><span class="cl"><span class="s1">ExecStop=/usr/local/bin/docker-compose down
</span></span></span><span class="line"><span class="cl"><span class="s1">
</span></span></span><span class="line"><span class="cl"><span class="s1">[Install]
</span></span></span><span class="line"><span class="cl"><span class="s1">WantedBy=multi-user.target
</span></span></span><span class="line"><span class="cl"><span class="s1">EOL&#39;</span>
</span></span></code></pre></div></li>
<li>
<p>Services aktivieren:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl daemon-reload
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> rundeck-docker
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> awx-docker
</span></span></code></pre></div></li>
</ol>
<h2 id="wichtige-hinweise">Wichtige Hinweise</h2>
<ul>
<li>Beide Lösungen können parallel betrieben werden</li>
<li>Daten werden in ~/rundeck_data und ~/awx_data gespeichert</li>
<li>Für Produktivumgebungen sollten zusätzliche Sicherheitsmaßnahmen getroffen werden</li>
</ul>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
@@ -1,116 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>blueray_install_manjaro – Hugo Docker CMS</title>
<meta name="description" content="Befehle zur Einrichtung von VLC für Blu-rays (Manjaro) Diese Schritte helfen Ihnen, VLC so zu konfigurieren, dass es Blu-ray-Discs abspielen kann.
Benötigte …">
<meta property="og:title" content="blueray_install_manjaro – Hugo Docker CMS">
<meta property="og:description" content="Befehle zur Einrichtung von VLC für Blu-rays (Manjaro) Diese Schritte helfen Ihnen, VLC so zu konfigurieren, dass es Blu-ray-Discs abspielen kann.
Benötigte …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/blueray_install_manjaro/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>blueray_install_manjaro</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#befehle-zur-einrichtung-von-vlc-für-blu-rays-manjaro">Befehle zur Einrichtung von VLC für Blu-rays (Manjaro)</a></li>
</ul>
</li>
</ul>
</nav>
</details>
<div class="content">
<h3 id="befehle-zur-einrichtung-von-vlc-für-blu-rays-manjaro">Befehle zur Einrichtung von VLC für Blu-rays (Manjaro)</h3>
<p>Diese Schritte helfen Ihnen, VLC so zu konfigurieren, dass es Blu-ray-Discs abspielen kann.</p>
<ol>
<li>
<p><strong>Benötigte Pakete installieren</strong>
Dieser Befehl installiert alle notwendigen Pakete für die Blu-ray-Wiedergabe:</p>
<ul>
<li><code>vlc</code>: Der Media Player.</li>
<li><code>libaacs</code>: Notwendig, um AACS-geschützte Blu-ray-Discs zu entschlüsseln.</li>
<li><code>libbluray</code>: Eine Bibliothek für die Navigation und Wiedergabe von Blu-ray-Discs.</li>
<li><code>jre-openjdk</code>: Eine Java-Laufzeitumgebung, die für Blu-ray-Menüs (BD-J) benötigt wird.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S vlc libaacs libbluray jre-openjdk
</span></span></code></pre></div><p><em>Hinweis: Der zuvor erwähnte Paket <code>libbdplus</code> wurde hier weggelassen, da er nicht direkt in den offiziellen Arch/Manjaro Repositories gefunden wurde und für viele Blu-rays möglicherweise nicht sofort notwendig ist. Sollten Sie später Probleme mit BD+-geschützten Discs haben, können wir die Installation aus dem AUR (Arch User Repository) in Betracht ziehen.</em></p>
</li>
<li>
<p><strong>Verzeichnis für AACS-Schlüssel erstellen</strong>
Dieser Befehl erstellt das notwendige Verzeichnis in Ihrem Home-Verzeichnis, wo die Entschlüsselungsschlüssel (<code>KEYDB.cfg</code>) für Blu-ray-Discs gespeichert werden. Das <code>-p</code>-Flag stellt sicher, dass alle übergeordneten Verzeichnisse bei Bedarf ebenfalls erstellt werden und unterdrückt Fehlermeldungen, falls das Verzeichnis bereits existiert.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/.config/aacs/
</span></span></code></pre></div></li>
<li>
<p><strong>KEYDB.cfg-Datei herunterladen</strong>
Dieser Befehl lädt die Datei <code>KEYDB.cfg</code> herunter, welche die Datenbank der Blu-ray-Entschlüsselungsschlüssel enthält. Diese Datei ist entscheidend für die Wiedergabe vieler kommerzieller Blu-rays. Die Datei wird direkt in das zuvor erstellte <code>.config/aacs/</code>-Verzeichnis gespeichert.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget -O ~/.config/aacs/KEYDB.cfg http://vlc-bluray.whoknowsmy.name/files/KEYDB.cfg
</span></span></code></pre></div></li>
<li>
<p><strong>Benutzerberechtigungen für das Blu-ray-Laufwerk korrigieren</strong>
Sollten Sie die Fehlermeldung erhalten, dass VLC die Medienadresse nicht öffnen kann (<code>VLC kann die Medienadresse 'bluray:///dev/sr0' nicht öffnen</code>), liegt es wahrscheinlich an fehlenden Berechtigungen. Dieser Befehl fügt Ihren Benutzer zur <code>optical</code>-Gruppe hinzu, die den Zugriff auf optische Laufwerke ermöglicht.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo usermod -aG optical jonnybravo
</span></span></code></pre></div><p><strong>WICHTIG:</strong> Damit diese Änderung wirksam wird, müssen Sie sich <strong>vollständig von Ihrer aktuellen Sitzung abmelden und dann wieder neu anmelden</strong> (oder den Computer neu starten).</p>
</li>
</ol>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
@@ -1,290 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Calcurse Tastenkürzel (Zusammenfassung) – Hugo Docker CMS</title>
<meta name="description" content="Calcurse Tastenkürzel (Zusammenfassung) Basierend auf deiner Konfigurationsdatei sind hier die wichtigsten Tastenkürzel für calcurse zusammengefasst.
Allgemeine …">
<meta property="og:title" content="Calcurse Tastenkürzel (Zusammenfassung) – Hugo Docker CMS">
<meta property="og:description" content="Calcurse Tastenkürzel (Zusammenfassung) Basierend auf deiner Konfigurationsdatei sind hier die wichtigsten Tastenkürzel für calcurse zusammengefasst.
Allgemeine …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/calcurse_tastenk%C3%BCrzel/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Calcurse Tastenkürzel (Zusammenfassung)</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#allgemeine-steuerung"><strong>Allgemeine Steuerung</strong></a></li>
<li><a href="#navigation-im-kalender"><strong>Navigation im Kalender</strong></a></li>
<li><a href="#termine--todos-verwalten"><strong>Termine &amp; TODOs verwalten</strong></a></li>
<li><a href="#speziell-für-die-todo-liste"><strong>Speziell für die TODO-Liste</strong></a></li>
<li><a href="#daten-im---export"><strong>Daten Im- &amp; Export</strong></a></li>
</ul>
</li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="calcurse-tastenkürzel-zusammenfassung">Calcurse Tastenkürzel (Zusammenfassung)</h1>
<p>Basierend auf deiner Konfigurationsdatei sind hier die wichtigsten Tastenkürzel für <code>calcurse</code> zusammengefasst.</p>
<hr>
<h3 id="allgemeine-steuerung"><strong>Allgemeine Steuerung</strong></h3>
<table>
<thead>
<tr>
<th>Taste(n)</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>q</code>, <code>Q</code></td>
<td>Calcurse beenden</td>
</tr>
<tr>
<td><code>s</code>, <code>S</code></td>
<td>Änderungen speichern</td>
</tr>
<tr>
<td><code>?</code></td>
<td>Hilfe anzeigen</td>
</tr>
<tr>
<td><code>C</code></td>
<td>Konfigurationsmenü öffnen</td>
</tr>
<tr>
<td><code>TAB</code></td>
<td>Zwischen den Ansichten wechseln (Termine/TODO)</td>
</tr>
<tr>
<td><code>ESC</code></td>
<td>Aktion abbrechen / Dialog schließen</td>
</tr>
<tr>
<td><code>:</code></td>
<td>Befehlszeile öffnen</td>
</tr>
<tr>
<td><code>^R</code></td>
<td>Bildschirm neu zeichnen</td>
</tr>
</tbody>
</table>
<h3 id="navigation-im-kalender"><strong>Navigation im Kalender</strong></h3>
<table>
<thead>
<tr>
<th>Taste(n)</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>t</code></td>
<td>Nächster Tag</td>
</tr>
<tr>
<td><code>T</code></td>
<td>Vorheriger Tag</td>
</tr>
<tr>
<td><code>w</code></td>
<td>Nächste Woche</td>
</tr>
<tr>
<td><code>W</code></td>
<td>Vorherige Woche</td>
</tr>
<tr>
<td><code>m</code></td>
<td>Nächster Monat</td>
</tr>
<tr>
<td><code>M</code></td>
<td>Vorheriger Monat</td>
</tr>
<tr>
<td><code>y</code></td>
<td>Nächstes Jahr</td>
</tr>
<tr>
<td><code>Y</code></td>
<td>Vorheriges Jahr</td>
</tr>
<tr>
<td><code>g</code>, <code>G</code></td>
<td>Zu einem bestimmten Datum springen</td>
</tr>
<tr>
<td><code>^G</code></td>
<td>Zum heutigen Tag springen</td>
</tr>
<tr>
<td><code>h</code>,<code>j</code>,<code>k</code>,<code>l</code></td>
<td>Navigation (links, runter, hoch, rechts)</td>
</tr>
</tbody>
</table>
<h3 id="termine--todos-verwalten"><strong>Termine &amp; TODOs verwalten</strong></h3>
<table>
<thead>
<tr>
<th>Taste(n)</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>a</code>, <code>A</code></td>
<td>Neuen Eintrag hinzufügen (je nach Ansicht)</td>
</tr>
<tr>
<td><code>^A</code></td>
<td>Direkt einen neuen <strong>Termin</strong> hinzufügen</td>
</tr>
<tr>
<td><code>^T</code></td>
<td>Direkt einen neuen <strong>TODO</strong>-Eintrag hinzufügen</td>
</tr>
<tr>
<td><code>d</code>, <code>D</code></td>
<td>Ausgewählten Eintrag löschen</td>
</tr>
<tr>
<td><code>e</code>, <code>E</code></td>
<td>Ausgewählten Eintrag bearbeiten</td>
</tr>
<tr>
<td><code>v</code>, <code>Enter</code></td>
<td>Details des Eintrags ansehen</td>
</tr>
<tr>
<td><code>n</code>, <code>N</code></td>
<td>Notiz bearbeiten/hinzufügen</td>
</tr>
<tr>
<td><code>&gt;</code></td>
<td>Notiz ansehen</td>
</tr>
<tr>
<td><code>c</code></td>
<td>Eintrag kopieren</td>
</tr>
<tr>
<td><code>p</code></td>
<td>Eintrag einfügen</td>
</tr>
<tr>
<td><code>r</code></td>
<td>Wiederholung für einen Eintrag festlegen</td>
</tr>
</tbody>
</table>
<h3 id="speziell-für-die-todo-liste"><strong>Speziell für die TODO-Liste</strong></h3>
<table>
<thead>
<tr>
<th>Taste(n)</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>!</code></td>
<td>Task als erledigt markieren (umschalten)</td>
</tr>
<tr>
<td><code>+</code></td>
<td>Priorität des Tasks erhöhen</td>
</tr>
<tr>
<td><code>-</code></td>
<td>Priorität des Tasks senken</td>
</tr>
</tbody>
</table>
<h3 id="daten-im---export"><strong>Daten Im- &amp; Export</strong></h3>
<table>
<thead>
<tr>
<th>Taste(n)</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>i</code>, <code>I</code></td>
<td>Daten aus einer Datei importieren</td>
</tr>
<tr>
<td><code>x</code>, <code>X</code></td>
<td>Daten in eine Datei exportieren</td>
</tr>
<tr>
<td>`</td>
<td>`</td>
</tr>
</tbody>
</table>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-1
View File
File diff suppressed because one or more lines are too long
-171
View File
@@ -1,171 +0,0 @@
<html lang="de">
<head>
<meta name="generator" content="Hugo 0.165.0"><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Hugo Docker CMS</title>
<meta name="description" content="Markdown-Dateien einfach in content/ ablegen.">
<meta property="og:title" content="Hugo Docker CMS">
<meta property="og:description" content="Markdown-Dateien einfach in content/ ablegen.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://localhost:1313/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
<link rel="alternate" type="application/rss+xml" title="Hugo Docker CMS" href="/index.xml">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
</header>
<main data-pagefind-body>
<h1>Hugo Docker CMS</h1>
<p class="subtitle">Markdown-Dateien einfach in content/ ablegen.</p>
<div class="post-grid">
<article class="card">
<time>08.09.2026</time>
<h2><a href="/ver_next_einbinden/">Anleitung: Bestehende `rclone`-Konfiguration auf einen neuen Rechner übertragen</a></h2>
<p>Anleitung: Bestehende rclone-Konfiguration auf einen neuen Rechner übertragen Diese Anleitung erklärt, wie Sie eine bereits existierende rclone-Konfiguration, insbesondere für einen verschlüsselten …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/blueray_install_manjaro/">blueray_install_manjaro</a></h2>
<p>Befehle zur Einrichtung von VLC für Blu-rays (Manjaro) Diese Schritte helfen Ihnen, VLC so zu konfigurieren, dass es Blu-ray-Discs abspielen kann.
Benötigte Pakete installieren Dieser Befehl …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/calcurse_tastenk%C3%BCrzel/">Calcurse Tastenkürzel (Zusammenfassung)</a></h2>
<p>Calcurse Tastenkürzel (Zusammenfassung) Basierend auf deiner Konfigurationsdatei sind hier die wichtigsten Tastenkürzel für calcurse zusammengefasst.
Allgemeine Steuerung Taste(n) Aktion q, Q Calcurse …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/astro-vim-recommendations/">Empfehlungen für AstroVim</a></h2>
<p>Empfehlungen für AstroVim 1. Tastenkürzel kennenlernen (Which‑Key) AstroVim nutzt which‑key für kontextsensitive Key‑Menüs. Drücke &lt;leader&gt; (Standard: Leertaste) und warte kurz, um das Menü zu …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/lazygit/">Lazygit – Der Terminal-Git-Client</a></h2>
<p>Lazygit – Der Terminal-Git-Client Lazygit ist ein schneller, terminalbasierter Git-Client mit TUI (Terminal User Interface). Du steuerst alles per Tastatur und behältst dein ganzes Repository auf …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/string_prefixes/">Python String-Präfixe</a></h2>
<p>Python String-Präfixe In Python gibt es verschiedene Präfixe für String-Literale, die bestimmen, wie der Interpreter den Inhalt des Strings verarbeitet. Suffixe für String-Literale existieren in …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/install_browser/">qutebrowser Installation (Wayland / Sway)</a></h2>
<p>qutebrowser Installation (Wayland / Sway) Tastaturgesteuerter, vim-artiger Browser auf Basis von Python + QtWebEngine (Chromium/Blink-Engine). Kein Fork, sondern eigenständig.
Hinweis: qutebrowser …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/awx_und_rundeck_install/">Rundeck und AWX Installation mit Docker</a></h2>
<p>Rundeck und AWX Installation mit Docker Diese Anleitung zeigt, wie man Rundeck und AWX in Docker-Containern installiert, wobei alle wichtigen Daten persistent gespeichert werden.
Voraussetzungen …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/stretchen_laufen/">Stretchen_laufen</a></h2>
<p>Aufwärmen: 10-15 Wh. 1-2 Sek.
Zwillingswadenmuskel dehnen S166 Zwillingswadenmuskel dehen S164 Beste Dhenübung der Welt S140 Girlanden-Haltung S126 Hüftkreisen im Stehen S148 Oberschenkelrückseite …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/system-optimierung/">System Optimierung – nächste Schritte</a></h2>
<p>System Optimierung – nächste Schritte Letzte Bearbeitung: 07.09.2026 Chat-Session-ID: 20260907_182659_6403f3 Chat wieder aufrufen: @session:default/20260907_182659_6403f3 in Hermes Agent eingeben
1. …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/tinydb_vs_sqlite/">Vergleich: TinyDB vs. SQLite</a></h2>
<p>Vergleich: TinyDB vs. SQLite Sowohl TinyDB als auch SQLite sind hervorragende &ldquo;Embedded Databases&rdquo; (eingebettete Datenbanken), die ihre Daten in einer Datei speichern, ohne dass ein …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/willkommen/">Willkommen bei Hugo Docker</a></h2>
<p>Das ist eine Beispiel-Seite. Funktioniert!
Einfach .md-Dateien in den Ordner content/ kopieren – Hugo rendert sie automatisch.
So geht&rsquo;s # Neue Seite anlegen echo &#39;--- title: &#34;Meine …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/yubikey_setup_guide/">YubiKey-Einrichtung unter Manjaro Sway</a></h2>
<p>YubiKey-Einrichtung unter Manjaro Sway Diese Anleitung beschreibt, wie Sie einen YubiKey unter Manjaro Sway für verschiedene Anwendungsfälle konfigurieren.
Übersicht der Anwendungsfälle: FIDO2/U2F: …</p>
</article>
<article class="card">
<time>08.09.2026</time>
<h2><a href="/networkconfig_dns/">Zusammenfassung der vorgenommenen Änderungen und Konfigurationen</a></h2>
<p>Zusammenfassung der vorgenommenen Änderungen und Konfigurationen Dieses Dokument fasst die wichtigsten Änderungen und Konfigurationen zusammen, die wir besprochen und durchgeführt haben.
1. Python …</p>
</article>
</div>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-141
View File
@@ -1,141 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Hugo Docker CMS</title>
<link>https://localhost:1313/</link>
<description>Markdown-Dateien einfach in content/ ablegen.</description>
<generator>Hugo 0.165.0</generator>
<language>de</language>
<lastBuildDate>Thu, 10 Sep 2026 07:50:28 +0000</lastBuildDate>
<atom:link href="https://localhost:1313/index.xml" rel="self" type="application/rss+xml"/>
<item>
<title>Anleitung: Bestehende `rclone`-Konfiguration auf einen neuen Rechner übertragen</title>
<link>https://localhost:1313/ver_next_einbinden/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/ver_next_einbinden/</guid>
<description>Anleitung: Bestehende rclone-Konfiguration auf einen neuen Rechner übertragen Diese Anleitung erklärt, wie Sie eine bereits existierende rclone-Konfiguration, insbesondere für einen verschlüsselten Nextcloud-Speicher, auf einen neuen Computer umziehen können, ohne alles neu einrichten zu müssen. …</description>
</item>
<item>
<title>blueray_install_manjaro</title>
<link>https://localhost:1313/blueray_install_manjaro/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/blueray_install_manjaro/</guid>
<description>Befehle zur Einrichtung von VLC für Blu-rays (Manjaro) Diese Schritte helfen Ihnen, VLC so zu konfigurieren, dass es Blu-ray-Discs abspielen kann.
Benötigte Pakete installieren Dieser Befehl installiert alle notwendigen Pakete für die Blu-ray-Wiedergabe:
vlc: Der Media Player. libaacs: Notwendig, um …</description>
</item>
<item>
<title>Calcurse Tastenkürzel (Zusammenfassung)</title>
<link>https://localhost:1313/calcurse_tastenk%C3%BCrzel/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/calcurse_tastenk%C3%BCrzel/</guid>
<description>Calcurse Tastenkürzel (Zusammenfassung) Basierend auf deiner Konfigurationsdatei sind hier die wichtigsten Tastenkürzel für calcurse zusammengefasst.
Allgemeine Steuerung Taste(n) Aktion q, Q Calcurse beenden s, S Änderungen speichern ? Hilfe anzeigen C Konfigurationsmenü öffnen TAB Zwischen den …</description>
</item>
<item>
<title>Empfehlungen für AstroVim</title>
<link>https://localhost:1313/astro-vim-recommendations/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/astro-vim-recommendations/</guid>
<description>Empfehlungen für AstroVim 1. Tastenkürzel kennenlernen (Which‑Key) AstroVim nutzt which‑key für kontextsensitive Key‑Menüs. Drücke &lt;leader&gt; (Standard: Leertaste) und warte kurz, um das Menü zu sehen. So erkennst du schnell verfügbare Aktionen.
2. Dateiexplorer (Neo‑Tree) AstroVim bringt …</description>
</item>
<item>
<title>Lazygit – Der Terminal-Git-Client</title>
<link>https://localhost:1313/lazygit/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/lazygit/</guid>
<description>Lazygit – Der Terminal-Git-Client Lazygit ist ein schneller, terminalbasierter Git-Client mit TUI (Terminal User Interface). Du steuerst alles per Tastatur und behältst dein ganzes Repository auf einen Blick – kein Merken von kryptischen git-Befehlen mehr.
Installation # Arch / Manjaro sudo pacman …</description>
</item>
<item>
<title>Python String-Präfixe</title>
<link>https://localhost:1313/string_prefixes/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/string_prefixes/</guid>
<description>Python String-Präfixe In Python gibt es verschiedene Präfixe für String-Literale, die bestimmen, wie der Interpreter den Inhalt des Strings verarbeitet. Suffixe für String-Literale existieren in Python nicht direkt (anders als in Sprachen wie C++), aber es gibt Methoden auf String-Objekten wie …</description>
</item>
<item>
<title>qutebrowser Installation (Wayland / Sway)</title>
<link>https://localhost:1313/install_browser/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/install_browser/</guid>
<description>qutebrowser Installation (Wayland / Sway) Tastaturgesteuerter, vim-artiger Browser auf Basis von Python + QtWebEngine (Chromium/Blink-Engine). Kein Fork, sondern eigenständig.
Hinweis: qutebrowser liegt im offiziellen Repo (extra), nicht im AUR.
1. Basis-Installation sudo pacman -S qutebrowser 2. …</description>
</item>
<item>
<title>Rundeck und AWX Installation mit Docker</title>
<link>https://localhost:1313/awx_und_rundeck_install/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/awx_und_rundeck_install/</guid>
<description>Rundeck und AWX Installation mit Docker Diese Anleitung zeigt, wie man Rundeck und AWX in Docker-Containern installiert, wobei alle wichtigen Daten persistent gespeichert werden.
Voraussetzungen Docker und Docker-Compose installiert Ausreichend Speicherplatz (mindestens 2GB empfohlen) Ports 4440 und …</description>
</item>
<item>
<title>Stretchen_laufen</title>
<link>https://localhost:1313/stretchen_laufen/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/stretchen_laufen/</guid>
<description>Aufwärmen: 10-15 Wh. 1-2 Sek.
Zwillingswadenmuskel dehnen S166 Zwillingswadenmuskel dehen S164 Beste Dhenübung der Welt S140 Girlanden-Haltung S126 Hüftkreisen im Stehen S148 Oberschenkelrückseite dynamisch dehen S163 Einsteiger : 10-15 Wh. 1-2 Sek.
Katze - Kuh S74 Quadrizeps dehnen im Stehen S156 …</description>
</item>
<item>
<title>System Optimierung – nächste Schritte</title>
<link>https://localhost:1313/system-optimierung/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/system-optimierung/</guid>
<description>System Optimierung – nächste Schritte Letzte Bearbeitung: 07.09.2026 Chat-Session-ID: 20260907_182659_6403f3 Chat wieder aufrufen: @session:default/20260907_182659_6403f3 in Hermes Agent eingeben
1. flashfocus patchen (Marshmallow-4.x-Inkompatibilität) Einmalig ausführen:
sudo sed -i …</description>
</item>
<item>
<title>Vergleich: TinyDB vs. SQLite</title>
<link>https://localhost:1313/tinydb_vs_sqlite/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/tinydb_vs_sqlite/</guid>
<description>Vergleich: TinyDB vs. SQLite Sowohl TinyDB als auch SQLite sind hervorragende &ldquo;Embedded Databases&rdquo; (eingebettete Datenbanken), die ihre Daten in einer Datei speichern, ohne dass ein separater Serverprozess läuft. Der Unterschied liegt hauptsächlich in ihrem Ansatz zur Datenspeicherung …</description>
</item>
<item>
<title>Willkommen bei Hugo Docker</title>
<link>https://localhost:1313/willkommen/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/willkommen/</guid>
<description>Das ist eine Beispiel-Seite. Funktioniert!
Einfach .md-Dateien in den Ordner content/ kopieren – Hugo rendert sie automatisch.
So geht&rsquo;s # Neue Seite anlegen echo &#39;--- title: &#34;Meine Seite&#34; date: &#34;2026-09-08&#34; --- Inhalt hier ... &#39; &gt; content/meine-seite.md Änderungen …</description>
</item>
<item>
<title>YubiKey-Einrichtung unter Manjaro Sway</title>
<link>https://localhost:1313/yubikey_setup_guide/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/yubikey_setup_guide/</guid>
<description>YubiKey-Einrichtung unter Manjaro Sway Diese Anleitung beschreibt, wie Sie einen YubiKey unter Manjaro Sway für verschiedene Anwendungsfälle konfigurieren.
Übersicht der Anwendungsfälle: FIDO2/U2F: Für die Zwei-Faktor-Authentifizierung auf Webseiten. GPG: Zur Verschlüsselung von E-Mails/Dateien und …</description>
</item>
<item>
<title>Zusammenfassung der vorgenommenen Änderungen und Konfigurationen</title>
<link>https://localhost:1313/networkconfig_dns/</link>
<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
<guid>https://localhost:1313/networkconfig_dns/</guid>
<description>Zusammenfassung der vorgenommenen Änderungen und Konfigurationen Dieses Dokument fasst die wichtigsten Änderungen und Konfigurationen zusammen, die wir besprochen und durchgeführt haben.
1. Python Logging (sync.py und logging_config.py) Um die Log-Ausgabe des sync.py-Skripts zu verbessern, wurde …</description>
</item>
</channel>
</rss>
-274
View File
@@ -1,274 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>qutebrowser Installation (Wayland / Sway) – Hugo Docker CMS</title>
<meta name="description" content="qutebrowser Installation (Wayland / Sway) Tastaturgesteuerter, vim-artiger Browser auf Basis von Python &#43; QtWebEngine (Chromium/Blink-Engine). Kein Fork, …">
<meta property="og:title" content="qutebrowser Installation (Wayland / Sway) – Hugo Docker CMS">
<meta property="og:description" content="qutebrowser Installation (Wayland / Sway) Tastaturgesteuerter, vim-artiger Browser auf Basis von Python &#43; QtWebEngine (Chromium/Blink-Engine). Kein Fork, …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/install_browser/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>qutebrowser Installation (Wayland / Sway)</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#1-basis-installation">1. Basis-Installation</a></li>
<li><a href="#2-video-hardwarebeschleunigung-vaapi">2. Video-Hardwarebeschleunigung (VAAPI)</a></li>
<li><a href="#3-drm--widevine-netflix-prime-spotify-">3. DRM / Widevine (Netflix, Prime, Spotify …)</a></li>
<li><a href="#4-wayland-nativ-starten">4. Wayland-nativ starten</a></li>
<li><a href="#5-adblock--datenschutz">5. Adblock &amp; Datenschutz</a></li>
<li><a href="#6-minimale-beispiel-konfiguration">6. Minimale Beispiel-Konfiguration</a></li>
<li><a href="#7-wichtigste-tastenkürzel">7. Wichtigste Tastenkürzel</a></li>
<li><a href="#8-alternativen-im-überblick-schnell--sicher-auf-sway">8. Alternativen im Überblick (schnell &amp; sicher auf Sway)</a></li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="qutebrowser-installation-wayland--sway">qutebrowser Installation (Wayland / Sway)</h1>
<p>Tastaturgesteuerter, vim-artiger Browser auf Basis von Python + QtWebEngine
(Chromium/Blink-Engine). Kein Fork, sondern eigenständig.</p>
<p>Hinweis: qutebrowser liegt im offiziellen Repo (<code>extra</code>), nicht im AUR.</p>
<hr>
<h2 id="1-basis-installation">1. Basis-Installation</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S qutebrowser
</span></span></code></pre></div><hr>
<h2 id="2-video-hardwarebeschleunigung-vaapi">2. Video-Hardwarebeschleunigung (VAAPI)</h2>
<p>Deine GPU: Intel Iris Xe (TigerLake). Dafür brauchst du den Intel-Media-Driver
und die VAAPI-Utils zum Prüfen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S intel-media-driver libva-utils
</span></span></code></pre></div><p>Testen ob VAAPI läuft:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">vainfo
</span></span></code></pre></div><p>Erwartete Ausgabe: eine Liste mit Profilen (H264, HEVC/VP9-Decoding etc.).
Falls leer oder Fehler -&gt; Treiberproblem.</p>
<p>In qutebrowser aktivieren (<code>:set</code> oder in <code>~/.config/qutebrowser/config.py</code>):</p>
<pre tabindex="0"><code>qt.args:
- ignore-gpu-blocklist
- enable-features=VaapiVideoDecoder,VaapiVideoDecodeLinuxGL
- enable-accelerated-video-decode
</code></pre><hr>
<h2 id="3-drm--widevine-netflix-prime-spotify-">3. DRM / Widevine (Netflix, Prime, Spotify …)</h2>
<p>Widevine ist proprietär und nicht im offiziellen Repo. Das AUR-Paket
<code>chromium-widevine</code> stellt das Widevine-CDM (<code>libwidevinecdm.so</code>) bereit:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yay -S chromium-widevine
</span></span></code></pre></div><p>Das Paket legt die Bibliothek ab unter:</p>
<pre tabindex="0"><code>/usr/lib/chromium/libwidevinecdm.so
</code></pre><p>Pfad in qutebrowser bekannt machen (in <code>config.py</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">qt</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;widevine-path=/usr/lib/chromium/libwidevinecdm.so&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;ignore-gpu-blocklist&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;enable-features=VaapiVideoDecoder&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span></code></pre></div><p>Danach qutebrowser neu starten und prüfen:</p>
<pre tabindex="0"><code>:version
</code></pre><p>Dort sollte Widevine aufgelistet sein. Prüfseite: <a href="https://bitmovin.com/demos/drm">https://bitmovin.com/demos/drm</a></p>
<p>Wichtige Einschränkung: Widevine unter Linux liefert maximal <strong>1080p</strong> (L3-Lizenz).
4K-Streaming geht auf Linux nur mit Microsoft Edge oder Safari/macOS.</p>
<hr>
<h2 id="4-wayland-nativ-starten">4. Wayland-nativ starten</h2>
<p>Sway ist Wayland, also qutebrowser nativ (ohne XWayland) laufen lassen:</p>
<pre tabindex="0"><code>:set qt.args
</code></pre><p>oder in <code>config.py</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">qt</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;widevine-path=...&#34;</span><span class="p">]</span>
</span></span></code></pre></div><p>Standardmäßig nutzt qutebrowser unter Sway bereits Wayland. Prüfen:</p>
<pre tabindex="0"><code>:version
</code></pre><p>Unter &ldquo;Qt&rdquo; sollte <code>wayland</code> als Platform stehen (nicht <code>xcb</code>).</p>
<hr>
<h2 id="5-adblock--datenschutz">5. Adblock &amp; Datenschutz</h2>
<p>qutebrowser hat einen eingebauten Host-Datei-Adblocker. Listen aktualisieren:</p>
<pre tabindex="0"><code>:adblock-update
</code></pre><p>Für besseren Schutz in <code>config.py</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Standard-User-Agent abschalten (weniger Fingerprinting)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">user_agent</span> <span class="o">=</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># DNT / Tracking-Opt-out</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">do_not_track</span> <span class="o">=</span> <span class="kc">True</span>
</span></span></code></pre></div><hr>
<h2 id="6-minimale-beispiel-konfiguration">6. Minimale Beispiel-Konfiguration</h2>
<p>Datei: <code>~/.config/qutebrowser/config.py</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># DRM + Video-Hardwarebeschleunigung</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">qt</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;widevine-path=/usr/lib/chromium/libwidevinecdm.so&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;ignore-gpu-blocklist&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;enable-features=VaapiVideoDecoder,VaapiVideoDecodeLinuxGL&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Startseite</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">start_pages</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;https://duckduckgo.com&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Adblock-Listen</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">blocking</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">blocking</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="s2">&#34;both&#34;</span> <span class="c1"># hosts + adblock</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">blocking</span><span class="o">.</span><span class="n">hosts</span><span class="o">.</span><span class="n">lists</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Tabs / Verhalten</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">tabs</span><span class="o">.</span><span class="n">position</span> <span class="o">=</span> <span class="s2">&#34;top&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">confirm_quit</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;downloads&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Tastatur: h/j/k/l Navigation (bereits Standard bei qutebrowser)</span>
</span></span></code></pre></div><hr>
<h2 id="7-wichtigste-tastenkürzel">7. Wichtigste Tastenkürzel</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>:</code></td>
<td>Befehlszeile</td>
</tr>
<tr>
<td><code>o</code></td>
<td>URL öffnen</td>
</tr>
<tr>
<td><code>O</code></td>
<td>URL in neuem Tab öffnen</td>
</tr>
<tr>
<td><code>f</code></td>
<td>Links per Buchstabenkürzel anklicken</td>
</tr>
<tr>
<td><code>H</code> / <code>L</code></td>
<td>Zurück / Vor</td>
</tr>
<tr>
<td><code>j</code> / <code>k</code></td>
<td>Nach unten / oben scrollen</td>
</tr>
<tr>
<td><code>gg</code> / <code>G</code></td>
<td>Seitenanfang / -ende</td>
</tr>
<tr>
<td><code>J</code> / <code>K</code></td>
<td>Nächster / vorheriger Tab</td>
</tr>
<tr>
<td><code>d</code> / <code>u</code></td>
<td>Tab schließen / wieder öffnen</td>
</tr>
<tr>
<td><code>/</code></td>
<td>Suche auf Seite</td>
</tr>
<tr>
<td><code>n</code> / <code>N</code></td>
<td>Nächstes / vorheriges Suchergebnis</td>
</tr>
<tr>
<td><code>yy</code></td>
<td>URL in Zwischenablage</td>
</tr>
<tr>
<td><code>ZZ</code></td>
<td>qutebrowser beenden</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="8-alternativen-im-überblick-schnell--sicher-auf-sway">8. Alternativen im Überblick (schnell &amp; sicher auf Sway)</h2>
<table>
<thead>
<tr>
<th>Browser</th>
<th>Engine</th>
<th>Install</th>
<th>Anmerkung</th>
</tr>
</thead>
<tbody>
<tr>
<td>qutebrowser</td>
<td>Blink (Qt)</td>
<td><code>sudo pacman -S qutebrowser</code></td>
<td>Tastatur-only, ideal für Tiling</td>
</tr>
<tr>
<td>LibreWolf</td>
<td>Gecko (Firefox)</td>
<td><code>yay -S librewolf-bin</code></td>
<td>Firefox ohne Telemetrie, +uBlock</td>
</tr>
<tr>
<td>ungoogled-chromium</td>
<td>Blink</td>
<td><code>yay -S ungoogled-chromium-bin</code></td>
<td>Chromium ohne Google</td>
</tr>
<tr>
<td>Brave</td>
<td>Blink</td>
<td><code>yay -S brave-bin</code></td>
<td>Built-in Werbeblocker</td>
</tr>
</tbody>
</table>
<p>Für 4K-Streaming + Extensions: Brave. Für maximalen Datenschutz: LibreWolf.
Für reine Tastatur-Steuerung im Tiling-WM: qutebrowser.</p>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
@@ -1 +0,0 @@
(function(){"use strict";const t=document.getElementById("search-input"),e=document.getElementById("search-results");if(!t||!e)return;let n=null,s=null,a=[];async function r(){return n||(n=await import("/pagefind/pagefind.js")),n}function o(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function c(t){if(a=t,!t.length){e.innerHTML='<p class="search-empty">Keine Treffer.</p>',e.hidden=!1;return}e.innerHTML=t.map(e=>{const n=e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"",t=(e.sub_results||[]).slice(0,3).map(e=>`<li><a href="${e.url}">${o(e.title)}</a>`+(e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"")+`</li>`).join("");return`<a class="search-item" href="${e.url}">`+`<span class="search-title">${o(e.title)}</span>${n}</a>`+(t?`<ul class="search-sub">${t}</ul>`:"")}).join(""),e.hidden=!1}async function i(t){if(t=t.trim(),t.length<2){e.hidden=!0,e.innerHTML="";return}try{const n=await r(),s=await n.search(t),e=[];for(const n of s.results.slice(0,8)){const t=await n.data();e.push({url:t.url,title:t.meta&&t.meta.title||t.url,excerpt:t.excerpt,sub_results:(t.sub_results||[]).map(e=>({url:e.url,title:e.title,excerpt:e.excerpt}))})}c(e)}catch{e.innerHTML='<p class="search-empty">Suche nicht verfügbar.</p>',e.hidden=!1}}t.addEventListener("input",()=>{clearTimeout(s),s=setTimeout(()=>i(t.value),150)}),t.addEventListener("focus",()=>{t.value.trim().length>=2&&i(t.value)}),document.addEventListener("click",t=>{t.target.closest(".search")||(e.hidden=!0)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&(e.hidden=!0,t.blur())})})()
@@ -1 +0,0 @@
(function(){"use strict";const t=document.getElementById("search-input"),e=document.getElementById("search-results");if(!t||!e)return;let n=null,s=null,c=[];async function a(){return n||(n=await import("/pagefind/pagefind.js")),n}function o(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function r(t){if(!t.length){e.innerHTML='<p class="search-empty">Keine Treffer.</p>',e.hidden=!1;return}e.innerHTML=t.map(e=>{const n=e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"",t=(e.sub_results||[]).slice(0,3).map(e=>`<li><a href="${e.url}">${o(e.title)}</a>`+(e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"")+`</li>`).join("");return`<a class="search-item" href="${e.url}">`+`<span class="search-title">${o(e.title)}</span>${n}</a>`+(t?`<ul class="search-sub">${t}</ul>`:"")}).join(""),e.hidden=!1}async function i(t){if(t=t.trim(),t.length<2){e.hidden=!0,e.innerHTML="";return}try{const n=await a(),s=await n.search(t),e=[];for(const n of s.results.slice(0,8)){const t=await n.data();e.push({url:t.url,title:t.meta&&t.meta.title||t.url,excerpt:t.excerpt,sub_results:(t.sub_results||[]).map(e=>({url:e.url,title:e.title,excerpt:e.excerpt}))})}r(e)}catch{e.innerHTML='<p class="search-empty">Suche nicht verfügbar.</p>',e.hidden=!1}}t.addEventListener("input",()=>{clearTimeout(s),s=setTimeout(()=>i(t.value),150)}),t.addEventListener("focus",()=>{t.value.trim().length>=2&&i(t.value)}),document.addEventListener("click",t=>{t.target.closest(".search")||(e.hidden=!0)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&(e.hidden=!0,t.blur())})})()
@@ -1 +0,0 @@
(function(){"use strict";const t=document.getElementById("search-input"),e=document.getElementById("search-results");if(!t||!e)return;let n=null,s=null;async function a(){return n||(n=await import("/pagefind/pagefind.js")),n}function o(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function r(t){if(!t.length){e.innerHTML='<p class="search-empty">Keine Treffer.</p>',e.hidden=!1;return}e.innerHTML=t.map(e=>{const n=e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"",t=(e.sub_results||[]).slice(0,3).map(e=>`<li><a href="${e.url}">${o(e.title)}</a>`+(e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"")+`</li>`).join("");return`<a class="search-item" href="${e.url}">`+`<span class="search-title">${o(e.title)}</span>${n}</a>`+(t?`<ul class="search-sub">${t}</ul>`:"")}).join(""),e.hidden=!1}async function i(t){if(t=t.trim(),t.length<2){e.hidden=!0,e.innerHTML="";return}try{const n=await a(),s=await n.search(t),e=[];for(const n of s.results.slice(0,8)){const t=await n.data();e.push({url:t.url,title:t.meta&&t.meta.title||t.url,excerpt:t.excerpt,sub_results:(t.sub_results||[]).map(e=>({url:e.url,title:e.title,excerpt:e.excerpt}))})}r(e)}catch{e.innerHTML='<p class="search-empty">Suche nicht verfügbar.</p>',e.hidden=!1}}t.addEventListener("input",()=>{clearTimeout(s),s=setTimeout(()=>i(t.value),150)}),t.addEventListener("focus",()=>{t.value.trim().length>=2&&i(t.value)}),document.addEventListener("click",t=>{t.target.closest(".search")||(e.hidden=!0)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&(e.hidden=!0,t.blur())})})()
@@ -1 +0,0 @@
(function(){"use strict";const t=document.getElementById("search-input"),e=document.getElementById("search-results");if(!t||!e)return;let n=null,s=null,o=[];async function r(){return n||(n=await import("/pagefind/pagefind.js")),n}function i(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function c(t){if(o=t,!t.length){e.innerHTML='<p class="search-empty">Keine Treffer.</p>',e.hidden=!1;return}e.innerHTML=t.map(e=>{const n=e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"",t=(e.sub_results||[]).slice(0,3).map(e=>`<li><a href="${e.url}">${i(e.title)}</a>`+(e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"")+`</li>`).join("");return`<a class="search-item" href="${e.url}">`+`<span class="search-title">${i(e.title)}</span>${n}</a>`+(t?`<ul class="search-sub">${t}</ul>`:"")}).join(""),e.hidden=!1}async function a(t){if(t=t.trim(),t.length<2){e.hidden=!0,e.innerHTML="",o=[];return}try{const n=await r(),s=await n.search(t),e=[];for(const n of s.results.slice(0,8)){const t=await n.data();e.push({url:t.url,title:t.meta&&t.meta.title||t.url,excerpt:t.excerpt,sub_results:(t.sub_results||[]).map(e=>({url:e.url,title:e.title,excerpt:e.excerpt}))})}c(e)}catch{e.innerHTML='<p class="search-empty">Suche nicht verfügbar.</p>',e.hidden=!1}}t.addEventListener("input",()=>{clearTimeout(s),s=setTimeout(()=>a(t.value),150)}),t.addEventListener("focus",()=>{t.value.trim().length>=2&&a(t.value)}),document.addEventListener("click",t=>{t.target.closest(".search")||(e.hidden=!0)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&(e.hidden=!0,t.blur())})})()
@@ -1 +0,0 @@
(function(){"use strict";const t=document.getElementById("search-input"),e=document.getElementById("search-results");if(!t||!e)return;let s=null,o=null,n=[];async function r(){return s||(s=await import("/pagefind/pagefind.js")),s}function i(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function c(t){if(n=t,!t.length){e.innerHTML='<p class="search-empty">Keine Treffer.</p>',e.hidden=!1;return}e.innerHTML=t.map(e=>{const n=e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"",t=(e.sub_results||[]).slice(0,3).map(e=>`<li><a href="${e.url}">${i(e.title)}</a>`+(e.excerpt?`<span class="search-excerpt">${e.excerpt}</span>`:"")+`</li>`).join("");return`<a class="search-item" href="${e.url}">`+`<span class="search-title">${i(e.title)}</span>${n}</a>`+(t?`<ul class="search-sub">${t}</ul>`:"")}).join(""),e.hidden=!1}async function a(t){if(t=t.trim(),t.length<2){e.hidden=!0,e.innerHTML="",n=[];return}try{const n=await r(),s=await n.search(t),e=[];for(const n of s.results.slice(0,8)){const t=await n.data();e.push({url:t.url,title:t.meta&&t.meta.title||t.url,excerpt:t.excerpt,sub_results:(t.sub_results||[]).map(e=>({url:e.url,title:e.title,excerpt:e.excerpt}))})}c(e)}catch{e.innerHTML='<p class="search-empty">Suche nicht verfügbar.</p>',e.hidden=!1}}t.addEventListener("input",()=>{clearTimeout(o),o=setTimeout(()=>a(t.value),150)}),t.addEventListener("focus",()=>{t.value.trim().length>=2&&a(t.value)}),t.addEventListener("keydown",e=>{e.key==="Enter"&&(e.preventDefault(),n.length&&(window.location.href=n[0].url))}),document.addEventListener("click",t=>{t.target.closest(".search")||(e.hidden=!0)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&(e.hidden=!0,t.blur())})})()
-688
View File
@@ -1,688 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Lazygit – Der Terminal-Git-Client – Hugo Docker CMS</title>
<meta name="description" content="Lazygit – Der Terminal-Git-Client Lazygit ist ein schneller, terminalbasierter Git-Client mit TUI (Terminal User Interface). Du steuerst alles per Tastatur und …">
<meta property="og:title" content="Lazygit – Der Terminal-Git-Client – Hugo Docker CMS">
<meta property="og:description" content="Lazygit – Der Terminal-Git-Client Lazygit ist ein schneller, terminalbasierter Git-Client mit TUI (Terminal User Interface). Du steuerst alles per Tastatur und …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/lazygit/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Lazygit – Der Terminal-Git-Client</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#installation">Installation</a></li>
<li><a href="#navigation-global">Navigation (global)</a></li>
<li><a href="#panel-1-status-ganz-links">Panel 1: Status (ganz links)</a></li>
<li><a href="#panel-2-dateien--working-tree">Panel 2: Dateien / Working Tree</a>
<ul>
<li><a href="#patch-modus-p">Patch-Modus (<code>p</code>)</a></li>
</ul>
</li>
<li><a href="#panel-3-branches">Panel 3: Branches</a></li>
<li><a href="#panel-4-commits-im-branch-panel-mit-enter">Panel 4: Commits (im Branch-Panel mit Enter)</a></li>
<li><a href="#panel-5-stash">Panel 5: Stash</a></li>
<li><a href="#reflog">Reflog</a></li>
<li><a href="#remote--push--pull">Remote / Push &amp; Pull</a></li>
<li><a href="#undo--redo">Undo / Redo</a></li>
<li><a href="#konflikte-lösen">Konflikte lösen</a></li>
<li><a href="#submodule">Submodule</a></li>
<li><a href="#worktrees">Worktrees</a></li>
<li><a href="#tipps--häufige-workflows">Tipps &amp; häufige Workflows</a>
<ul>
<li><a href="#änderungen-committen">Änderungen committen</a></li>
<li><a href="#letzten-commit-ändern-amend">Letzten Commit ändern (amend)</a></li>
<li><a href="#branch-erstellen-und-wechseln">Branch erstellen und wechseln</a></li>
<li><a href="#commits-zusammenfassen-squash">Commits zusammenfassen (squash)</a></li>
<li><a href="#commit-rückgängig-machen">Commit rückgängig machen</a></li>
<li><a href="#interaktives-rebase">Interaktives Rebase</a></li>
</ul>
</li>
<li><a href="#konfiguration">Konfiguration</a></li>
<li><a href="#fazit">Fazit</a></li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="lazygit--der-terminal-git-client">Lazygit – Der Terminal-Git-Client</h1>
<p>Lazygit ist ein schneller, terminalbasierter Git-Client mit TUI (Terminal User
Interface). Du steuerst alles per Tastatur und behältst dein ganzes Repository
auf einen Blick – kein Merken von kryptischen <code>git</code>-Befehlen mehr.</p>
<h2 id="installation">Installation</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Arch / Manjaro</span>
</span></span><span class="line"><span class="cl">sudo pacman -S lazygit
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ubuntu / Debian</span>
</span></span><span class="line"><span class="cl"><span class="nv">LAZYGIT_VERSION</span><span class="o">=</span><span class="k">$(</span>curl -s <span class="s2">&#34;https://api.github.com/repos/jesseduffield/lazygit/releases/latest&#34;</span> <span class="p">|</span> grep -Po <span class="s1">&#39;&#34;tag_name&#34;: &#34;v\K[^&#34;]*&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">curl -Lo lazygit.tar.gz <span class="s2">&#34;https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_</span><span class="si">${</span><span class="nv">LAZYGIT_VERSION</span><span class="si">}</span><span class="s2">_Linux_x86_64.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">tar xf lazygit.tar.gz lazygit
</span></span><span class="line"><span class="cl">sudo install lazygit /usr/local/bin
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># macOS</span>
</span></span><span class="line"><span class="cl">brew install lazygit
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Windows (mit Winget)</span>
</span></span><span class="line"><span class="cl">winget install JesseDuffield.lazygit
</span></span></code></pre></div><p>Start: Einfach <code>lazygit</code> im Repository-Verzeichnis ausführen.</p>
<hr>
<h2 id="navigation-global">Navigation (global)</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>h</code> / <code>l</code></td>
<td>Zwischen Panels wechseln (links/rechts)</td>
</tr>
<tr>
<td><code>j</code> / <code>k</code></td>
<td>In Liste nach unten/oben</td>
</tr>
<tr>
<td><code>↑</code> / <code>↓</code></td>
<td>Dasselbe wie j/k</td>
</tr>
<tr>
<td><code>g</code></td>
<td>Zum Anfang der Liste</td>
</tr>
<tr>
<td><code>shift+G</code></td>
<td>Zum Ende der Liste</td>
</tr>
<tr>
<td><code>/</code></td>
<td>Suchen (im aktuellen Panel)</td>
</tr>
<tr>
<td><code>q</code></td>
<td>Lazygit beenden</td>
</tr>
<tr>
<td><code>esc</code></td>
<td>Zurück / Aktion abbrechen</td>
</tr>
<tr>
<td><code>?</code></td>
<td>Hilfe anzeigen (alle Tasten)</td>
</tr>
<tr>
<td><code>tab</code></td>
<td>In neuem Panel: zwischen Bereichen springen</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="panel-1-status-ganz-links">Panel 1: Status (ganz links)</h2>
<p>Zeigt, ob du im normalen Modus, im Rebase, Merge-Konflikt etc. bist.
Normalerweise springst du mit <code>1</code>-<code>5</code> direkt in die anderen Panels.</p>
<hr>
<h2 id="panel-2-dateien--working-tree">Panel 2: Dateien / Working Tree</h2>
<p>Hier siehst du alle geänderten, neuen und gelöschten Dateien.</p>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Leertaste</code></td>
<td>Datei stagen/unstagen (markiert)</td>
</tr>
<tr>
<td><code>a</code></td>
<td>Alle Dateien stagen/unstagen</td>
</tr>
<tr>
<td><code>c</code></td>
<td>Commit erstellen (öffnet Editor für Commit-Message)</td>
</tr>
<tr>
<td><code>shift+C</code></td>
<td>Commit mit Editor (git commit)</td>
</tr>
<tr>
<td><code>enter</code></td>
<td>Diff der ausgewählten Datei anzeigen</td>
</tr>
<tr>
<td><code>d</code></td>
<td>Änderungen der Datei verwerfen (Achtung, unwiderruflich!)</td>
</tr>
<tr>
<td><code>shift+D</code></td>
<td>Datei aus Working Tree löschen</td>
</tr>
<tr>
<td><code>e</code></td>
<td>Datei im Editor öffnen</td>
</tr>
<tr>
<td><code>o</code></td>
<td>Datei mit Standardprogramm öffnen</td>
</tr>
<tr>
<td><code>i</code></td>
<td>Datei zu .gitignore hinzufügen / Eintrag entfernen</td>
</tr>
<tr>
<td><code>p</code></td>
<td>Patch – interaktiv nur Teile einer Datei stagen</td>
</tr>
</tbody>
</table>
<h3 id="patch-modus-p">Patch-Modus (<code>p</code>)</h3>
<p>Nach Drücken von <code>p</code> auf einer Datei:</p>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Leertaste</code></td>
<td>Aktuellen Hunks stagen/unstagen</td>
</tr>
<tr>
<td><code>j</code> / <code>k</code></td>
<td>Zwischen Hunks navigieren</td>
</tr>
<tr>
<td><code>v</code></td>
<td>Selektionsmodus (visuell) – dann Leertaste für Auswahl</td>
</tr>
<tr>
<td><code>tab</code></td>
<td>In Diff-Fenster springen</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="panel-3-branches">Panel 3: Branches</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Leertaste</code></td>
<td>Branch auschecken</td>
</tr>
<tr>
<td><code>n</code></td>
<td>Neuen Branch erstellen</td>
</tr>
<tr>
<td><code>c</code></td>
<td>Branch mit Namen umbenennen (checkout)</td>
</tr>
<tr>
<td><code>shift+C</code></td>
<td>Branch umbenennen (ohne checkout)</td>
</tr>
<tr>
<td><code>d</code></td>
<td>Branch löschen</td>
</tr>
<tr>
<td><code>shift+D</code></td>
<td>Branch force-löschen (auch wenn nicht gemerged)</td>
</tr>
<tr>
<td><code>m</code></td>
<td>Aktuellen Branch in ausgewählten Branch mergen</td>
</tr>
<tr>
<td><code>M</code></td>
<td>Merge ohne Fast-Forward</td>
</tr>
<tr>
<td><code>enter</code></td>
<td>Commits des Branches anzeigen</td>
</tr>
<tr>
<td><code>r</code></td>
<td>Branch rebasen auf ausgewählten Branch</td>
</tr>
<tr>
<td><code>f</code></td>
<td>Fast-Forward des ausgewählten Branches</td>
</tr>
<tr>
<td><code>T</code></td>
<td>Tag erstellen</td>
</tr>
<tr>
<td><code>g</code></td>
<td>Branch zurücksetzen (reset) auf ausgewählten</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="panel-4-commits-im-branch-panel-mit-enter">Panel 4: Commits (im Branch-Panel mit Enter)</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>s</code></td>
<td>Squash down – Commit in den darunterliegenden squashen</td>
</tr>
<tr>
<td><code>shift+S</code></td>
<td>Fixup – Commit in darunterliegenden squashen, Message verwerfen</td>
</tr>
<tr>
<td><code>r</code></td>
<td>Rebase auf diesen Commit starten / Rebase fortsetzen</td>
</tr>
<tr>
<td><code>R</code></td>
<td>Commit-Message mit <code>git commit --amend</code> bearbeiten</td>
</tr>
<tr>
<td><code>A</code></td>
<td>Commit mit Staged-Änderungen amendend (git commit &ndash;amend)</td>
</tr>
<tr>
<td><code>t</code></td>
<td>Commit rückgängig machen (revert)</td>
</tr>
<tr>
<td><code>shift+T</code></td>
<td>Revert erstellen, ohne zu commiten</td>
</tr>
<tr>
<td><code>ctrl+j</code> / <code>ctrl+k</code></td>
<td>Commit in der Liste nach unten/oben verschieben (interaktiv)</td>
</tr>
<tr>
<td><code>g</code></td>
<td>Reset auf diesen Commit – Optionen:</td>
</tr>
<tr>
<td></td>
<td><code>soft</code> – HEAD verschieben, Index bleibt</td>
</tr>
<tr>
<td></td>
<td><code>mixed</code> (default) – HEAD + Index verschieben</td>
</tr>
<tr>
<td></td>
<td><code>hard</code> – HEAD + Index + Working Tree (Achtung, verwirft!)</td>
</tr>
<tr>
<td><code>d</code></td>
<td>Commit löschen (während Rebase)</td>
</tr>
<tr>
<td><code>shift+D</code></td>
<td>Commits ab hier löschen (während Rebase)</td>
</tr>
<tr>
<td><code>f</code></td>
<td>Fixup-Commit erstellen</td>
</tr>
<tr>
<td><code>shift+F</code></td>
<td>Fixup-Commit für einen bestimmten Commit</td>
</tr>
<tr>
<td><code>enter</code></td>
<td>Dateien des Commits anzeigen</td>
</tr>
<tr>
<td><code>ctrl+l</code></td>
<td>Commit-Log anzeigen</td>
</tr>
<tr>
<td><code>shift+C</code></td>
<td>Commit kopieren (cherry-pick)</td>
</tr>
<tr>
<td><code>v</code></td>
<td>Commits in die Zwischenablage kopieren</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="panel-5-stash">Panel 5: Stash</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Leertaste</code></td>
<td>Stash anwenden</td>
</tr>
<tr>
<td><code>g</code></td>
<td>Stash anwenden und danach löschen (pop)</td>
</tr>
<tr>
<td><code>d</code></td>
<td>Stash löschen</td>
</tr>
<tr>
<td><code>enter</code></td>
<td>Dateien des Stashs anzeigen</td>
</tr>
<tr>
<td><code>n</code></td>
<td>Neuen Stash mit Nachricht erstellen</td>
</tr>
<tr>
<td><code>s</code></td>
<td>Schnell-Stash (ohne Nachricht)</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="reflog">Reflog</h2>
<p>Mit <code>ctrl+o</code> (oder im Commits-Panel) öffnest du das Reflog – alle HEAD-Bewegungen.</p>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>enter</code></td>
<td>Reflog-Eintrag anzeigen</td>
</tr>
<tr>
<td><code>g</code></td>
<td>Auf diesen Eintrag zurücksetzen (soft/mixed/hard)</td>
</tr>
<tr>
<td><code>ctrl+o</code></td>
<td>Reflog schließen</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="remote--push--pull">Remote / Push &amp; Pull</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>p</code></td>
<td>Push (im Branch- oder Commits-Panel)</td>
</tr>
<tr>
<td><code>shift+P</code></td>
<td>Force-Push (<code>--force-with-lease</code>)</td>
</tr>
<tr>
<td><code>shift+F</code></td>
<td>Fetch (alle Remotes)</td>
</tr>
<tr>
<td><code>ctrl+p</code></td>
<td>Pull (fetch + merge)</td>
</tr>
<tr>
<td><code>shift+ctrl+P</code></td>
<td>Pull mit Rebase</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="undo--redo">Undo / Redo</h2>
<p>Lazygit hat eine eingebaute Undo-Funktion – ein Lebensretter!</p>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>z</code></td>
<td>Letzte Git-Aktion rückgängig machen (undo)</td>
</tr>
<tr>
<td><code>shift+Z</code></td>
<td>Rückgängig gemachte Aktion wiederholen (redo)</td>
</tr>
</tbody>
</table>
<p>Funktioniert für: Commit, Stash, Branch-Reset, Checkout, Cherry-Pick, Revert,
Merge &hellip;</p>
<hr>
<h2 id="konflikte-lösen">Konflikte lösen</h2>
<p>Im Merge-Konflikt-Fall zeigt Lazygit die betroffenen Dateien.</p>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Leertaste</code></td>
<td>Datei als &ldquo;ours&rdquo; markieren (eigene Version)</td>
</tr>
<tr>
<td><code>b</code></td>
<td>Datei als &ldquo;theirs&rdquo; markieren (fremde Version)</td>
</tr>
<tr>
<td><code>↑</code> / <code>↓</code></td>
<td>Hunk auswählen</td>
</tr>
<tr>
<td><code>Leertaste</code></td>
<td>Hunk auswählen (ours/theirs oder beide)</td>
</tr>
<tr>
<td><code>a</code></td>
<td>Alle Hunks auf einmal akzeptieren</td>
</tr>
<tr>
<td><code>shift+M</code></td>
<td>Merge-Tool für diese Datei öffnen</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="submodule">Submodule</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>enter</code></td>
<td>In Submodule wechseln (öffnet neue Lazygit-Instanz)</td>
</tr>
<tr>
<td><code>i</code></td>
<td>Submodule init</td>
</tr>
<tr>
<td><code>u</code></td>
<td>Submodule updaten</td>
</tr>
<tr>
<td><code>n</code></td>
<td>Submodule hinzufügen</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="worktrees">Worktrees</h2>
<table>
<thead>
<tr>
<th>Taste</th>
<th>Aktion</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>n</code></td>
<td>Neues Worktree erstellen</td>
</tr>
<tr>
<td><code>enter</code></td>
<td>In Worktree wechseln</td>
</tr>
<tr>
<td><code>d</code></td>
<td>Worktree löschen</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="tipps--häufige-workflows">Tipps &amp; häufige Workflows</h2>
<h3 id="änderungen-committen">Änderungen committen</h3>
<pre tabindex="0"><code>1. j/k → Datei auswählen
2. Leertaste → Stagen
3. c → Commit-Message schreiben, Enter
4. p → Pushen
</code></pre><h3 id="letzten-commit-ändern-amend">Letzten Commit ändern (amend)</h3>
<pre tabindex="0"><code>1. a → Alle Dateien stagen
2. shift+A → Amend (fügt Staged-Änderungen zum letzten Commit hinzu)
</code></pre><h3 id="branch-erstellen-und-wechseln">Branch erstellen und wechseln</h3>
<pre tabindex="0"><code>1. 3 → Branch-Panel
2. n → Neuen Branch, Namen eingeben, Enter
</code></pre><h3 id="commits-zusammenfassen-squash">Commits zusammenfassen (squash)</h3>
<pre tabindex="0"><code>1. 4 → Commits-Panel
2. j/k → Commit auswählen (der, der in den darunterliegenden gesquasht werden soll)
3. s → Squash
</code></pre><h3 id="commit-rückgängig-machen">Commit rückgängig machen</h3>
<pre tabindex="0"><code>1. 4 → Commits-Panel
2. g → &#34;reset&#34;
3. soft → HEAD verschieben, Änderungen bleiben im Index
</code></pre><p>Falls du es dir anders überlegst: <code>z</code> (undo).</p>
<h3 id="interaktives-rebase">Interaktives Rebase</h3>
<pre tabindex="0"><code>1. 4 → Commits-Panel
2. r auf einem älteren Commit → Rebase starten
3. j/k → Commits auswählen, dann s/f/d zum Squashen/Fixen/Löschen
4. r → Rebase fortsetzen
</code></pre><hr>
<h2 id="konfiguration">Konfiguration</h2>
<p>Die Konfigurationsdatei liegt unter:</p>
<ul>
<li>Linux/macOS: <code>~/.config/lazygit/config.yml</code></li>
<li>Windows: <code>%APPDATA%/lazygit/config.yml</code></li>
</ul>
<p>Beispiel für ein nützliches Config-Snippet:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">gui</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">theme</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">activeBorderColor</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;#89b4fa&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bold</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">inactiveBorderColor</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;#a6adc8&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nerdFontsVersion</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">git</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paging</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colorArg</span><span class="p">:</span><span class="w"> </span><span class="l">always</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pager</span><span class="p">:</span><span class="w"> </span><span class="l">delta --dark --paging=never</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Commit-Konvention für Merge-Commits</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commitPrefixes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">my_project</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^(\\w+\\/\\w+-\\d+)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;[$1] &#34;</span><span class="w">
</span></span></span></code></pre></div><hr>
<h2 id="fazit">Fazit</h2>
<p>Lazygit macht Git massiv schneller: Du siehst Diff, Branches, Commits und
Stashes gleichzeitig, stagen mit Leertaste, commiten mit <code>c</code>, pushen mit <code>p</code>.
Kein <code>git status</code>-Tippen mehr, kein <code>git log --oneline</code>-Starren.</p>
<p>Die beiden wichtigsten Tasten: <code>z</code> für Undo und <code>?</code> für Hilfe.</p>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-233
View File
@@ -1,233 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Zusammenfassung der vorgenommenen Änderungen und Konfigurationen – Hugo Docker CMS</title>
<meta name="description" content="Zusammenfassung der vorgenommenen Änderungen und Konfigurationen Dieses Dokument fasst die wichtigsten Änderungen und Konfigurationen zusammen, die wir …">
<meta property="og:title" content="Zusammenfassung der vorgenommenen Änderungen und Konfigurationen – Hugo Docker CMS">
<meta property="og:description" content="Zusammenfassung der vorgenommenen Änderungen und Konfigurationen Dieses Dokument fasst die wichtigsten Änderungen und Konfigurationen zusammen, die wir …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/networkconfig_dns/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Zusammenfassung der vorgenommenen Änderungen und Konfigurationen</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#1-python-logging-syncpy-und-logging_configpy">1. Python Logging (sync.py und logging_config.py)</a>
<ul>
<li><a href="#logging_configpy-erstellt"><code>logging_config.py</code> erstellt</a></li>
<li><a href="#syncpy-angepasst"><code>sync.py</code> angepasst</a></li>
</ul>
</li>
<li><a href="#2-dns-konfiguration-auf-dem-manjaro-system">2. DNS-Konfiguration auf dem Manjaro-System</a>
<ul>
<li><a href="#globale-systemd-resolved-konfiguration">Globale <code>systemd-resolved</code> Konfiguration</a></li>
<li><a href="#networkmanager-überschreibung-für-alle-verbindungen">NetworkManager Überschreibung für alle Verbindungen</a></li>
<li><a href="#anpassung-des-spezifischen-wlan-profils-sweethome-5g">Anpassung des spezifischen WLAN-Profils (SweetHome-5G)</a></li>
</ul>
</li>
<li><a href="#3-adguard-home-konfiguration">3. AdGuard Home Konfiguration</a>
<ul>
<li><a href="#installation--ssl-einrichtung">Installation &amp; SSL-Einrichtung</a></li>
<li><a href="#bedingte-weiterleitung-für-lokale-namen">Bedingte Weiterleitung für lokale Namen</a></li>
</ul>
</li>
<li><a href="#4-problembehebung-wireguard-dns">4. Problembehebung WireGuard DNS</a></li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="zusammenfassung-der-vorgenommenen-änderungen-und-konfigurationen">Zusammenfassung der vorgenommenen Änderungen und Konfigurationen</h1>
<p>Dieses Dokument fasst die wichtigsten Änderungen und Konfigurationen zusammen, die wir besprochen und durchgeführt haben.</p>
<hr>
<h2 id="1-python-logging-syncpy-und-logging_configpy">1. Python Logging (sync.py und logging_config.py)</h2>
<p>Um die Log-Ausgabe des <code>sync.py</code>-Skripts zu verbessern, wurde eine modulare Logging-Konfiguration mit Log-Rotation erstellt und in eine separate Datei ausgelagert.</p>
<h3 id="logging_configpy-erstellt"><code>logging_config.py</code> erstellt</h3>
<p><strong>Zweck:</strong> Enthält die Funktion <code>setup_logging()</code> zur Konfiguration eines Root-Loggers, der Logs in eine Datei (<code>sync_log.log</code>) schreibt, diese bei Erreichen einer Größe von 5 MB rotiert und 5 Backups behält. Optional kann auch ein Konsolen-Logger aktiviert werden.</p>
<p><strong>Inhalt der Datei (<code>/home/jonnybravo/Projekte/python_tests/rclone/logging_config.py</code>):</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">logging.handlers</span> <span class="kn">import</span> <span class="n">RotatingFileHandler</span><span class="p">,</span> <span class="n">TimedRotatingFileHandler</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">setup_logging</span><span class="p">(</span><span class="n">console_logging</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Konfiguriert das Root-Logging für die Anwendung mit Rotation.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> Diese Funktion richtet einen Root-Logger ein, der Log-Nachrichten in eine Datei schreibt,
</span></span></span><span class="line"><span class="cl"><span class="s2"> welche bei Erreichen einer bestimmten Größe rotiert wird.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> :param console_logging: Wenn True, werden Logs zusätzlich zur Datei auch auf der Konsole ausgegeben.
</span></span></span><span class="line"><span class="cl"><span class="s2"> Standardmäßig ist dies deaktiviert (False).
</span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># --- Allgemeine Einstellungen ---</span>
</span></span><span class="line"><span class="cl"> <span class="n">log_file</span> <span class="o">=</span> <span class="s2">&#34;sync_log.log&#34;</span> <span class="c1"># Name der Log-Datei</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Maximale Größe der Log-Datei in Bytes, bevor sie rotiert wird (hier 5 MB)</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_log_size</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Anzahl der rotierenden Backup-Dateien, die behalten werden sollen (hier 5)</span>
</span></span><span class="line"><span class="cl"> <span class="n">backup_count</span> <span class="o">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># --- Logger-Initialisierung ---</span>
</span></span><span class="line"><span class="cl"> <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">logger</span><span class="o">.</span><span class="n">hasHandlers</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># --- Logging-Level einstellen ---</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Mögliche Levels: DEBUG, INFO, WARNING, ERROR, CRITICAL</span>
</span></span><span class="line"><span class="cl"> <span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># --- Formatter erstellen ---</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Definiert das Layout der Log-Nachrichten.</span>
</span></span><span class="line"><span class="cl"> <span class="n">formatter</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(asctime)s</span><span class="s1"> - </span><span class="si">%(levelname)s</span><span class="s1"> - </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># --- Handler erstellen und dem Logger hinzufügen ---</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># 1. RotatingFileHandler (immer aktiv)</span>
</span></span><span class="line"><span class="cl"> <span class="n">file_handler</span> <span class="o">=</span> <span class="n">RotatingFileHandler</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">log_file</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">maxBytes</span><span class="o">=</span><span class="n">max_log_size</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">backupCount</span><span class="o">=</span><span class="n">backup_count</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">file_handler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">formatter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">file_handler</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># 2. StreamHandler für Konsolen-Ausgabe (optional)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">console_logging</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">console_handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">console_handler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">formatter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">console_handler</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># --- Weitere Referenzen und alternative Handler ---</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># (Ausführliche Kommentare sind in der Datei enthalten, hier gekürzt)</span>
</span></span></code></pre></div><h3 id="syncpy-angepasst"><code>sync.py</code> angepasst</h3>
<p><strong>Zweck:</strong> Importiert die <code>setup_logging</code>-Funktion und ruft sie ganz am Anfang des Skripts auf, um die Logging-Konfiguration zu initialisieren.</p>
<p><strong>Relevanten Änderungen in <code>/home/jonnybravo/Projekte/python_tests/rclone/sync.py</code>:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">logging_config</span> <span class="kn">import</span> <span class="n">setup_logging</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Logging so früh wie möglich einrichten</span>
</span></span><span class="line"><span class="cl"><span class="n">setup_logging</span><span class="p">()</span> <span class="c1"># Optional: setup_logging(console_logging=True) für Konsolen-Logs</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">rclone_python</span> <span class="kn">import</span> <span class="n">rclone</span> <span class="k">as</span> <span class="n">rc</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">rclone_python.utils</span> <span class="kn">import</span> <span class="n">RcloneException</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ... (restlicher Code)</span>
</span></span></code></pre></div><hr>
<h2 id="2-dns-konfiguration-auf-dem-manjaro-system">2. DNS-Konfiguration auf dem Manjaro-System</h2>
<p>Um den AdGuard Home-Server <code>10.50.0.3</code> als primären DNS-Server für das gesamte System und alle Verbindungen zu nutzen, wurden folgende Schritte durchgeführt:</p>
<h3 id="globale-systemd-resolved-konfiguration">Globale <code>systemd-resolved</code> Konfiguration</h3>
<p><strong>Zweck:</strong> Setzt <code>10.50.0.3</code> als systemweiten DNS-Server für <code>systemd-resolved</code>.</p>
<p><strong>Änderungen in <code>/etc/systemd/resolved.conf</code>:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[Resolve]</span>
</span></span><span class="line"><span class="cl"><span class="na">DNS</span><span class="o">=</span><span class="s">10.50.0.3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># FallbackDNS= # Auskommentieren oder auf FallbackDNS= setzen, um Fallback zu verhindern</span>
</span></span></code></pre></div><p>Nach der Bearbeitung: <code>sudo systemctl restart systemd-resolved</code></p>
<h3 id="networkmanager-überschreibung-für-alle-verbindungen">NetworkManager Überschreibung für alle Verbindungen</h3>
<p><strong>Zweck:</strong> Weist NetworkManager an, bei allen Netzwerkverbindungen (bestehende und neue) den vom DHCP-Server angebotenen DNS zu ignorieren. Dadurch wird der globale DNS von <code>systemd-resolved</code> verwendet.</p>
<p><strong>Neue Datei erstellt: <code>/etc/NetworkManager/conf.d/99-global-dns-override.conf</code></strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[connection]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Diese Einstellung gilt für alle neuen und bestehenden Verbindungen.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Sie weist NetworkManager an, den DNS-Server vom DHCP zu ignorieren.</span>
</span></span><span class="line"><span class="cl"><span class="na">ipv4.ignore-auto-dns</span><span class="o">=</span><span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">ipv6.ignore-auto-dns</span><span class="o">=</span><span class="s">true</span>
</span></span></code></pre></div><p>Nach der Erstellung: <code>sudo systemctl restart NetworkManager</code></p>
<h3 id="anpassung-des-spezifischen-wlan-profils-sweethome-5g">Anpassung des spezifischen WLAN-Profils (SweetHome-5G)</h3>
<p><strong>Zweck:</strong> Hinzufügen der DNS-Suchdomäne, damit lokale Hostnamen ohne vollen Domain-Namen aufgelöst werden können.</p>
<p><strong>Befehle für die Kommandozeile (nmcli):</strong>
(Ersetzen Sie &ldquo;Ihr Verbindungsname&rdquo; durch den tatsächlichen Namen, z.B. &ldquo;SweetHome-5G&rdquo;)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nmcli connection modify <span class="s2">&#34;Ihr Verbindungsname&#34;</span> ipv4.dns-search <span class="s2">&#34;speedport.ip&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># optional für IPv6: nmcli connection modify &#34;Ihr Verbindungsname&#34; ipv6.dns-search &#34;speedport.ip&#34;</span>
</span></span><span class="line"><span class="cl">nmcli connection up <span class="s2">&#34;Ihr Verbindungsname&#34;</span>
</span></span></code></pre></div><hr>
<h2 id="3-adguard-home-konfiguration">3. AdGuard Home Konfiguration</h2>
<h3 id="installation--ssl-einrichtung">Installation &amp; SSL-Einrichtung</h3>
<p><strong>Zweck:</strong> Installation von AdGuard Home auf einem Linux-Server und Absicherung der Weboberfläche mit einem selbstsignierten SSL-Zertifikat und eigener CA.</p>
<p><strong>Schritte (ausführlich in vorherigen Antworten beschrieben):</strong></p>
<ol>
<li>AdGuard Home installieren (<code>curl ... install.sh</code>).</li>
<li>Eigene CA (<code>MyCA.key</code>, <code>MyCA.pem</code>) und Server-Zertifikat (<code>adguard.key</code>, <code>adguard.crt</code>) mit <code>openssl</code> erstellen, inklusive SAN-Erweiterung für IP-Adresse/lokalen Hostnamen.</li>
<li>Zertifikate in AdGuard Home (<code>adguard.crt</code>, <code>adguard.key</code>) unter <strong>Einstellungen → Verschlüsselungseinstellungen</strong> konfigurieren.</li>
<li><code>MyCA.pem</code> auf Client-Geräten als vertrauenswürdige Stammzertifizierungsstelle installieren.</li>
</ol>
<h3 id="bedingte-weiterleitung-für-lokale-namen">Bedingte Weiterleitung für lokale Namen</h3>
<p><strong>Zweck:</strong> Ermöglicht AdGuard Home die Auflösung lokaler Hostnamen durch Weiterleitung an den Router.</p>
<p><strong>Konfiguration in der AdGuard Home Weboberfläche:</strong></p>
<ol>
<li>Gehen Sie zu <strong>Einstellungen → DNS-Einstellungen</strong>.</li>
<li>Im Abschnitt <strong>&ldquo;Upstream-DNS-Server&rdquo;</strong> die folgende Zeile hinzufügen (zusätzlich zu öffentlichen DNS-Servern):
<pre tabindex="0"><code>[/speedport.ip/]192.168.50.1
</code></pre></li>
<li>Einstellungen speichern.</li>
</ol>
<hr>
<h2 id="4-problembehebung-wireguard-dns">4. Problembehebung WireGuard DNS</h2>
<p><strong>Zweck:</strong> Behebung des Konflikts, bei dem WireGuard die DNS-Einstellungen überschrieben und auf einen nicht existierenden Server (<code>10.50.0.3</code> ohne installierten DNS-Dienst) gezeigt hat.</p>
<p><strong>Änderung in der WireGuard-Konfigurationsdatei:</strong></p>
<ul>
<li>In <code>/etc/wireguard/wg0.conf</code> (im Abschnitt <code>[Interface]</code>) die Zeile <code>DNS = 10.50.0.3</code> auskommentieren oder auf einen anderen DNS-Server ändern.
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[Interface]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># DNS = 10.50.0.3</span>
</span></span></code></pre></div></li>
<li>WireGuard neu starten: <code>sudo systemctl restart wg-quick@wg0</code> (oder <code>sudo wg-quick down wg0 &amp;&amp; sudo wg-quick up wg0</code>).</li>
</ul>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-52
View File
@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://localhost:1313/ver_next_einbinden/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/blueray_install_manjaro/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/calcurse_tastenk%C3%BCrzel/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/astro-vim-recommendations/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/lazygit/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/string_prefixes/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/install_browser/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/awx_und_rundeck_install/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/stretchen_laufen/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/system-optimierung/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/tinydb_vs_sqlite/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/willkommen/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/yubikey_setup_guide/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/networkconfig_dns/</loc>
<lastmod>2026-09-08T00:00:00+00:00</lastmod>
</url><url>
<loc>https://localhost:1313/tags/</loc>
</url>
</urlset>
-97
View File
@@ -1,97 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Stretchen_laufen – Hugo Docker CMS</title>
<meta name="description" content="Aufwärmen: 10-15 Wh. 1-2 Sek.
Zwillingswadenmuskel dehnen S166 Zwillingswadenmuskel dehen S164 Beste Dhenübung der Welt S140 Girlanden-Haltung S126 Hüftkreisen …">
<meta property="og:title" content="Stretchen_laufen – Hugo Docker CMS">
<meta property="og:description" content="Aufwärmen: 10-15 Wh. 1-2 Sek.
Zwillingswadenmuskel dehnen S166 Zwillingswadenmuskel dehen S164 Beste Dhenübung der Welt S140 Girlanden-Haltung S126 Hüftkreisen …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/stretchen_laufen/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Stretchen_laufen</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents"></nav>
</details>
<div class="content">
<p>Aufwärmen:
10-15 Wh. 1-2 Sek.</p>
<ol>
<li>Zwillingswadenmuskel dehnen S166</li>
<li>Zwillingswadenmuskel dehen S164</li>
<li>Beste Dhenübung der Welt S140</li>
<li>Girlanden-Haltung S126</li>
<li>Hüftkreisen im Stehen S148</li>
<li>Oberschenkelrückseite dynamisch dehen S163</li>
</ol>
<p>Einsteiger :
10-15 Wh. 1-2 Sek.</p>
<ol>
<li>Katze - Kuh S74</li>
<li>Quadrizeps dehnen im Stehen S156</li>
<li>Oberschenkelrückseite statisch S160</li>
<li>Hüftbeuger mithilfe eines Stuhles S137</li>
<li>Zwillingswardenmuskel dehnen S166</li>
<li>Hüftkreisen im Viertelfüser S150</li>
<li>Oberschenkelrückseite S163</li>
</ol>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-373
View File
@@ -1,373 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Python String-Präfixe – Hugo Docker CMS</title>
<meta name="description" content="Python String-Präfixe In Python gibt es verschiedene Präfixe für String-Literale, die bestimmen, wie der Interpreter den Inhalt des Strings verarbeitet. Suffixe …">
<meta property="og:title" content="Python String-Präfixe – Hugo Docker CMS">
<meta property="og:description" content="Python String-Präfixe In Python gibt es verschiedene Präfixe für String-Literale, die bestimmen, wie der Interpreter den Inhalt des Strings verarbeitet. Suffixe …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/string_prefixes/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Python String-Präfixe</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#python-string-methoden">Python String-Methoden</a>
<ul>
<li><a href="#1-bereinigen-und-ausrichten">1. Bereinigen und Ausrichten</a></li>
<li><a href="#2-suchen-und-ersetzen">2. Suchen und Ersetzen</a></li>
<li><a href="#3-aufteilen-und-verbinden">3. Aufteilen und Verbinden</a></li>
<li><a href="#4-groß-kleinschreibung-ändern">4. Groß-/Kleinschreibung ändern</a></li>
<li><a href="#5-überprüfungsmethoden-geben-true-oder-false-zurück">5. Überprüfungsmethoden (Geben <code>True</code> oder <code>False</code> zurück)</a></li>
</ul>
</li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="python-string-präfixe">Python String-Präfixe</h1>
<p>In Python gibt es verschiedene Präfixe für String-Literale, die bestimmen, wie der Interpreter den Inhalt des Strings verarbeitet. Suffixe für String-Literale existieren in Python nicht direkt (anders als in Sprachen wie C++), aber es gibt Methoden auf String-Objekten wie <code>.startswith()</code> und <code>.endswith()</code>.</p>
<p>Hier ist die Liste aller String-Präfixe in Python mit Beschreibung und logischen Beispielen:</p>
<table>
<thead>
<tr>
<th style="text-align: left">Präfix</th>
<th style="text-align: left">Beschreibung</th>
<th style="text-align: left">Logisches Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong>Keines</strong></td>
<td style="text-align: left">Standard-Unicode-String (UTF-8 in Python 3). Verarbeitet normale Escape-Sequenzen wie <code>\n</code> oder <code>\t</code>.</td>
<td style="text-align: left"><code>text = &quot;Zeile 1\nZeile 2&quot;</code></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>f</code> / <code>F</code></strong></td>
<td style="text-align: left"><strong>Formatted String (f-string):</strong> Ermöglicht die direkte Einbettung von Python-Ausdrücken und Variablen in geschweiften Klammern <code>{}</code>.</td>
<td style="text-align: left"><code>name = &quot;Welt&quot;\nprint(f&quot;Hallo {name}!&quot;)</code> <em>(Ausgabe: Hallo Welt!)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>r</code> / <code>R</code></strong></td>
<td style="text-align: left"><strong>Raw String:</strong> Behandelt Backslashes <code>\</code> als normale Zeichen und ignoriert Escape-Sequenzen. Ideal für reguläre Ausdrücke oder Dateipfade.</td>
<td style="text-align: left"><code>pfad = r&quot;C:\Users\Name\Documents&quot;</code></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>b</code> / <code>B</code></strong></td>
<td style="text-align: left"><strong>Byte-String:</strong> Erzeugt ein <code>bytes</code>-Objekt statt eines Standard-Strings. Erlaubt nur ASCII-Zeichen (Werte 0-127).</td>
<td style="text-align: left"><code>daten = b&quot;Hallo&quot;</code> <em>(Typ ist <code>bytes</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>u</code> / <code>U</code></strong></td>
<td style="text-align: left"><strong>Unicode-String:</strong> In Python 3 standardmäßig das Standardverhalten. Wird heute hauptsächlich für die Abwärtskompatibilität mit Python 2 verwendet.</td>
<td style="text-align: left"><code>unicode_text = u&quot;Café&quot;</code></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>fr</code> / <code>rf</code></strong></td>
<td style="text-align: left"><strong>Kombination (Raw f-string):</strong> Erlaubt sowohl die Formatierung mit <code>{}</code> als auch die Ignorierung von Escape-Sequenzen.</td>
<td style="text-align: left"><code>ordner = &quot;Bilder&quot;\npfad = fr&quot;C:\{ordner}\bild.png&quot;</code></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>br</code> / <code>rb</code></strong></td>
<td style="text-align: left"><strong>Kombination (Raw Byte-string):</strong> Erzeugt ein Byte-Objekt, bei dem Backslashes nicht als Escape-Sequenzen interpretiert werden.</td>
<td style="text-align: left"><code>regex_bytes = rb&quot;a\nb&quot;</code></td>
</tr>
</tbody>
</table>
<p><em>(Hinweis: Die Groß- und Kleinschreibung der Präfixe ist beliebig, d. h. <code>f&quot;&quot;</code> verhält sich identisch zu <code>F&quot;&quot;</code>.)</em></p>
<h2 id="python-string-methoden">Python String-Methoden</h2>
<p>Hier ist eine Übersicht über die wichtigsten eingebauten Methoden von String-Objekten (<code>str</code>) in Python, sortiert nach ihrer Funktion:</p>
<h3 id="1-bereinigen-und-ausrichten">1. Bereinigen und Ausrichten</h3>
<table>
<thead>
<tr>
<th style="text-align: left">Methode</th>
<th style="text-align: left">Beschreibung</th>
<th style="text-align: left">Logisches Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong><code>strip([chars])</code></strong></td>
<td style="text-align: left">Entfernt führende und folgende Whitespaces (oder die angegebenen Zeichen in <code>chars</code>).</td>
<td style="text-align: left"><code>&quot; hallo &quot;.strip()</code> <em>(Ergebnis: <code>&quot;hallo&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>lstrip([chars])</code></strong></td>
<td style="text-align: left">Entfernt nur führende Whitespaces oder Zeichen.</td>
<td style="text-align: left"><code>&quot; hallo &quot;.lstrip()</code> <em>(Ergebnis: <code>&quot;hallo &quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>rstrip([chars])</code></strong></td>
<td style="text-align: left">Entfernt nur folgende Whitespaces oder Zeichen.</td>
<td style="text-align: left"><code>&quot; hallo &quot;.rstrip()</code> <em>(Ergebnis: <code>&quot; hallo&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>ljust(width[, fillchar])</code></strong></td>
<td style="text-align: left">Richtet den String linksbündig in einem Feld der Breite <code>width</code> aus.</td>
<td style="text-align: left"><code>&quot;test&quot;.ljust(10, &quot;-&quot;)</code> <em>(Ergebnis: <code>&quot;test------&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>rjust(width[, fillchar])</code></strong></td>
<td style="text-align: left">Richtet den String rechtsbündig in einem Feld der Breite <code>width</code> aus.</td>
<td style="text-align: left"><code>&quot;test&quot;.rjust(10, &quot;-&quot;)</code> <em>(Ergebnis: <code>&quot;------test&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>center(width[, fillchar])</code></strong></td>
<td style="text-align: left">Zentriert den String in einem Feld der Breite <code>width</code>.</td>
<td style="text-align: left"><code>&quot;test&quot;.center(10, &quot;-&quot;)</code> <em>(Ergebnis: <code>&quot;---test---&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>zfill(width)</code></strong></td>
<td style="text-align: left">Füllt den String links mit Nullen auf, bis die Breite <code>width</code> erreicht ist.</td>
<td style="text-align: left"><code>&quot;42&quot;.zfill(5)</code> <em>(Ergebnis: <code>&quot;00042&quot;</code>)</em></td>
</tr>
</tbody>
</table>
<h3 id="2-suchen-und-ersetzen">2. Suchen und Ersetzen</h3>
<table>
<thead>
<tr>
<th style="text-align: left">Methode</th>
<th style="text-align: left">Beschreibung</th>
<th style="text-align: left">Logisches Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong><code>replace(old, new[, count])</code></strong></td>
<td style="text-align: left">Ersetzt Vorkommen von <code>old</code> durch <code>new</code>. Optional wird die Anzahl durch <code>count</code> begrenzt.</td>
<td style="text-align: left"><code>&quot;A-B-C&quot;.replace(&quot;-&quot;, &quot;/&quot;)</code> <em>(Ergebnis: <code>&quot;A/B/C&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>find(sub[, start[, end]])</code></strong></td>
<td style="text-align: left">Gibt den niedrigsten Index zurück, an dem <code>sub</code> gefunden wird. Gibt <code>-1</code> zurück, wenn nicht gefunden.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.find(&quot;ll&quot;)</code> <em>(Ergebnis: <code>2</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>rfind(sub[, start[, end]])</code></strong></td>
<td style="text-align: left">Gibt den höchsten Index zurück, an dem <code>sub</code> gefunden wird. Gibt <code>-1</code> zurück, wenn nicht gefunden.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.rfind(&quot;l&quot;)</code> <em>(Ergebnis: <code>3</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>index(sub[, start[, end]])</code></strong></td>
<td style="text-align: left">Wie <code>find()</code>, wirft aber einen <code>ValueError</code>, wenn das Substring nicht gefunden wird.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.index(&quot;x&quot;)</code> <em>(Ergebnis: <code>ValueError</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>rindex(sub[, start[, end]])</code></strong></td>
<td style="text-align: left">Wie <code>rfind()</code>, wirft aber einen <code>ValueError</code>, wenn nicht gefunden.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.rindex(&quot;l&quot;)</code> <em>(Ergebnis: <code>3</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>count(sub[, start[, end]])</code></strong></td>
<td style="text-align: left">Zählt, wie oft das Substring <code>sub</code> im String vorkommt.</td>
<td style="text-align: left"><code>&quot;banane&quot;.count(&quot;an&quot;)</code> <em>(Ergebnis: <code>2</code>)</em></td>
</tr>
</tbody>
</table>
<h3 id="3-aufteilen-und-verbinden">3. Aufteilen und Verbinden</h3>
<table>
<thead>
<tr>
<th style="text-align: left">Methode</th>
<th style="text-align: left">Beschreibung</th>
<th style="text-align: left">Logisches Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong><code>split(sep=None, maxsplit=-1)</code></strong></td>
<td style="text-align: left">Teilt den String an Trennzeichen <code>sep</code> und gibt eine Liste zurück.</td>
<td style="text-align: left"><code>&quot;A,B,C&quot;.split(&quot;,&quot;)</code> <em>(Ergebnis: <code>['A', 'B', 'C']</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>rsplit(sep=None, maxsplit=-1)</code></strong></td>
<td style="text-align: left">Teilt den String vom Ende her auf.</td>
<td style="text-align: left"><code>&quot;A,B,C&quot;.rsplit(&quot;,&quot;, 1)</code> <em>(Ergebnis: <code>['A,B', 'C']</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>splitlines([keepends])</code></strong></td>
<td style="text-align: left">Teilt den String an Zeilenumbrüchen auf.</td>
<td style="text-align: left"><code>&quot;A\nB&quot;.splitlines()</code> <em>(Ergebnis: <code>['A', 'B']</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>join(iterable)</code></strong></td>
<td style="text-align: left">Verbindet die Elemente eines Iterables (z.B. Liste) mit dem String als Trennzeichen.</td>
<td style="text-align: left"><code>&quot;-&quot;.join([&quot;A&quot;, &quot;B&quot;])</code> <em>(Ergebnis: <code>&quot;A-B&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>partition(sep)</code></strong></td>
<td style="text-align: left">Teilt den String beim ersten Vorkommen von <code>sep</code> in ein Tupel: <code>(vor, sep, nach)</code>.</td>
<td style="text-align: left"><code>&quot;A-B-C&quot;.partition(&quot;-&quot;)</code> <em>(Ergebnis: <code>('A', '-', 'B-C')</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>rpartition(sep)</code></strong></td>
<td style="text-align: left">Teilt den String beim letzten Vorkommen von <code>sep</code>.</td>
<td style="text-align: left"><code>&quot;A-B-C&quot;.rpartition(&quot;-&quot;)</code> <em>(Ergebnis: <code>('A-B', '-', 'C')</code>)</em></td>
</tr>
</tbody>
</table>
<h3 id="4-groß-kleinschreibung-ändern">4. Groß-/Kleinschreibung ändern</h3>
<table>
<thead>
<tr>
<th style="text-align: left">Methode</th>
<th style="text-align: left">Beschreibung</th>
<th style="text-align: left">Logisches Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong><code>lower()</code></strong></td>
<td style="text-align: left">Konvertiert alle Zeichen in Kleinbuchstaben.</td>
<td style="text-align: left"><code>&quot;Hallo&quot;.lower()</code> <em>(Ergebnis: <code>&quot;hallo&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>upper()</code></strong></td>
<td style="text-align: left">Konvertiert alle Zeichen in Großbuchstaben.</td>
<td style="text-align: left"><code>&quot;Hallo&quot;.upper()</code> <em>(Ergebnis: <code>&quot;HALLO&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>capitalize()</code></strong></td>
<td style="text-align: left">Setzt das erste Zeichen auf Groß und den Rest auf Klein.</td>
<td style="text-align: left"><code>&quot;hallo welt&quot;.capitalize()</code> <em>(Ergebnis: <code>&quot;Hallo welt&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>title()</code></strong></td>
<td style="text-align: left">Setzt den ersten Buchstaben jedes Wortes auf Groß.</td>
<td style="text-align: left"><code>&quot;hallo welt&quot;.title()</code> <em>(Ergebnis: <code>&quot;Hallo Welt&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>swapcase()</code></strong></td>
<td style="text-align: left">Vertauscht Groß- und Kleinschreibung.</td>
<td style="text-align: left"><code>&quot;HAllo&quot;.swapcase()</code> <em>(Ergebnis: <code>&quot;haLLO&quot;</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>casefold()</code></strong></td>
<td style="text-align: left">Ähnlich wie <code>lower()</code>, ist aber aggressiver beim Entfernen von Groß-/Kleinschreibungsunterschieden (gut für Caseless Matching in Unicode).</td>
<td style="text-align: left"><code>&quot;Straße&quot;.casefold()</code> <em>(Ergebnis: <code>&quot;strasse&quot;</code>)</em></td>
</tr>
</tbody>
</table>
<h3 id="5-überprüfungsmethoden-geben-true-oder-false-zurück">5. Überprüfungsmethoden (Geben <code>True</code> oder <code>False</code> zurück)</h3>
<table>
<thead>
<tr>
<th style="text-align: left">Methode</th>
<th style="text-align: left">Beschreibung</th>
<th style="text-align: left">Logisches Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong><code>startswith(prefix[, start[, end]])</code></strong></td>
<td style="text-align: left">Prüft, ob der String mit <code>prefix</code> beginnt.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.startswith(&quot;ha&quot;)</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>endswith(suffix[, start[, end]])</code></strong></td>
<td style="text-align: left">Prüft, ob der String mit <code>suffix</code> endet.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.endswith(&quot;lo&quot;)</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>isalnum()</code></strong></td>
<td style="text-align: left">Prüft, ob alle Zeichen alphanumerisch sind (Buchstaben und Zahlen) und mindestens ein Zeichen vorhanden ist.</td>
<td style="text-align: left"><code>&quot;Python3&quot;.isalnum()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>isalpha()</code></strong></td>
<td style="text-align: left">Prüft, ob alle Zeichen Buchstaben sind.</td>
<td style="text-align: left"><code>&quot;Python&quot;.isalpha()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>isdigit()</code></strong></td>
<td style="text-align: left">Prüft, ob alle Zeichen Ziffern sind (z. B. auch hochgestellte Zahlen).</td>
<td style="text-align: left"><code>&quot;123&quot;.isdigit()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>isnumeric()</code></strong></td>
<td style="text-align: left">Prüft, ob alle Zeichen numerisch sind (auch Brüche wie ½).</td>
<td style="text-align: left"><code>&quot;½&quot;.isnumeric()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>isspace()</code></strong></td>
<td style="text-align: left">Prüft, ob der String nur aus Whitespaces (Leerzeichen, Tabs, Zeilenumbrüchen) besteht.</td>
<td style="text-align: left"><code>&quot; \n&quot;.isspace()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>islower()</code></strong></td>
<td style="text-align: left">Prüft, ob alle buchstabenbasierten Zeichen kleingeschrieben sind.</td>
<td style="text-align: left"><code>&quot;hallo&quot;.islower()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>isupper()</code></strong></td>
<td style="text-align: left">Prüft, ob alle buchstabenbasierten Zeichen großgeschrieben sind.</td>
<td style="text-align: left"><code>&quot;HALLO&quot;.isupper()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
<tr>
<td style="text-align: left"><strong><code>istitle()</code></strong></td>
<td style="text-align: left">Prüft, ob der String im Titlecase-Format vorliegt.</td>
<td style="text-align: left"><code>&quot;Hallo Welt&quot;.istitle()</code> <em>(Ergebnis: <code>True</code>)</em></td>
</tr>
</tbody>
</table>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-207
View File
@@ -1,207 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>System Optimierung – nächste Schritte – Hugo Docker CMS</title>
<meta name="description" content="System Optimierung – nächste Schritte Letzte Bearbeitung: 07.09.2026 Chat-Session-ID: 20260907_182659_6403f3 Chat wieder aufrufen: …">
<meta property="og:title" content="System Optimierung – nächste Schritte – Hugo Docker CMS">
<meta property="og:description" content="System Optimierung – nächste Schritte Letzte Bearbeitung: 07.09.2026 Chat-Session-ID: 20260907_182659_6403f3 Chat wieder aufrufen: …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/system-optimierung/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>System Optimierung – nächste Schritte</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#1-flashfocus-patchen-marshmallow-4x-inkompatibilität">1. flashfocus patchen (Marshmallow-4.x-Inkompatibilität)</a></li>
<li><a href="#2-systemd-user-services-masken">2. Systemd-User-Services masken</a></li>
<li><a href="#3-neustart-und-test">3. Neustart und Test</a></li>
<li><a href="#4-weitere-performance-empfehlungen">4. Weitere Performance-Empfehlungen</a></li>
<li><a href="#5-verwaiste-pakete-aufräumen">5. Verwaiste Pakete aufräumen</a></li>
<li><a href="#wie-diesen-chat-wieder-aufrufen">Wie diesen Chat wieder aufrufen</a></li>
<li><a href="#dateien-die-geändert-wurden">Dateien, die geändert wurden</a></li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="system-optimierung--nächste-schritte">System Optimierung – nächste Schritte</h1>
<blockquote>
<p>Letzte Bearbeitung: 07.09.2026
Chat-Session-ID: <code>20260907_182659_6403f3</code>
Chat wieder aufrufen: <code>@session:default/20260907_182659_6403f3</code> in Hermes Agent eingeben</p>
</blockquote>
<hr>
<h2 id="1-flashfocus-patchen-marshmallow-4x-inkompatibilität">1. flashfocus patchen (Marshmallow-4.x-Inkompatibilität)</h2>
<p><strong>Einmalig ausführen:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/fields\.Number/fields.Float/g&#39;</span> /usr/lib/python3.14/site-packages/flashfocus/config.py
</span></span></code></pre></div><p><strong>Danach testen:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">flashfocus --help
</span></span></code></pre></div><p>Wenn kein Traceback kommt, ist der Patch erfolgreich.</p>
<p><strong>Achtung:</strong> Nach jedem <code>pacman -Syu</code>, bei dem flashfocus aktualisiert wird, muss der Patch erneut angewendet werden.</p>
<hr>
<h2 id="2-systemd-user-services-masken">2. Systemd-User-Services masken</h2>
<p>Die Manjaro-Sway-Config versucht die Dienste bei jedem Start neu zu enablen.<br>
Nur <code>disable</code> reicht nicht – sie müssen <strong>maskiert</strong> werden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl --user mask mako.service flashfocus.service pcmanfm.service poweralertd.service xdg-desktop-portal-gtk.service xdg-desktop-portal-lxqt.service
</span></span></code></pre></div><p><strong>Kontrolle:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl --user status mako flashfocus pcmanfm poweralertd xdg-desktop-portal-gtk xdg-desktop-portal-lxqt
</span></span></code></pre></div><p>Alle sollten <code>masked</code> anzeigen (nicht <code>failed</code>).</p>
<hr>
<h2 id="3-neustart-und-test">3. Neustart und Test</h2>
<p>Sway neustarten (Super+Shift+R) oder System rebooten.</p>
<p>Nach dem Neustart prüfen, ob alle Dienste laufen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pgrep -a mako
</span></span><span class="line"><span class="cl">pgrep -a pcmanfm-qt
</span></span><span class="line"><span class="cl">pgrep -a poweralertd
</span></span><span class="line"><span class="cl">pgrep -a flashfocus
</span></span><span class="line"><span class="cl">pgrep -a xdg-desktop-portal
</span></span></code></pre></div><p>Jeder Befehl sollte eine PID und den Prozessnamen ausgeben.</p>
<p><strong>Journal aufräumen</strong> – keine neuen Crash-Logs mehr:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">journalctl --user -p <span class="m">3</span> --since <span class="s2">&#34;1 minute ago&#34;</span>
</span></span></code></pre></div><hr>
<h2 id="4-weitere-performance-empfehlungen">4. Weitere Performance-Empfehlungen</h2>
<p>Die vollständige Analyse ist in diesem Chat dokumentiert. Hier die Top-Empfehlungen als Übersicht:</p>
<table>
<thead>
<tr>
<th>Priorität</th>
<th>Maßnahme</th>
<th>Befehl</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hoch</td>
<td>swappiness auf 40 senken (ZRAM)</td>
<td><code>sudo sysctl vm.swappiness=40</code> (temporär) oder <code>/etc/sysctl.d/99-zram.conf</code></td>
</tr>
<tr>
<td>Hoch</td>
<td>vfs_cache_pressure auf 50</td>
<td><code>sudo sysctl vm.vfs_cache_pressure=50</code></td>
</tr>
<tr>
<td>Mittel</td>
<td>ollama stoppen (294 MB RAM)</td>
<td><code>sudo systemctl disable --now ollama</code></td>
</tr>
<tr>
<td>Mittel</td>
<td>lxd/docker stoppen (530 MB RAM)</td>
<td><code>sudo systemctl disable --now lxd docker</code></td>
</tr>
<tr>
<td>Mittel</td>
<td>CPU-Governor auf powersave</td>
<td><code>sudo cpupower frequency-set -g powersave</code></td>
</tr>
<tr>
<td>Niedrig</td>
<td>Boot beschleunigen</td>
<td><code>sudo systemctl disable NetworkManager-wait-online</code></td>
</tr>
<tr>
<td>Niedrig</td>
<td>Journal-Größe limitieren (3,9 GB → 500 MB)</td>
<td><code>sudo nano /etc/systemd/journald.conf</code> → <code>SystemMaxUse=500M</code></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="5-verwaiste-pakete-aufräumen">5. Verwaiste Pakete aufräumen</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -Rns <span class="k">$(</span>pacman -Qtdq<span class="k">)</span> <span class="c1"># 9 verwaiste Pakete</span>
</span></span></code></pre></div><hr>
<h2 id="wie-diesen-chat-wieder-aufrufen">Wie diesen Chat wieder aufrufen</h2>
<p>In einer neuen Hermes-Agent-Session einfach eingeben:</p>
<pre tabindex="0"><code>@session:default/20260907_182659_6403f3
</code></pre><p>Dann lädt der Agent den kompletten Chatverlauf aus der Datenbank.</p>
<hr>
<h2 id="dateien-die-geändert-wurden">Dateien, die geändert wurden</h2>
<table>
<thead>
<tr>
<th>Datei</th>
<th>Zweck</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~/.config/sway/config.d/10-autostart-fix.conf</code></td>
<td>Korrigierte Autostarts (exec statt systemd)</td>
</tr>
<tr>
<td><code>/usr/lib/python3.14/site-packages/flashfocus/config.py</code></td>
<td>Marshmallow-4.x-Patch (sudo nötig)</td>
</tr>
<tr>
<td><code>/home/jonnybravo/Projekte/Python_Skripte/create_selfsign/selfsing.py</code></td>
<td>CA + Zertifikats-Script (vorherige Session)</td>
</tr>
<tr>
<td><code>~/scripts/mount-nfs.sh</code></td>
<td>Manuelle NFS-Mount-Steuerung (vorherige Session)</td>
</tr>
<tr>
<td><code>~/scripts/mounts.md</code></td>
<td>NFS-Mount-Dokumentation (vorherige Session)</td>
</tr>
</tbody>
</table>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-66
View File
@@ -1,66 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Tags – Hugo Docker CMS</title>
<meta name="description" content="Markdown-Dateien einfach in content/ ablegen.">
<meta property="og:title" content="Tags – Hugo Docker CMS">
<meta property="og:description" content="Markdown-Dateien einfach in content/ ablegen.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/tags/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
<link rel="alternate" type="application/rss+xml" title="Hugo Docker CMS" href="/tags/index.xml">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<h1>Tags</h1>
<p class="subtitle">Markdown-Dateien einfach in content/ ablegen.</p>
<div class="post-grid">
</div>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-13
View File
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Hugo Docker CMS</title>
<link>https://localhost:1313/tags/</link>
<description>Markdown-Dateien einfach in content/ ablegen.</description>
<generator>Hugo 0.165.0</generator>
<language>de</language>
<lastBuildDate>Thu, 10 Sep 2026 07:50:28 +0000</lastBuildDate>
<atom:link href="https://localhost:1313/index.xml" rel="self" type="application/rss+xml"/>
</channel>
</rss>
-125
View File
@@ -1,125 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Vergleich: TinyDB vs. SQLite – Hugo Docker CMS</title>
<meta name="description" content="Vergleich: TinyDB vs. SQLite Sowohl TinyDB als auch SQLite sind hervorragende &ldquo;Embedded Databases&rdquo; (eingebettete Datenbanken), die ihre Daten in …">
<meta property="og:title" content="Vergleich: TinyDB vs. SQLite – Hugo Docker CMS">
<meta property="og:description" content="Vergleich: TinyDB vs. SQLite Sowohl TinyDB als auch SQLite sind hervorragende &ldquo;Embedded Databases&rdquo; (eingebettete Datenbanken), die ihre Daten in …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/tinydb_vs_sqlite/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Vergleich: TinyDB vs. SQLite</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#sqlite">SQLite</a></li>
<li><a href="#tinydb">TinyDB</a></li>
</ul>
</li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="vergleich-tinydb-vs-sqlite">Vergleich: TinyDB vs. SQLite</h1>
<p>Sowohl TinyDB als auch SQLite sind hervorragende &ldquo;Embedded Databases&rdquo; (eingebettete Datenbanken), die ihre Daten in einer Datei speichern, ohne dass ein separater Serverprozess läuft. Der Unterschied liegt hauptsächlich in ihrem Ansatz zur Datenspeicherung und -abfrage.</p>
<hr>
<h3 id="sqlite">SQLite</h3>
<p><strong>Vorteile (<code>Pros</code>):</strong></p>
<ul>
<li><strong>Sehr robust und bewährt:</strong> Seit Jahrzehnten im Einsatz, extrem zuverlässig (ACID-konform).</li>
<li><strong>Standard-SQL:</strong> Bietet eine mächtige, standardisierte Abfragesprache, die von vielen Entwicklern beherrscht wird und plattformübergreifend kompatibel ist.</li>
<li><strong>Performance:</strong> Sehr gute Leistung für komplexe Abfragen, Joins und große Datensätze.</li>
<li><strong>Strikte Schemas:</strong> Erzwingt Datenintegrität durch vordefinierte Tabellenstrukturen und Datentypen.</li>
<li><strong>Großes Ökosystem:</strong> Viele Tools, Treiber und Support in fast jeder Programmiersprache verfügbar.</li>
<li><strong>Transaktionen:</strong> Robuste Unterstützung für atomare Transaktionen.</li>
</ul>
<p><strong>Nachteile (<code>Cons</code>):</strong></p>
<ul>
<li><strong>SQL-Kenntnisse erforderlich:</strong> Entwickler, die kein SQL beherrschen, müssen es lernen.</li>
<li><strong>Schema-Bindung:</strong> Änderungen am Datenmodell erfordern oft Schema-Migrationen, die aufwendig sein können. Weniger flexibel für sich schnell ändernde Daten.</li>
<li><strong>Binärdateien:</strong> Die Datenbankdateien sind binär und nicht direkt menschenlesbar, was das Debugging erschweren kann.</li>
<li><strong>Boilerplate-Code:</strong> Für einfache Operationen kann der SQL-Code im Vergleich zu einer NoSQL-Datenbank länger sein.</li>
<li><strong>Keine native Unterstützung für verschachtelte Daten:</strong> Das Speichern von hierarchischen Daten (JSON) erfordert oft JSON-Funktionen in SQL oder separate Tabellen.</li>
</ul>
<hr>
<h3 id="tinydb">TinyDB</h3>
<p><strong>Vorteile (<code>Pros</code>):</strong></p>
<ul>
<li><strong>Rein Pythonisch:</strong> Die API ist zu 100% in Python geschrieben und fühlt sich sehr natürlich an. Keine SQL-Kenntnisse erforderlich.</li>
<li><strong>Schema-los (NoSQL):</strong> Speichert Daten als Python-Wörterbücher (ähnlich JSON). Keine Schema-Definitionen im Voraus notwendig, maximale Flexibilität für sich ändernde Datenmodelle.</li>
<li><strong>Extrem einfach und schnell zu starten:</strong> Ideal für kleine Projekte, Prototypen und den schnellen Einstieg.</li>
<li><strong>Menschenlesbare Daten:</strong> Speichert Daten standardmäßig in JSON (oder YAML/CBOR), die Datenbankdatei ist mit einem Texteditor lesbar.</li>
<li><strong>Hervorragend für verschachtelte Daten:</strong> Ideal für das Speichern und Abfragen von Daten mit komplexen, hierarchischen Strukturen direkt als Python-Objekte.</li>
<li><strong>Keine Konfiguration:</strong> Einfach importieren und loslegen.</li>
</ul>
<p><strong>Nachteile (<code>Cons</code>):</strong></p>
<ul>
<li><strong>Python-spezifisch:</strong> Nicht leicht in anderen Programmiersprachen zu verwenden (im Gegensatz zu SQL).</li>
<li><strong>Keine komplexe relationale Abfrage:</strong> Nicht für komplexe Joins oder Aggregationen über mehrere &ldquo;Tabellen&rdquo; hinweg konzipiert.</li>
<li><strong>Leistung bei großen Datensätzen:</strong> Bei sehr großen Datenmengen kann die Leistung leiden, da TinyDB für einige Operationen die gesamte Datei lesen muss.</li>
<li><strong>Weniger strenge ACID-Garantien:</strong> Obwohl es Transaktionen bietet, ist es im Vergleich zu SQLite weniger robust in Bezug auf strikte ACID-Konformität.</li>
<li><strong>Kleineres Ökosystem:</strong> Weniger Tools, Treiber und Community-Support als für SQLite.</li>
</ul>
<hr>
<p>Die Wahl zwischen beiden hängt stark von den spezifischen Anforderungen Ihres Projekts ab, insbesondere von der Art der Daten, der Komplexität der Abfragen und der Notwendigkeit einer schemalosen Flexibilität.</p>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-164
View File
@@ -1,164 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Anleitung: Bestehende `rclone`-Konfiguration auf einen neuen Rechner übertragen – Hugo Docker CMS</title>
<meta name="description" content="Anleitung: Bestehende rclone-Konfiguration auf einen neuen Rechner übertragen Diese Anleitung erklärt, wie Sie eine bereits existierende rclone-Konfiguration, …">
<meta property="og:title" content="Anleitung: Bestehende `rclone`-Konfiguration auf einen neuen Rechner übertragen – Hugo Docker CMS">
<meta property="og:description" content="Anleitung: Bestehende rclone-Konfiguration auf einen neuen Rechner übertragen Diese Anleitung erklärt, wie Sie eine bereits existierende rclone-Konfiguration, …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/ver_next_einbinden/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Anleitung: Bestehende `rclone`-Konfiguration auf einen neuen Rechner übertragen</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#worum-geht-es">Worum geht es?</a></li>
<li><a href="#voraussetzungen">Voraussetzungen</a></li>
<li><a href="#schritt-für-schritt-anleitung">Schritt-für-Schritt-Anleitung</a></li>
<li><a href="#-wichtiger-warnhinweis-zum-passwort">⚠️ Wichtiger Warnhinweis zum Passwort</a></li>
</ul>
</li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="anleitung-bestehende-rclone-konfiguration-auf-einen-neuen-rechner-übertragen">Anleitung: Bestehende <code>rclone</code>-Konfiguration auf einen neuen Rechner übertragen</h1>
<p>Diese Anleitung erklärt, wie Sie eine bereits existierende <code>rclone</code>-Konfiguration, insbesondere für einen verschlüsselten Nextcloud-Speicher, auf einen neuen Computer umziehen können, ohne alles neu einrichten zu müssen.</p>
<hr>
<h3 id="worum-geht-es">Worum geht es?</h3>
<p>Alle Ihre <code>rclone</code>-Einstellungen, einschließlich der Zugangsdaten zu Ihren Cloud-Speichern, sind in einer einzigen Datei namens <code>rclone.conf</code> gespeichert. Indem Sie diese Datei auf einen neuen Rechner übertragen, &ldquo;kennt&rdquo; <code>rclone</code> dort sofort alle Ihre eingerichteten Verbindungen (Remotes).</p>
<hr>
<h3 id="voraussetzungen">Voraussetzungen</h3>
<p>Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:</p>
<ol>
<li><strong>Zugriff auf den alten Rechner</strong>, auf dem <code>rclone</code> bereits konfiguriert ist.</li>
<li><strong>Das Passwort für Ihr verschlüsseltes <code>crypt</code>-Remote.</strong> Dies ist extrem wichtig! Ohne dieses Passwort können Sie auf Ihre verschlüsselten Daten nicht mehr zugreifen. Das Kopieren der Konfigurationsdatei allein reicht nicht, wenn Sie das Passwort nicht kennen.</li>
<li>Einen Weg, eine einzelne Datei zu übertragen (z.B. ein USB-Stick, ein sicheres Netzlaufwerk etc.).</li>
</ol>
<hr>
<h3 id="schritt-für-schritt-anleitung">Schritt-für-Schritt-Anleitung</h3>
<h4 id="schritt-1-rcloneconf-datei-auf-dem-alten-rechner-finden-und-kopieren">Schritt 1: <code>rclone.conf</code>-Datei auf dem alten Rechner finden und kopieren</h4>
<p>Die Konfigurationsdatei, die Sie benötigen, befindet sich im Home-Verzeichnis Ihres Benutzers.</p>
<ol>
<li>
<p>Öffnen Sie ein Terminal auf Ihrem <strong>alten Rechner</strong>.</p>
</li>
<li>
<p>Der Pfad zur Datei lautet: <code>~/.config/rclone/rclone.conf</code>.</p>
</li>
<li>
<p>Kopieren Sie diese Datei auf Ihr Übertragungsmedium (z.B. einen USB-Stick).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Beispiel für das Kopieren auf einen USB-Stick, der unter /media/MeinStick gemountet ist</span>
</span></span><span class="line"><span class="cl">cp ~/.config/rclone/rclone.conf /media/MeinStick/
</span></span></code></pre></div></li>
</ol>
<h4 id="schritt-2-rclone-auf-dem-neuen-rechner-installieren">Schritt 2: <code>rclone</code> auf dem neuen Rechner installieren</h4>
<p>Falls <code>rclone</code> auf dem <strong>neuen Computer</strong> noch nicht installiert ist, müssen Sie dies nachholen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Auf Manjaro/Arch Linux</span>
</span></span><span class="line"><span class="cl">sudo pacman -S rclone
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Auf Debian/Ubuntu</span>
</span></span><span class="line"><span class="cl">sudo apt install rclone
</span></span></code></pre></div><h4 id="schritt-3-konfigurationsdatei-auf-dem-neuen-rechner-einfügen">Schritt 3: Konfigurationsdatei auf dem neuen Rechner einfügen</h4>
<p>Nun bringen Sie die Konfiguration auf den neuen Rechner.</p>
<ol>
<li>
<p>Öffnen Sie ein Terminal auf Ihrem <strong>neuen Rechner</strong>.</p>
</li>
<li>
<p>Stellen Sie sicher, dass das Zielverzeichnis existiert. Der folgende Befehl erstellt es, falls es fehlt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/.config/rclone/
</span></span></code></pre></div></li>
<li>
<p>Kopieren Sie die <code>rclone.conf</code>-Datei von Ihrem Übertragungsmedium in dieses Verzeichnis.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Beispiel für das Kopieren von einem USB-Stick</span>
</span></span><span class="line"><span class="cl">cp /media/MeinStick/rclone.conf ~/.config/rclone/
</span></span></code></pre></div></li>
</ol>
<h4 id="schritt-4-überprüfung-und-erster-test-auf-dem-neuen-rechner">Schritt 4: Überprüfung und erster Test auf dem neuen Rechner</h4>
<p>Jetzt können Sie überprüfen, ob <code>rclone</code> die Konfiguration erfolgreich übernommen hat.</p>
<ol>
<li>
<p><strong>Lassen Sie sich alle erkannten Remotes anzeigen:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rclone listremotes
</span></span></code></pre></div><p>Die Ausgabe sollte nun die Namen Ihrer Remotes (z.B. <code>nextcloud_unverschluesselt:</code> und <code>nextcloud_verschluesselt:</code>) auflisten.</p>
</li>
<li>
<p><strong>Führen Sie einen Test durch:</strong>
Der beste Test ist, den Inhalt Ihres verschlüsselten Remotes aufzulisten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rclone ls nextcloud_verschluesselt:
</span></span></code></pre></div><ul>
<li>Möglicherweise fragt <code>rclone</code> Sie an dieser Stelle einmalig nach dem Passwort für Ihr verschlüsseltes Remote, um es zu verifizieren. Geben Sie hier das Passwort ein, das Sie sich gemerkt haben.</li>
<li>Wenn der Befehl erfolgreich ist und eine Liste Ihrer verschlüsselten Dateien und Ordner anzeigt, war der Umzug erfolgreich!</li>
</ul>
</li>
</ol>
<hr>
<h3 id="-wichtiger-warnhinweis-zum-passwort">⚠️ Wichtiger Warnhinweis zum Passwort</h3>
<p>Die <code>rclone.conf</code>-Datei speichert Ihr Verschlüsselungspasswort nur in einer verschleierten Form. <strong>Sie ersetzt nicht die Notwendigkeit, dass Sie das Passwort kennen!</strong></p>
<ul>
<li><strong>Bewahren Sie Ihr Passwort immer an einem sicheren Ort auf</strong> (z.B. in einem Passwort-Manager).</li>
<li>Ohne das korrekte Passwort sind Ihre verschlüsselten Daten <strong>unwiderruflich verloren</strong>, selbst wenn Sie die <code>rclone.conf</code>-Datei haben.</li>
<li>Betrachten Sie die <code>rclone.conf</code>-Datei selbst als sensibel, da sie die Zugangsdaten zu Ihren Cloud-Konten enthält.</li>
</ul>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-93
View File
@@ -1,93 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Willkommen bei Hugo Docker – Hugo Docker CMS</title>
<meta name="description" content="Das ist eine Beispiel-Seite. Funktioniert!
Einfach .md-Dateien in den Ordner content/ kopieren – Hugo rendert sie automatisch.
So geht&rsquo;s # Neue Seite …">
<meta property="og:title" content="Willkommen bei Hugo Docker – Hugo Docker CMS">
<meta property="og:description" content="Das ist eine Beispiel-Seite. Funktioniert!
Einfach .md-Dateien in den Ordner content/ kopieren – Hugo rendert sie automatisch.
So geht&rsquo;s # Neue Seite …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/willkommen/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>Willkommen bei Hugo Docker</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li><a href="#so-gehts">So geht&rsquo;s</a></li>
</ul>
</nav>
</details>
<div class="content">
<p>Das ist eine Beispiel-Seite. <strong>Funktioniert!</strong></p>
<p>Einfach <code>.md</code>-Dateien in den Ordner <code>content/</code> kopieren – Hugo rendert sie automatisch.</p>
<h2 id="so-gehts">So geht&rsquo;s</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Neue Seite anlegen</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;---
</span></span></span><span class="line"><span class="cl"><span class="s1">title: &#34;Meine Seite&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">date: &#34;2026-09-08&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">---
</span></span></span><span class="line"><span class="cl"><span class="s1">Inhalt hier ...
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span> &gt; content/meine-seite.md
</span></span></code></pre></div><p>Änderungen werden dank <code>--watch</code> in Echtzeit übernommen.</p>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>
-208
View File
@@ -1,208 +0,0 @@
<html lang="de">
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>YubiKey-Einrichtung unter Manjaro Sway – Hugo Docker CMS</title>
<meta name="description" content="YubiKey-Einrichtung unter Manjaro Sway Diese Anleitung beschreibt, wie Sie einen YubiKey unter Manjaro Sway für verschiedene Anwendungsfälle konfigurieren. …">
<meta property="og:title" content="YubiKey-Einrichtung unter Manjaro Sway – Hugo Docker CMS">
<meta property="og:description" content="YubiKey-Einrichtung unter Manjaro Sway Diese Anleitung beschreibt, wie Sie einen YubiKey unter Manjaro Sway für verschiedene Anwendungsfälle konfigurieren. …">
<meta property="og:type" content="article">
<meta property="og:url" content="https://localhost:1313/yubikey_setup_guide/">
<meta property="og:site_name" content="Hugo Docker CMS">
<link rel="stylesheet" href="/css/main.min.css">
<script src="/js/search.min.e3b0d3e2cda62c2da5ea36b7702e0c2c8c2677c6e586d872a4d8f1545fda8cd8.js" defer></script>
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<div class="search">
<input
type="search"
id="search-input"
placeholder="Suchen…"
autocomplete="off"
aria-label="Suche"
aria-controls="search-results"
aria-expanded="false">
<div id="search-results" class="search-results" hidden></div>
</div>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main data-pagefind-body>
<article>
<header class="article-header">
<h1>YubiKey-Einrichtung unter Manjaro Sway</h1>
<time datetime="2026-09-08">08.09.2026</time>
</header>
<details class="toc" >
<summary>Inhaltsverzeichnis</summary>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#übersicht-der-anwendungsfälle">Übersicht der Anwendungsfälle:</a></li>
<li><a href="#schritt-1-notwendige-pakete-installieren">Schritt 1: Notwendige Pakete installieren</a></li>
<li><a href="#schritt-2-yubikey-erkennen-und-status-prüfen">Schritt 2: YubiKey erkennen und Status prüfen</a></li>
<li><a href="#anwendungsfälle">Anwendungsfälle:</a></li>
<li><a href="#wichtige-hinweise">Wichtige Hinweise:</a></li>
</ul>
</li>
</ul>
</nav>
</details>
<div class="content">
<h1 id="yubikey-einrichtung-unter-manjaro-sway">YubiKey-Einrichtung unter Manjaro Sway</h1>
<p>Diese Anleitung beschreibt, wie Sie einen YubiKey unter Manjaro Sway für verschiedene Anwendungsfälle konfigurieren.</p>
<hr>
<h3 id="übersicht-der-anwendungsfälle">Übersicht der Anwendungsfälle:</h3>
<ol>
<li><strong>FIDO2/U2F:</strong> Für die Zwei-Faktor-Authentifizierung auf Webseiten.</li>
<li><strong>GPG:</strong> Zur Verschlüsselung von E-Mails/Dateien und zum Signieren von Git-Commits.</li>
<li><strong>SSH:</strong> Zur sicheren Anmeldung auf Servern.</li>
<li><strong>PAM:</strong> Zur Anmeldung am System oder für <code>sudo</code> (fortgeschritten und mit Vorsicht zu genießen).</li>
</ol>
<hr>
<h3 id="schritt-1-notwendige-pakete-installieren">Schritt 1: Notwendige Pakete installieren</h3>
<p>Zuerst müssen Sie die erforderlichen Pakete über den Paketmanager <code>pacman</code> installieren. Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S yubikey-manager yubikey-personalization libfido2 gnupg pcsclite ccid
</span></span></code></pre></div><p><strong>Erklärung der Pakete:</strong></p>
<ul>
<li><code>yubikey-manager</code>: Das wichtigste Werkzeug zur Konfiguration Ihres YubiKeys.</li>
<li><code>yubikey-personalization</code>: Für ältere YubiKey-Modelle oder spezielle Konfigurationen (obwohl <code>yubikey-manager</code> oft bevorzugt wird).</li>
<li><code>libfido2</code>: Stellt die FIDO2-Unterstützung für WebAuthn in Browsern sicher.</li>
<li><code>gnupg</code>: Das GnuPG-Programm, notwendig für die Smartcard-Funktionen des YubiKeys.</li>
<li><code>pcsclite</code> &amp; <code>ccid</code>: Systemdienste, die die Kommunikation mit dem YubiKey als Smartcard ermöglichen.</li>
</ul>
<p>Nach der Installation ist es eine gute Idee, den <code>pcscd</code>-Dienst zu aktivieren und zu starten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> pcscd.service
</span></span><span class="line"><span class="cl">sudo systemctl start pcscd.service
</span></span></code></pre></div><h3 id="schritt-2-yubikey-erkennen-und-status-prüfen">Schritt 2: YubiKey erkennen und Status prüfen</h3>
<p>Stecken Sie Ihren YubiKey ein und überprüfen Sie, ob das System ihn erkennt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ykman info
</span></span></code></pre></div><p>Wenn alles korrekt ist, sollten Sie hier Informationen zu Ihrem YubiKey-Modell und dessen Firmware-Version sehen.</p>
<hr>
<h3 id="anwendungsfälle">Anwendungsfälle:</h3>
<h4 id="anwendungsfall-a-web-authentifizierung-fido2u2f">Anwendungsfall A: Web-Authentifizierung (FIDO2/U2F)</h4>
<p>Dies ist der einfachste Fall und erfordert in der Regel keine zusätzliche Konfiguration nach der Installation von <code>libfido2</code>.</p>
<ol>
<li><strong>Voraussetzung:</strong> Ein unterstützter Webbrowser (Firefox, Chrome, Brave, Edge, etc.).</li>
<li><strong>Registrierung:</strong> Gehen Sie zu einer Webseite, die WebAuthn oder FIDO2 unterstützt (z.B. GitHub, Google, GitLab). Navigieren Sie zu den Sicherheitseinstellungen der Webseite.</li>
<li><strong>YubiKey hinzufügen:</strong> Registrieren Sie Ihren YubiKey als neuen Sicherheitsschlüssel. Der Browser sollte Sie auffordern, den YubiKey zu berühren.</li>
</ol>
<p>Das war&rsquo;s schon! Sie können den YubiKey nun für die Zwei-Faktor-Authentifizierung (2FA) auf diesen Seiten verwenden.</p>
<h4 id="anwendungsfall-b-gpg-für-verschlüsselung-und-signaturen">Anwendungsfall B: GPG für Verschlüsselung und Signaturen</h4>
<p>Sie können den YubiKey als Hardware-Speicher für Ihre GPG-Schlüssel verwenden. Das ist sehr sicher, da die privaten Schlüssel den YubiKey niemals verlassen.</p>
<ol>
<li>
<p><strong>GPG-Status prüfen:</strong> Stecken Sie den YubiKey ein und führen Sie aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gpg --card-status
</span></span></code></pre></div><p>Wenn GPG den YubiKey als &ldquo;Card&rdquo; erkennt, sind Sie bereit für die weitere Konfiguration.</p>
</li>
<li>
<p><strong>Schlüssel generieren oder importieren:</strong>
Der Prozess, GPG-Schlüssel zu erstellen und auf den YubiKey zu übertragen, ist sehr umfangreich und sollte sorgfältig durchgeführt werden. Die offizielle Anleitung von Yubico ist hierfür die beste Quelle:
<a href="https://developers.yubico.com/PGP/">Yubico Docs: Using Your YubiKey with GPG</a>
(Stellen Sie sicher, dass Sie eine aktuelle Anleitung verwenden, die zu Ihrer YubiKey-Firmware passt.)</p>
</li>
</ol>
<h4 id="anwendungsfall-c-ssh-authentifizierung">Anwendungsfall C: SSH-Authentifizierung</h4>
<p>Sie können den YubiKey auch für die SSH-Authentifizierung verwenden, um sich sicher auf Servern anzumelden.</p>
<p><strong>Möglichkeit 1: SSH-Authentifizierung über GPG</strong>
Wenn Sie bereits GPG (Anwendungsfall B) eingerichtet haben, können Sie den Authentifizierungs-Unterschlüssel Ihres GPG-Schlüssels für SSH verwenden.</p>
<ol>
<li>Fügen Sie <code>enable-ssh-support</code> zu Ihrer <code>~/.gnupg/gpg-agent.conf</code> hinzu.</li>
<li>Folgen Sie einer Anleitung, um den GPG-Agent als SSH-Agent zu konfigurieren, z.B. für Arch Linux (Manjaro basiert darauf):
<a href="https://wiki.archlinux.org/title/GnuPG#SSH_agent">ArchWiki: GnuPG - SSH agent</a></li>
</ol>
<p><strong>Möglichkeit 2: Direkte FIDO-basierte SSH-Schlüssel (neuere YubiKeys)</strong>
Neuere YubiKeys (ab Firmware 5.2.7) können direkt als FIDO-Gerät für SSH-Schlüssel vom Typ <code>ecdsa-sk</code> oder <code>ed25519-sk</code> verwendet werden. Dies erfordert OpenSSH ab Version 8.2.</p>
<ol>
<li>
<p><strong>Schlüssel generieren:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-keygen -t ed25519-sk -C <span class="s2">&#34;mein-yubikey-ssh-schluessel&#34;</span>
</span></span></code></pre></div><p><code>ssh-keygen</code> wird Sie auffordern, Ihren YubiKey zu berühren, um den Schlüssel zu erstellen.</p>
</li>
<li>
<p><strong>Öffentlichen Schlüssel verwenden:</strong>
Den generierten öffentlichen Schlüssel (z.B. <code>~/.ssh/id_ed25519_sk.pub</code>) können Sie wie gewohnt auf Ihre Server in die <code>~/.ssh/authorized_keys</code>-Datei kopieren. Bei der SSH-Anmeldung wird Ihre SSH-Anwendung Sie dann auffordern, den YubiKey zu berühren.</p>
</li>
</ol>
<h4 id="anwendungsfall-d-system-login-und-sudo-pam---für-fortgeschrittene-und-mit-äußerster-vorsicht">Anwendungsfall D: System-Login und Sudo (PAM) - <strong>Für Fortgeschrittene und mit äußerster Vorsicht!</strong></h4>
<p>Sie können den YubiKey auch verwenden, um sich am System anzumelden oder <code>sudo</code>-Befehle zu autorisieren. Eine Fehlkonfiguration hier kann Sie von Ihrem System ausschließen.</p>
<p><strong>⚠️ WARNUNG:</strong></p>
<ul>
<li><strong>Lassen Sie IMMER ein zweites Terminal mit einer aktiven Root-Shell (<code>sudo -i</code>) offen</strong>, während Sie die PAM-Konfiguration ändern. So können Sie Fehler sofort korrigieren.</li>
<li>Erstellen Sie vor Änderungen an PAM-Dateien <strong>immer Backups</strong> der Originaldateien (z.B. <code>sudo cp /etc/pam.d/sudo /etc/pam.d/sudo.bak</code>).</li>
</ul>
<ol>
<li>
<p><strong>PAM-Modul installieren:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S pam-u2f
</span></span></code></pre></div></li>
<li>
<p><strong>Konfigurationsdatei für den YubiKey erstellen:</strong>
Diese Datei ordnet Ihren YubiKey Ihrem Benutzerkonto zu.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/.config/Yubico
</span></span><span class="line"><span class="cl">pamu2fcfg &gt; ~/.config/Yubico/u2f_keys
</span></span></code></pre></div><p><strong>Wichtig:</strong> Stecken Sie Ihren YubiKey ein und berühren Sie ihn, wenn die LED während der Ausführung von <code>pamu2fcfg</code> blinkt.</p>
</li>
<li>
<p><strong>PAM-Datei bearbeiten (Beispiel für <code>sudo</code>):</strong>
Öffnen Sie die <code>sudo</code>-PAM-Konfiguration zum Bearbeiten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nano /etc/pam.d/sudo
</span></span></code></pre></div><p>Fügen Sie die folgende Zeile <strong>GANZ OBEN</strong> in die Datei ein:</p>
<pre tabindex="0"><code>auth sufficient pam_u2f.so authfile=/home/DEIN_BENUTZER/.config/Yubico/u2f_keys
</code></pre><ul>
<li>Ersetzen Sie <code>DEIN_BENUTZER</code> durch Ihren tatsächlichen Linux-Benutzernamen (z.B. <code>jonnybravo</code>).</li>
<li><code>auth sufficient</code>: Bedeutet, dass eine erfolgreiche Authentifizierung mit dem YubiKey <strong>ausreicht</strong>. Wenn der YubiKey nicht eingesteckt ist oder die Authentifizierung fehlschlägt, wird die nächste Authentifizierungsmethode (normalerweise das Passwort) verwendet. Dies ist sicherer, um sich nicht auszusperren. Wenn Sie <code>required</code> verwenden, MUSS der YubiKey funktionieren.</li>
</ul>
</li>
<li>
<p><strong>Testen:</strong>
Öffnen Sie ein <em>neues</em> Terminal (NICHT das, in dem Ihre Root-Shell läuft) und testen Sie den <code>sudo</code>-Befehl (z.B. <code>sudo ls</code>). Sie sollten aufgefordert werden, Ihren YubiKey zu berühren. Berühren Sie ihn und prüfen Sie, ob <code>sudo</code> funktioniert. Funktioniert es nicht, nutzen Sie das Root-Terminal, um die Änderungen rückgängig zu machen.</p>
</li>
</ol>
<p><strong>Weitere PAM-Anwendungen:</strong>
Ähnliche Einträge können Sie auch für den Login-Manager (z.B. <code>sddm</code>, <code>gdm</code>, <code>lightdm</code>) oder den Screensaver (z.B. <code>swaylock</code>) in deren entsprechenden PAM-Dateien (<code>/etc/pam.d/&lt;dienstname&gt;</code>) hinzufügen. Das genaue Vorgehen kann je nach Dienst variieren.</p>
<hr>
<h3 id="wichtige-hinweise">Wichtige Hinweise:</h3>
<ul>
<li><strong>PINs und PUKs:</strong> Merken Sie sich die PINs und PUKs Ihres YubiKeys. Sie sind für viele Funktionen unerlässlich.</li>
<li><strong>Backups:</strong> Erstellen Sie immer Backups Ihrer GPG-Schlüssel, bevor Sie diese auf den YubiKey verschieben.</li>
<li><strong>Vorsicht bei PAM:</strong> PAM-Konfigurationen sind mächtig. Testen Sie Änderungen immer sorgfältig und haben Sie einen Notfallplan (z.B. eine Live-CD oder das offene Root-Terminal).</li>
<li><strong>Firmware:</strong> Stellen Sie sicher, dass die Firmware Ihres YubiKeys aktuell ist (<code>ykman firmware info</code>).</li>
<li><strong>Dokumentation:</strong> Die Yubico-Dokumentation ist exzellent und sollte bei spezifischen Problemen oder fortgeschrittenen Konfigurationen konsultiert werden.</li>
</ul>
</div>
</article>
</main>
<footer>
<p>Hugo Docker CMS – <a href="/index.xml">RSS</a></p>
</footer>
</body>
</html>