This commit is contained in:
jonnybravo
2026-09-08 11:02:29 +02:00
commit 3ad8c9b5a6
66 changed files with 6169 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
https://localhost:5443 {
tls /etc/caddy/certs/hugo.crt /etc/caddy/certs/hugo.key
reverse_proxy hugo:1313
}
https://man-dan-05:5443 {
tls /etc/caddy/certs/man-dan-05.crt /etc/caddy/certs/man-dan-05.key
reverse_proxy hugo:1313
}
+138
View File
@@ -0,0 +1,138 @@
---
# Playbook: Hugo-Docker-CMS aufzielen
# Aufruf: ansible-playbook -i "<host>," deploy.yml
# oder mit Variablen:
# ansible-playbook -i "<host>," deploy.yml -e "target_hostname=ras-dan-01 target_port=5443"
- name: Hugo Docker CMS bereitstellen
hosts: all
gather_facts: true
vars:
target_hostname: "{{ inventory_hostname }}"
target_port: 5443
site_title: "Hugo Docker CMS"
site_description: "Markdown-Dateien einfach in content/ ablegen."
site_author: "JonnyBravo"
deploy_path: "{{ '~' | expanduser }}/.docker/hugo"
tasks:
# ── Verzeichnisse anlegen ──
- name: Zielverzeichnisse erstellen
ansible.builtin.file:
path: "{{ deploy_path }}/{{ item }}"
state: directory
mode: "0755"
loop:
- content
- crt
- site/assets/css
- site/layouts/_default
- site/layouts/partials
- site/static
# ── docker-compose.yml kopieren ──
- name: docker-compose.yml kopieren
ansible.builtin.copy:
src: "../docker-compose.yml"
dest: "{{ deploy_path }}/docker-compose.yml"
mode: "0644"
# ── Statische Site-Dateien kopieren ──
- name: Hugo-Layouts kopieren
ansible.builtin.copy:
src: "../site/layouts/"
dest: "{{ deploy_path }}/site/layouts/"
mode: "0644"
- name: main.css kopieren
ansible.builtin.copy:
src: "../site/assets/css/main.css"
dest: "{{ deploy_path }}/site/assets/css/main.css"
mode: "0644"
- name: Entrypoint kopieren und ausführbar machen
ansible.builtin.copy:
src: "../site/entrypoint.sh"
dest: "{{ deploy_path }}/site/entrypoint.sh"
mode: "0755"
# ── Zertifikate kopieren ──
- name: Zertifikate für Ziel-Host kopieren
ansible.builtin.copy:
src: "../crt/"
dest: "{{ deploy_path }}/crt/"
mode: "0600"
- name: Zertifikate lesbar machen (crt-Dateien)
ansible.builtin.file:
path: "{{ deploy_path }}/crt/{{ item }}"
mode: "0644"
loop:
- "ca.crt"
- "{{ target_hostname }}.crt"
- "{{ target_hostname }}-chain.crt"
- "localhost.crt"
- "localhost-chain.crt"
# ── Content (optional, nur wenn lokal vorhanden) ──
- name: Beispiel-Content kopieren (falls vorhanden)
ansible.builtin.copy:
src: "../content/"
dest: "{{ deploy_path }}/content/"
mode: "0644"
ignore_errors: true
# ── Templates rendern ──
- name: Caddyfile aus Template generieren
ansible.builtin.template:
src: "templates/Caddyfile.j2"
dest: "{{ deploy_path }}/Caddyfile"
mode: "0644"
- name: hugo.toml aus Template generieren
ansible.builtin.template:
src: "templates/hugo.toml.j2"
dest: "{{ deploy_path }}/site/hugo.toml"
mode: "0644"
# ── Docker Compose starten ──
- name: Docker Compose Pull (neueste Images)
ansible.builtin.command:
cmd: docker compose pull
chdir: "{{ deploy_path }}"
register: pull_result
changed_when: "'Pulled' in pull_result.stdout or 'newer' in pull_result.stdout"
- name: Docker Compose starten
ansible.builtin.command:
cmd: docker compose up -d
chdir: "{{ deploy_path }}"
register: compose_result
changed_when: "'Starting' in compose_result.stdout or 'Creating' in compose_result.stdout"
- name: Warten bis Caddy lauscht
ansible.builtin.wait_for:
port: "{{ target_port }}"
host: "127.0.0.1"
timeout: 30
- name: HTTPS-Smoke-Test
ansible.builtin.uri:
url: "https://localhost:{{ target_port }}/"
validate_certs: false
return_content: false
register: smoketest
failed_when: smoketest.status != 200
- name: Erfolgsmeldung
ansible.builtin.debug:
msg:
- "✅ Hugo Docker CMS läuft!"
- " https://{{ target_hostname }}:{{ target_port }}/"
- " https://localhost:{{ target_port }}/"
- " Pfad: {{ deploy_path }}"
- " .md-Dateien: {{ deploy_path }}/content/"
- ""
- "🔒 CA-Zertifikat muss noch vertraut werden (auf deinem Client):"
- " sudo cp {{ playbook_dir }}/../crt/ca.crt /etc/ca-certificates/trust-source/anchors/hugo-docker-ca.crt"
- " sudo update-ca-trust"
+5
View File
@@ -0,0 +1,5 @@
library=
name=NSS Internal PKCS #11 Module
parameters=configdir='sql:' certPrefix='' keyPrefix='' secmod='secmod.db' flags= updatedir='' updateCertPrefix='' updateKeyPrefix='' updateid='' updateTokenDescription=''
NSS=Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[ECC,RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30})
+11
View File
@@ -0,0 +1,11 @@
{# Template: Caddyfile für Ziel-Host #}
https://{{ target_hostname }}:{{ target_port }} {
tls /etc/caddy/certs/{{ target_hostname }}.crt /etc/caddy/certs/{{ target_hostname }}.key
reverse_proxy hugo:1313
}
{% if target_hostname != 'localhost' %}
https://localhost:{{ target_port }} {
tls /etc/caddy/certs/localhost.crt /etc/caddy/certs/localhost.key
reverse_proxy hugo:1313
}
{% endif %}
+32
View File
@@ -0,0 +1,32 @@
{# Template: hugo.toml für Ziel-Host #}
# Hugo 0.165+ — moderne Konfiguration
baseURL = "https://{{ target_hostname }}:{{ target_port }}/"
locale = "de"
title = "{{ site_title }}"
enableGitInfo = false
disableFastRender = true
[markup]
[markup.highlight]
style = "catppuccin-mocha"
noClasses = false
lineNos = false
[markup.goldmark]
[markup.goldmark.renderer]
unsafe = true
[taxonomies]
tag = "tags"
[outputs]
home = ["HTML", "RSS"]
page = ["HTML"]
[params]
description = "{{ site_description }}"
author = "{{ site_author }}"
images = []
buildDrafts = false
buildFuture = false
buildExpired = false
+131
View File
@@ -0,0 +1,131 @@
---
title: "Rundeck und AWX Installation mit Docker"
date: "2026-09-08"
---
# 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 8052 frei
## Rundeck Installation
1. Verzeichnis für persistente Daten erstellen:
```bash
mkdir -p ~/rundeck_data
```
2. Rundeck Container starten:
```bash
docker run -d \
-p 4440:4440 \
-v ~/rundeck_data:/home/rundeck/server/data \
--name rundeck \
rundeck/rundeck:latest
```
3. Zugriff:
- URL: http://<deine-ip>:4440
- Login: admin/admin
## AWX Installation
1. Verzeichnisse für persistente Daten erstellen:
```bash
mkdir -p ~/awx_data/postgres ~/awx_data/projects
```
2. docker-compose.yml erstellen:
```bash
cat <<EOL > ~/awx_data/docker-compose.yml
version: '3'
services:
postgres:
image: postgres:13
volumes:
- ~/awx_data/postgres:/var/lib/postgresql/data
environment:
POSTGRES_DB: awx
POSTGRES_USER: awx
POSTGRES_PASSWORD: awxpass
awx:
image: ansible/awx:latest
depends_on:
- postgres
ports:
- "8052:8052"
volumes:
- ~/awx_data/projects:/var/lib/awx/projects
environment:
DATABASE_USER: awx
DATABASE_PASSWORD: awxpass
DATABASE_NAME: awx
DATABASE_HOST: postgres
EOL
```
3. AWX starten:
```bash
cd ~/awx_data
docker-compose up -d
```
4. Zugriff:
- URL: http://<deine-ip>:8052
- Login: admin/password
## Persistenz und Autostart
Um sicherzustellen, dass die Container nach einem Neustart automatisch starten, können Systemd-Services eingerichtet werden:
1. Für Rundeck:
```bash
sudo bash -c 'cat <<EOL > /etc/systemd/system/rundeck-docker.service
[Unit]
Description=Rundeck Docker Container
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker start -a rundeck
ExecStop=/usr/bin/docker stop -t 2 rundeck
[Install]
WantedBy=multi-user.target
EOL'
```
2. Für AWX:
```bash
sudo bash -c 'cat <<EOL > /etc/systemd/system/awx-docker.service
[Unit]
Description=AWX Docker Container
After=docker.service
[Service]
WorkingDirectory=/home/$(whoami)/awx_data
Restart=always
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
[Install]
WantedBy=multi-user.target
EOL'
```
3. Services aktivieren:
```bash
sudo systemctl daemon-reload
sudo systemctl enable rundeck-docker
sudo systemctl enable awx-docker
```
## Wichtige Hinweise
- Beide Lösungen können parallel betrieben werden
- Daten werden in ~/rundeck_data und ~/awx_data gespeichert
- Für Produktivumgebungen sollten zusätzliche Sicherheitsmaßnahmen getroffen werden
+197
View File
@@ -0,0 +1,197 @@
---
title: "qutebrowser Installation (Wayland / Sway)"
date: "2026-09-08"
---
# 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
```bash
sudo pacman -S qutebrowser
```
---
## 2. Video-Hardwarebeschleunigung (VAAPI)
Deine GPU: Intel Iris Xe (TigerLake). Dafür brauchst du den Intel-Media-Driver
und die VAAPI-Utils zum Prüfen:
```bash
sudo pacman -S intel-media-driver libva-utils
```
Testen ob VAAPI läuft:
```bash
vainfo
```
Erwartete Ausgabe: eine Liste mit Profilen (H264, HEVC/VP9-Decoding etc.).
Falls leer oder Fehler -> Treiberproblem.
In qutebrowser aktivieren (`:set` oder in `~/.config/qutebrowser/config.py`):
```
qt.args:
- ignore-gpu-blocklist
- enable-features=VaapiVideoDecoder,VaapiVideoDecodeLinuxGL
- enable-accelerated-video-decode
```
---
## 3. DRM / Widevine (Netflix, Prime, Spotify …)
Widevine ist proprietär und nicht im offiziellen Repo. Das AUR-Paket
`chromium-widevine` stellt das Widevine-CDM (`libwidevinecdm.so`) bereit:
```bash
yay -S chromium-widevine
```
Das Paket legt die Bibliothek ab unter:
```
/usr/lib/chromium/libwidevinecdm.so
```
Pfad in qutebrowser bekannt machen (in `config.py`):
```python
c.qt.args = [
"widevine-path=/usr/lib/chromium/libwidevinecdm.so",
"ignore-gpu-blocklist",
"enable-features=VaapiVideoDecoder",
]
```
Danach qutebrowser neu starten und prüfen:
```
:version
```
Dort sollte Widevine aufgelistet sein. Prüfseite: https://bitmovin.com/demos/drm
Wichtige Einschränkung: Widevine unter Linux liefert maximal **1080p** (L3-Lizenz).
4K-Streaming geht auf Linux nur mit Microsoft Edge oder Safari/macOS.
---
## 4. Wayland-nativ starten
Sway ist Wayland, also qutebrowser nativ (ohne XWayland) laufen lassen:
```
:set qt.args
```
oder in `config.py`:
```python
c.qt.args = ["widevine-path=..."]
```
Standardmäßig nutzt qutebrowser unter Sway bereits Wayland. Prüfen:
```
:version
```
Unter "Qt" sollte `wayland` als Platform stehen (nicht `xcb`).
---
## 5. Adblock & Datenschutz
qutebrowser hat einen eingebauten Host-Datei-Adblocker. Listen aktualisieren:
```
:adblock-update
```
Für besseren Schutz in `config.py`:
```python
# Standard-User-Agent abschalten (weniger Fingerprinting)
c.content.headers.user_agent = None
# DNT / Tracking-Opt-out
c.content.headers.do_not_track = True
```
---
## 6. Minimale Beispiel-Konfiguration
Datei: `~/.config/qutebrowser/config.py`
```python
import os
# DRM + Video-Hardwarebeschleunigung
c.qt.args = [
"widevine-path=/usr/lib/chromium/libwidevinecdm.so",
"ignore-gpu-blocklist",
"enable-features=VaapiVideoDecoder,VaapiVideoDecodeLinuxGL",
]
# Startseite
c.url.start_pages = ["https://duckduckgo.com"]
# Adblock-Listen
c.content.blocking.enabled = True
c.content.blocking.method = "both" # hosts + adblock
c.content.blocking.hosts.lists = [
"https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts",
]
# Tabs / Verhalten
c.tabs.position = "top"
c.confirm_quit = ["downloads"]
# Tastatur: h/j/k/l Navigation (bereits Standard bei qutebrowser)
```
---
## 7. Wichtigste Tastenkürzel
| Taste | Aktion |
|---|---|
| `:` | Befehlszeile |
| `o` | URL öffnen |
| `O` | URL in neuem Tab öffnen |
| `f` | Links per Buchstabenkürzel anklicken |
| `H` / `L` | Zurück / Vor |
| `j` / `k` | Nach unten / oben scrollen |
| `gg` / `G` | Seitenanfang / -ende |
| `J` / `K` | Nächster / vorheriger Tab |
| `d` / `u` | Tab schließen / wieder öffnen |
| `/` | Suche auf Seite |
| `n` / `N` | Nächstes / vorheriges Suchergebnis |
| `yy` | URL in Zwischenablage |
| `ZZ` | qutebrowser beenden |
---
## 8. Alternativen im Überblick (schnell & sicher auf Sway)
| Browser | Engine | Install | Anmerkung |
|---|---|---|---|
| qutebrowser | Blink (Qt) | `sudo pacman -S qutebrowser` | Tastatur-only, ideal für Tiling |
| LibreWolf | Gecko (Firefox) | `yay -S librewolf-bin` | Firefox ohne Telemetrie, +uBlock |
| ungoogled-chromium | Blink | `yay -S ungoogled-chromium-bin` | Chromium ohne Google |
| Brave | Blink | `yay -S brave-bin` | Built-in Werbeblocker |
Für 4K-Streaming + Extensions: Brave. Für maximalen Datenschutz: LibreWolf.
Für reine Tastatur-Steuerung im Tiling-WM: qutebrowser.
+23
View File
@@ -0,0 +1,23 @@
---
title: "Stretchen_laufen"
date: "2026-09-08"
---
Aufwärmen:
10-15 Wh. 1-2 Sek.
1. Zwillingswadenmuskel dehnen S166
2. Zwillingswadenmuskel dehen S164
3. Beste Dhenübung der Welt S140
4. Girlanden-Haltung S126
5. Hüftkreisen im Stehen S148
6. Oberschenkelrückseite dynamisch dehen S163
Einsteiger :
10-15 Wh. 1-2 Sek.
1. Katze - Kuh S74
2. Quadrizeps dehnen im Stehen S156
3. Oberschenkelrückseite statisch S160
4. Hüftbeuger mithilfe eines Stuhles S137
5. Zwillingswardenmuskel dehnen S166
6. Hüftkreisen im Viertelfüser S150
7. Oberschenkelrückseite S163
+48
View File
@@ -0,0 +1,48 @@
---
title: "Empfehlungen für AstroVim"
date: "2026-09-08"
---
# Empfehlungen für AstroVim
## 1. Tastenkürzel kennenlernen (Which‑Key)
AstroVim nutzt **which‑key** für kontextsensitive Key‑Menüs.
Drücke `<leader>` (Standard: Leertaste) und warte kurz, um das Menü
zu sehen. So erkennst du schnell verfügbare Aktionen.
## 2. Dateiexplorer (Neo‑Tree)
AstroVim bringt **neo‑tree** als Dateibaum mit.
- `<leader> e` öffnet / schließt den Explorer.
- `a` legt eine neue Datei an, `d` löscht, `r` benennt um.
- `H` blendet ausgeblendete Dateien ein / aus.
## 3. Fuzzy‑Finder (Telescope)
**Telescope** ist der Fuzzy‑Finder.
- `<leader> f f` : Dateien im Projekt suchen
- `<leader> f g` : live‑grep im Projekt
- `<leader> f b` : geöffnete Buffer durchsuchen
- `<leader> f h` : Hilfe‑Tags durchsuchen
## 4. Buffer‑Verwaltung
- `<leader> c` schließt den aktuellen Buffer.
- `[ b` / `] b` wechselt zum vorherigen / nächsten Buffer.
- `<leader> b` zeigt eine Liste offener Buffer.
## 5. Git‑Integration (LazyGit / Gitsigns)
- **LazyGit** startest du mit `<leader> g g` – eine vollwertige
Git‑TUI direkt im Terminal‑Fenster.
- **Gitsigns** zeigt Änderungen in der Sign‑Spalte.
- `] c` / `[ c` springt zur nächsten / vorherigen Änderung.
- `<leader> h s` stage a hunk, `<leader> h r` reset hunk.
## 6. Terminal im Editor
- `<leader> t f` öffnet ein floatendes Terminal.
- `<leader> t h` / `<leader> t v` teilt horizontal / vertikal
mit einem Terminal.
- `Ctrl+\ Ctrl+n` wechselt in den Normal‑Modus innerhalb des Terminals.
## 7. Snippets (LuaSnip)
AstroVim verwendet **LuaSnip**. Du kannst eigene Snippets unter
`~/.config/nvim/lua/user/snippets/` ablegen. Beispiel‑Datei
`python.lua`:
+44
View File
@@ -0,0 +1,44 @@
---
title: "blueray_install_manjaro"
date: "2026-09-08"
---
### 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.
1. **Benötigte Pakete installieren**
Dieser Befehl installiert alle notwendigen Pakete für die Blu-ray-Wiedergabe:
- `vlc`: Der Media Player.
- `libaacs`: Notwendig, um AACS-geschützte Blu-ray-Discs zu entschlüsseln.
- `libbluray`: Eine Bibliothek für die Navigation und Wiedergabe von Blu-ray-Discs.
- `jre-openjdk`: Eine Java-Laufzeitumgebung, die für Blu-ray-Menüs (BD-J) benötigt wird.
```bash
sudo pacman -S vlc libaacs libbluray jre-openjdk
```
*Hinweis: Der zuvor erwähnte Paket `libbdplus` 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.*
2. **Verzeichnis für AACS-Schlüssel erstellen**
Dieser Befehl erstellt das notwendige Verzeichnis in Ihrem Home-Verzeichnis, wo die Entschlüsselungsschlüssel (`KEYDB.cfg`) für Blu-ray-Discs gespeichert werden. Das `-p`-Flag stellt sicher, dass alle übergeordneten Verzeichnisse bei Bedarf ebenfalls erstellt werden und unterdrückt Fehlermeldungen, falls das Verzeichnis bereits existiert.
```bash
mkdir -p ~/.config/aacs/
```
3. **KEYDB.cfg-Datei herunterladen**
Dieser Befehl lädt die Datei `KEYDB.cfg` 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 `.config/aacs/`-Verzeichnis gespeichert.
```bash
wget -O ~/.config/aacs/KEYDB.cfg http://vlc-bluray.whoknowsmy.name/files/KEYDB.cfg
```
4. **Benutzerberechtigungen für das Blu-ray-Laufwerk korrigieren**
Sollten Sie die Fehlermeldung erhalten, dass VLC die Medienadresse nicht öffnen kann (`VLC kann die Medienadresse 'bluray:///dev/sr0' nicht öffnen`), liegt es wahrscheinlich an fehlenden Berechtigungen. Dieser Befehl fügt Ihren Benutzer zur `optical`-Gruppe hinzu, die den Zugriff auf optische Laufwerke ermöglicht.
```bash
sudo usermod -aG optical jonnybravo
```
**WICHTIG:** Damit diese Änderung wirksam wird, müssen Sie sich **vollständig von Ihrer aktuellen Sitzung abmelden und dann wieder neu anmelden** (oder den Computer neu starten).
+75
View File
@@ -0,0 +1,75 @@
---
title: "Calcurse Tastenkürzel (Zusammenfassung)"
date: "2026-09-08"
---
# 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 Ansichten wechseln (Termine/TODO) |
| `ESC` | Aktion abbrechen / Dialog schließen |
| `:` | Befehlszeile öffnen |
| `^R` | Bildschirm neu zeichnen |
### **Navigation im Kalender**
| Taste(n) | Aktion |
|---------------|----------------------------------------------|
| `t` | Nächster Tag |
| `T` | Vorheriger Tag |
| `w` | Nächste Woche |
| `W` | Vorherige Woche |
| `m` | Nächster Monat |
| `M` | Vorheriger Monat |
| `y` | Nächstes Jahr |
| `Y` | Vorheriges Jahr |
| `g`, `G` | Zu einem bestimmten Datum springen |
| `^G` | Zum heutigen Tag springen |
| `h`,`j`,`k`,`l`| Navigation (links, runter, hoch, rechts) |
### **Termine & TODOs verwalten**
| Taste(n) | Aktion |
|---------------|----------------------------------------------|
| `a`, `A` | Neuen Eintrag hinzufügen (je nach Ansicht) |
| `^A` | Direkt einen neuen **Termin** hinzufügen |
| `^T` | Direkt einen neuen **TODO**-Eintrag hinzufügen |
| `d`, `D` | Ausgewählten Eintrag löschen |
| `e`, `E` | Ausgewählten Eintrag bearbeiten |
| `v`, `Enter` | Details des Eintrags ansehen |
| `n`, `N` | Notiz bearbeiten/hinzufügen |
| `>` | Notiz ansehen |
| `c` | Eintrag kopieren |
| `p` | Eintrag einfügen |
| `r` | Wiederholung für einen Eintrag festlegen |
### **Speziell für die TODO-Liste**
| Taste(n) | Aktion |
|---------------|----------------------------------------------|
| `!` | Task als erledigt markieren (umschalten) |
| `+` | Priorität des Tasks erhöhen |
| `-` | Priorität des Tasks senken |
### **Daten Im- & Export**
| Taste(n) | Aktion |
|---------------|----------------------------------------------|
| `i`, `I` | Daten aus einer Datei importieren |
| `x`, `X` | Daten in eine Datei exportieren |
| `|` | Eintrag an ein externes Skript weiterleiten |
+316
View File
@@ -0,0 +1,316 @@
---
title: "Lazygit – Der Terminal-Git-Client"
date: "2026-09-08"
---
# 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
```bash
# Arch / Manjaro
sudo pacman -S lazygit
# Ubuntu / Debian
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar xf lazygit.tar.gz lazygit
sudo install lazygit /usr/local/bin
# macOS
brew install lazygit
# Windows (mit Winget)
winget install JesseDuffield.lazygit
```
Start: Einfach `lazygit` im Repository-Verzeichnis ausführen.
---
## Navigation (global)
| Taste | Aktion |
|-------|--------|
| `h` / `l` | Zwischen Panels wechseln (links/rechts) |
| `j` / `k` | In Liste nach unten/oben |
| `↑` / `↓` | Dasselbe wie j/k |
| `g` | Zum Anfang der Liste |
| `shift+G` | Zum Ende der Liste |
| `/` | Suchen (im aktuellen Panel) |
| `q` | Lazygit beenden |
| `esc` | Zurück / Aktion abbrechen |
| `?` | Hilfe anzeigen (alle Tasten) |
| `tab` | In neuem Panel: zwischen Bereichen springen |
---
## Panel 1: Status (ganz links)
Zeigt, ob du im normalen Modus, im Rebase, Merge-Konflikt etc. bist.
Normalerweise springst du mit `1`-`5` direkt in die anderen Panels.
---
## Panel 2: Dateien / Working Tree
Hier siehst du alle geänderten, neuen und gelöschten Dateien.
| Taste | Aktion |
|-------|--------|
| `Leertaste` | Datei stagen/unstagen (markiert) |
| `a` | Alle Dateien stagen/unstagen |
| `c` | Commit erstellen (öffnet Editor für Commit-Message) |
| `shift+C` | Commit mit Editor (git commit) |
| `enter` | Diff der ausgewählten Datei anzeigen |
| `d` | Änderungen der Datei verwerfen (Achtung, unwiderruflich!) |
| `shift+D` | Datei aus Working Tree löschen |
| `e` | Datei im Editor öffnen |
| `o` | Datei mit Standardprogramm öffnen |
| `i` | Datei zu .gitignore hinzufügen / Eintrag entfernen |
| `p` | Patch – interaktiv nur Teile einer Datei stagen |
### Patch-Modus (`p`)
Nach Drücken von `p` auf einer Datei:
| Taste | Aktion |
|-------|--------|
| `Leertaste` | Aktuellen Hunks stagen/unstagen |
| `j` / `k` | Zwischen Hunks navigieren |
| `v` | Selektionsmodus (visuell) – dann Leertaste für Auswahl |
| `tab` | In Diff-Fenster springen |
---
## Panel 3: Branches
| Taste | Aktion |
|-------|--------|
| `Leertaste` | Branch auschecken |
| `n` | Neuen Branch erstellen |
| `c` | Branch mit Namen umbenennen (checkout) |
| `shift+C` | Branch umbenennen (ohne checkout) |
| `d` | Branch löschen |
| `shift+D` | Branch force-löschen (auch wenn nicht gemerged) |
| `m` | Aktuellen Branch in ausgewählten Branch mergen |
| `M` | Merge ohne Fast-Forward |
| `enter` | Commits des Branches anzeigen |
| `r` | Branch rebasen auf ausgewählten Branch |
| `f` | Fast-Forward des ausgewählten Branches |
| `T` | Tag erstellen |
| `g` | Branch zurücksetzen (reset) auf ausgewählten |
---
## Panel 4: Commits (im Branch-Panel mit Enter)
| Taste | Aktion |
|-------|--------|
| `s` | Squash down – Commit in den darunterliegenden squashen |
| `shift+S` | Fixup – Commit in darunterliegenden squashen, Message verwerfen |
| `r` | Rebase auf diesen Commit starten / Rebase fortsetzen |
| `R` | Commit-Message mit `git commit --amend` bearbeiten |
| `A` | Commit mit Staged-Änderungen amendend (git commit --amend) |
| `t` | Commit rückgängig machen (revert) |
| `shift+T` | Revert erstellen, ohne zu commiten |
| `ctrl+j` / `ctrl+k` | Commit in der Liste nach unten/oben verschieben (interaktiv) |
| `g` | Reset auf diesen Commit – Optionen: |
| | `soft` – HEAD verschieben, Index bleibt |
| | `mixed` (default) – HEAD + Index verschieben |
| | `hard` – HEAD + Index + Working Tree (Achtung, verwirft!) |
| `d` | Commit löschen (während Rebase) |
| `shift+D` | Commits ab hier löschen (während Rebase) |
| `f` | Fixup-Commit erstellen |
| `shift+F` | Fixup-Commit für einen bestimmten Commit |
| `enter` | Dateien des Commits anzeigen |
| `ctrl+l` | Commit-Log anzeigen |
| `shift+C` | Commit kopieren (cherry-pick) |
| `v` | Commits in die Zwischenablage kopieren |
---
## Panel 5: Stash
| Taste | Aktion |
|-------|--------|
| `Leertaste` | Stash anwenden |
| `g` | Stash anwenden und danach löschen (pop) |
| `d` | Stash löschen |
| `enter` | Dateien des Stashs anzeigen |
| `n` | Neuen Stash mit Nachricht erstellen |
| `s` | Schnell-Stash (ohne Nachricht) |
---
## Reflog
Mit `ctrl+o` (oder im Commits-Panel) öffnest du das Reflog – alle HEAD-Bewegungen.
| Taste | Aktion |
|-------|--------|
| `enter` | Reflog-Eintrag anzeigen |
| `g` | Auf diesen Eintrag zurücksetzen (soft/mixed/hard) |
| `ctrl+o` | Reflog schließen |
---
## Remote / Push & Pull
| Taste | Aktion |
|-------|--------|
| `p` | Push (im Branch- oder Commits-Panel) |
| `shift+P` | Force-Push (`--force-with-lease`) |
| `shift+F` | Fetch (alle Remotes) |
| `ctrl+p` | Pull (fetch + merge) |
| `shift+ctrl+P` | Pull mit Rebase |
---
## Undo / Redo
Lazygit hat eine eingebaute Undo-Funktion – ein Lebensretter!
| Taste | Aktion |
|-------|--------|
| `z` | Letzte Git-Aktion rückgängig machen (undo) |
| `shift+Z` | Rückgängig gemachte Aktion wiederholen (redo) |
Funktioniert für: Commit, Stash, Branch-Reset, Checkout, Cherry-Pick, Revert,
Merge ...
---
## Konflikte lösen
Im Merge-Konflikt-Fall zeigt Lazygit die betroffenen Dateien.
| Taste | Aktion |
|-------|--------|
| `Leertaste` | Datei als "ours" markieren (eigene Version) |
| `b` | Datei als "theirs" markieren (fremde Version) |
| `↑` / `↓` | Hunk auswählen |
| `Leertaste` | Hunk auswählen (ours/theirs oder beide) |
| `a` | Alle Hunks auf einmal akzeptieren |
| `shift+M` | Merge-Tool für diese Datei öffnen |
---
## Submodule
| Taste | Aktion |
|-------|--------|
| `enter` | In Submodule wechseln (öffnet neue Lazygit-Instanz) |
| `i` | Submodule init |
| `u` | Submodule updaten |
| `n` | Submodule hinzufügen |
---
## Worktrees
| Taste | Aktion |
|-------|--------|
| `n` | Neues Worktree erstellen |
| `enter` | In Worktree wechseln |
| `d` | Worktree löschen |
---
## Tipps & häufige Workflows
### Änderungen committen
```
1. j/k → Datei auswählen
2. Leertaste → Stagen
3. c → Commit-Message schreiben, Enter
4. p → Pushen
```
### Letzten Commit ändern (amend)
```
1. a → Alle Dateien stagen
2. shift+A → Amend (fügt Staged-Änderungen zum letzten Commit hinzu)
```
### Branch erstellen und wechseln
```
1. 3 → Branch-Panel
2. n → Neuen Branch, Namen eingeben, Enter
```
### Commits zusammenfassen (squash)
```
1. 4 → Commits-Panel
2. j/k → Commit auswählen (der, der in den darunterliegenden gesquasht werden soll)
3. s → Squash
```
### Commit rückgängig machen
```
1. 4 → Commits-Panel
2. g → "reset"
3. soft → HEAD verschieben, Änderungen bleiben im Index
```
Falls du es dir anders überlegst: `z` (undo).
### Interaktives Rebase
```
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
```
---
## Konfiguration
Die Konfigurationsdatei liegt unter:
- Linux/macOS: `~/.config/lazygit/config.yml`
- Windows: `%APPDATA%/lazygit/config.yml`
Beispiel für ein nützliches Config-Snippet:
```yaml
gui:
theme:
activeBorderColor:
- '#89b4fa'
- bold
inactiveBorderColor:
- '#a6adc8'
nerdFontsVersion: "3"
git:
paging:
colorArg: always
pager: delta --dark --paging=never
# Commit-Konvention für Merge-Commits
commitPrefixes:
my_project:
pattern: "^(\\w+\\/\\w+-\\d+)"
replace: "[$1] "
```
---
## Fazit
Lazygit macht Git massiv schneller: Du siehst Diff, Branches, Commits und
Stashes gleichzeitig, stagen mit Leertaste, commiten mit `c`, pushen mit `p`.
Kein `git status`-Tippen mehr, kein `git log --oneline`-Starren.
Die beiden wichtigsten Tasten: `z` für Undo und `?` für Hilfe.
+187
View File
@@ -0,0 +1,187 @@
---
title: "Zusammenfassung der vorgenommenen Änderungen und Konfigurationen"
date: "2026-09-08"
---
# 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 eine modulare Logging-Konfiguration mit Log-Rotation erstellt und in eine separate Datei ausgelagert.
### `logging_config.py` erstellt
**Zweck:** Enthält die Funktion `setup_logging()` zur Konfiguration eines Root-Loggers, der Logs in eine Datei (`sync_log.log`) schreibt, diese bei Erreichen einer Größe von 5 MB rotiert und 5 Backups behält. Optional kann auch ein Konsolen-Logger aktiviert werden.
**Inhalt der Datei (`/home/jonnybravo/Projekte/python_tests/rclone/logging_config.py`):**
```python
import logging
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
import os
def setup_logging(console_logging=False):
"""Konfiguriert das Root-Logging für die Anwendung mit Rotation.
Diese Funktion richtet einen Root-Logger ein, der Log-Nachrichten in eine Datei schreibt,
welche bei Erreichen einer bestimmten Größe rotiert wird.
:param console_logging: Wenn True, werden Logs zusätzlich zur Datei auch auf der Konsole ausgegeben.
Standardmäßig ist dies deaktiviert (False).
"""
# --- Allgemeine Einstellungen ---
log_file = "sync_log.log" # Name der Log-Datei
# Maximale Größe der Log-Datei in Bytes, bevor sie rotiert wird (hier 5 MB)
max_log_size = 5 * 1024 * 1024
# Anzahl der rotierenden Backup-Dateien, die behalten werden sollen (hier 5)
backup_count = 5
# --- Logger-Initialisierung ---
logger = logging.getLogger()
if logger.hasHandlers():
return
# --- Logging-Level einstellen ---
# Mögliche Levels: DEBUG, INFO, WARNING, ERROR, CRITICAL
logger.setLevel(logging.INFO)
# --- Formatter erstellen ---
# Definiert das Layout der Log-Nachrichten.
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# --- Handler erstellen und dem Logger hinzufügen ---
# 1. RotatingFileHandler (immer aktiv)
file_handler = RotatingFileHandler(
log_file,
maxBytes=max_log_size,
backupCount=backup_count,
encoding='utf-8'
)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# 2. StreamHandler für Konsolen-Ausgabe (optional)
if console_logging:
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# --- Weitere Referenzen und alternative Handler ---
# (Ausführliche Kommentare sind in der Datei enthalten, hier gekürzt)
```
### `sync.py` angepasst
**Zweck:** Importiert die `setup_logging`-Funktion und ruft sie ganz am Anfang des Skripts auf, um die Logging-Konfiguration zu initialisieren.
**Relevanten Änderungen in `/home/jonnybravo/Projekte/python_tests/rclone/sync.py`:**
```python
from logging_config import setup_logging
# Logging so früh wie möglich einrichten
setup_logging() # Optional: setup_logging(console_logging=True) für Konsolen-Logs
from rclone_python import rclone as rc
from rclone_python.utils import RcloneException
import os
import logging
# ... (restlicher Code)
```
---
## 2. DNS-Konfiguration auf dem Manjaro-System
Um den AdGuard Home-Server `10.50.0.3` als primären DNS-Server für das gesamte System und alle Verbindungen zu nutzen, wurden folgende Schritte durchgeführt:
### Globale `systemd-resolved` Konfiguration
**Zweck:** Setzt `10.50.0.3` als systemweiten DNS-Server für `systemd-resolved`.
**Änderungen in `/etc/systemd/resolved.conf`:**
```ini
[Resolve]
DNS=10.50.0.3
# FallbackDNS= # Auskommentieren oder auf FallbackDNS= setzen, um Fallback zu verhindern
```
Nach der Bearbeitung: `sudo systemctl restart systemd-resolved`
### NetworkManager Überschreibung für alle Verbindungen
**Zweck:** Weist NetworkManager an, bei allen Netzwerkverbindungen (bestehende und neue) den vom DHCP-Server angebotenen DNS zu ignorieren. Dadurch wird der globale DNS von `systemd-resolved` verwendet.
**Neue Datei erstellt: `/etc/NetworkManager/conf.d/99-global-dns-override.conf`**
```ini
[connection]
# Diese Einstellung gilt für alle neuen und bestehenden Verbindungen.
# Sie weist NetworkManager an, den DNS-Server vom DHCP zu ignorieren.
ipv4.ignore-auto-dns=true
ipv6.ignore-auto-dns=true
```
Nach der Erstellung: `sudo systemctl restart NetworkManager`
### Anpassung des spezifischen WLAN-Profils (SweetHome-5G)
**Zweck:** Hinzufügen der DNS-Suchdomäne, damit lokale Hostnamen ohne vollen Domain-Namen aufgelöst werden können.
**Befehle für die Kommandozeile (nmcli):**
(Ersetzen Sie "Ihr Verbindungsname" durch den tatsächlichen Namen, z.B. "SweetHome-5G")
```bash
nmcli connection modify "Ihr Verbindungsname" ipv4.dns-search "speedport.ip"
# optional für IPv6: nmcli connection modify "Ihr Verbindungsname" ipv6.dns-search "speedport.ip"
nmcli connection up "Ihr Verbindungsname"
```
---
## 3. AdGuard Home Konfiguration
### Installation & SSL-Einrichtung
**Zweck:** Installation von AdGuard Home auf einem Linux-Server und Absicherung der Weboberfläche mit einem selbstsignierten SSL-Zertifikat und eigener CA.
**Schritte (ausführlich in vorherigen Antworten beschrieben):**
1. AdGuard Home installieren (`curl ... install.sh`).
2. Eigene CA (`MyCA.key`, `MyCA.pem`) und Server-Zertifikat (`adguard.key`, `adguard.crt`) mit `openssl` erstellen, inklusive SAN-Erweiterung für IP-Adresse/lokalen Hostnamen.
3. Zertifikate in AdGuard Home (`adguard.crt`, `adguard.key`) unter **Einstellungen → Verschlüsselungseinstellungen** konfigurieren.
4. `MyCA.pem` auf Client-Geräten als vertrauenswürdige Stammzertifizierungsstelle installieren.
### Bedingte Weiterleitung für lokale Namen
**Zweck:** Ermöglicht AdGuard Home die Auflösung lokaler Hostnamen durch Weiterleitung an den Router.
**Konfiguration in der AdGuard Home Weboberfläche:**
1. Gehen Sie zu **Einstellungen → DNS-Einstellungen**.
2. Im Abschnitt **"Upstream-DNS-Server"** die folgende Zeile hinzufügen (zusätzlich zu öffentlichen DNS-Servern):
```
[/speedport.ip/]192.168.50.1
```
3. Einstellungen speichern.
---
## 4. Problembehebung WireGuard DNS
**Zweck:** Behebung des Konflikts, bei dem WireGuard die DNS-Einstellungen überschrieben und auf einen nicht existierenden Server (`10.50.0.3` ohne installierten DNS-Dienst) gezeigt hat.
**Änderung in der WireGuard-Konfigurationsdatei:**
* In `/etc/wireguard/wg0.conf` (im Abschnitt `[Interface]`) die Zeile `DNS = 10.50.0.3` auskommentieren oder auf einen anderen DNS-Server ändern.
```ini
[Interface]
# DNS = 10.50.0.3
```
* WireGuard neu starten: `sudo systemctl restart wg-quick@wg0` (oder `sudo wg-quick down wg0 && sudo wg-quick up wg0`).
+81
View File
@@ -0,0 +1,81 @@
---
title: "Python String-Präfixe"
date: "2026-09-08"
---
# 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 `.startswith()` und `.endswith()`.
Hier ist die Liste aller String-Präfixe in Python mit Beschreibung und logischen Beispielen:
| Präfix | Beschreibung | Logisches Beispiel |
| :--- | :--- | :--- |
| **Keines** | Standard-Unicode-String (UTF-8 in Python 3). Verarbeitet normale Escape-Sequenzen wie `\n` oder `\t`. | `text = "Zeile 1\nZeile 2"` |
| **`f` / `F`** | **Formatted String (f-string):** Ermöglicht die direkte Einbettung von Python-Ausdrücken und Variablen in geschweiften Klammern `{}`. | `name = "Welt"\nprint(f"Hallo {name}!")` *(Ausgabe: Hallo Welt!)* |
| **`r` / `R`** | **Raw String:** Behandelt Backslashes `\` als normale Zeichen und ignoriert Escape-Sequenzen. Ideal für reguläre Ausdrücke oder Dateipfade. | `pfad = r"C:\Users\Name\Documents"` |
| **`b` / `B`** | **Byte-String:** Erzeugt ein `bytes`-Objekt statt eines Standard-Strings. Erlaubt nur ASCII-Zeichen (Werte 0-127). | `daten = b"Hallo"` *(Typ ist `bytes`)* |
| **`u` / `U`** | **Unicode-String:** In Python 3 standardmäßig das Standardverhalten. Wird heute hauptsächlich für die Abwärtskompatibilität mit Python 2 verwendet. | `unicode_text = u"Café"` |
| **`fr` / `rf`** | **Kombination (Raw f-string):** Erlaubt sowohl die Formatierung mit `{}` als auch die Ignorierung von Escape-Sequenzen. | `ordner = "Bilder"\npfad = fr"C:\{ordner}\bild.png"` |
| **`br` / `rb`** | **Kombination (Raw Byte-string):** Erzeugt ein Byte-Objekt, bei dem Backslashes nicht als Escape-Sequenzen interpretiert werden. | `regex_bytes = rb"a\nb"` |
*(Hinweis: Die Groß- und Kleinschreibung der Präfixe ist beliebig, d. h. `f""` verhält sich identisch zu `F""`.)*
## Python String-Methoden
Hier ist eine Übersicht über die wichtigsten eingebauten Methoden von String-Objekten (`str`) in Python, sortiert nach ihrer Funktion:
### 1. Bereinigen und Ausrichten
| Methode | Beschreibung | Logisches Beispiel |
| :--- | :--- | :--- |
| **`strip([chars])`** | Entfernt führende und folgende Whitespaces (oder die angegebenen Zeichen in `chars`). | `" hallo ".strip()` *(Ergebnis: `"hallo"`)* |
| **`lstrip([chars])`** | Entfernt nur führende Whitespaces oder Zeichen. | `" hallo ".lstrip()` *(Ergebnis: `"hallo "`)* |
| **`rstrip([chars])`** | Entfernt nur folgende Whitespaces oder Zeichen. | `" hallo ".rstrip()` *(Ergebnis: `" hallo"`)* |
| **`ljust(width[, fillchar])`** | Richtet den String linksbündig in einem Feld der Breite `width` aus. | `"test".ljust(10, "-")` *(Ergebnis: `"test------"`)* |
| **`rjust(width[, fillchar])`** | Richtet den String rechtsbündig in einem Feld der Breite `width` aus. | `"test".rjust(10, "-")` *(Ergebnis: `"------test"`)* |
| **`center(width[, fillchar])`** | Zentriert den String in einem Feld der Breite `width`. | `"test".center(10, "-")` *(Ergebnis: `"---test---"`)* |
| **`zfill(width)`** | Füllt den String links mit Nullen auf, bis die Breite `width` erreicht ist. | `"42".zfill(5)` *(Ergebnis: `"00042"`)* |
### 2. Suchen und Ersetzen
| Methode | Beschreibung | Logisches Beispiel |
| :--- | :--- | :--- |
| **`replace(old, new[, count])`** | Ersetzt Vorkommen von `old` durch `new`. Optional wird die Anzahl durch `count` begrenzt. | `"A-B-C".replace("-", "/")` *(Ergebnis: `"A/B/C"`)* |
| **`find(sub[, start[, end]])`** | Gibt den niedrigsten Index zurück, an dem `sub` gefunden wird. Gibt `-1` zurück, wenn nicht gefunden. | `"hallo".find("ll")` *(Ergebnis: `2`)* |
| **`rfind(sub[, start[, end]])`** | Gibt den höchsten Index zurück, an dem `sub` gefunden wird. Gibt `-1` zurück, wenn nicht gefunden. | `"hallo".rfind("l")` *(Ergebnis: `3`)* |
| **`index(sub[, start[, end]])`** | Wie `find()`, wirft aber einen `ValueError`, wenn das Substring nicht gefunden wird. | `"hallo".index("x")` *(Ergebnis: `ValueError`)* |
| **`rindex(sub[, start[, end]])`** | Wie `rfind()`, wirft aber einen `ValueError`, wenn nicht gefunden. | `"hallo".rindex("l")` *(Ergebnis: `3`)* |
| **`count(sub[, start[, end]])`** | Zählt, wie oft das Substring `sub` im String vorkommt. | `"banane".count("an")` *(Ergebnis: `2`)* |
### 3. Aufteilen und Verbinden
| Methode | Beschreibung | Logisches Beispiel |
| :--- | :--- | :--- |
| **`split(sep=None, maxsplit=-1)`** | Teilt den String an Trennzeichen `sep` und gibt eine Liste zurück. | `"A,B,C".split(",")` *(Ergebnis: `['A', 'B', 'C']`)* |
| **`rsplit(sep=None, maxsplit=-1)`** | Teilt den String vom Ende her auf. | `"A,B,C".rsplit(",", 1)` *(Ergebnis: `['A,B', 'C']`)* |
| **`splitlines([keepends])`** | Teilt den String an Zeilenumbrüchen auf. | `"A\nB".splitlines()` *(Ergebnis: `['A', 'B']`)* |
| **`join(iterable)`** | Verbindet die Elemente eines Iterables (z.B. Liste) mit dem String als Trennzeichen. | `"-".join(["A", "B"])` *(Ergebnis: `"A-B"`)* |
| **`partition(sep)`** | Teilt den String beim ersten Vorkommen von `sep` in ein Tupel: `(vor, sep, nach)`. | `"A-B-C".partition("-")` *(Ergebnis: `('A', '-', 'B-C')`)* |
| **`rpartition(sep)`** | Teilt den String beim letzten Vorkommen von `sep`. | `"A-B-C".rpartition("-")` *(Ergebnis: `('A-B', '-', 'C')`)* |
### 4. Groß-/Kleinschreibung ändern
| Methode | Beschreibung | Logisches Beispiel |
| :--- | :--- | :--- |
| **`lower()`** | Konvertiert alle Zeichen in Kleinbuchstaben. | `"Hallo".lower()` *(Ergebnis: `"hallo"`)* |
| **`upper()`** | Konvertiert alle Zeichen in Großbuchstaben. | `"Hallo".upper()` *(Ergebnis: `"HALLO"`)* |
| **`capitalize()`** | Setzt das erste Zeichen auf Groß und den Rest auf Klein. | `"hallo welt".capitalize()` *(Ergebnis: `"Hallo welt"`)* |
| **`title()`** | Setzt den ersten Buchstaben jedes Wortes auf Groß. | `"hallo welt".title()` *(Ergebnis: `"Hallo Welt"`)* |
| **`swapcase()`** | Vertauscht Groß- und Kleinschreibung. | `"HAllo".swapcase()` *(Ergebnis: `"haLLO"`)* |
| **`casefold()`** | Ähnlich wie `lower()`, ist aber aggressiver beim Entfernen von Groß-/Kleinschreibungsunterschieden (gut für Caseless Matching in Unicode). | `"Straße".casefold()` *(Ergebnis: `"strasse"`)* |
### 5. Überprüfungsmethoden (Geben `True` oder `False` zurück)
| Methode | Beschreibung | Logisches Beispiel |
| :--- | :--- | :--- |
| **`startswith(prefix[, start[, end]])`** | Prüft, ob der String mit `prefix` beginnt. | `"hallo".startswith("ha")` *(Ergebnis: `True`)* |
| **`endswith(suffix[, start[, end]])`** | Prüft, ob der String mit `suffix` endet. | `"hallo".endswith("lo")` *(Ergebnis: `True`)* |
| **`isalnum()`** | Prüft, ob alle Zeichen alphanumerisch sind (Buchstaben und Zahlen) und mindestens ein Zeichen vorhanden ist. | `"Python3".isalnum()` *(Ergebnis: `True`)* |
| **`isalpha()`** | Prüft, ob alle Zeichen Buchstaben sind. | `"Python".isalpha()` *(Ergebnis: `True`)* |
| **`isdigit()`** | Prüft, ob alle Zeichen Ziffern sind (z. B. auch hochgestellte Zahlen). | `"123".isdigit()` *(Ergebnis: `True`)* |
| **`isnumeric()`** | Prüft, ob alle Zeichen numerisch sind (auch Brüche wie ½). | `"½".isnumeric()` *(Ergebnis: `True`)* |
| **`isspace()`** | Prüft, ob der String nur aus Whitespaces (Leerzeichen, Tabs, Zeilenumbrüchen) besteht. | `" \n".isspace()` *(Ergebnis: `True`)* |
| **`islower()`** | Prüft, ob alle buchstabenbasierten Zeichen kleingeschrieben sind. | `"hallo".islower()` *(Ergebnis: `True`)* |
| **`isupper()`** | Prüft, ob alle buchstabenbasierten Zeichen großgeschrieben sind. | `"HALLO".isupper()` *(Ergebnis: `True`)* |
| **`istitle()`** | Prüft, ob der String im Titlecase-Format vorliegt. | `"Hallo Welt".istitle()` *(Ergebnis: `True`)* |
+121
View File
@@ -0,0 +1,121 @@
---
title: "System Optimierung – nächste Schritte"
date: "2026-09-08"
---
# 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:**
```bash
sudo sed -i 's/fields\.Number/fields.Float/g' /usr/lib/python3.14/site-packages/flashfocus/config.py
```
**Danach testen:**
```bash
flashfocus --help
```
Wenn kein Traceback kommt, ist der Patch erfolgreich.
**Achtung:** Nach jedem `pacman -Syu`, bei dem flashfocus aktualisiert wird, muss der Patch erneut angewendet werden.
---
## 2. Systemd-User-Services masken
Die Manjaro-Sway-Config versucht die Dienste bei jedem Start neu zu enablen.
Nur `disable` reicht nicht – sie müssen **maskiert** werden.
```bash
systemctl --user mask mako.service flashfocus.service pcmanfm.service poweralertd.service xdg-desktop-portal-gtk.service xdg-desktop-portal-lxqt.service
```
**Kontrolle:**
```bash
systemctl --user status mako flashfocus pcmanfm poweralertd xdg-desktop-portal-gtk xdg-desktop-portal-lxqt
```
Alle sollten `masked` anzeigen (nicht `failed`).
---
## 3. Neustart und Test
Sway neustarten (Super+Shift+R) oder System rebooten.
Nach dem Neustart prüfen, ob alle Dienste laufen:
```bash
pgrep -a mako
pgrep -a pcmanfm-qt
pgrep -a poweralertd
pgrep -a flashfocus
pgrep -a xdg-desktop-portal
```
Jeder Befehl sollte eine PID und den Prozessnamen ausgeben.
**Journal aufräumen** – keine neuen Crash-Logs mehr:
```bash
journalctl --user -p 3 --since "1 minute ago"
```
---
## 4. Weitere Performance-Empfehlungen
Die vollständige Analyse ist in diesem Chat dokumentiert. Hier die Top-Empfehlungen als Übersicht:
| Priorität | Maßnahme | Befehl |
|---|---|---|
| Hoch | swappiness auf 40 senken (ZRAM) | `sudo sysctl vm.swappiness=40` (temporär) oder `/etc/sysctl.d/99-zram.conf` |
| Hoch | vfs_cache_pressure auf 50 | `sudo sysctl vm.vfs_cache_pressure=50` |
| Mittel | ollama stoppen (294 MB RAM) | `sudo systemctl disable --now ollama` |
| Mittel | lxd/docker stoppen (530 MB RAM) | `sudo systemctl disable --now lxd docker` |
| Mittel | CPU-Governor auf powersave | `sudo cpupower frequency-set -g powersave` |
| Niedrig | Boot beschleunigen | `sudo systemctl disable NetworkManager-wait-online` |
| Niedrig | Journal-Größe limitieren (3,9 GB → 500 MB) | `sudo nano /etc/systemd/journald.conf` → `SystemMaxUse=500M` |
---
## 5. Verwaiste Pakete aufräumen
```bash
sudo pacman -Rns $(pacman -Qtdq) # 9 verwaiste Pakete
```
---
## Wie diesen Chat wieder aufrufen
In einer neuen Hermes-Agent-Session einfach eingeben:
```
@session:default/20260907_182659_6403f3
```
Dann lädt der Agent den kompletten Chatverlauf aus der Datenbank.
---
## Dateien, die geändert wurden
| Datei | Zweck |
|---|---|
| `~/.config/sway/config.d/10-autostart-fix.conf` | Korrigierte Autostarts (exec statt systemd) |
| `/usr/lib/python3.14/site-packages/flashfocus/config.py` | Marshmallow-4.x-Patch (sudo nötig) |
| `/home/jonnybravo/Projekte/Python_Skripte/create_selfsign/selfsing.py` | CA + Zertifikats-Script (vorherige Session) |
| `~/scripts/mount-nfs.sh` | Manuelle NFS-Mount-Steuerung (vorherige Session) |
| `~/scripts/mounts.md` | NFS-Mount-Dokumentation (vorherige Session) |
+54
View File
@@ -0,0 +1,54 @@
---
title: "Vergleich: TinyDB vs. SQLite"
date: "2026-09-08"
---
# Vergleich: TinyDB vs. SQLite
Sowohl TinyDB als auch SQLite sind hervorragende "Embedded Databases" (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.
---
### SQLite
**Vorteile (`Pros`):**
* **Sehr robust und bewährt:** Seit Jahrzehnten im Einsatz, extrem zuverlässig (ACID-konform).
* **Standard-SQL:** Bietet eine mächtige, standardisierte Abfragesprache, die von vielen Entwicklern beherrscht wird und plattformübergreifend kompatibel ist.
* **Performance:** Sehr gute Leistung für komplexe Abfragen, Joins und große Datensätze.
* **Strikte Schemas:** Erzwingt Datenintegrität durch vordefinierte Tabellenstrukturen und Datentypen.
* **Großes Ökosystem:** Viele Tools, Treiber und Support in fast jeder Programmiersprache verfügbar.
* **Transaktionen:** Robuste Unterstützung für atomare Transaktionen.
**Nachteile (`Cons`):**
* **SQL-Kenntnisse erforderlich:** Entwickler, die kein SQL beherrschen, müssen es lernen.
* **Schema-Bindung:** Änderungen am Datenmodell erfordern oft Schema-Migrationen, die aufwendig sein können. Weniger flexibel für sich schnell ändernde Daten.
* **Binärdateien:** Die Datenbankdateien sind binär und nicht direkt menschenlesbar, was das Debugging erschweren kann.
* **Boilerplate-Code:** Für einfache Operationen kann der SQL-Code im Vergleich zu einer NoSQL-Datenbank länger sein.
* **Keine native Unterstützung für verschachtelte Daten:** Das Speichern von hierarchischen Daten (JSON) erfordert oft JSON-Funktionen in SQL oder separate Tabellen.
---
### TinyDB
**Vorteile (`Pros`):**
* **Rein Pythonisch:** Die API ist zu 100% in Python geschrieben und fühlt sich sehr natürlich an. Keine SQL-Kenntnisse erforderlich.
* **Schema-los (NoSQL):** Speichert Daten als Python-Wörterbücher (ähnlich JSON). Keine Schema-Definitionen im Voraus notwendig, maximale Flexibilität für sich ändernde Datenmodelle.
* **Extrem einfach und schnell zu starten:** Ideal für kleine Projekte, Prototypen und den schnellen Einstieg.
* **Menschenlesbare Daten:** Speichert Daten standardmäßig in JSON (oder YAML/CBOR), die Datenbankdatei ist mit einem Texteditor lesbar.
* **Hervorragend für verschachtelte Daten:** Ideal für das Speichern und Abfragen von Daten mit komplexen, hierarchischen Strukturen direkt als Python-Objekte.
* **Keine Konfiguration:** Einfach importieren und loslegen.
**Nachteile (`Cons`):**
* **Python-spezifisch:** Nicht leicht in anderen Programmiersprachen zu verwenden (im Gegensatz zu SQL).
* **Keine komplexe relationale Abfrage:** Nicht für komplexe Joins oder Aggregationen über mehrere "Tabellen" hinweg konzipiert.
* **Leistung bei großen Datensätzen:** Bei sehr großen Datenmengen kann die Leistung leiden, da TinyDB für einige Operationen die gesamte Datei lesen muss.
* **Weniger strenge ACID-Garantien:** Obwohl es Transaktionen bietet, ist es im Vergleich zu SQLite weniger robust in Bezug auf strikte ACID-Konformität.
* **Kleineres Ökosystem:** Weniger Tools, Treiber und Community-Support als für SQLite.
---
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.
+97
View File
@@ -0,0 +1,97 @@
---
title: "Anleitung: Bestehende `rclone`-Konfiguration auf einen neuen Rechner übertragen"
date: "2026-09-08"
---
# 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.
---
### Worum geht es?
Alle Ihre `rclone`-Einstellungen, einschließlich der Zugangsdaten zu Ihren Cloud-Speichern, sind in einer einzigen Datei namens `rclone.conf` gespeichert. Indem Sie diese Datei auf einen neuen Rechner übertragen, "kennt" `rclone` dort sofort alle Ihre eingerichteten Verbindungen (Remotes).
---
### Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:
1. **Zugriff auf den alten Rechner**, auf dem `rclone` bereits konfiguriert ist.
2. **Das Passwort für Ihr verschlüsseltes `crypt`-Remote.** 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.
3. Einen Weg, eine einzelne Datei zu übertragen (z.B. ein USB-Stick, ein sicheres Netzlaufwerk etc.).
---
### Schritt-für-Schritt-Anleitung
#### Schritt 1: `rclone.conf`-Datei auf dem alten Rechner finden und kopieren
Die Konfigurationsdatei, die Sie benötigen, befindet sich im Home-Verzeichnis Ihres Benutzers.
1. Öffnen Sie ein Terminal auf Ihrem **alten Rechner**.
2. Der Pfad zur Datei lautet: `~/.config/rclone/rclone.conf`.
3. Kopieren Sie diese Datei auf Ihr Übertragungsmedium (z.B. einen USB-Stick).
```bash
# Beispiel für das Kopieren auf einen USB-Stick, der unter /media/MeinStick gemountet ist
cp ~/.config/rclone/rclone.conf /media/MeinStick/
```
#### Schritt 2: `rclone` auf dem neuen Rechner installieren
Falls `rclone` auf dem **neuen Computer** noch nicht installiert ist, müssen Sie dies nachholen.
```bash
# Auf Manjaro/Arch Linux
sudo pacman -S rclone
# Auf Debian/Ubuntu
sudo apt install rclone
```
#### Schritt 3: Konfigurationsdatei auf dem neuen Rechner einfügen
Nun bringen Sie die Konfiguration auf den neuen Rechner.
1. Öffnen Sie ein Terminal auf Ihrem **neuen Rechner**.
2. Stellen Sie sicher, dass das Zielverzeichnis existiert. Der folgende Befehl erstellt es, falls es fehlt:
```bash
mkdir -p ~/.config/rclone/
```
3. Kopieren Sie die `rclone.conf`-Datei von Ihrem Übertragungsmedium in dieses Verzeichnis.
```bash
# Beispiel für das Kopieren von einem USB-Stick
cp /media/MeinStick/rclone.conf ~/.config/rclone/
```
#### Schritt 4: Überprüfung und erster Test auf dem neuen Rechner
Jetzt können Sie überprüfen, ob `rclone` die Konfiguration erfolgreich übernommen hat.
1. **Lassen Sie sich alle erkannten Remotes anzeigen:**
```bash
rclone listremotes
```
Die Ausgabe sollte nun die Namen Ihrer Remotes (z.B. `nextcloud_unverschluesselt:` und `nextcloud_verschluesselt:`) auflisten.
2. **Führen Sie einen Test durch:**
Der beste Test ist, den Inhalt Ihres verschlüsselten Remotes aufzulisten.
```bash
rclone ls nextcloud_verschluesselt:
```
* Möglicherweise fragt `rclone` 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.
* Wenn der Befehl erfolgreich ist und eine Liste Ihrer verschlüsselten Dateien und Ordner anzeigt, war der Umzug erfolgreich!
---
### ⚠️ Wichtiger Warnhinweis zum Passwort
Die `rclone.conf`-Datei speichert Ihr Verschlüsselungspasswort nur in einer verschleierten Form. **Sie ersetzt nicht die Notwendigkeit, dass Sie das Passwort kennen!**
* **Bewahren Sie Ihr Passwort immer an einem sicheren Ort auf** (z.B. in einem Passwort-Manager).
* Ohne das korrekte Passwort sind Ihre verschlüsselten Daten **unwiderruflich verloren**, selbst wenn Sie die `rclone.conf`-Datei haben.
* Betrachten Sie die `rclone.conf`-Datei selbst als sensibel, da sie die Zugangsdaten zu Ihren Cloud-Konten enthält.
+22
View File
@@ -0,0 +1,22 @@
---
title: "Willkommen bei Hugo Docker"
date: "2026-09-08"
---
Das ist eine Beispiel-Seite. **Funktioniert!**
Einfach `.md`-Dateien in den Ordner `content/` kopieren – Hugo rendert sie automatisch.
## So geht's
```bash
# Neue Seite anlegen
echo '---
title: "Meine Seite"
date: "2026-09-08"
---
Inhalt hier ...
' > content/meine-seite.md
```
Änderungen werden dank `--watch` in Echtzeit übernommen.
+148
View File
@@ -0,0 +1,148 @@
---
title: "YubiKey-Einrichtung unter Manjaro Sway"
date: "2026-09-08"
---
# 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:
1. **FIDO2/U2F:** Für die Zwei-Faktor-Authentifizierung auf Webseiten.
2. **GPG:** Zur Verschlüsselung von E-Mails/Dateien und zum Signieren von Git-Commits.
3. **SSH:** Zur sicheren Anmeldung auf Servern.
4. **PAM:** Zur Anmeldung am System oder für `sudo` (fortgeschritten und mit Vorsicht zu genießen).
---
### Schritt 1: Notwendige Pakete installieren
Zuerst müssen Sie die erforderlichen Pakete über den Paketmanager `pacman` installieren. Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus:
```bash
sudo pacman -S yubikey-manager yubikey-personalization libfido2 gnupg pcsclite ccid
```
**Erklärung der Pakete:**
* `yubikey-manager`: Das wichtigste Werkzeug zur Konfiguration Ihres YubiKeys.
* `yubikey-personalization`: Für ältere YubiKey-Modelle oder spezielle Konfigurationen (obwohl `yubikey-manager` oft bevorzugt wird).
* `libfido2`: Stellt die FIDO2-Unterstützung für WebAuthn in Browsern sicher.
* `gnupg`: Das GnuPG-Programm, notwendig für die Smartcard-Funktionen des YubiKeys.
* `pcsclite` & `ccid`: Systemdienste, die die Kommunikation mit dem YubiKey als Smartcard ermöglichen.
Nach der Installation ist es eine gute Idee, den `pcscd`-Dienst zu aktivieren und zu starten:
```bash
sudo systemctl enable pcscd.service
sudo systemctl start pcscd.service
```
### Schritt 2: YubiKey erkennen und Status prüfen
Stecken Sie Ihren YubiKey ein und überprüfen Sie, ob das System ihn erkennt:
```bash
ykman info
```
Wenn alles korrekt ist, sollten Sie hier Informationen zu Ihrem YubiKey-Modell und dessen Firmware-Version sehen.
---
### Anwendungsfälle:
#### Anwendungsfall A: Web-Authentifizierung (FIDO2/U2F)
Dies ist der einfachste Fall und erfordert in der Regel keine zusätzliche Konfiguration nach der Installation von `libfido2`.
1. **Voraussetzung:** Ein unterstützter Webbrowser (Firefox, Chrome, Brave, Edge, etc.).
2. **Registrierung:** Gehen Sie zu einer Webseite, die WebAuthn oder FIDO2 unterstützt (z.B. GitHub, Google, GitLab). Navigieren Sie zu den Sicherheitseinstellungen der Webseite.
3. **YubiKey hinzufügen:** Registrieren Sie Ihren YubiKey als neuen Sicherheitsschlüssel. Der Browser sollte Sie auffordern, den YubiKey zu berühren.
Das war's schon! Sie können den YubiKey nun für die Zwei-Faktor-Authentifizierung (2FA) auf diesen Seiten verwenden.
#### Anwendungsfall B: GPG für Verschlüsselung und Signaturen
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.
1. **GPG-Status prüfen:** Stecken Sie den YubiKey ein und führen Sie aus:
```bash
gpg --card-status
```
Wenn GPG den YubiKey als "Card" erkennt, sind Sie bereit für die weitere Konfiguration.
2. **Schlüssel generieren oder importieren:**
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:
[Yubico Docs: Using Your YubiKey with GPG](https://developers.yubico.com/PGP/)
(Stellen Sie sicher, dass Sie eine aktuelle Anleitung verwenden, die zu Ihrer YubiKey-Firmware passt.)
#### Anwendungsfall C: SSH-Authentifizierung
Sie können den YubiKey auch für die SSH-Authentifizierung verwenden, um sich sicher auf Servern anzumelden.
**Möglichkeit 1: SSH-Authentifizierung über GPG**
Wenn Sie bereits GPG (Anwendungsfall B) eingerichtet haben, können Sie den Authentifizierungs-Unterschlüssel Ihres GPG-Schlüssels für SSH verwenden.
1. Fügen Sie `enable-ssh-support` zu Ihrer `~/.gnupg/gpg-agent.conf` hinzu.
2. Folgen Sie einer Anleitung, um den GPG-Agent als SSH-Agent zu konfigurieren, z.B. für Arch Linux (Manjaro basiert darauf):
[ArchWiki: GnuPG - SSH agent](https://wiki.archlinux.org/title/GnuPG#SSH_agent)
**Möglichkeit 2: Direkte FIDO-basierte SSH-Schlüssel (neuere YubiKeys)**
Neuere YubiKeys (ab Firmware 5.2.7) können direkt als FIDO-Gerät für SSH-Schlüssel vom Typ `ecdsa-sk` oder `ed25519-sk` verwendet werden. Dies erfordert OpenSSH ab Version 8.2.
1. **Schlüssel generieren:**
```bash
ssh-keygen -t ed25519-sk -C "mein-yubikey-ssh-schluessel"
```
`ssh-keygen` wird Sie auffordern, Ihren YubiKey zu berühren, um den Schlüssel zu erstellen.
2. **Öffentlichen Schlüssel verwenden:**
Den generierten öffentlichen Schlüssel (z.B. `~/.ssh/id_ed25519_sk.pub`) können Sie wie gewohnt auf Ihre Server in die `~/.ssh/authorized_keys`-Datei kopieren. Bei der SSH-Anmeldung wird Ihre SSH-Anwendung Sie dann auffordern, den YubiKey zu berühren.
#### Anwendungsfall D: System-Login und Sudo (PAM) - **Für Fortgeschrittene und mit äußerster Vorsicht!**
Sie können den YubiKey auch verwenden, um sich am System anzumelden oder `sudo`-Befehle zu autorisieren. Eine Fehlkonfiguration hier kann Sie von Ihrem System ausschließen.
**⚠️ WARNUNG:**
* **Lassen Sie IMMER ein zweites Terminal mit einer aktiven Root-Shell (`sudo -i`) offen**, während Sie die PAM-Konfiguration ändern. So können Sie Fehler sofort korrigieren.
* Erstellen Sie vor Änderungen an PAM-Dateien **immer Backups** der Originaldateien (z.B. `sudo cp /etc/pam.d/sudo /etc/pam.d/sudo.bak`).
1. **PAM-Modul installieren:**
```bash
sudo pacman -S pam-u2f
```
2. **Konfigurationsdatei für den YubiKey erstellen:**
Diese Datei ordnet Ihren YubiKey Ihrem Benutzerkonto zu.
```bash
mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys
```
**Wichtig:** Stecken Sie Ihren YubiKey ein und berühren Sie ihn, wenn die LED während der Ausführung von `pamu2fcfg` blinkt.
3. **PAM-Datei bearbeiten (Beispiel für `sudo`):**
Öffnen Sie die `sudo`-PAM-Konfiguration zum Bearbeiten:
```bash
sudo nano /etc/pam.d/sudo
```
Fügen Sie die folgende Zeile **GANZ OBEN** in die Datei ein:
```
auth sufficient pam_u2f.so authfile=/home/DEIN_BENUTZER/.config/Yubico/u2f_keys
```
* Ersetzen Sie `DEIN_BENUTZER` durch Ihren tatsächlichen Linux-Benutzernamen (z.B. `jonnybravo`).
* `auth sufficient`: Bedeutet, dass eine erfolgreiche Authentifizierung mit dem YubiKey **ausreicht**. 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 `required` verwenden, MUSS der YubiKey funktionieren.
4. **Testen:**
Öffnen Sie ein *neues* Terminal (NICHT das, in dem Ihre Root-Shell läuft) und testen Sie den `sudo`-Befehl (z.B. `sudo ls`). Sie sollten aufgefordert werden, Ihren YubiKey zu berühren. Berühren Sie ihn und prüfen Sie, ob `sudo` funktioniert. Funktioniert es nicht, nutzen Sie das Root-Terminal, um die Änderungen rückgängig zu machen.
**Weitere PAM-Anwendungen:**
Ähnliche Einträge können Sie auch für den Login-Manager (z.B. `sddm`, `gdm`, `lightdm`) oder den Screensaver (z.B. `swaylock`) in deren entsprechenden PAM-Dateien (`/etc/pam.d/<dienstname>`) hinzufügen. Das genaue Vorgehen kann je nach Dienst variieren.
---
### Wichtige Hinweise:
* **PINs und PUKs:** Merken Sie sich die PINs und PUKs Ihres YubiKeys. Sie sind für viele Funktionen unerlässlich.
* **Backups:** Erstellen Sie immer Backups Ihrer GPG-Schlüssel, bevor Sie diese auf den YubiKey verschieben.
* **Vorsicht bei PAM:** 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).
* **Firmware:** Stellen Sie sicher, dass die Firmware Ihres YubiKeys aktuell ist (`ykman firmware info`).
* **Dokumentation:** Die Yubico-Dokumentation ist exzellent und sollte bei spezifischen Problemen oder fortgeschrittenen Konfigurationen konsultiert werden.
+32
View File
@@ -0,0 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIBATANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDc1NDA2WhcNMzYwOTA1
MDc1NDA2WjBWMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCk15IFJvb3QgQ0Ew
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv/6/A8xXnuXX6/qiA0q/f
THju1i+hROxZMtRFRDweBrgRUGthZlV1bphCxMqI0waDdLzk4IcsKtoZ1TULArlF
KyJ+ERXQMmz9ZZ/JB2vMvMl+xmt56A7HBD9K0ByTX2CeRllrdMwUU+2+DRdY3V9G
6bpxJTkpF1Yj85GLryXZE5SI+/nsMGfYUSEAY7LfZ8eovmuOFuCTS5I9/ku0eR0r
/ZKYcLp3K8b0Dp8WtGZGWuPuoUlt7pNqTY8oyWG4cE6toExHmiv+UawX1hsek0ao
/amHpQovahlowXtWaaLKDXusAJ4oDfLbjVdj8R5k5msdneRIogH+LhjULChts42a
RaMG5GiHTFiNHL/mWpjTNhBQE59ZqerQdIm2PBA5TiAm+TzZkaC+dQ6r2apYliRE
qAOK+yXvyGwhGOFQc9hLBoel5Gfuk8W/SW2Kmz+IoLarbgKI1ULGATLD8Ce+OGZY
EEoX7lV863OXpLQ9RnL/HRv4ql4UYHc5ZXWHnKwCDy9anbSU+AbTnC1Cu9TgLcsn
ZwZOXYbkoe8D65QnzN9wZmkYb1wTlgyyclz8aGbpC0OM3nq0kGUyStdUilGzUShy
lA1EqP5lqp5PWavErSih+9pBQejjKRh5JMVKSY0Xmv8b2eEwmhIt0q21wpMdpTF/
mitwYhuoxajtIw74B+/eowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUOwHDJt6XTYwoxe2aj9nxLRgL9L0wDQYJKoZI
hvcNAQELBQADggIBAB3rtwMYk+UXSJ+d9Nd83ofaCPFjD5pEA+6i37jwt0y5Kb3X
LWNF7Nmb+IsvN92zSYgXf+oXaoCvCfF5/BAqeRIFQDtVMS3z6BC0HpGBg3uHF4bJ
EDRv+TUUg3KauT2IHz33371qhUhZuh2FIgzvtwS350MhlqjdAlpj1SJzEz9O9aNu
XcNXFe3A9Pes8vrvHgkPDqhKmJXf9dwModutrp/XQv5mQtx6lFb2FPprsv4j3nKU
76YaslbLWwZYl8abr0cv6Hi7pgUS+7bB3RmBT9+2yZpBN8lZ864o8Osuovui2OyS
cOVgVf4gYqg2xZO2u/F6dPxjctbmKSUUeonXc6QRI6/7vKO7x6HXWZxY9uv+dL/2
l5jb6OFIzsFCXzwpseJyhW7yEzNE/AlIxeR+qgIhv3QyIV33yUKCA4Ki2E4ta7/X
LJ1IS29u3xDBRzcVKQGkfyDdk7K9KuR8IIz3hZieHRkrzggOK8vxRsLfXTKU1IRM
34Ys4LcPUDVX3Uy4zWwDhBuHRLCdlae2a4Sysot1uK5+846ihln1xqjE8IWuimX/
HqtOktl2MfmVMDwTnGsIWG9iHRe+PimtlVYpt22ucRGt4XULps8hMYw5pvic1ofy
o8DkkOc94h7P0TGA0xUaBxJrscq5EuG7ty1BwhLWNHTYyB9fsSjoBqhvCdIN
-----END CERTIFICATE-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAr/+vwPMV57l1+v6ogNKv30x47tYvoUTsWTLURUQ8Hga4EVBr
YWZVdW6YQsTKiNMGg3S85OCHLCraGdU1CwK5RSsifhEV0DJs/WWfyQdrzLzJfsZr
eegOxwQ/StAck19gnkZZa3TMFFPtvg0XWN1fRum6cSU5KRdWI/ORi68l2ROUiPv5
7DBn2FEhAGOy32fHqL5rjhbgk0uSPf5LtHkdK/2SmHC6dyvG9A6fFrRmRlrj7qFJ
be6Tak2PKMlhuHBOraBMR5or/lGsF9YbHpNGqP2ph6UKL2oZaMF7Vmmiyg17rACe
KA3y241XY/EeZOZrHZ3kSKIB/i4Y1CwobbONmkWjBuRoh0xYjRy/5lqY0zYQUBOf
Wanq0HSJtjwQOU4gJvk82ZGgvnUOq9mqWJYkRKgDivsl78hsIRjhUHPYSwaHpeRn
7pPFv0ltips/iKC2q24CiNVCxgEyw/AnvjhmWBBKF+5VfOtzl6S0PUZy/x0b+Kpe
FGB3OWV1h5ysAg8vWp20lPgG05wtQrvU4C3LJ2cGTl2G5KHvA+uUJ8zfcGZpGG9c
E5YMsnJc/Ghm6QtDjN56tJBlMkrXVIpRs1EocpQNRKj+ZaqeT1mrxK0oofvaQUHo
4ykYeSTFSkmNF5r/G9nhMJoSLdKttcKTHaUxf5orcGIbqMWo7SMO+Afv3qMCAwEA
AQKCAgAAmfVYu394YvXoMO/NPqsPg+Nv5tOTZRxl3WjEK5rMUXfkjQf3IC7Idscd
o7ye/hINrtS3E7mO91svxKI97xy59YDUgOU4Wmgz73boesgtzBavEJsQooVrvTsk
lJR43KtLdkW+umwqjA+J98UmmRYqbUGzj9Tx5LkhzDTiDwhTBUrw68eA53/idBFn
21Lp34SF3Oy2m2rZl8d1wxqiyb0pDtJfzmwjzjhSw/OUqTm0dxALVBgYh5Id8O49
W7eyJ9CIkT2aYF3hHjSpK/f1MxEUW05uftbSrosTkrqR/4Wh8FeFyeL5Wte8cDaX
9OOxMuglISbvmihXeYK9NYhO8eD1YEDX2lnv79DjnTgxNiCPcxR9+m6y2rx+EUad
IVYtLJmiWFsV0O0EzUBEMvBoCAebIZiMJajG9dP1ASYh7ZdUb4diN21re9ZDw+9H
Z3NCuri0UQfVUL8K8XgaIevtnkkrrcku6+QqttRw8x5ZJNEmbFypyzfkwSCUHYL1
WT3TFgRoQWleU/f5GVjYpqfSsy/EFmoXfT6xJ4D95r5G1FJPMhoAGDSyiQHdJzfx
HFX5wxbK1zRKv0IlSqN/YOkbs9er+4W+R1HK68cNup7u1UTQaY5L7mYYlwFoChqK
01jKQOyAPaJ1QJR0dQ0v6H06XlYq0pdzam6LTwNd7ckBh8O0WQKCAQEA9D313cQZ
W58F1QcxsWKUz3lNH/yfmVF6/2AqkQyEkTZ55WVmo7eEsxfIwSMilo5XboJwgJ4/
qIw7WwZ9rKgtKHYdA2cqNxrAG4TvzthjVDvidPbwFBMAQkDBTemIo6UdGX4fZBVZ
TYudlbLB+Eiu4L6ugUnnR+KfifC9IOUdgYl6PLkar3pAl6nXpELcK0sY+nWi2Wf8
YLaJvX6oOJNbcyBUqPPIgfd6Ogk/3V4onvN3UVEmd8oK3oGP58Z/S96enKybCdpp
40NUO+BC09GvHZaXSxMW+T1yfLomE9t0yTjwj1beErZ+5xTNqUeG7+St0vGNSRV6
CCqCbxyHqLn1CwKCAQEAuHiyLU3rhfoBWFPvKubVtNWwy50w9lrP+Z91wEGtX1Sv
kNdQ4GHSHz4zMsNzOr60iRDcg0DuPfHfBABU96rIe+bEeYUXhIVYwF7ZmYkLR+tX
R38qmsyslUvB9KuWcJsqgHLi7Pe/JrcCoJswLWB3Bnlvo29HDAGe5gpRNYelSjXa
vkK2rM0l3OIsmSfuqP5AIpBmKWo3OZ+IIxWK1b3+wstNmvOr4mh8RQwKd6EO+Msd
nuuAANmGbGK0OleyNBw9KtCZrETL0EaGIEb0oYndjR3T+Tec0i+RJ8qSRL117c6+
unfHyMnTrxmOWerm6IKOOj5jQ35BSE/OC7nPc5ULyQKCAQEA87OfT9gLNVBHEXhM
LSKgOSRfwDrhRKn4gDgEQRasb/hbSHkVIOZMkiZ5Ob1FFdSRiMK+XpeIDTVfREQF
wfFMncK80Fhv1uvqI4tRfKKM+c+G9g4vHtiWuYTDXGpY3HAzyOv/hm2G3ckhQ+1J
feOIGtgoZvjGvQNzDMAY9mmmN0plnZFU/yKMsMfXUx8jcE9ObRpTk3oeaKG6bkmi
sFDYPtdTogEdYBD+9EmmX8tD3NYxiAHg0EXY8ot0e1+kRJ+sw8e2Ku60GP9lXRk3
lQL0KCHKdC5oDekyAyH6PHYM4XrfDScwDpvpo8kuLGoiSdtzVbePsgyr5toDq7pb
4g8qYQKCAQAapnU3TlaEWIXxOM8Ip6igI28TO3ZjYONC8OKWD+b4KsfiaPjqMbel
g9rprorrJbn3Q1RYMf05PcQ2U8Xysd2c6M3hsHShVJJp2EofgEj87ucBEUIacw9L
0lIHAvMM+Z2+SNq32WLoOPBMO59OLu2DJfAW8HCXL3TBTyREU4BxpC4h5ol1lX2u
144R4k78Yx7o32ui+BFaZc3JI8eW8YfopG5lwGZIo0ewwfiRJ9d94fo5h1RKyyI8
blYTR7AbDylXEiPhW18Gi+m8qAOXgs9bH8AL9RjW1MBnu0A+ZhCvdnrffYaDX4UR
euOx4dnSJWpex7yXd5n+1Gi0EPgDfrjhAoIBAQCbq3JjpmDgLDpy+3aiOwyoNhRC
A+/+ZCTYd7eGHuvF1UtfzKUguJty3+PEC2mTVafCGTCjQZm0pUxqg2ZMErIuXU7u
EDEzWWirRAU4M3WGoKnaD+E+nLIfYcYkaWkYIKFlPw1HCVD18xxiUiVFDe8Peh5w
OiD2GxK8/BvlkYid/Kj0uA4EwQRJGaMHsvZwIgscF5X2MtojGOB+U4SCHXMoNr1C
heCBboIPamBcEEChe48PxDIgG2i/fr8T854Oq9y5JeSRFeysrqYbOI+DAvAY2A4o
qV15bjCxrbYUwQI3CvGS99cWAwYmNAt1xIQQGmBI4Ap4Ec6JIG/dXkE2Fe/U
-----END RSA PRIVATE KEY-----
+60
View File
@@ -0,0 +1,60 @@
-----BEGIN CERTIFICATE-----
MIIEqzCCApOgAwIBAgIBGjANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAzWhcNMjcwOTA4
MDg0MTAzWjBkMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEjAQBgNVBAMMCWxvY2FsaG9zdDEN
MAsGA1UECwwEaHVnbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOsO
keiI/Pk/gTAb+4YXkTH/UgaI/OgXHsDNSpC4Ax834s09oNfxvWCryWtehRmByRnL
nAwJscZ3tZzZwNvsSqKX23+6TjBzhDjb88DoHX+0RsdaqU6xARje63H+0Lm9PZpr
j40yBTQZcsdxlGRakUivLKEj2CSisaQ6C7WRcPPIcEeplORy0E0/t1jAVE+Yjn/m
btusaoPgCMFKeLKLJEiyJAI6BU/G4s6MfcqEPDIOn9YH2KTtqNaA5/zOwdLd4f5v
t58Fb1KWManK5kD0QtAzfYWl822ACYbqjAPSvaj679JmepE8uda4LWletcUdgKVv
ffxdamSIyCRoXllNyHUCAwEAAaN2MHQwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0OBBYEFF/xS+XzxtxOk1b7d4jhh245iCTnMB8GA1UdIwQYMBaA
FDsBwybel02MKMXtmo/Z8S0YC/S9MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkq
hkiG9w0BAQsFAAOCAgEASdlpsP7s5s/W8VgUlOaXsxpWAfkKQIMmUTqwt6paNt27
TSEYY4J7oYGjZkik95DVP4vIXt6GnHGn91tCj/F5KqEOGzo+Y/ulmsxVTB4VZ00Z
Z+pGXA1M8ctuKpHyrMm77CLVLt1VMzlOiDmR3Ntzhkzhcn4gSH0lrFkqU7UTLarG
OdIm0WXfYYXnP0oA/b0hpqIWvhdn2p/lLjzr2ou2Ldp+21Co/NHDenF68es8X3YD
MMu31+vIc0jQoExxD/f9cTsvODi9W37rQ+CBgHgKkdUmhdh01X92GQ8FCs8UlDax
WoWdu9/l7d/5cIA6lqUWDhX4ERr1KXKMlQoKwckAEp5+fHELs8FMPDccquEa5TNY
36buWru60v/jOT9BhhxO2pwxvdUT4ghuLwf/ZsSZB00hS1VZtmtzW2yyHwGGlp0r
AEtMsqADppxc2QQrfRuZoCkgxcPqYV7rQEZXYYUgjrYnKE+fFbkk1j7iPqbIzzFa
z/KLWl9550DHfUwql2A/2M76jxJols1SjjLLB+qPeVVE+qioi474BBBlqnEdLEcc
Ws7yXowsdvruXYypu7C90JVU8oouagHQtgHScdAl783ZtEo+MZ0lKUK4vxbH5jpM
bi+2bLF8OvrVO3IcSuOdR65tBVuA3o5XQFSYl7TNp6gwRVioTwHbjgv6FuYECGU=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIBATANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDc1NDA2WhcNMzYwOTA1
MDc1NDA2WjBWMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCk15IFJvb3QgQ0Ew
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv/6/A8xXnuXX6/qiA0q/f
THju1i+hROxZMtRFRDweBrgRUGthZlV1bphCxMqI0waDdLzk4IcsKtoZ1TULArlF
KyJ+ERXQMmz9ZZ/JB2vMvMl+xmt56A7HBD9K0ByTX2CeRllrdMwUU+2+DRdY3V9G
6bpxJTkpF1Yj85GLryXZE5SI+/nsMGfYUSEAY7LfZ8eovmuOFuCTS5I9/ku0eR0r
/ZKYcLp3K8b0Dp8WtGZGWuPuoUlt7pNqTY8oyWG4cE6toExHmiv+UawX1hsek0ao
/amHpQovahlowXtWaaLKDXusAJ4oDfLbjVdj8R5k5msdneRIogH+LhjULChts42a
RaMG5GiHTFiNHL/mWpjTNhBQE59ZqerQdIm2PBA5TiAm+TzZkaC+dQ6r2apYliRE
qAOK+yXvyGwhGOFQc9hLBoel5Gfuk8W/SW2Kmz+IoLarbgKI1ULGATLD8Ce+OGZY
EEoX7lV863OXpLQ9RnL/HRv4ql4UYHc5ZXWHnKwCDy9anbSU+AbTnC1Cu9TgLcsn
ZwZOXYbkoe8D65QnzN9wZmkYb1wTlgyyclz8aGbpC0OM3nq0kGUyStdUilGzUShy
lA1EqP5lqp5PWavErSih+9pBQejjKRh5JMVKSY0Xmv8b2eEwmhIt0q21wpMdpTF/
mitwYhuoxajtIw74B+/eowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUOwHDJt6XTYwoxe2aj9nxLRgL9L0wDQYJKoZI
hvcNAQELBQADggIBAB3rtwMYk+UXSJ+d9Nd83ofaCPFjD5pEA+6i37jwt0y5Kb3X
LWNF7Nmb+IsvN92zSYgXf+oXaoCvCfF5/BAqeRIFQDtVMS3z6BC0HpGBg3uHF4bJ
EDRv+TUUg3KauT2IHz33371qhUhZuh2FIgzvtwS350MhlqjdAlpj1SJzEz9O9aNu
XcNXFe3A9Pes8vrvHgkPDqhKmJXf9dwModutrp/XQv5mQtx6lFb2FPprsv4j3nKU
76YaslbLWwZYl8abr0cv6Hi7pgUS+7bB3RmBT9+2yZpBN8lZ864o8Osuovui2OyS
cOVgVf4gYqg2xZO2u/F6dPxjctbmKSUUeonXc6QRI6/7vKO7x6HXWZxY9uv+dL/2
l5jb6OFIzsFCXzwpseJyhW7yEzNE/AlIxeR+qgIhv3QyIV33yUKCA4Ki2E4ta7/X
LJ1IS29u3xDBRzcVKQGkfyDdk7K9KuR8IIz3hZieHRkrzggOK8vxRsLfXTKU1IRM
34Ys4LcPUDVX3Uy4zWwDhBuHRLCdlae2a4Sysot1uK5+846ihln1xqjE8IWuimX/
HqtOktl2MfmVMDwTnGsIWG9iHRe+PimtlVYpt22ucRGt4XULps8hMYw5pvic1ofy
o8DkkOc94h7P0TGA0xUaBxJrscq5EuG7ty1BwhLWNHTYyB9fsSjoBqhvCdIN
-----END CERTIFICATE-----
+28
View File
@@ -0,0 +1,28 @@
-----BEGIN CERTIFICATE-----
MIIEqzCCApOgAwIBAgIBGjANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAzWhcNMjcwOTA4
MDg0MTAzWjBkMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEjAQBgNVBAMMCWxvY2FsaG9zdDEN
MAsGA1UECwwEaHVnbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOsO
keiI/Pk/gTAb+4YXkTH/UgaI/OgXHsDNSpC4Ax834s09oNfxvWCryWtehRmByRnL
nAwJscZ3tZzZwNvsSqKX23+6TjBzhDjb88DoHX+0RsdaqU6xARje63H+0Lm9PZpr
j40yBTQZcsdxlGRakUivLKEj2CSisaQ6C7WRcPPIcEeplORy0E0/t1jAVE+Yjn/m
btusaoPgCMFKeLKLJEiyJAI6BU/G4s6MfcqEPDIOn9YH2KTtqNaA5/zOwdLd4f5v
t58Fb1KWManK5kD0QtAzfYWl822ACYbqjAPSvaj679JmepE8uda4LWletcUdgKVv
ffxdamSIyCRoXllNyHUCAwEAAaN2MHQwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0OBBYEFF/xS+XzxtxOk1b7d4jhh245iCTnMB8GA1UdIwQYMBaA
FDsBwybel02MKMXtmo/Z8S0YC/S9MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkq
hkiG9w0BAQsFAAOCAgEASdlpsP7s5s/W8VgUlOaXsxpWAfkKQIMmUTqwt6paNt27
TSEYY4J7oYGjZkik95DVP4vIXt6GnHGn91tCj/F5KqEOGzo+Y/ulmsxVTB4VZ00Z
Z+pGXA1M8ctuKpHyrMm77CLVLt1VMzlOiDmR3Ntzhkzhcn4gSH0lrFkqU7UTLarG
OdIm0WXfYYXnP0oA/b0hpqIWvhdn2p/lLjzr2ou2Ldp+21Co/NHDenF68es8X3YD
MMu31+vIc0jQoExxD/f9cTsvODi9W37rQ+CBgHgKkdUmhdh01X92GQ8FCs8UlDax
WoWdu9/l7d/5cIA6lqUWDhX4ERr1KXKMlQoKwckAEp5+fHELs8FMPDccquEa5TNY
36buWru60v/jOT9BhhxO2pwxvdUT4ghuLwf/ZsSZB00hS1VZtmtzW2yyHwGGlp0r
AEtMsqADppxc2QQrfRuZoCkgxcPqYV7rQEZXYYUgjrYnKE+fFbkk1j7iPqbIzzFa
z/KLWl9550DHfUwql2A/2M76jxJols1SjjLLB+qPeVVE+qioi474BBBlqnEdLEcc
Ws7yXowsdvruXYypu7C90JVU8oouagHQtgHScdAl783ZtEo+MZ0lKUK4vxbH5jpM
bi+2bLF8OvrVO3IcSuOdR65tBVuA3o5XQFSYl7TNp6gwRVioTwHbjgv6FuYECGU=
-----END CERTIFICATE-----
+28
View File
@@ -0,0 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA6w6R6Ij8+T+BMBv7hheRMf9SBoj86BcewM1KkLgDHzfizT2g
1/G9YKvJa16FGYHJGcucDAmxxne1nNnA2+xKopfbf7pOMHOEONvzwOgdf7RGx1qp
TrEBGN7rcf7Qub09mmuPjTIFNBlyx3GUZFqRSK8soSPYJKKxpDoLtZFw88hwR6mU
5HLQTT+3WMBUT5iOf+Zu26xqg+AIwUp4soskSLIkAjoFT8bizox9yoQ8Mg6f1gfY
pO2o1oDn/M7B0t3h/m+3nwVvUpYxqcrmQPRC0DN9haXzbYAJhuqMA9K9qPrv0mZ6
kTy51rgtaV61xR2ApW99/F1qZIjIJGheWU3IdQIDAQABAoIBAApB/IQVVlTaPJ0I
25UieiegaMf4OnE2cRUg4Fwoa5p1KeSjB93kossRNB0HZu+SBmClzg2IbsWme7p4
lj4Ctc8aqW2Nh9P9dou0rZKBjqgACgaxIipY9x9KuyOiZyFz7LhMcVtMD4YShjvF
7R/kA+sUGfJ+SfRvVSlBjzlBO5in1TWCcsgKMDnli3vQo6eAwcB0LUCQl0uAooJR
ITODNpVXvIIzm9kg5RyyIZKwmnZC99WN3ZLLofupa8ILzJj4latMjL0lvPV340Vx
HaTDN4eyyF0EYoSa5pzfOzz3UeRjhN5bffhUOU3zIW3ViEXOAtOesr/TURVyvUKj
7OGeQBECgYEA9VuTty9IAyMl2LgakHY9ICapQw3hNS5hAvVMhK6z84wda5SKjXBI
GyvRoJSUGRYISY41VPHHRPXnN82rjUIqSG6qkdQqcjmIoRHm84SL6J3VgeNV48sx
4Ipg5F6jm2N/DuAjXKJu6n4Ef36xZkZWA7xDFsgUWq91FUhsw8jp/LcCgYEA9UCd
LgteVe3KnmqSenAOVvetzTbkpFGQYvtJL2R5jccdU6Ur4iU/NLIxh+xYOWjgMm37
DSD1/Bu7Cb4JMI7ON3fw00p0Zm7oQyMiVFAzsaf0tozDZGa+TBhMxyKgvEFrS9U6
fp7Do3iHVnfWp6IFX2fIp8iwGJcEayCe6elDEDMCgYEAr4F9LVjN2yimJtqybcmW
OcxN4SApiyAM1s/elz5cjIcaeFy9qyS4/26duY7uTO98qBjoP0Xfc42ugjVFVHsS
wdMfgcbRQfmzqPukR2b1qURVeF7EjnhHykVRv6mOwFUwitR7lwS98FCKKSTYAr+n
QW7GUqJ2JNRDHSE8Y+PwtAsCgYA2Vye8gQZY8cQ4T5K/ED8NI/ndg3Eru2rLk7QG
jTOlp12nH+zWQbx8d5Mj88kkh0lNwzKiGRCH2LkbkoDEwo+MmMXCezfJTn+mCI3d
spuRnI5LOGs+vskhYSz53oFQ1QnqFofMcG8WtGkATrNAF1Ura3p5Oq1R9XwkJGkx
mN6kIwKBgGDzi1lj/8xP3q6emDvU5oFxmZfClRsrUhTQbyuWFiMSNfFoANdeldm2
0IidjMiiAnrjUlhM1lCO1Jkqk8AYpugsEHQZRcrbT87wAv/YGX0Run0bTBsjwo6d
KgXe+3cwCTM4FwtjYcPe+XMPCIxH/RpXyUAoV6IO6eLIC4vUY/Ni
-----END RSA PRIVATE KEY-----
+61
View File
@@ -0,0 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIEsDCCApigAwIBAgIBFzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAyWhcNMjcwOTA4
MDg0MTAyWjBpMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEjAQBgNVBAMMCWxvY2FsaG9zdDES
MBAGA1UECwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA7B9whIPTcUzOW/sY56gLs+xT/nX1Q3XKKQK1EGT3bNxQP0Iihy3zKkq2Ig0V
eizuqANKqPDuAy4Z9u0Pa/DCfRZXnFY9gyUF1D8+rBkasLteGSToZW7c1fC1GIVd
JH067d6twUydDxuzYCVLrhxiBE95T1gEwqOcHj6VMX/R+9Fz2t2PcdggiEdKymZW
nWmbjmnqVtWqIzfS4elFiosZBd4hI2kEHfCe223Ixnwcfk6XcqmiSMSZXNhjdrEK
uPcGT/wAG6qvjZRqvuk6wVL57X9tssIkGY5VqcJF1+sOdaBOkOSwoW3vSZ4Nvy3c
NFoXtYRGkoct8F11YQFLQJFTdQIDAQABo3YwdDAMBgNVHRMBAf8EAjAAMA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHQ4EFgQUyBVbFN9EiNXKmHv3SrqR4zDYZLUwHwYDVR0j
BBgwFoAUOwHDJt6XTYwoxe2aj9nxLRgL9L0wFAYDVR0RBA0wC4IJbG9jYWxob3N0
MA0GCSqGSIb3DQEBCwUAA4ICAQBQik5F49MxVOFWXJ4LGkpi4LpErC4V7nFgsUKR
DoVfGxjXPp8CC0mKKkWTr/W4YmFDQVJt6yz7UXxGlk+/wCa2edf9gNJM5ayuN6NK
Kd6OOtNSOx+fIB3iFovfdJ/O/yLN7DWn3Qs2eGi7CIS3+ZGU9Cv11j1PowlTpBSo
cYiVFcnWuhAQqjTih2gZXNk9p12oEdCFjaOFwFIhvbaFov5XElRkoy5va7C3E3ws
ILOvBktPtpL9BVf7+BE9IQtQtHrQrlaccb8RMgssYB4Ot9tgTfvd5AHgrzgDlnUP
RrAPJTZ1zQgCusFBRZxoFt5OPGSXCeFItvGmu9JNACjwIU8mo4Mg8Eq7H/AIbZ/4
dMtlCJ3gKJE7s+XTdzOUTjh/2MzRFmGaqgXOE7ZSxehv5cmmDamzWfSDUHG8bs83
QuS+bgcLboLNm0wB52iP5d0tlyX0HxqV+65OZdsWZVSdroFAG4Os+BW82AwlHOgV
v+h4JHFAyr1VOzIzDHA6aemILGO/XPJ2Ud6eRdNrI8gHisMTYNHWUQkL0qqexkPu
DhPPzrvthXgpO55SpB5JKsBIFqj1HBnXIawSG1SL23khO/IOrgTAllDqfi9S3DiI
aigyTiDiidlU5qbyPSs+KYIIWlDGyLRnZi6yqshfDy4JBHRtryMKEf58ceEnX5J9
DW9UPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIBATANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDc1NDA2WhcNMzYwOTA1
MDc1NDA2WjBWMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCk15IFJvb3QgQ0Ew
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv/6/A8xXnuXX6/qiA0q/f
THju1i+hROxZMtRFRDweBrgRUGthZlV1bphCxMqI0waDdLzk4IcsKtoZ1TULArlF
KyJ+ERXQMmz9ZZ/JB2vMvMl+xmt56A7HBD9K0ByTX2CeRllrdMwUU+2+DRdY3V9G
6bpxJTkpF1Yj85GLryXZE5SI+/nsMGfYUSEAY7LfZ8eovmuOFuCTS5I9/ku0eR0r
/ZKYcLp3K8b0Dp8WtGZGWuPuoUlt7pNqTY8oyWG4cE6toExHmiv+UawX1hsek0ao
/amHpQovahlowXtWaaLKDXusAJ4oDfLbjVdj8R5k5msdneRIogH+LhjULChts42a
RaMG5GiHTFiNHL/mWpjTNhBQE59ZqerQdIm2PBA5TiAm+TzZkaC+dQ6r2apYliRE
qAOK+yXvyGwhGOFQc9hLBoel5Gfuk8W/SW2Kmz+IoLarbgKI1ULGATLD8Ce+OGZY
EEoX7lV863OXpLQ9RnL/HRv4ql4UYHc5ZXWHnKwCDy9anbSU+AbTnC1Cu9TgLcsn
ZwZOXYbkoe8D65QnzN9wZmkYb1wTlgyyclz8aGbpC0OM3nq0kGUyStdUilGzUShy
lA1EqP5lqp5PWavErSih+9pBQejjKRh5JMVKSY0Xmv8b2eEwmhIt0q21wpMdpTF/
mitwYhuoxajtIw74B+/eowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUOwHDJt6XTYwoxe2aj9nxLRgL9L0wDQYJKoZI
hvcNAQELBQADggIBAB3rtwMYk+UXSJ+d9Nd83ofaCPFjD5pEA+6i37jwt0y5Kb3X
LWNF7Nmb+IsvN92zSYgXf+oXaoCvCfF5/BAqeRIFQDtVMS3z6BC0HpGBg3uHF4bJ
EDRv+TUUg3KauT2IHz33371qhUhZuh2FIgzvtwS350MhlqjdAlpj1SJzEz9O9aNu
XcNXFe3A9Pes8vrvHgkPDqhKmJXf9dwModutrp/XQv5mQtx6lFb2FPprsv4j3nKU
76YaslbLWwZYl8abr0cv6Hi7pgUS+7bB3RmBT9+2yZpBN8lZ864o8Osuovui2OyS
cOVgVf4gYqg2xZO2u/F6dPxjctbmKSUUeonXc6QRI6/7vKO7x6HXWZxY9uv+dL/2
l5jb6OFIzsFCXzwpseJyhW7yEzNE/AlIxeR+qgIhv3QyIV33yUKCA4Ki2E4ta7/X
LJ1IS29u3xDBRzcVKQGkfyDdk7K9KuR8IIz3hZieHRkrzggOK8vxRsLfXTKU1IRM
34Ys4LcPUDVX3Uy4zWwDhBuHRLCdlae2a4Sysot1uK5+846ihln1xqjE8IWuimX/
HqtOktl2MfmVMDwTnGsIWG9iHRe+PimtlVYpt22ucRGt4XULps8hMYw5pvic1ofy
o8DkkOc94h7P0TGA0xUaBxJrscq5EuG7ty1BwhLWNHTYyB9fsSjoBqhvCdIN
-----END CERTIFICATE-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIEsDCCApigAwIBAgIBFzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAyWhcNMjcwOTA4
MDg0MTAyWjBpMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEjAQBgNVBAMMCWxvY2FsaG9zdDES
MBAGA1UECwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA7B9whIPTcUzOW/sY56gLs+xT/nX1Q3XKKQK1EGT3bNxQP0Iihy3zKkq2Ig0V
eizuqANKqPDuAy4Z9u0Pa/DCfRZXnFY9gyUF1D8+rBkasLteGSToZW7c1fC1GIVd
JH067d6twUydDxuzYCVLrhxiBE95T1gEwqOcHj6VMX/R+9Fz2t2PcdggiEdKymZW
nWmbjmnqVtWqIzfS4elFiosZBd4hI2kEHfCe223Ixnwcfk6XcqmiSMSZXNhjdrEK
uPcGT/wAG6qvjZRqvuk6wVL57X9tssIkGY5VqcJF1+sOdaBOkOSwoW3vSZ4Nvy3c
NFoXtYRGkoct8F11YQFLQJFTdQIDAQABo3YwdDAMBgNVHRMBAf8EAjAAMA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHQ4EFgQUyBVbFN9EiNXKmHv3SrqR4zDYZLUwHwYDVR0j
BBgwFoAUOwHDJt6XTYwoxe2aj9nxLRgL9L0wFAYDVR0RBA0wC4IJbG9jYWxob3N0
MA0GCSqGSIb3DQEBCwUAA4ICAQBQik5F49MxVOFWXJ4LGkpi4LpErC4V7nFgsUKR
DoVfGxjXPp8CC0mKKkWTr/W4YmFDQVJt6yz7UXxGlk+/wCa2edf9gNJM5ayuN6NK
Kd6OOtNSOx+fIB3iFovfdJ/O/yLN7DWn3Qs2eGi7CIS3+ZGU9Cv11j1PowlTpBSo
cYiVFcnWuhAQqjTih2gZXNk9p12oEdCFjaOFwFIhvbaFov5XElRkoy5va7C3E3ws
ILOvBktPtpL9BVf7+BE9IQtQtHrQrlaccb8RMgssYB4Ot9tgTfvd5AHgrzgDlnUP
RrAPJTZ1zQgCusFBRZxoFt5OPGSXCeFItvGmu9JNACjwIU8mo4Mg8Eq7H/AIbZ/4
dMtlCJ3gKJE7s+XTdzOUTjh/2MzRFmGaqgXOE7ZSxehv5cmmDamzWfSDUHG8bs83
QuS+bgcLboLNm0wB52iP5d0tlyX0HxqV+65OZdsWZVSdroFAG4Os+BW82AwlHOgV
v+h4JHFAyr1VOzIzDHA6aemILGO/XPJ2Ud6eRdNrI8gHisMTYNHWUQkL0qqexkPu
DhPPzrvthXgpO55SpB5JKsBIFqj1HBnXIawSG1SL23khO/IOrgTAllDqfi9S3DiI
aigyTiDiidlU5qbyPSs+KYIIWlDGyLRnZi6yqshfDy4JBHRtryMKEf58ceEnX5J9
DW9UPA==
-----END CERTIFICATE-----
+28
View File
@@ -0,0 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA7B9whIPTcUzOW/sY56gLs+xT/nX1Q3XKKQK1EGT3bNxQP0Ii
hy3zKkq2Ig0VeizuqANKqPDuAy4Z9u0Pa/DCfRZXnFY9gyUF1D8+rBkasLteGSTo
ZW7c1fC1GIVdJH067d6twUydDxuzYCVLrhxiBE95T1gEwqOcHj6VMX/R+9Fz2t2P
cdggiEdKymZWnWmbjmnqVtWqIzfS4elFiosZBd4hI2kEHfCe223Ixnwcfk6Xcqmi
SMSZXNhjdrEKuPcGT/wAG6qvjZRqvuk6wVL57X9tssIkGY5VqcJF1+sOdaBOkOSw
oW3vSZ4Nvy3cNFoXtYRGkoct8F11YQFLQJFTdQIDAQABAoIBAASJnHcuHwRXSkOU
vqIHBfCMywFsbAyXk81iyVl5uJKC5QI43Q0qz3iMK9YELoSPnqd5EWMlPCGwrgbj
f9oea+e3o/KJFWYIMlrlkJNXPn7PyaC4kkRkE2zYvcDX9pYCrRJQpuynHQE4Z6Oi
RoMfoFeTsmcEBUAQoP7+ILkCizsS/iRAM66lJyK/NOfVr4Au1F/BgGYeRMfIHeMT
SzqwHDmatk+tqms+HnmXO6EhNMXlCPFtGXyU1RY6CWeGv71iahbcjKOpO2+JJxYd
0oSz3O4ruvxFB6y1dtBL09UEohAOyLxFHuM9RZfcbK7yURSzVak6B8HhP0VJ1XYI
GaKueKECgYEA/1W2xgYStemiY+3kRGQZkvn7XXgFp4fWt2Y62klpiCR/dWAmG4Uc
nP2JcjiRw31WSjJ050QrQETOW2K2bcEoceJl/f4VRy/wy2E3vzJTG972EondMArE
QGulnX0zEoWtqSZP557hKJ9DKUPqsvgqv+phh054v2mrhkfCbVlb1pUCgYEA7Lzp
ry36JDlyyDF5CtB6N5XURZEC4cB61l3ZR9aq+fGPM5o0rUuHCvRLP7tCxbtoB+kD
EOVmciJ/1T9/g4Pt7CIceGi3sIoaaINvZJWLjcI+hX2NeXSDnKa/7JDC6QubSFvs
nbVTgVc7QhzpaZDuaOgLskIKKpfiRzWFd/3IsWECgYEAxvmFoBVVeVtix9q3mrAi
2c1im/kO9vm9UlghHsA8s/I1PUO7DpERtilBdbgtpxjCKLnfLeWKit/Tq5VmMmtm
2DCkaGUbMcljLSpKZf2SlFKQkevLaUfKnaUFf4/0P8fah8kqVYYTUjOiA8NAX01T
CxFcBTQalpeDKfY7xjjvf20CgYEAw3bLP0+n7Abe5borZalyb7iu1m1/wqOpCJve
TflJnCs9gG6/NaJZssq34rwbyqUMpRNX67hs2KnxgEH4Z78jT8duWGCl4gZ0/Xwg
Gh17ZyVNd+yNRg3UqR/o8UspEz/5C0qS2Dgh5XX/wHucoQQARO/q0FjEihxzwTXI
qKUK8qECgYA4qwx5WZfI4FzinxfLgohQCDuusCj0BwWJZ3wAWGskPeMIz71/3U6C
xWnRAQyO28I5rPfGwHAPZy3W6tjLFOrqA1HtR530dM2nQvQtklVaOepdTNcty2j+
KtA/IE48kOJiTInsVAsZ/d5vaXKHcNui1K+/ieyZiJNIFmudQv3L5g==
-----END RSA PRIVATE KEY-----
+61
View File
@@ -0,0 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIEszCCApugAwIBAgIBGDANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAyWhcNMjcwOTA4
MDg0MTAyWjBrMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCm1hbi1kYW4tMDUx
EzARBgNVBAsMCm1hbi1kYW4tMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDB1K7CYSa7Us4pomvMs0PIJUX0unGzC+KinsnLGMO1fpb8VEOprQ+HY61f
87hpIGD4VjX72ELuHBDCB5qi9q5emUZJnRzxPw9OGS6q1wKwI07yOMN1L++mBjEs
zHv5koTf5DcGBgSp7AItooXJd2Ct36nPKp0iPyKSXypdIC5A51xAgUVAFs6nAXug
uQIy4G/FXalLY3JHUL7OtGfyrahG7AAM0J0sv54awJUD+PQ4685uRR/NqTkidYgZ
liOn7e1eKFOzgIm8q8b5lTg8UWQovtCRJrN5h63QiXKS/vEzV+SwZG72dUd8aPKG
r640Chp6qr3sEdjdVkN67wOzNpK5AgMBAAGjdzB1MAwGA1UdEwEB/wQCMAAwDgYD
VR0PAQH/BAQDAgWgMB0GA1UdDgQWBBSCGyOvy8BYa4lX4ONYtutUZsZyHzAfBgNV
HSMEGDAWgBQ7AcMm3pdNjCjF7ZqP2fEtGAv0vTAVBgNVHREEDjAMggptYW4tZGFu
LTA1MA0GCSqGSIb3DQEBCwUAA4ICAQAkBtg4r/c3N1Fd3iNboALRZ6zflbFmV5RQ
IKNCdtg2tDkbT8RRHM9WHyRSEyd1Oc67ATLxumN1Zta0ugQSNRNlXLohRENE0QRM
f90vuXyclfL6JZyX5lgR0TDd2Yh2Tb3ZH7qEICswapEyvyUNldmtrqvv+vJfhlHC
Su311mG+fZJzbuyzP0NSimo5pAVhLlLkp224TuBEZpxvxcLCCrbt45dfAd/KQ2Py
/iy2IBy1vsr8FOzpUHYPrQ0wZbE8NVQuhw1dtPVvtcrQBRVhfsMUS5mng2HlkXHw
YJbkTYU+Cv9vp8sNz/53OeBKpeh7znXdQED3QhBkUTq95vJPWtcqt1JPDP6WCgyG
kCg3QhTZ2QSgPcMjupQ6/j8n3wykH0I4iW08aweRyxLgbRIZNG6EMAxdeYVT2AF8
mt6hhxzcSj1nTc0WsE+R9BG4Nvd9UDRG+1aeV3BZ+M33ONTMEUdlzu6gafV6p06k
J9qUzGhWyIhUGcUaFbbVlT7YycyNPOxXCFJUa+bmaEfQCn7SmC/kflUwIzxQt8Gs
6WLf9JLkB6pvy9NK5FCZgbcfeXRyWAzzIVeAFR4mhLa6t2HwPS4Ja3HS5HKnH3Lm
Ger4VnJdF+CHtNXLTLI8W/SibAtNqjj8W55jYJLH+gnnizFYtJ/A8LPkd3wOgUks
mT1rhXUx5A==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIBATANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDc1NDA2WhcNMzYwOTA1
MDc1NDA2WjBWMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCk15IFJvb3QgQ0Ew
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv/6/A8xXnuXX6/qiA0q/f
THju1i+hROxZMtRFRDweBrgRUGthZlV1bphCxMqI0waDdLzk4IcsKtoZ1TULArlF
KyJ+ERXQMmz9ZZ/JB2vMvMl+xmt56A7HBD9K0ByTX2CeRllrdMwUU+2+DRdY3V9G
6bpxJTkpF1Yj85GLryXZE5SI+/nsMGfYUSEAY7LfZ8eovmuOFuCTS5I9/ku0eR0r
/ZKYcLp3K8b0Dp8WtGZGWuPuoUlt7pNqTY8oyWG4cE6toExHmiv+UawX1hsek0ao
/amHpQovahlowXtWaaLKDXusAJ4oDfLbjVdj8R5k5msdneRIogH+LhjULChts42a
RaMG5GiHTFiNHL/mWpjTNhBQE59ZqerQdIm2PBA5TiAm+TzZkaC+dQ6r2apYliRE
qAOK+yXvyGwhGOFQc9hLBoel5Gfuk8W/SW2Kmz+IoLarbgKI1ULGATLD8Ce+OGZY
EEoX7lV863OXpLQ9RnL/HRv4ql4UYHc5ZXWHnKwCDy9anbSU+AbTnC1Cu9TgLcsn
ZwZOXYbkoe8D65QnzN9wZmkYb1wTlgyyclz8aGbpC0OM3nq0kGUyStdUilGzUShy
lA1EqP5lqp5PWavErSih+9pBQejjKRh5JMVKSY0Xmv8b2eEwmhIt0q21wpMdpTF/
mitwYhuoxajtIw74B+/eowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUOwHDJt6XTYwoxe2aj9nxLRgL9L0wDQYJKoZI
hvcNAQELBQADggIBAB3rtwMYk+UXSJ+d9Nd83ofaCPFjD5pEA+6i37jwt0y5Kb3X
LWNF7Nmb+IsvN92zSYgXf+oXaoCvCfF5/BAqeRIFQDtVMS3z6BC0HpGBg3uHF4bJ
EDRv+TUUg3KauT2IHz33371qhUhZuh2FIgzvtwS350MhlqjdAlpj1SJzEz9O9aNu
XcNXFe3A9Pes8vrvHgkPDqhKmJXf9dwModutrp/XQv5mQtx6lFb2FPprsv4j3nKU
76YaslbLWwZYl8abr0cv6Hi7pgUS+7bB3RmBT9+2yZpBN8lZ864o8Osuovui2OyS
cOVgVf4gYqg2xZO2u/F6dPxjctbmKSUUeonXc6QRI6/7vKO7x6HXWZxY9uv+dL/2
l5jb6OFIzsFCXzwpseJyhW7yEzNE/AlIxeR+qgIhv3QyIV33yUKCA4Ki2E4ta7/X
LJ1IS29u3xDBRzcVKQGkfyDdk7K9KuR8IIz3hZieHRkrzggOK8vxRsLfXTKU1IRM
34Ys4LcPUDVX3Uy4zWwDhBuHRLCdlae2a4Sysot1uK5+846ihln1xqjE8IWuimX/
HqtOktl2MfmVMDwTnGsIWG9iHRe+PimtlVYpt22ucRGt4XULps8hMYw5pvic1ofy
o8DkkOc94h7P0TGA0xUaBxJrscq5EuG7ty1BwhLWNHTYyB9fsSjoBqhvCdIN
-----END CERTIFICATE-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIEszCCApugAwIBAgIBGDANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAyWhcNMjcwOTA4
MDg0MTAyWjBrMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCm1hbi1kYW4tMDUx
EzARBgNVBAsMCm1hbi1kYW4tMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDB1K7CYSa7Us4pomvMs0PIJUX0unGzC+KinsnLGMO1fpb8VEOprQ+HY61f
87hpIGD4VjX72ELuHBDCB5qi9q5emUZJnRzxPw9OGS6q1wKwI07yOMN1L++mBjEs
zHv5koTf5DcGBgSp7AItooXJd2Ct36nPKp0iPyKSXypdIC5A51xAgUVAFs6nAXug
uQIy4G/FXalLY3JHUL7OtGfyrahG7AAM0J0sv54awJUD+PQ4685uRR/NqTkidYgZ
liOn7e1eKFOzgIm8q8b5lTg8UWQovtCRJrN5h63QiXKS/vEzV+SwZG72dUd8aPKG
r640Chp6qr3sEdjdVkN67wOzNpK5AgMBAAGjdzB1MAwGA1UdEwEB/wQCMAAwDgYD
VR0PAQH/BAQDAgWgMB0GA1UdDgQWBBSCGyOvy8BYa4lX4ONYtutUZsZyHzAfBgNV
HSMEGDAWgBQ7AcMm3pdNjCjF7ZqP2fEtGAv0vTAVBgNVHREEDjAMggptYW4tZGFu
LTA1MA0GCSqGSIb3DQEBCwUAA4ICAQAkBtg4r/c3N1Fd3iNboALRZ6zflbFmV5RQ
IKNCdtg2tDkbT8RRHM9WHyRSEyd1Oc67ATLxumN1Zta0ugQSNRNlXLohRENE0QRM
f90vuXyclfL6JZyX5lgR0TDd2Yh2Tb3ZH7qEICswapEyvyUNldmtrqvv+vJfhlHC
Su311mG+fZJzbuyzP0NSimo5pAVhLlLkp224TuBEZpxvxcLCCrbt45dfAd/KQ2Py
/iy2IBy1vsr8FOzpUHYPrQ0wZbE8NVQuhw1dtPVvtcrQBRVhfsMUS5mng2HlkXHw
YJbkTYU+Cv9vp8sNz/53OeBKpeh7znXdQED3QhBkUTq95vJPWtcqt1JPDP6WCgyG
kCg3QhTZ2QSgPcMjupQ6/j8n3wykH0I4iW08aweRyxLgbRIZNG6EMAxdeYVT2AF8
mt6hhxzcSj1nTc0WsE+R9BG4Nvd9UDRG+1aeV3BZ+M33ONTMEUdlzu6gafV6p06k
J9qUzGhWyIhUGcUaFbbVlT7YycyNPOxXCFJUa+bmaEfQCn7SmC/kflUwIzxQt8Gs
6WLf9JLkB6pvy9NK5FCZgbcfeXRyWAzzIVeAFR4mhLa6t2HwPS4Ja3HS5HKnH3Lm
Ger4VnJdF+CHtNXLTLI8W/SibAtNqjj8W55jYJLH+gnnizFYtJ/A8LPkd3wOgUks
mT1rhXUx5A==
-----END CERTIFICATE-----
+28
View File
@@ -0,0 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAwdSuwmEmu1LOKaJrzLNDyCVF9Lpxswviop7JyxjDtX6W/FRD
qa0Ph2OtX/O4aSBg+FY1+9hC7hwQwgeaovauXplGSZ0c8T8PThkuqtcCsCNO8jjD
dS/vpgYxLMx7+ZKE3+Q3BgYEqewCLaKFyXdgrd+pzyqdIj8ikl8qXSAuQOdcQIFF
QBbOpwF7oLkCMuBvxV2pS2NyR1C+zrRn8q2oRuwADNCdLL+eGsCVA/j0OOvObkUf
zak5InWIGZYjp+3tXihTs4CJvKvG+ZU4PFFkKL7QkSazeYet0Ilykv7xM1fksGRu
9nVHfGjyhq+uNAoaeqq97BHY3VZDeu8DszaSuQIDAQABAoIBAALP8gqsM+6JGqho
PMHrMm8xmkCdIWfwgtTq8qDVnsZP/EMUOmiYdBaZ68KuA7WTxJBp2M3rAvqXMeeM
ynG1nE1PUkGga9J0wKU4kJCmPrndQ0iYqf5V6BdbtOQyYdSay35/nkxCM1hfTh9J
IcGM77xKF9nDg6Ti716aDqBsBnvG0RK04KkNOp/LfAPy9CGgIVDn4LPojyXXM8Cz
GHS7DGbz0rarUiv0T8aJOszYv3Hb4wg0XzDBEp6SKRdjJwJ+SSk4zieLPRL2M5iV
auGmwJCi8TYPno/N8nqnSqIXNp4Kv3BqOfBG3nnCp1zPU8kdUB/5v8vJKvvFsKJs
CuMp6aECgYEA+UCDImodT03eHl+g1D/T5KybIKYlfP2dyXKz8lXM5oSyhq/59YLw
YAr8yGt8dGlTSXZOSqBCAJRyvslNaQGXbRpVtSv7+JwZPHYJDnFtmO9MoKcdiaTm
UMflFr6OkHH+qo2SytTDyZ9wqylsAKFn1zftbFyQ0I7vajO27vFQzJkCgYEAxxQQ
NcSbDYbPWYDGUC/kEwMrb23yUwFikcW2t412rgmkrqND76QGkuACcDJv1aGruyjJ
h7UW5B0hRCKNEqW4ShTI3AVPBsrRMBQEYcXfh2jT7Ges2m3ztCshie7MD4PVRyZO
1j2K7KX6s84E0l8Vj757jezM6k2/0b5NxXtyqyECgYBuNbpGE0mWcUXPhFUmxHo6
2J9XFl/pHnMQSemLM6kAHJibuV/60MTckr8nF2/WQWQUTX1cvfOxMfJyravOzGda
VJSlISeuy8bU1xQ2EK13PAhT2NDUtdcozNpc7jE3aVBDtYm8qctQcXFuHUimFrhF
j3MpwNw/e5QdD3TJvmYNsQKBgDoEG9E/kZw4jFbeE20s97+erdrUZMlR3wLyZpRJ
cqu3fbmzNMoyuAO3qp495J+SdPSfJ1QYLyqdXqN3mjsz9mgIdJzCI0yscJgdTUWd
H85be18qu5IQdvQrmaOT5v4iglYw0MrYtpLOsCgUQw13zlXMwj8TIoipzdv3JL0H
g9xhAoGAM8/hywrwMNdcfaogKAePDk2FfOb4zhWyjx868DrkSArzNrRbd0aYPUTV
fZh8Usz55VdfDYA/cut6jdMXjRX3yhDU7IXs9SmdeMQwxTuQVv/9aOg84uNaKHKe
KsT4RVBJF5PYhWPlM1LO/DcCcDre2DahA2OqQ+S+dWZex4nGBaU=
-----END RSA PRIVATE KEY-----
+61
View File
@@ -0,0 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIEszCCApugAwIBAgIBGTANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAzWhcNMjcwOTA4
MDg0MTAzWjBrMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCnJhcy1kYW4tMDEx
EzARBgNVBAsMCnJhcy1kYW4tMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDGms8XFZwmnL/7D1yIfvyFIYfmuyGSUCa40tPw9rrVZGBG4VVtmHOBcMY/
U+0/MXuXonAqe/qbabvqsi+zQA4280siadeG/k1Q7UKQADmw7Qu7TbbK4klI5Xuz
/KtZK1ZOQNRS8OdO1EvJroG5J3U64Ri5ODlBA6vjk6OMrQXIOv1o616QGTFzCne6
08KZG2ACdgPKXBn3wiBMo6DSwOwMU31uKbTUqKx+spBHgUMsrfIm3ckGmzC4iJ/3
TBEg2Pr0au9YzAEnwOXY+HV7307hKoJslFvd8Nj7PDZuK/i5Vg1HuWDkwpwYHCfi
kE7ExbQS6UardUpe4F/HnAqAYeqTAgMBAAGjdzB1MAwGA1UdEwEB/wQCMAAwDgYD
VR0PAQH/BAQDAgWgMB0GA1UdDgQWBBQoU+V8cq2PTEFq6QtDDRj7jlvLWjAfBgNV
HSMEGDAWgBQ7AcMm3pdNjCjF7ZqP2fEtGAv0vTAVBgNVHREEDjAMggpyYXMtZGFu
LTAxMA0GCSqGSIb3DQEBCwUAA4ICAQBLjYUBJlpkw+d0/mvZp3xNTS7Rs1Qapsef
W0nKGn5hslXJE3YKBMhCAZ88A7wQ5OiOJjPZIkuRwCNLZ/V8haavfctqvSj7epEU
crgG5VcVn+xFQVn9P5itq4HtZeLdwBphPzF2VUxFvklEp/ZUbSUAIWDP/mlblo/M
iZTTcgGZvaFbwmWuaJol/CMU2zMQYTPhTVBwt9+aHDEpDfVQuaNGQr3Gqyc6SI9Q
EHNc/hHG2jCqeaOK106sao7AFL/crASqTCAUP2XoFx47Mslw6rcblXRTHP4ZgyF6
WqxzOrzX95lkeupMqV3TN/ng2AIzgZLmEO6R8i027c6FdiEoxv9O4A2I9j0kMDb5
yrUUfC3KvXLNrj05baEzgyu4PBLgNS93OC4EqCB4Xct3+dXKdpuirXyRnK9WiVSA
TuRAVS/ScLR/OtyUDI11/BK6KXFd5pN2E4W8yIOU2o4BlCyUQ0Z0C0hQsqx/OSjX
Qm9k7CwW39qbo3Mqyb5iXmPSMnpGzC4c9GZMhUvov3Jx8kDmm1U7MXx6yVYxiFS+
/Qicy/llVkMTjJQ45aPX1FOQZ7lWcCX7B0p8v6VhAC4EdD0CNr+KxYzAKv9Yu2DX
rDHh7vBGXlCjWiIQb5H3uwEgiv1RqAWdI5ouzaiDfysR0ckaqorWw71A9pfOAund
9241vNHa+w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIBATANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDc1NDA2WhcNMzYwOTA1
MDc1NDA2WjBWMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCk15IFJvb3QgQ0Ew
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv/6/A8xXnuXX6/qiA0q/f
THju1i+hROxZMtRFRDweBrgRUGthZlV1bphCxMqI0waDdLzk4IcsKtoZ1TULArlF
KyJ+ERXQMmz9ZZ/JB2vMvMl+xmt56A7HBD9K0ByTX2CeRllrdMwUU+2+DRdY3V9G
6bpxJTkpF1Yj85GLryXZE5SI+/nsMGfYUSEAY7LfZ8eovmuOFuCTS5I9/ku0eR0r
/ZKYcLp3K8b0Dp8WtGZGWuPuoUlt7pNqTY8oyWG4cE6toExHmiv+UawX1hsek0ao
/amHpQovahlowXtWaaLKDXusAJ4oDfLbjVdj8R5k5msdneRIogH+LhjULChts42a
RaMG5GiHTFiNHL/mWpjTNhBQE59ZqerQdIm2PBA5TiAm+TzZkaC+dQ6r2apYliRE
qAOK+yXvyGwhGOFQc9hLBoel5Gfuk8W/SW2Kmz+IoLarbgKI1ULGATLD8Ce+OGZY
EEoX7lV863OXpLQ9RnL/HRv4ql4UYHc5ZXWHnKwCDy9anbSU+AbTnC1Cu9TgLcsn
ZwZOXYbkoe8D65QnzN9wZmkYb1wTlgyyclz8aGbpC0OM3nq0kGUyStdUilGzUShy
lA1EqP5lqp5PWavErSih+9pBQejjKRh5JMVKSY0Xmv8b2eEwmhIt0q21wpMdpTF/
mitwYhuoxajtIw74B+/eowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUOwHDJt6XTYwoxe2aj9nxLRgL9L0wDQYJKoZI
hvcNAQELBQADggIBAB3rtwMYk+UXSJ+d9Nd83ofaCPFjD5pEA+6i37jwt0y5Kb3X
LWNF7Nmb+IsvN92zSYgXf+oXaoCvCfF5/BAqeRIFQDtVMS3z6BC0HpGBg3uHF4bJ
EDRv+TUUg3KauT2IHz33371qhUhZuh2FIgzvtwS350MhlqjdAlpj1SJzEz9O9aNu
XcNXFe3A9Pes8vrvHgkPDqhKmJXf9dwModutrp/XQv5mQtx6lFb2FPprsv4j3nKU
76YaslbLWwZYl8abr0cv6Hi7pgUS+7bB3RmBT9+2yZpBN8lZ864o8Osuovui2OyS
cOVgVf4gYqg2xZO2u/F6dPxjctbmKSUUeonXc6QRI6/7vKO7x6HXWZxY9uv+dL/2
l5jb6OFIzsFCXzwpseJyhW7yEzNE/AlIxeR+qgIhv3QyIV33yUKCA4Ki2E4ta7/X
LJ1IS29u3xDBRzcVKQGkfyDdk7K9KuR8IIz3hZieHRkrzggOK8vxRsLfXTKU1IRM
34Ys4LcPUDVX3Uy4zWwDhBuHRLCdlae2a4Sysot1uK5+846ihln1xqjE8IWuimX/
HqtOktl2MfmVMDwTnGsIWG9iHRe+PimtlVYpt22ucRGt4XULps8hMYw5pvic1ofy
o8DkkOc94h7P0TGA0xUaBxJrscq5EuG7ty1BwhLWNHTYyB9fsSjoBqhvCdIN
-----END CERTIFICATE-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIEszCCApugAwIBAgIBGTANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJERTEQ
MA4GA1UECAwHU2FjaHNlbjEOMAwGA1UECgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNk
ZW4xEzARBgNVBAMMCk15IFJvb3QgQ0EwHhcNMjYwOTA4MDg0MTAzWhcNMjcwOTA4
MDg0MTAzWjBrMQswCQYDVQQGEwJERTEQMA4GA1UECAwHU2FjaHNlbjEOMAwGA1UE
CgwFSWNoQUcxEDAOBgNVBAcMB0RyZXNkZW4xEzARBgNVBAMMCnJhcy1kYW4tMDEx
EzARBgNVBAsMCnJhcy1kYW4tMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDGms8XFZwmnL/7D1yIfvyFIYfmuyGSUCa40tPw9rrVZGBG4VVtmHOBcMY/
U+0/MXuXonAqe/qbabvqsi+zQA4280siadeG/k1Q7UKQADmw7Qu7TbbK4klI5Xuz
/KtZK1ZOQNRS8OdO1EvJroG5J3U64Ri5ODlBA6vjk6OMrQXIOv1o616QGTFzCne6
08KZG2ACdgPKXBn3wiBMo6DSwOwMU31uKbTUqKx+spBHgUMsrfIm3ckGmzC4iJ/3
TBEg2Pr0au9YzAEnwOXY+HV7307hKoJslFvd8Nj7PDZuK/i5Vg1HuWDkwpwYHCfi
kE7ExbQS6UardUpe4F/HnAqAYeqTAgMBAAGjdzB1MAwGA1UdEwEB/wQCMAAwDgYD
VR0PAQH/BAQDAgWgMB0GA1UdDgQWBBQoU+V8cq2PTEFq6QtDDRj7jlvLWjAfBgNV
HSMEGDAWgBQ7AcMm3pdNjCjF7ZqP2fEtGAv0vTAVBgNVHREEDjAMggpyYXMtZGFu
LTAxMA0GCSqGSIb3DQEBCwUAA4ICAQBLjYUBJlpkw+d0/mvZp3xNTS7Rs1Qapsef
W0nKGn5hslXJE3YKBMhCAZ88A7wQ5OiOJjPZIkuRwCNLZ/V8haavfctqvSj7epEU
crgG5VcVn+xFQVn9P5itq4HtZeLdwBphPzF2VUxFvklEp/ZUbSUAIWDP/mlblo/M
iZTTcgGZvaFbwmWuaJol/CMU2zMQYTPhTVBwt9+aHDEpDfVQuaNGQr3Gqyc6SI9Q
EHNc/hHG2jCqeaOK106sao7AFL/crASqTCAUP2XoFx47Mslw6rcblXRTHP4ZgyF6
WqxzOrzX95lkeupMqV3TN/ng2AIzgZLmEO6R8i027c6FdiEoxv9O4A2I9j0kMDb5
yrUUfC3KvXLNrj05baEzgyu4PBLgNS93OC4EqCB4Xct3+dXKdpuirXyRnK9WiVSA
TuRAVS/ScLR/OtyUDI11/BK6KXFd5pN2E4W8yIOU2o4BlCyUQ0Z0C0hQsqx/OSjX
Qm9k7CwW39qbo3Mqyb5iXmPSMnpGzC4c9GZMhUvov3Jx8kDmm1U7MXx6yVYxiFS+
/Qicy/llVkMTjJQ45aPX1FOQZ7lWcCX7B0p8v6VhAC4EdD0CNr+KxYzAKv9Yu2DX
rDHh7vBGXlCjWiIQb5H3uwEgiv1RqAWdI5ouzaiDfysR0ckaqorWw71A9pfOAund
9241vNHa+w==
-----END CERTIFICATE-----
+28
View File
@@ -0,0 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxprPFxWcJpy/+w9ciH78hSGH5rshklAmuNLT8Pa61WRgRuFV
bZhzgXDGP1PtPzF7l6JwKnv6m2m76rIvs0AONvNLImnXhv5NUO1CkAA5sO0Lu022
yuJJSOV7s/yrWStWTkDUUvDnTtRLya6BuSd1OuEYuTg5QQOr45OjjK0FyDr9aOte
kBkxcwp3utPCmRtgAnYDylwZ98IgTKOg0sDsDFN9bim01KisfrKQR4FDLK3yJt3J
BpswuIif90wRINj69GrvWMwBJ8Dl2Ph1e99O4SqCbJRb3fDY+zw2biv4uVYNR7lg
5MKcGBwn4pBOxMW0EulGq3VKXuBfx5wKgGHqkwIDAQABAoIBAEryAnIIoptjjYLV
Qir0GKC4jYtBVKLdAi++x2HoCYsbTMWSpOUtoXDYOMePCTlOmAAZuVAe5uwc01/2
i8+NvY948gJzhHSZpF2EmxiyLRMZ8NJmujMHf3Y1ux+pmpOUqgXvqu/9npv9uvfJ
lYRkYnWsmeLTV6+0DfpcLVyZslPjXGc7to+79yTDseeRpXbPUBYL80CotUTusi4J
o1KVswsGEl3I2O/ssoaPgjzr69TZUYF0hTn/p9nsJpGVrWZfOjdN1o38yvOzL8Mh
eSi58Ixvg7SXwJp2N7muTqXWXKJbHhSddmxcRBxbZP81SuwTDN2rgcfANnynP5Nz
osf3cpkCgYEA7qmV/gNLSKRcm8+S08Kdsry4ThlAkKDVMEgnOM8uQP8DBHo91y8T
gI0xuVf5NiSWt6CsfgDvCWsL6gfKW9yMd0ttXJndWXfjddFgbppsAeUBBVenn2EU
Aqwnd8JNF02W974ixZs2iSezl3HzYFr72ZPle8boURvhrnaqR9gvUg8CgYEA1QhE
pB6D6J0LwoY37UpwZaho+GEkv/z7lWd/sb6Z+EFmu/gZ4W1rfgmZ1xtwu1dEU26U
rhGztiqdAyOPrBhPMxb+fFDx+nuJjjtROG4/tONmofu5iUxGbf0eU6hEq9Bilwvd
e2rPMqOQntJzhkD7z1R02H3oDZKO78+CLjD30z0CgYEAotFjGIXayFYJL+ruejUd
LKD/A5jKqWBv0J6I04LURVc0EcvrgHAHV/37XDyeMcfIYsHkq5mrebtjx2dFMGJI
GeKFW1VE4xKdRPVwWkRTRv+aMLDaFCtAYYpc6qDNwwYV5jH6uuDm1a8WIE2HAcdQ
ZeE1/7l1KFBjKIigJp9fuRUCgYEAjIZyuQxEGUqXOk9NTyM+d2CbNdTm6BpaXtiy
HC7N5DxIJ5BmihSixrZQm9vHBl1vfdXBD/4vXOhJQIvRt0Ul4V62qoy+wmuBdqhc
UGwxbAJhblLdtdrxzpYczjR+cBP7JQY3qLTxTscknA/ZEuOE9+QPW8vaKjHWRgzN
I+k7YUUCgYEA7C55gLO2/OMSSG5y5WoHtJ69ijLZk78ya/7Q/0DwSijL7sWRftVy
Pcfv5XDAurq7KKO8Rdnz43npTS5xd5QG2A+UGopVccGJ0nFbrhSiyha8Y71WqzCb
+t9ZxUsLZ7y+5cwPOq9nTMl5LIMzoknk+PpBkKfYJlLTatRohsFjqyc=
-----END RSA PRIVATE KEY-----
+23
View File
@@ -0,0 +1,23 @@
services:
hugo:
image: hugomods/hugo:latest # Hugo 0.165.0 (2026)
entrypoint: /src/entrypoint.sh
volumes:
- ./site:/src # Hugo-Config, Layouts, Assets, Entrypoint
- ./content:/src/content # HIER .md-Dateien ablegen
restart: unless-stopped
caddy:
image: caddy:2-alpine
ports:
- "5443:5443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./crt:/etc/caddy/certs:ro
- caddy_data:/data
restart: unless-stopped
depends_on:
- hugo
volumes:
caddy_data:
View File
+326
View File
@@ -0,0 +1,326 @@
/* ============================================================
Modern CSS — oklch() + light-dark() + CSS Grid + Container Q
Kein Build-Step. Funktioniert in Chrome 111+, Firefox 120+,
Safari 16.4+ (alles 2023+).
============================================================ */
/* ---- Reset & Base ---- */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
}
html {
color-scheme: light dark;
scroll-behavior: smooth;
}
body {
--bg: light-dark(oklch(0.98 0 0), oklch(0.15 0.005 260));
--text: light-dark(oklch(0.25 0 0), oklch(0.88 0.005 260));
--muted: light-dark(oklch(0.50 0 0), oklch(0.55 0.005 260));
--border: light-dark(oklch(0.85 0 0), oklch(0.28 0.005 260));
--card: light-dark(oklch(1 0 0), oklch(0.20 0.008 260));
--card-h: light-dark(oklch(0.96 0 0), oklch(0.25 0.015 260));
--accent: light-dark(oklch(0.52 0.23 260), oklch(0.70 0.22 260));
--code-bg:light-dark(oklch(0.94 0.01 260), oklch(0.22 0.015 260));
--radius: 8px;
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
font-size: 1rem;
line-height: 1.7;
text-wrap: pretty;
color: var(--text);
background: var(--bg);
min-height: 100dvh;
/* Grid-Layout: header – main – footer */
display: grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: 1fr min(800px, 95%) 1fr;
> * {
grid-column: 2;
}
}
/* ---- Header ---- */
header {
padding: 1.5rem 0;
display: flex;
justify-content: space-between;
align-items: baseline;
flex-wrap: wrap;
gap: 0.5rem;
border-bottom: 1px solid var(--border);
margin-bottom: 2rem;
.logo {
font-size: 1.25rem;
font-weight: 700;
color: var(--accent);
text-decoration: none;
&:hover { text-decoration: underline; }
}
nav a {
color: var(--muted);
font-size: 0.9rem;
text-decoration: none;
&:hover { color: var(--text); }
}
}
/* ---- Footer ---- */
footer {
margin-top: 3rem;
padding: 1.5rem 0;
border-top: 1px solid var(--border);
text-align: center;
font-size: 0.85rem;
color: var(--muted);
a { color: var(--accent); }
}
/* ---- Headings ---- */
h1, h2, h3, h4, h5, h6 {
line-height: 1.3;
color: var(--text);
text-wrap: balance;
}
h1 { font-size: 2rem; margin-bottom: 0.5rem; }
h2 { font-size: 1.5rem; margin: 2rem 0 0.5rem; }
h3 { font-size: 1.2rem; margin: 1.5rem 0 0.4rem; }
.subtitle {
color: var(--muted);
margin-bottom: 2rem;
}
/* ---- Links ---- */
a {
color: var(--accent);
text-underline-offset: 3px;
text-decoration-thickness: 1px;
&:hover { text-decoration-thickness: 2px; }
}
/* ---- Content ---- */
.content {
p, ul, ol, blockquote {
margin-bottom: 1rem;
}
ul, ol { padding-left: 1.5rem; }
li { margin-bottom: 0.25rem; }
blockquote {
border-left: 3px solid var(--accent);
padding: 0.5rem 1rem;
color: var(--muted);
background: var(--card);
border-radius: 0 var(--radius) var(--radius) 0;
p:last-child { margin-bottom: 0; }
}
img { max-width: 100%; height: auto; border-radius: var(--radius); }
hr {
border: none;
border-top: 1px solid var(--border);
margin: 2rem 0;
}
/* Inline code */
:not(pre) > code {
background: var(--code-bg);
padding: 0.15em 0.4em;
border-radius: 4px;
font-size: 0.9em;
}
/* Code blocks */
pre {
background: var(--code-bg);
padding: 1rem 1.25rem;
border-radius: var(--radius);
overflow-x: auto;
margin-bottom: 1.5rem;
border: 1px solid var(--border);
code { font-size: 0.85rem; background: none; padding: 0; }
}
/* Tables */
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 1.5rem;
font-size: 0.9rem;
th, td {
padding: 0.5rem 0.75rem;
border: 1px solid var(--border);
text-align: left;
}
th {
background: var(--card);
font-weight: 600;
}
tr:nth-child(even) { background: var(--card); }
}
}
/* ---- Article Header ---- */
.article-header {
margin-bottom: 1.5rem;
h1 { margin-bottom: 0.25rem; }
time {
color: var(--muted);
font-size: 0.9rem;
}
}
/* ---- TOC ---- */
details.toc {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 0.75rem 1rem;
margin-bottom: 2rem;
font-size: 0.9rem;
summary {
cursor: pointer;
font-weight: 600;
user-select: none;
}
/* Ul im TOC */
nav#TableOfContents > ul {
padding-left: 1rem;
margin-top: 0.5rem;
}
ul {
list-style: none;
padding-left: 1.25rem;
li { margin-bottom: 0.3rem; }
}
a { text-decoration: none; }
}
/* ---- Cards (List Page) ---- */
.post-grid {
container-type: inline-size;
display: grid;
gap: 1.5rem;
}
article.card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.25rem 1.5rem;
transition: background 0.15s, border-color 0.15s;
&:hover {
background: var(--card-h);
border-color: var(--accent);
}
time {
color: var(--muted);
font-size: 0.8rem;
}
h2 {
font-size: 1.15rem;
margin-top: 0.25rem;
a {
color: var(--text);
text-decoration: none;
&:hover { color: var(--accent); }
}
}
p {
color: var(--muted);
font-size: 0.9rem;
margin-top: 0.5rem;
}
}
/* ---- Tags ---- */
.tags {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-top: 0.5rem;
}
.tag {
background: var(--code-bg);
color: var(--muted);
font-size: 0.75rem;
padding: 0.15em 0.6em;
border-radius: 4px;
}
/* ---- Chroma Code Highlighting — Catppuccin Mocha ---- */
/* Light */
:root {
--chroma-bg: oklch(0.22 0.015 260);
--chroma-k: #cba6f7;
--chroma-s: #a6e3a1;
--chroma-c: #6c7086;
--chroma-n: #cdd6f4;
--chroma-o: #89b4fa;
--chroma-m: #f38ba8;
}
/* Dark (same in dark — Mocha is already dark) */
@media (prefers-color-scheme: light) {
:root {
--chroma-bg: oklch(0.94 0.01 260);
--chroma-k: #8839ef;
--chroma-s: #40a02b;
--chroma-c: #9ca0b0;
--chroma-n: #4c4f69;
--chroma-o: #1e66f5;
--chroma-m: #d20f39;
}
}
pre.chroma { background: var(--chroma-bg); }
pre .k, pre .kd, pre .kn { color: var(--chroma-k); } /* keywords */
pre .s, pre .s1, pre .s2 { color: var(--chroma-s); } /* strings */
pre .c, pre .c1, pre .cm { color: var(--chroma-c); font-style: italic; } /* comments */
pre .n, pre .na, pre .nt { color: var(--chroma-n); } /* names */
pre .o, pre .p { color: var(--chroma-o); } /* operators */
pre .m, pre .mi { color: var(--chroma-m); } /* numbers */
/* ---- Responsive ---- */
@media (max-width: 840px) {
body {
grid-template-columns: 1fr;
padding: 0 1rem;
> * { grid-column: 1; }
}
}
+35
View File
@@ -0,0 +1,35 @@
#!/bin/sh
# Auto-Frontmatter für Hugo 0.165+
# Fügt fehlenden --- Titel-Block in .md-Dateien ein.
CONTENT_DIR="/src/content"
for md in "$CONTENT_DIR"/*.md; do
[ -f "$md" ] || continue
first_line=$(head -1 "$md")
if [ "$first_line" != "---" ]; then
title=$(grep -m1 '^# ' "$md" | sed 's/^# //')
[ -z "$title" ] && title=$(basename "$md" .md)
date=$(date -r "$md" +%Y-%m-%d 2>/dev/null || date +%Y-%m-%d)
tmp="${md}.tmp"
{
echo "---"
echo "title: \"$title\""
echo "date: \"$date\""
echo "---"
echo
cat "$md"
} > "$tmp" && mv "$tmp" "$md"
echo "[frontmatter] $title"
fi
done
exec hugo server \
--watch \
--bind=0.0.0.0 \
--port=1313 \
--disableFastRender \
--baseURL=https://localhost:5443/ \
--renderStaticToDisk
+37
View File
@@ -0,0 +1,37 @@
# Hugo 0.165+ — moderne Konfiguration
baseURL = "https://localhost:5443/"
locale = "de"
title = "Hugo Docker CMS"
enableGitInfo = false
disableFastRender = true
# --- Markdown / Goldmark ---
[markup]
[markup.highlight]
style = "catppuccin-mocha"
noClasses = false # Klassen statt Inline-Styles → CSS steuert
lineNos = false
[markup.goldmark]
[markup.goldmark.renderer]
unsafe = true # HTML in Markdown erlauben
# --- Taxonomien ---
[taxonomies]
tag = "tags"
# --- Ausgabe-Formate ---
[outputs]
home = ["HTML", "RSS"]
page = ["HTML"]
# --- Seiten-Parameter ---
[params]
description = "Markdown-Dateien einfach in content/ ablegen."
author = "JonnyBravo"
# Open Graph defaults
images = []
# Sicherstellen, dass Entwürfe im DEV-Modus angezeigt werden
buildDrafts = false
buildFuture = false
buildExpired = false
+12
View File
@@ -0,0 +1,12 @@
<html lang="{{ .Site.Language.Locale }}">
<head>
{{ partial "head.html" . }}
</head>
<body>
{{ partial "header.html" . }}
<main>
{{ block "main" . }}{{ end }}
</main>
{{ partial "footer.html" . }}
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ with .Site.Params.description }}<p class="subtitle">{{ . }}</p>{{ end }}
<div class="post-grid">
{{ range .Pages }}
<article class="card">
<time>{{ .Date.Format "02.01.2006" }}</time>
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
<p>{{ .Summary | plainify | truncate 200 }}</p>
{{ with .Params.tags }}
<div class="tags">
{{ range . }}<span class="tag">{{ . }}</span>{{ end }}
</div>
{{ end }}
</article>
{{ end }}
</div>
{{ end }}
+21
View File
@@ -0,0 +1,21 @@
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ .Site.Title }}</title>
<link>{{ .Permalink }}</link>
<description>{{ .Site.Params.description }}</description>
<generator>Hugo {{ hugo.Version }}</generator>
<language>{{ .Site.Language.Locale }}</language>
<lastBuildDate>{{ now.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>
<atom:link href="{{ "index.xml" | absURL }}" rel="self" type="application/rss+xml"/>
{{ range .Pages }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
<guid>{{ .Permalink }}</guid>
<description>{{ .Summary | plainify | truncate 300 }}</description>
</item>
{{ end }}
</channel>
</rss>
+19
View File
@@ -0,0 +1,19 @@
{{ define "main" }}
<article>
<header class="article-header">
<h1>{{ .Title }}</h1>
{{ with .Date }}<time datetime="{{ .Format "2006-01-02" }}">{{ .Format "02.01.2006" }}</time>{{ end }}
{{ with .Params.tags }}
<div class="tags">
{{ range . }}<span class="tag">{{ . }}</span>{{ end }}
</div>
{{ end }}
</header>
{{ partial "toc.html" . }}
<div class="content">
{{ .Content }}
</div>
</article>
{{ end }}
+3
View File
@@ -0,0 +1,3 @@
<footer>
<p>{{ .Site.Title }} – <a href="{{ "index.xml" | relURL }}">RSS</a></p>
</footer>
+20
View File
@@ -0,0 +1,20 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} – {{ .Site.Title }}{{ end }}</title>
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ with .Summary }}{{ . | plainify | truncate 160 }}{{ else }}{{ .Site.Params.description }}{{ end }}{{ end }}">
<!-- Open Graph -->
<meta property="og:title" content="{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} – {{ .Site.Title }}{{ end }}">
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{ with .Summary }}{{ . | plainify | truncate 160 }}{{ else }}{{ .Site.Params.description }}{{ end }}{{ end }}">
<meta property="og:type" content="{{ if .IsHome }}website{{ else }}article{{ end }}">
<meta property="og:url" content="{{ .Permalink }}">
<meta property="og:site_name" content="{{ .Site.Title }}">
<!-- CSS -->
{{ $css := resources.Get "css/main.css" | resources.Minify }}
<link rel="stylesheet" href="{{ $css.RelPermalink }}">
<!-- RSS -->
{{ with .OutputFormats.Get "rss" }}
<link rel="alternate" type="application/rss+xml" title="{{ $.Site.Title }}" href="{{ .RelPermalink }}">
{{ end }}
+8
View File
@@ -0,0 +1,8 @@
<header>
<a href="/" class="logo">{{ .Site.Title }}</a>
{{ if not .IsHome }}
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
{{ end }}
</header>
+4
View File
@@ -0,0 +1,4 @@
<details class="toc" {{ if gt (len .Fragments.Headings) 2 }}open{{ end }}>
<summary>Inhaltsverzeichnis</summary>
{{ .TableOfContents }}
</details>
@@ -0,0 +1,113 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
@@ -0,0 +1,190 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
@@ -0,0 +1,97 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
@@ -0,0 +1,271 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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
@@ -0,0 +1 @@
*,*::before,*::after{box-sizing:border-box;margin:0}html{color-scheme:light dark;scroll-behavior:smooth}body{--bg:light-dark(oklch(0.98 0 0), oklch(0.15 0.005 260));--text:light-dark(oklch(0.25 0 0), oklch(0.88 0.005 260));--muted:light-dark(oklch(0.50 0 0), oklch(0.55 0.005 260));--border:light-dark(oklch(0.85 0 0), oklch(0.28 0.005 260));--card:light-dark(oklch(1 0 0), oklch(0.20 0.008 260));--card-h:light-dark(oklch(0.96 0 0), oklch(0.25 0.015 260));--accent:light-dark(oklch(0.52 0.23 260), oklch(0.70 0.22 260));--code-bg:light-dark(oklch(0.94 0.01 260), oklch(0.22 0.015 260));--radius:8px;font-family:system-ui,-apple-system,segoe ui,sans-serif;font-size:1rem;line-height:1.7;text-wrap:pretty;color:var(--text);background:var(--bg);min-height:100dvh;display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr min(800px,95%)1fr;> *{grid-column:2}}header{padding:1.5rem 0;display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:.5rem;border-bottom:1px solid var(--border);margin-bottom:2rem;.logo{font-size:1.25rem;font-weight:700;color:var(--accent);text-decoration:none;&:hover{text-decoration:underline}}nav a{color:var(--muted);font-size:.9rem;text-decoration:none;&:hover{color:var(--text)}}}footer{margin-top:3rem;padding:1.5rem 0;border-top:1px solid var(--border);text-align:center;font-size:.85rem;color:var(--muted);a{color:var(--accent)}}h1,h2,h3,h4,h5,h6{line-height:1.3;color:var(--text);text-wrap:balance}h1{font-size:2rem;margin-bottom:.5rem}h2{font-size:1.5rem;margin:2rem 0 .5rem}h3{font-size:1.2rem;margin:1.5rem 0 .4rem}.subtitle{color:var(--muted);margin-bottom:2rem}a{color:var(--accent);text-underline-offset:3px;text-decoration-thickness:1px;&:hover{text-decoration-thickness:2px}}.content{p, ul, ol, blockquote{margin-bottom:1rem}ul, ol{padding-left:1.5rem}li{margin-bottom:.25rem}blockquote{border-left:3px solid var(--accent);padding:.5rem 1rem;color:var(--muted);background:var(--card);border-radius:0 var(--radius)var(--radius)0;p:last-child{margin-bottom:0}}img{max-width:100%;height:auto;border-radius:var(--radius)}hr{border:none;border-top:1px solid var(--border);margin:2rem 0} :not(pre) > code { background: var(--code-bg); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.9em; } pre { background: var(--code-bg); padding: 1rem 1.25rem; border-radius: var(--radius); overflow-x: auto; margin-bottom: 1.5rem; border: 1px solid var(--border); code { font-size: 0.85rem; background: none; padding: 0; } } table { width: 100%; border-collapse: collapse; margin-bottom: 1.5rem; font-size: 0.9rem; th, td { padding: 0.5rem 0.75rem; border: 1px solid var(--border); text-align: left; } th { background: var(--card); font-weight: 600; } tr:nth-child(even) { background: var(--card); } }}.article-header{margin-bottom:1.5rem;h1{margin-bottom:.25rem}time{color:var(--muted);font-size:.9rem}}details.toc{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:.75rem 1rem;margin-bottom:2rem;font-size:.9rem;summary{cursor:pointer;font-weight:600;user-select:none}nav#TableOfContents > ul{padding-left:1rem;margin-top:.5rem}ul{list-style:none;padding-left:1.25rem;li{margin-bottom:.3rem}}a{text-decoration:none}}.post-grid{container-type:inline-size;display:grid;gap:1.5rem}article.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem 1.5rem;transition:background .15s,border-color .15s;&:hover{background:var(--card-h);border-color:var(--accent)}time{color:var(--muted);font-size:.8rem}h2{font-size:1.15rem;margin-top:.25rem;a{color:var(--text);text-decoration:none;&:hover{color:var(--accent)}}}p{color:var(--muted);font-size:.9rem;margin-top:.5rem}}.tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.5rem}.tag{background:var(--code-bg);color:var(--muted);font-size:.75rem;padding:.15em .6em;border-radius:4px}:root{--chroma-bg:oklch(0.22 0.015 260);--chroma-k:#cba6f7;--chroma-s:#a6e3a1;--chroma-c:#6c7086;--chroma-n:#cdd6f4;--chroma-o:#89b4fa;--chroma-m:#f38ba8}@media(prefers-color-scheme:light){:root{--chroma-bg:oklch(0.94 0.01 260);--chroma-k:#8839ef;--chroma-s:#40a02b;--chroma-c:#9ca0b0;--chroma-n:#4c4f69;--chroma-o:#1e66f5;--chroma-m:#d20f39}}pre.chroma{background:var(--chroma-bg)}pre .k,pre .kd,pre .kn{color:var(--chroma-k)}pre .s,pre .s1,pre .s2{color:var(--chroma-s)}pre .c,pre .c1,pre .cm{color:var(--chroma-c);font-style:italic}pre .n,pre .na,pre .nt{color:var(--chroma-n)}pre .o,pre .p{color:var(--chroma-o)}pre .m,pre .mi{color:var(--chroma-m)}@media(max-width:840px){body{grid-template-columns:1fr;padding:0 1rem;> *{grid-column:1}}}
+152
View File
@@ -0,0 +1,152 @@
<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">
<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>
</header>
<main>
<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
@@ -0,0 +1,141 @@
<?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>Tue, 08 Sep 2026 08:07:00 +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>
+255
View File
@@ -0,0 +1,255 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+669
View File
@@ -0,0 +1,669 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+214
View File
@@ -0,0 +1,214 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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
@@ -0,0 +1,52 @@
<?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>
+78
View File
@@ -0,0 +1,78 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+354
View File
@@ -0,0 +1,354 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+188
View File
@@ -0,0 +1,188 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+47
View File
@@ -0,0 +1,47 @@
<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">
<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>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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
@@ -0,0 +1,13 @@
<?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>Tue, 08 Sep 2026 08:07:00 +0000</lastBuildDate>
<atom:link href="https://localhost:1313/index.xml" rel="self" type="application/rss+xml"/>
</channel>
</rss>
+106
View File
@@ -0,0 +1,106 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+145
View File
@@ -0,0 +1,145 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+74
View File
@@ -0,0 +1,74 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>
+189
View File
@@ -0,0 +1,189 @@
<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">
</head>
<body>
<header>
<a href="/" class="logo">Hugo Docker CMS</a>
<nav aria-label="Breadcrumb">
<a href="/">← Start</a>
</nav>
</header>
<main>
<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>