<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.saya.loseyourip.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Saya</id>
	<title>Home Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.saya.loseyourip.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Saya"/>
	<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php/Spezial:Beitr%C3%A4ge/Saya"/>
	<updated>2026-04-23T09:16:38Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Serverbefehle&amp;diff=248</id>
		<title>Serverbefehle</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Serverbefehle&amp;diff=248"/>
		<updated>2026-02-19T19:11:58Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 4️⃣ Container neu starten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt, wie du den Speicherverbrauch deiner Docker-Ordner (am Beispiel Jellyfin) analysierst und Konflikte mit belegten Ports (z. B. Port 80) löst.&lt;br /&gt;
&lt;br /&gt;
== 📂 Speicherverbrauch analysieren ==&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Gesamten Speicherverbrauch der Ordner sehen ===&lt;br /&gt;
Wechsle zuerst in dein Verzeichnis:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/robin/docker/jellyfin&lt;br /&gt;
du -sh *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;du&#039;&#039;&#039;: Disk Usage&lt;br /&gt;
* &#039;&#039;&#039;-s&#039;&#039;&#039;: nur Summen pro Ordner&lt;br /&gt;
* &#039;&#039;&#039;-h&#039;&#039;&#039;: &amp;quot;human readable&amp;quot; (MB/GB)&lt;br /&gt;
&lt;br /&gt;
Beispiel-Ausgabe:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
config      12G&lt;br /&gt;
cache       18G&lt;br /&gt;
data        15G&lt;br /&gt;
logs        1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Mehr Details (sortiert nach Größe) ===&lt;br /&gt;
Um direkt die größten &amp;quot;Speicherfresser&amp;quot; oben zu sehen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--max-depth=1&#039;&#039;&#039;: zeigt nur die direkte Ebene der Unterordner.&lt;br /&gt;
* &#039;&#039;&#039;sort -hr&#039;&#039;&#039;: sortiert numerisch und in lesbarem Format absteigend.&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Optional: Tiefer in Unterordner eintauchen ===&lt;br /&gt;
Wenn du z. B. nur den Inhalt des Cache-Ordners prüfen willst:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 ./cache | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🔌 Port-Konflikte lösen (z. B. Port 80) ==&lt;br /&gt;
&lt;br /&gt;
Wenn ein Container nicht startet, weil ein Port bereits belegt ist, folge diesen Schritten:&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Prüfen, welcher Prozess den Port nutzt ===&lt;br /&gt;
Führe einen dieser Befehle aus:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo lsof -i :80&lt;br /&gt;
# ODER&lt;br /&gt;
sudo netstat -tulpn | grep :80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du erhältst eine Anzeige des Prozesses (z. B. nginx oder apache), der den Port blockiert.&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Den störenden Prozess stoppen ===&lt;br /&gt;
Falls der Dienst nicht benötigt wird:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop nginx&lt;br /&gt;
# ODER (für Apache)&lt;br /&gt;
sudo systemctl stop apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls ein anderer Docker-Container schuld ist:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
docker ps&lt;br /&gt;
docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Alternativ: Port in Docker ändern ===&lt;br /&gt;
Wenn du beide Dienste parallel nutzen willst, ändere den Host-Port in deiner &amp;lt;nowiki&amp;gt;docker-compose.yml&amp;lt;/nowiki&amp;gt;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
ports:&lt;br /&gt;
  - &amp;quot;8080:80&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Der Container ist dann extern über Port 8080 erreichbar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 4️⃣ Container neu starten ===&lt;br /&gt;
Sobald der Port frei oder geändert ist, starte die Umgebung neu:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rechter vergabe: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo chown -R {{user}}:{{user}} .&lt;br /&gt;
chmod -R u+rwX .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 💡 Hinweis ==&lt;br /&gt;
Die Befehle für den Speicherverbrauch lassen sich auf jedes beliebige Verzeichnis anwenden, nicht nur auf Jellyfin. Es ist ratsam, regelmäßig die &#039;&#039;&#039;logs&#039;&#039;&#039; und den &#039;&#039;&#039;cache&#039;&#039;&#039; zu prüfen, da diese oft unbemerkt anwachsen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Serverbefehle&amp;diff=247</id>
		<title>Serverbefehle</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Serverbefehle&amp;diff=247"/>
		<updated>2026-02-18T18:40:56Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt, wie du den Speicherverbrauch deiner Docker-Ordner (am Beispiel Jellyfin) analysierst und Konflikte mit belegten Ports (z. B. Port 80) löst.&lt;br /&gt;
&lt;br /&gt;
== 📂 Speicherverbrauch analysieren ==&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Gesamten Speicherverbrauch der Ordner sehen ===&lt;br /&gt;
Wechsle zuerst in dein Verzeichnis:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/robin/docker/jellyfin&lt;br /&gt;
du -sh *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;du&#039;&#039;&#039;: Disk Usage&lt;br /&gt;
* &#039;&#039;&#039;-s&#039;&#039;&#039;: nur Summen pro Ordner&lt;br /&gt;
* &#039;&#039;&#039;-h&#039;&#039;&#039;: &amp;quot;human readable&amp;quot; (MB/GB)&lt;br /&gt;
&lt;br /&gt;
Beispiel-Ausgabe:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
config      12G&lt;br /&gt;
cache       18G&lt;br /&gt;
data        15G&lt;br /&gt;
logs        1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Mehr Details (sortiert nach Größe) ===&lt;br /&gt;
Um direkt die größten &amp;quot;Speicherfresser&amp;quot; oben zu sehen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--max-depth=1&#039;&#039;&#039;: zeigt nur die direkte Ebene der Unterordner.&lt;br /&gt;
* &#039;&#039;&#039;sort -hr&#039;&#039;&#039;: sortiert numerisch und in lesbarem Format absteigend.&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Optional: Tiefer in Unterordner eintauchen ===&lt;br /&gt;
Wenn du z. B. nur den Inhalt des Cache-Ordners prüfen willst:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 ./cache | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🔌 Port-Konflikte lösen (z. B. Port 80) ==&lt;br /&gt;
&lt;br /&gt;
Wenn ein Container nicht startet, weil ein Port bereits belegt ist, folge diesen Schritten:&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Prüfen, welcher Prozess den Port nutzt ===&lt;br /&gt;
Führe einen dieser Befehle aus:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo lsof -i :80&lt;br /&gt;
# ODER&lt;br /&gt;
sudo netstat -tulpn | grep :80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du erhältst eine Anzeige des Prozesses (z. B. nginx oder apache), der den Port blockiert.&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Den störenden Prozess stoppen ===&lt;br /&gt;
Falls der Dienst nicht benötigt wird:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop nginx&lt;br /&gt;
# ODER (für Apache)&lt;br /&gt;
sudo systemctl stop apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls ein anderer Docker-Container schuld ist:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
docker ps&lt;br /&gt;
docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Alternativ: Port in Docker ändern ===&lt;br /&gt;
Wenn du beide Dienste parallel nutzen willst, ändere den Host-Port in deiner &amp;lt;nowiki&amp;gt;docker-compose.yml&amp;lt;/nowiki&amp;gt;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
ports:&lt;br /&gt;
  - &amp;quot;8080:80&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Der Container ist dann extern über Port 8080 erreichbar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 4️⃣ Container neu starten ===&lt;br /&gt;
Sobald der Port frei oder geändert ist, starte die Umgebung neu:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rechter vergabe: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo chown -R {{user}}:{{user}} . &amp;amp;&amp;amp; chmod -R u+rwX .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 💡 Hinweis ==&lt;br /&gt;
Die Befehle für den Speicherverbrauch lassen sich auf jedes beliebige Verzeichnis anwenden, nicht nur auf Jellyfin. Es ist ratsam, regelmäßig die &#039;&#039;&#039;logs&#039;&#039;&#039; und den &#039;&#039;&#039;cache&#039;&#039;&#039; zu prüfen, da diese oft unbemerkt anwachsen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Serverbefehle&amp;diff=246</id>
		<title>Serverbefehle</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Serverbefehle&amp;diff=246"/>
		<updated>2026-02-17T22:02:10Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt, wie du den Speicherverbrauch deiner Docker-Ordner (am Beispiel Jellyfin) analysierst und Konflikte mit belegten Ports (z. B. Port 80) löst.&lt;br /&gt;
&lt;br /&gt;
== 📂 Speicherverbrauch analysieren ==&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Gesamten Speicherverbrauch der Ordner sehen ===&lt;br /&gt;
Wechsle zuerst in dein Verzeichnis:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/robin/docker/jellyfin&lt;br /&gt;
du -sh *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;du&#039;&#039;&#039;: Disk Usage&lt;br /&gt;
* &#039;&#039;&#039;-s&#039;&#039;&#039;: nur Summen pro Ordner&lt;br /&gt;
* &#039;&#039;&#039;-h&#039;&#039;&#039;: &amp;quot;human readable&amp;quot; (MB/GB)&lt;br /&gt;
&lt;br /&gt;
Beispiel-Ausgabe:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
config      12G&lt;br /&gt;
cache       18G&lt;br /&gt;
data        15G&lt;br /&gt;
logs        1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Mehr Details (sortiert nach Größe) ===&lt;br /&gt;
Um direkt die größten &amp;quot;Speicherfresser&amp;quot; oben zu sehen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--max-depth=1&#039;&#039;&#039;: zeigt nur die direkte Ebene der Unterordner.&lt;br /&gt;
* &#039;&#039;&#039;sort -hr&#039;&#039;&#039;: sortiert numerisch und in lesbarem Format absteigend.&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Optional: Tiefer in Unterordner eintauchen ===&lt;br /&gt;
Wenn du z. B. nur den Inhalt des Cache-Ordners prüfen willst:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 ./cache | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🔌 Port-Konflikte lösen (z. B. Port 80) ==&lt;br /&gt;
&lt;br /&gt;
Wenn ein Container nicht startet, weil ein Port bereits belegt ist, folge diesen Schritten:&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Prüfen, welcher Prozess den Port nutzt ===&lt;br /&gt;
Führe einen dieser Befehle aus:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo lsof -i :80&lt;br /&gt;
# ODER&lt;br /&gt;
sudo netstat -tulpn | grep :80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du erhältst eine Anzeige des Prozesses (z. B. nginx oder apache), der den Port blockiert.&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Den störenden Prozess stoppen ===&lt;br /&gt;
Falls der Dienst nicht benötigt wird:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop nginx&lt;br /&gt;
# ODER (für Apache)&lt;br /&gt;
sudo systemctl stop apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls ein anderer Docker-Container schuld ist:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
docker ps&lt;br /&gt;
docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Alternativ: Port in Docker ändern ===&lt;br /&gt;
Wenn du beide Dienste parallel nutzen willst, ändere den Host-Port in deiner &amp;lt;nowiki&amp;gt;docker-compose.yml&amp;lt;/nowiki&amp;gt;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
ports:&lt;br /&gt;
  - &amp;quot;8080:80&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Der Container ist dann extern über Port 8080 erreichbar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 4️⃣ Container neu starten ===&lt;br /&gt;
Sobald der Port frei oder geändert ist, starte die Umgebung neu:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 💡 Hinweis ==&lt;br /&gt;
Die Befehle für den Speicherverbrauch lassen sich auf jedes beliebige Verzeichnis anwenden, nicht nur auf Jellyfin. Es ist ratsam, regelmäßig die &#039;&#039;&#039;logs&#039;&#039;&#039; und den &#039;&#039;&#039;cache&#039;&#039;&#039; zu prüfen, da diese oft unbemerkt anwachsen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Speedtest_Tracker&amp;diff=245</id>
		<title>Speedtest Tracker</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Speedtest_Tracker&amp;diff=245"/>
		<updated>2026-02-17T21:53:08Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt, wie du das Test-Intervall für den &#039;&#039;&#039;Speedtest-Tracker&#039;&#039;&#039; anpasst, um automatische Messungen in festen Zeitabständen durchzuführen.&lt;br /&gt;
&lt;br /&gt;
== ⏱️ Test-Intervall anpassen (Cron-Schedule) ==&lt;br /&gt;
&lt;br /&gt;
Der Speedtest-Tracker nutzt standardmäßig einen Cron-Ausdruck, um festzulegen, wann die Messungen stattfinden. Dieser wird in der Umgebungsvariable `SPEEDTEST_SCHEDULE` definiert.&lt;br /&gt;
&lt;br /&gt;
=== Aktuelle Konfiguration prüfen ===&lt;br /&gt;
In deiner aktuellen Konfiguration ist vermutlich folgender Wert gesetzt:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
- SPEEDTEST_SCHEDULE=0 * * * *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Das bedeutet: Ein Test findet **einmal pro Stunde** statt (immer zur Minute 0).&lt;br /&gt;
&lt;br /&gt;
=== Umstellung auf alle 20 Minuten ===&lt;br /&gt;
Wenn du möchtest, dass alle 20 Minuten ein Test durchgeführt wird, musst du den Ausdruck wie folgt ändern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
- SPEEDTEST_SCHEDULE=*/20 * * * *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erklärung des Cron-Ausdrucks: ====&lt;br /&gt;
* &#039;&#039;&#039;*/20&#039;&#039;&#039;: Führt den Befehl alle 20 Minuten aus (0, 20, 40).&lt;br /&gt;
* &#039;&#039;&#039;*&#039;&#039;&#039;: Jede Stunde.&lt;br /&gt;
* &#039;&#039;&#039;*&#039;&#039;&#039;: Jeden Tag.&lt;br /&gt;
* &#039;&#039;&#039;*&#039;&#039;&#039;: Jeden Monat.&lt;br /&gt;
* &#039;&#039;&#039;*&#039;&#039;&#039;: Jeden Wochentag.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== ⚙️ Weitere wichtige Einstellungen ==&lt;br /&gt;
&lt;br /&gt;
Neben dem Zeitplan gibt es noch zwei nützliche Parameter für die Datenpflege:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PRUNE_RESULTS_OLDER_THAN=14&#039;&#039;&#039;: Löscht automatisch alle Testergebnisse, die älter als 14 Tage sind, um die Datenbank klein zu halten.&lt;br /&gt;
* &#039;&#039;&#039;TZ=Europe/Berlin&#039;&#039;&#039;: Stellt sicher, dass die Tests nach unserer lokalen Zeit (MEZ/MESZ) geloggt werden.&lt;br /&gt;
&lt;br /&gt;
== 🔄 Änderungen übernehmen ==&lt;br /&gt;
&lt;br /&gt;
Nachdem du die Änderung in deiner Konfigurationsdatei gespeichert hast, musst du den Container neu starten, damit die neue Variable geladen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 💡 Hinweis ==&lt;br /&gt;
Achte darauf, dass zu viele Tests (z. B. jede Minute) dein Netzwerk unnötig belasten und das Ergebnis anderer Anwendungen beeinflussen können. Ein Intervall von 20 Minuten ist ein guter Kompromiss für eine langfristige Statistik.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_Rollback&amp;diff=244</id>
		<title>Git Rollback</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_Rollback&amp;diff=244"/>
		<updated>2026-02-17T21:50:07Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt, wie du den Speicherverbrauch deiner Docker-Ordner (am Beispiel Jellyfin) analysierst und Konflikte mit belegten Ports (z. B. Port 80) löst.&lt;br /&gt;
&lt;br /&gt;
== 📂 Speicherverbrauch analysieren ==&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Gesamten Speicherverbrauch der Ordner sehen ===&lt;br /&gt;
Wechsle zuerst in dein Verzeichnis:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/robin/docker/jellyfin&lt;br /&gt;
du -sh *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;du&#039;&#039;&#039;: Disk Usage&lt;br /&gt;
* &#039;&#039;&#039;-s&#039;&#039;&#039;: nur Summen pro Ordner&lt;br /&gt;
* &#039;&#039;&#039;-h&#039;&#039;&#039;: &amp;quot;human readable&amp;quot; (MB/GB)&lt;br /&gt;
&lt;br /&gt;
Beispiel-Ausgabe:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
config      12G&lt;br /&gt;
cache       18G&lt;br /&gt;
data        15G&lt;br /&gt;
logs        1G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Mehr Details (sortiert nach Größe) ===&lt;br /&gt;
Um direkt die größten &amp;quot;Speicherfresser&amp;quot; oben zu sehen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--max-depth=1&#039;&#039;&#039;: zeigt nur die direkte Ebene der Unterordner.&lt;br /&gt;
* &#039;&#039;&#039;sort -hr&#039;&#039;&#039;: sortiert numerisch und in lesbarem Format absteigend.&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Optional: Tiefer in Unterordner eintauchen ===&lt;br /&gt;
Wenn du z. B. nur den Inhalt des Cache-Ordners prüfen willst:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
du -h --max-depth=1 ./cache | sort -hr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🔌 Port-Konflikte lösen (z. B. Port 80) ==&lt;br /&gt;
&lt;br /&gt;
Wenn ein Container nicht startet, weil ein Port bereits belegt ist, folge diesen Schritten:&lt;br /&gt;
&lt;br /&gt;
=== 1️⃣ Prüfen, welcher Prozess den Port nutzt ===&lt;br /&gt;
Führe einen dieser Befehle aus:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo lsof -i :80&lt;br /&gt;
# ODER&lt;br /&gt;
sudo netstat -tulpn | grep :80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du erhältst eine Anzeige des Prozesses (z. B. nginx oder apache), der den Port blockiert.&lt;br /&gt;
&lt;br /&gt;
=== 2️⃣ Den störenden Prozess stoppen ===&lt;br /&gt;
Falls der Dienst nicht benötigt wird:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop nginx&lt;br /&gt;
# ODER (für Apache)&lt;br /&gt;
sudo systemctl stop apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls ein anderer Docker-Container schuld ist:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker ps&lt;br /&gt;
docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3️⃣ Alternativ: Port in Docker ändern ===&lt;br /&gt;
Wenn du beide Dienste parallel nutzen willst, ändere den Host-Port in deiner &amp;lt;nowiki&amp;gt;docker-compose.yml&amp;lt;/nowiki&amp;gt;:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
ports:&lt;br /&gt;
  - &amp;quot;8080:80&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Der Container ist dann extern über Port 8080 erreichbar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 4️⃣ Container neu starten ===&lt;br /&gt;
Sobald der Port frei oder geändert ist, starte die Umgebung neu:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 💡 Hinweis ==&lt;br /&gt;
Die Befehle für den Speicherverbrauch lassen sich auf jedes beliebige Verzeichnis anwenden, nicht nur auf Jellyfin. Es ist ratsam, regelmäßig die &#039;&#039;&#039;logs&#039;&#039;&#039; und den &#039;&#039;&#039;cache&#039;&#039;&#039; zu prüfen, da diese oft unbemerkt anwachsen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Gitea&amp;diff=243</id>
		<title>Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Gitea&amp;diff=243"/>
		<updated>2026-02-17T21:47:16Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 🟢 Gitea Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Gitea Übersicht =&lt;br /&gt;
Gitea ist eine leichtgewichtige, selbst gehostete Git-Plattform auf [[Hauptseite|HomeLab]]&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/gitea&lt;br /&gt;
* **Docker-Container:** gitea&lt;br /&gt;
* **Image:** gitea/gitea:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:3000&lt;br /&gt;
* **SSH Port:** 2222&lt;br /&gt;
* **Datenbank:** MariaDB (Container: gitea-db)&lt;br /&gt;
* **Netzwerk:** gateway-net&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || gitea&lt;br /&gt;
|-&lt;br /&gt;
| Image || gitea/gitea:latest&lt;br /&gt;
|-&lt;br /&gt;
| Ports || 0.0.0.0:3000-&amp;gt;3000/tcp, 0.0.0.0:2222-&amp;gt;22/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk || gateway-net&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|-&lt;br /&gt;
| Volume (App Data) || ./gitea:/data&lt;br /&gt;
|-&lt;br /&gt;
| Volume (Config) || ./custom:/etc/gitea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Container Pfade ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Host !! Container&lt;br /&gt;
|-&lt;br /&gt;
| ./gitea || /data&lt;br /&gt;
|-&lt;br /&gt;
| ./custom || /etc/gitea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Datenbank Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| DB Container || gitea-db&lt;br /&gt;
|-&lt;br /&gt;
| Image || mariadb:10.11&lt;br /&gt;
|-&lt;br /&gt;
| Datenbankname || gitea&lt;br /&gt;
|-&lt;br /&gt;
| Benutzer || gitea&lt;br /&gt;
|-&lt;br /&gt;
| Passwort || supersecure-pass&lt;br /&gt;
|-&lt;br /&gt;
| Root-Passwort || rootpassword&lt;br /&gt;
|-&lt;br /&gt;
| Port || 3306&lt;br /&gt;
|-&lt;br /&gt;
| Volumes || ./db:/var/lib/mysql&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
* Docker Logs: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker logs gitea&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Live Logs: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker logs -f gitea&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Pfade ==&lt;br /&gt;
* Projektverzeichnis: /home/robin/docker/gitea&lt;br /&gt;
* App Data im Container: /data&lt;br /&gt;
* WebGUI Zugriff: http://192.168.2.217:3000&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
* Container starten: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker compose up -d&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Container stoppen: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker compose down&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Container Shell: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker exec -it gitea sh&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* ./gitea (enthält alle Repositories und Gitea-Daten)&lt;br /&gt;
* ./custom (enthält Gitea-Konfiguration)&lt;br /&gt;
* ./db (MariaDB-Datenbank)&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Docker&lt;br /&gt;
* Externes Netzwerk: gateway-net&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[Git einrichten]] – Anleitung zur zu Einrichten von Git auf dem Server&lt;br /&gt;
* [[Verbindung Server zu Gitea]] – Git Änderungen vom server nach gitea per skript&lt;br /&gt;
* [[Verbindung Gitea zu Server]] – Git Änderungen vom Gitea zum server per webhook&lt;br /&gt;
* [[Docker Services versionieren]] – Weitere Dateien in einen bestehenden git hinzufügen&lt;br /&gt;
* [[Git Rollback]] – Comitten auf einen früheren Stand&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=242</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=242"/>
		<updated>2026-02-17T21:23:52Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Liste hinzufügen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
==== Welches Remote-Repository wird verwendet? ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Detailinformationen (Tracking, Default-Branch, Push-URL) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Aktuellen Branch anzeigen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Nur die Remote-URL aus der Konfiguration auslesen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=241</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=241"/>
		<updated>2026-02-17T21:21:03Z</updated>

		<summary type="html">&lt;p&gt;Saya: Änderung 235 von Saya (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
==== Welches Remote-Repository wird verwendet? ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Detailinformationen (Tracking, Default-Branch, Push-URL) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Aktuellen Branch anzeigen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Nur die Remote-URL aus der Konfiguration auslesen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=235</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=235"/>
		<updated>2026-02-15T17:03:23Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Jellyfin Übersicht =&lt;br /&gt;
Jellyfin ist ein selbst gehosteter Media-Server für Filme, Serien und Musik auf [[Hauptseite|HomeLab]].&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/jellyfin&lt;br /&gt;
* **Docker-Container:** jellyfin&lt;br /&gt;
* **Image:** lscr.io/linuxserver/jellyfin:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:8096&lt;br /&gt;
* **Netzwerk:** streaming-net&lt;br /&gt;
* **Ports:** 8096 (HTTP), 8920 (HTTPS optional)&lt;br /&gt;
* **App Data:** Container: /config&lt;br /&gt;
* **Medienordner:** /mnt/HA_MEDIA&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || jellyfin&lt;br /&gt;
|-&lt;br /&gt;
| Image || lscr.io/linuxserver/jellyfin:latest&lt;br /&gt;
|-&lt;br /&gt;
| Ports || 0.0.0.0:8096-&amp;gt;8096/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk || streaming-net&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|-&lt;br /&gt;
| Volume (App Data) || ./config:/config&lt;br /&gt;
|-&lt;br /&gt;
| Volume (Cache) || ./cache:/cache&lt;br /&gt;
|-&lt;br /&gt;
| Volume (Medien) || /mnt/HA_MEDIA:/data&lt;br /&gt;
|-&lt;br /&gt;
| Environment || PUID=1000, PGID=1000, TZ=Europe/Berlin, LIBVA_DRIVER_NAME=iHD&lt;br /&gt;
|-&lt;br /&gt;
| Devices || /dev/dri:/dev/dri&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Container Pfade ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Host !! Container&lt;br /&gt;
|-&lt;br /&gt;
| ./config || /config&lt;br /&gt;
|-&lt;br /&gt;
| ./cache || /cache&lt;br /&gt;
|-&lt;br /&gt;
| /mnt/HA_MEDIA || /data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
==== Docker Logs anzeigen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;docker logs jellyfin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Live Logs verfolgen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;docker logs -f jellyfin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Pfade ==&lt;br /&gt;
* Projektverzeichnis: /home/robin/docker/jellyfin&lt;br /&gt;
* App Data im Container: /config&lt;br /&gt;
* Medienverzeichnis: /mnt/HA_MEDIA&lt;br /&gt;
* WebGUI Zugriff: http://192.168.2.217:8096&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;docker compose up -d&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Container stoppen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;docker compose down&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Container Shell öffnen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;docker exec -it jellyfin sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
==== App-Daten sichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;rsync -avh ./config /pfad/zu/backup/config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cache sichern (optional) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;rsync -avh ./cache /pfad/zu/backup/cache&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Medien sichern (optional) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;rsync -avh /mnt/HA_MEDIA /pfad/zu/backup/medien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wiederherstellung ==&lt;br /&gt;
==== App-Daten wiederherstellen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
rsync -avh /pfad/zu/backup/config ./config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cache wiederherstellen (optional) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;rsync -avh /pfad/zu/backup/cache ./cache&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Medien wiederherstellen (optional) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;rsync -avh /pfad/zu/backup/medien /mnt/HA_MEDIA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anleitungen ==&lt;br /&gt;
&lt;br /&gt;
== Best Practices ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Empfohlen !! Nicht empfohlen&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` versionieren || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Cache- und Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` mit echten Passwörtern&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Medien-Dateien, Backups&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Datenbanken (z. B. MariaDB/SQLite)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=231</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=231"/>
		<updated>2026-02-15T16:28:13Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Nur die Remote-URL aus der Konfiguration auslesen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
==== Welches Remote-Repository wird verwendet? ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Detailinformationen (Tracking, Default-Branch, Push-URL) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Aktuellen Branch anzeigen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Nur die Remote-URL aus der Konfiguration auslesen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=230</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=230"/>
		<updated>2026-02-15T16:27:56Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 5. Repository-Informationen &amp;amp; Analyse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
==== Welches Remote-Repository wird verwendet? ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Detailinformationen (Tracking, Default-Branch, Push-URL) ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Aktuellen Branch anzeigen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Nur die Remote-URL aus der Konfiguration auslesen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=229</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=229"/>
		<updated>2026-02-15T16:26:26Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 4. Änderungen zu Gitea übertragen (Push) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=228</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=228"/>
		<updated>2026-02-15T16:26:12Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 3. Status prüfen &amp;amp; Commit erstellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=227</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=227"/>
		<updated>2026-02-15T16:26:02Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 3. Status prüfen &amp;amp; Commit erstellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Prüfung der vorgemerkten Änderungen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Änderungen lokal speichern ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=226</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=226"/>
		<updated>2026-02-15T16:25:09Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 2. Dateien und Ordner zum Repository hinzufügen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Datei hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Liste hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Ganzen Ordner rekursiv hinzufügen ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=225</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=225"/>
		<updated>2026-02-15T16:23:44Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. [[Gitea]]) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=224</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=224"/>
		<updated>2026-02-15T16:23:13Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 1. Vorbereitung: Ignorierte Dateien prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=223</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=223"/>
		<updated>2026-02-15T16:22:08Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 1. Vorbereitung: Ignorierte Dateien prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=222</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=222"/>
		<updated>2026-02-15T16:21:50Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 1. Vorbereitung: Ignorierte Dateien prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Prüfung der Ignorier-Regeln ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=221</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=221"/>
		<updated>2026-02-15T16:21:05Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Wechsel in das Verzeichnis des Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wechsel in das Verzeichnis des Services ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prüfung der Ignorier-Regeln&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=220</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=220"/>
		<updated>2026-02-15T16:20:38Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 1. Vorbereitung: Ignorierte Dateien prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wechsel in das Verzeichnis des Services ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prüfung der Ignorier-Regeln&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=219</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=219"/>
		<updated>2026-02-15T16:20:26Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 1. Vorbereitung: Ignorierte Dateien prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wechsel in das Verzeichnis des Services&lt;br /&gt;
 ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prüfung der Ignorier-Regeln&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=218</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=218"/>
		<updated>2026-02-15T16:20:09Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 1. Vorbereitung: Ignorierte Dateien prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wechsel in das Verzeichnis des Services&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prüfung der Ignorier-Regeln&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=217</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=217"/>
		<updated>2026-02-15T16:19:50Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 5. Repository-Informationen &amp;amp; Analyse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wechsel in das Verzeichnis des Services&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prüfung der Ignorier-Regeln&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welches Remote-Repository wird verwendet?&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote show origin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuellen Branch anzeigen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=215</id>
		<title>Docker Services versionieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Docker_Services_versionieren&amp;diff=215"/>
		<updated>2026-02-15T16:17:38Z</updated>

		<summary type="html">&lt;p&gt;Saya: Die Seite wurde neu angelegt: „Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.  == 1. Vorbereitung: Ignorierte Dateien prüfen == Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.   Wechsel in das Verzeichnis des Services &amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt; cd ~/docker/{{folder}} &amp;lt;/pre&amp;gt; Prüfung der Ignorier-Regeln &amp;lt;pre class=&amp;quot;static-…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Anleitung beschreibt den Workflow, um Konfigurationsdateien von Docker-Services sicher in einem Git-Repository (z. B. Gitea) zu versionieren.&lt;br /&gt;
&lt;br /&gt;
== 1. Vorbereitung: Ignorierte Dateien prüfen ==&lt;br /&gt;
Bevor Dateien hinzugefügt werden, muss sichergestellt werden, dass die `.gitignore` den Upload nicht blockiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wechsel in das Verzeichnis des Services&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{folder}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Prüfung der Ignorier-Regeln&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cat .gitignore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Häufige Blocker in der .gitignore:&#039;&#039;&#039;&lt;br /&gt;
* `config/` (ignoriert den gesamten Ordner)&lt;br /&gt;
* `*.yaml` oder `*.yml` (ignoriert alle Konfigurationsdateien)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Falls eine Datei ignoriert wird, die du dennoch sichern willst, musst du die `.gitignore` anpassen oder den Befehl `git add -f` (force) nutzen.&lt;br /&gt;
&lt;br /&gt;
== 2. Dateien und Ordner zum Repository hinzufügen ==&lt;br /&gt;
Wähle die passende Methode, um deine Konfigurationen für den Commit vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
=== Variante A: Einzelne Dateien oder Ordner ===&lt;br /&gt;
Ideal für gezieltes Hinzufügen von Konfigurationsdateien.&lt;br /&gt;
&lt;br /&gt;
Einzelne Dateien hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Liste hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{pfadZurDatei}}/{{Datei}} {{pfadZurDatei}}/{{Datei2}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ODER: Ganzen Ordner rekursiv hinzufügen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add {{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variante B: Alles im aktuellen Verzeichnis ===&lt;br /&gt;
Um alle Änderungen im Projektordner gleichzeitig zu erfassen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Status prüfen &amp;amp; Commit erstellen ==&lt;br /&gt;
Vor dem Speichern solltest du immer prüfen, was im &amp;quot;Staging&amp;quot;-Bereich gelandet ist, um keine Passwörter versehentlich hochzuladen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prüfung der vorgemerkten Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Änderungen lokal speichern&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;{{Update}}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4. Änderungen zu Gitea übertragen (Push) ==&lt;br /&gt;
Um die lokalen Commits auf den Server hochzuladen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Repository-Informationen &amp;amp; Analyse ==&lt;br /&gt;
Hier findest du nützliche Befehle, um die Verknüpfung zu deinem Gitea-Server zu prüfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
# Welches Remote-Repository wird verwendet?&lt;br /&gt;
git remote -v&lt;br /&gt;
&lt;br /&gt;
# Detailinformationen (Tracking, Default-Branch, Push-URL)&lt;br /&gt;
git remote show origin&lt;br /&gt;
&lt;br /&gt;
# Aktuellen Branch anzeigen&lt;br /&gt;
git branch&lt;br /&gt;
&lt;br /&gt;
# Nur die Remote-URL aus der Konfiguration auslesen&lt;br /&gt;
git config --get remote.origin.url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Best Practices für Docker-Services ==&lt;br /&gt;
&lt;br /&gt;
Um das Repository sauber zu halten, sollten nur relevante Dateien versioniert werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Versionieren (Ja) !! NICHT versionieren (Nein)&lt;br /&gt;
|-&lt;br /&gt;
| `docker-compose.yml` || Logs (`*.log`)&lt;br /&gt;
|-&lt;br /&gt;
| `*.yaml` / `*.yml` Konfigurationen || Datenbank-Verzeichnisse (z.B. `mysql/`, `db/`)&lt;br /&gt;
|-&lt;br /&gt;
| `.env.example` (Templates) || `.env` (mit echten Passwörtern/Secrets!)&lt;br /&gt;
|-&lt;br /&gt;
| Eigene Shell-Scripte (`*.sh`) || Cache-Daten &amp;amp; Laufzeitdaten&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfiles || Media-Dateien, Bilder, Backups&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp zur Einbauposition (Mounting Position):&#039;&#039;&#039; &lt;br /&gt;
Wenn du Volumes in deiner `docker-compose.yml` verschiebst oder Pfade änderst, stelle sicher, dass die neuen Pfade auch von Git erfasst werden. Nutze dazu oben einfach die Variable `{{folder}}`, um die Befehle schnell für andere Container anzupassen.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Dockerbefehle&amp;diff=187</id>
		<title>Dockerbefehle</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Dockerbefehle&amp;diff=187"/>
		<updated>2026-02-15T13:03:55Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Auflisten aller ipv4 und v6 Netzwerke&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker network inspect $(docker network ls -q) \&lt;br /&gt;
  --format &#039;{{.Name}}: {{range .IPAM.Config}}{{.Subnet}} {{with index . &amp;quot;IPv6Subnet&amp;quot;}}{{.}}{{else}}-{{end}}{{end}}&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Dockerbefehle&amp;diff=186</id>
		<title>Dockerbefehle</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Dockerbefehle&amp;diff=186"/>
		<updated>2026-02-15T13:02:39Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Auflisten aller ipv4 und v6 Netzwerke&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker network inspect $(docker network ls -q) \ &lt;br /&gt;
 --format &#039;{{.Name}}: {{range .IPAM.Config}}{{.Subnet}} {{with index . &amp;quot;IPv6Subnet&amp;quot;}}{{.}}{{else}}-{{end}}{{end}}&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Dockerbefehle&amp;diff=185</id>
		<title>Dockerbefehle</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Dockerbefehle&amp;diff=185"/>
		<updated>2026-02-15T13:01:16Z</updated>

		<summary type="html">&lt;p&gt;Saya: Die Seite wurde neu angelegt: „ Auflisten aller ipv4 und v6 Netzwerke docker network inspect $(docker network ls -q) \   --format &amp;#039;{{.Name}}: {{range .IPAM.Config}}{{.Subnet}} {{with index . &amp;quot;IPv6Subnet&amp;quot;}}{{.}}{{else}}-{{end}}{{end}}&amp;#039;“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Auflisten aller ipv4 und v6 Netzwerke&lt;br /&gt;
docker network inspect $(docker network ls -q) \&lt;br /&gt;
  --format &#039;{{.Name}}: {{range .IPAM.Config}}{{.Subnet}} {{with index . &amp;quot;IPv6Subnet&amp;quot;}}{{.}}{{else}}-{{end}}{{end}}&#039;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=184</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=184"/>
		<updated>2026-02-14T18:02:02Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Allgemeine Infos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.10/admin/login (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
*Standard Logs:&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Live-Analyse (DNS-Anfragen):&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Pi-hole Logdatei im Container: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Container Update&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[.lan Netzwerk]] – Interne Kommunikation ohne ports und ip&#039;s.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=183</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=183"/>
		<updated>2026-02-14T18:01:41Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Allgemeine Infos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.10:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
*Standard Logs:&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Live-Analyse (DNS-Anfragen):&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Pi-hole Logdatei im Container: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Container Update&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[.lan Netzwerk]] – Interne Kommunikation ohne ports und ip&#039;s.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=182</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=182"/>
		<updated>2026-02-14T18:00:10Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Probleme &amp;amp; Anleitungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
*Standard Logs:&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Live-Analyse (DNS-Anfragen):&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Pi-hole Logdatei im Container: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Container Update&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[.lan Netzwerk]] – Interne Kommunikation ohne ports und ip&#039;s.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=181</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=181"/>
		<updated>2026-02-14T17:58:51Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Wartung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
*Standard Logs:&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Live-Analyse (DNS-Anfragen):&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Pi-hole Logdatei im Container: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Container Update&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[Automatisches Git-Push-Skript für Docker-Compose]] – Backup der Docker-Konfiguration.&lt;br /&gt;
* [[Git befehle]] – Übersicht für manuelle Backups.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&#039;&#039;Zuletzt geprüft via `docker ps` am: 14.02.2026&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=180</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=180"/>
		<updated>2026-02-14T17:57:52Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Logs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
*Standard Logs:&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Live-Analyse (DNS-Anfragen):&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Pi-hole Logdatei im Container: &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&lt;br /&gt;
# Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&lt;br /&gt;
# Container Update&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[Automatisches Git-Push-Skript für Docker-Compose]] – Backup der Docker-Konfiguration.&lt;br /&gt;
* [[Git befehle]] – Übersicht für manuelle Backups.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&#039;&#039;Zuletzt geprüft via `docker ps` am: 14.02.2026&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=179</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=179"/>
		<updated>2026-02-14T17:57:12Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Logs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
**Standard Logs:**&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Live-Analyse (DNS-Anfragen):**&lt;br /&gt;
 &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pi-hole Logdatei im Container:** &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&lt;br /&gt;
# Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&lt;br /&gt;
# Container Update&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[Automatisches Git-Push-Skript für Docker-Compose]] – Backup der Docker-Konfiguration.&lt;br /&gt;
* [[Git befehle]] – Übersicht für manuelle Backups.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&#039;&#039;Zuletzt geprüft via `docker ps` am: 14.02.2026&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=178</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=178"/>
		<updated>2026-02-14T17:56:34Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 🟢 Pi-hole Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Hauptseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
* **Standard Logs:** &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* **Live-Analyse (DNS-Anfragen):** &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* **Pi-hole Logdatei im Container:** &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&lt;br /&gt;
# Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&lt;br /&gt;
# Container Update&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[Automatisches Git-Push-Skript für Docker-Compose]] – Backup der Docker-Konfiguration.&lt;br /&gt;
* [[Git befehle]] – Übersicht für manuelle Backups.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&#039;&#039;Zuletzt geprüft via `docker ps` am: 14.02.2026&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=177</id>
		<title>Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Pi-hole&amp;diff=177"/>
		<updated>2026-02-14T17:55:57Z</updated>

		<summary type="html">&lt;p&gt;Saya: Die Seite wurde neu angelegt: „= 🟢 Pi-hole Übersicht = Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem HomeLab läuft.  == Allgemeine Infos == * **Server:** HomeServer2 * **Projektpfad:** /home/robin/docker/pihole * **Docker-Container:** pihole * **Image:** pihole/pihole:latest * **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port) * **Netzwerk:** gateway-net / host  == Docker Setup == {| class=&amp;quot;wikitable&amp;quot;…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 Pi-hole Übersicht =&lt;br /&gt;
Pi-hole ist dein netzwerkweiter Werbeblocker und DNS-Server, der als Docker-Container auf deinem [[Haupseite|HomeLab]] läuft.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/pihole&lt;br /&gt;
* **Docker-Container:** pihole&lt;br /&gt;
* **Image:** pihole/pihole:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:80 (oder via konfiguriertem Port)&lt;br /&gt;
* **Netzwerk:** gateway-net / host&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || pihole&lt;br /&gt;
|-&lt;br /&gt;
| Image || pihole/pihole:latest&lt;br /&gt;
|-&lt;br /&gt;
| DNS Port || 53/udp, 53/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Web Interface Port || 80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
* **DNS-Server:** Blockiert Werbung auf DNS-Ebene für alle Geräte im Netzwerk.&lt;br /&gt;
* **DHCP:** (Optional) Kann die IP-Adressvergabe im Netzwerk übernehmen.&lt;br /&gt;
* **Admin-Panel:** Verwaltung von Blacklists und Whitelists.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
* **Standard Logs:** &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* **Live-Analyse (DNS-Anfragen):** &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f pihole&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* **Pi-hole Logdatei im Container:** &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it pihole tail -f /var/log/pihole/pihole.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zur Verwaltung und zum Update:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Passwort für WebGUI vergessen? Neu setzen:&lt;br /&gt;
docker exec -it pihole pihole -a -p&lt;br /&gt;
&lt;br /&gt;
# Adlists (Blocklisten) über die Konsole aktualisieren:&lt;br /&gt;
docker exec -it pihole pihole -g&lt;br /&gt;
&lt;br /&gt;
# Container Update&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Teleporter:** Exportiere die Einstellungen über die Web-Oberfläche (Settings -&amp;gt; Teleporter).&lt;br /&gt;
* **Volumes:** Sichere den lokalen Ordner (meist `/etc/pihole` und `/etc/dnsmasq.d`), um Listen und Konfigurationen zu behalten.&lt;br /&gt;
&lt;br /&gt;
== Abhängigkeiten ==&lt;br /&gt;
* Port 53 darf auf dem Host nicht von `systemd-resolved` belegt sein.&lt;br /&gt;
* Statische IP des Servers (HomeServer2) im Router hinterlegt.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[DNS-Konfiguration]] – Wie man Pi-hole in der FritzBox oder im Router einträgt.&lt;br /&gt;
* [[Automatisches Git-Push-Skript für Docker-Compose]] – Backup der Docker-Konfiguration.&lt;br /&gt;
* [[Git befehle]] – Übersicht für manuelle Backups.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&#039;&#039;Zuletzt geprüft via `docker ps` am: 14.02.2026&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=MediaWiki&amp;diff=176</id>
		<title>MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=MediaWiki&amp;diff=176"/>
		<updated>2026-02-14T17:53:10Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Wartung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 🟢 MediaWiki Übersicht =&lt;br /&gt;
MediaWiki ist das Kernstück deiner Wissensdatenbank, gehostet als Docker-Container auf deinem [[Hauptseite|HomeLab]].&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Infos ==&lt;br /&gt;
* **Server:** HomeServer2&lt;br /&gt;
* **Projektpfad:** /home/robin/docker/mediawiki (basierend auf Standardstruktur)&lt;br /&gt;
* **Docker-Container:** wiki-mediawiki-1&lt;br /&gt;
* **Image:** mediawiki:latest&lt;br /&gt;
* **WebGUI:** http://192.168.2.217:6080&lt;br /&gt;
* **Datenbank:** MariaDB (Container: wiki-database-1)&lt;br /&gt;
* **Netzwerk:** wiki-network (oder Gateway-Net)&lt;br /&gt;
&lt;br /&gt;
== Docker Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Container Name || wiki-mediawiki-1&lt;br /&gt;
|-&lt;br /&gt;
| Image || mediawiki:latest&lt;br /&gt;
|-&lt;br /&gt;
| Ports || 0.0.0.0:6080-&amp;gt;80/tcp&lt;br /&gt;
|-&lt;br /&gt;
| Status || Up 43 hours (Gesund)&lt;br /&gt;
|-&lt;br /&gt;
| Restart Policy || unless-stopped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Datenbank Setup ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| DB Container || wiki-database-1&lt;br /&gt;
|-&lt;br /&gt;
| Image || mariadb:10.11&lt;br /&gt;
|-&lt;br /&gt;
| Port || 3306 (intern)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Up 3 days&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
* **MediaWiki App Logs:** &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs wiki-mediawiki-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* **Live-Zugriffs-Logs (Apache):** &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs -f wiki-mediawiki-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* **Datenbank Logs:** &lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker logs wiki-database-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Pfade ==&lt;br /&gt;
* **Projektverzeichnis:** `/home/robin/docker/mediawiki`&lt;br /&gt;
* **LocalSettings.php:** Befindet sich meist im Hauptverzeichnis des gemounteten Volumes.&lt;br /&gt;
* **WebGUI Zugriff:** [http://192.168.2.217:6080 http://192.168.2.217:6080]&lt;br /&gt;
&lt;br /&gt;
== Wartung ==&lt;br /&gt;
Befehle zum Verwalten der Wiki-Container:&lt;br /&gt;
&lt;br /&gt;
Neustart nach Änderungen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Update auf neue Version&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In den Container einloggen&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
docker exec -it wiki-mediawiki-1 bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup relevante Daten ==&lt;br /&gt;
* **Bilder/Dateien:** Verzeichnis `images/` im MediaWiki-Ordner.&lt;br /&gt;
* **Konfiguration:** `LocalSettings.php`.&lt;br /&gt;
* **Datenbank:** Ein SQL-Dump der MariaDB oder das `db/` Verzeichnis auf dem Host.&lt;br /&gt;
&lt;br /&gt;
== Probleme &amp;amp; Anleitungen ==&lt;br /&gt;
* [[Gagets für MediaWiki]] – Einrichten eines neuen Gadgets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Verbindung_Gitea_zu_Server&amp;diff=167</id>
		<title>Verbindung Gitea zu Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Verbindung_Gitea_zu_Server&amp;diff=167"/>
		<updated>2026-02-14T17:39:17Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Gitea Webhook einrichten: Felder richtig ausfüllen =&lt;br /&gt;
&lt;br /&gt;
Diese Seite erklärt Schritt für Schritt, wie man einen **Webhook in Gitea** konfiguriert, um automatisch Änderungen auf einen Server zu übertragen (z. B. via `git pull`).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Ziel-URL konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
**Feld:** „Ziel-URL“  &lt;br /&gt;
&lt;br /&gt;
Die Ziel-URL ist der Endpunkt auf deinem Server, der das Push-Event empfängt. Damit das richtige Repository aktualisiert wird, muss der Parameter `?repo=` korrekt gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Deine individuelle Ziel-URL:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
https://web.saya.loseyourip.com/git-auto-pull.php?repo={{Ordner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel (für den Ordner &amp;quot;tower&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
https://web.saya.loseyourip.com/git-auto-pull.php?repo=tower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Erklärung:&#039;&#039;&#039; Jedes Mal, wenn ein Push im Repository passiert, sendet Gitea eine POST-Anfrage an diese URL. Das PHP-Skript nutzt den Namen im Feld `repo`, um im entsprechenden Verzeichnis auf dem Server ein `git pull` auszuführen.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ HTTP-Methode &amp;amp; Content-Type ==&lt;br /&gt;
&lt;br /&gt;
Stelle sicher, dass die folgenden Standardwerte in Gitea ausgewählt sind:&lt;br /&gt;
&lt;br /&gt;
* **HTTP-Methode:** `POST`&lt;br /&gt;
* **Inhaltstyp (Content-Type):** `application/json`&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Webhook testen ==&lt;br /&gt;
&lt;br /&gt;
Sobald du die URL und die Einstellungen gespeichert hast, kannst du die Verbindung prüfen:&lt;br /&gt;
&lt;br /&gt;
1. Scrolle in den Webhook-Einstellungen ganz nach unten.&lt;br /&gt;
2. Klicke auf die Schaltfläche **&amp;quot;Test-Push auslösen&amp;quot;** (oder &amp;quot;Test Delivery&amp;quot;).&lt;br /&gt;
3. Wenn alles korrekt eingerichtet ist, erscheint ein grünes Häkchen (Status 200).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== ✅ Zusammenfassung der Daten ==&lt;br /&gt;
&lt;br /&gt;
| Feld | Wert |&lt;br /&gt;
|---|---|&lt;br /&gt;
| **Ziel-URL** | Siehe dynamische Box oben |&lt;br /&gt;
| **HTTP-Methode** | POST |&lt;br /&gt;
| **Inhaltstyp** | application/json |&lt;br /&gt;
| **Ereignisse** | Das Push-Ereignis (Standard) |&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **Tipp:** Falls der Test fehlschlägt (Status 404 oder 500), prüfe, ob das PHP-Skript auf dem Server unter der angegebenen URL erreichbar ist und die Berechtigungen für den Ordner korrekt gesetzt sind.&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Verbindung_Server_zu_Gitea&amp;diff=166</id>
		<title>Verbindung Server zu Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Verbindung_Server_zu_Gitea&amp;diff=166"/>
		<updated>2026-02-14T17:37:26Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatisches Git-Push-Skript für Docker-Compose =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt, wie du ein **automatisches Git-Push-Skript** einrichtest, sodass Änderungen an deiner Konfiguration automatisch in dein Gitea-Repository gepusht werden.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Skript-Versionen ==&lt;br /&gt;
&lt;br /&gt;
Hier findest du zwei Varianten des Skripts. Wähle diejenige, die besser zu deinem Projekt passt.&lt;br /&gt;
&lt;br /&gt;
=== Version 1: Einfach (Nur docker-compose.yml) ===&lt;br /&gt;
Dieses Skript überwacht lediglich eine einzelne Datei im aktuellen Ordner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Skript im gleichen Ordner wie docker-compose.yml&lt;br /&gt;
FILE=&amp;quot;docker-compose.yml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Zum Ordner wechseln (relativ zum Skript)&lt;br /&gt;
cd &amp;quot;$(dirname &amp;quot;$0&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Endlosschleife für automatische Commits &amp;amp; Push&lt;br /&gt;
while true; do&lt;br /&gt;
    inotifywait -e close_write &amp;quot;$FILE&amp;quot;&lt;br /&gt;
    git add &amp;quot;$FILE&amp;quot;&lt;br /&gt;
    git commit -m &amp;quot;Auto-update: $(date &#039;+%Y-%m-%d %H:%M:%S&#039;)&amp;quot;&lt;br /&gt;
    git push origin main&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Version 2: Erweitert (Mehrere Dateien) ===&lt;br /&gt;
Diese Version eignet sich, wenn du neben der `docker-compose.yml` auch Konfigurationsdateien (z. B. für die Homepage) überwachen willst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Zum Verzeichnis des Scripts wechseln&lt;br /&gt;
cd &amp;quot;$(dirname &amp;quot;$0&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Zu überwachende Dateien&lt;br /&gt;
FILES=(&lt;br /&gt;
  &amp;quot;docker-compose.yml&amp;quot;&lt;br /&gt;
  &amp;quot;homepage/config/settings.yaml&amp;quot;&lt;br /&gt;
  &amp;quot;homepage/config/services.yaml&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# Endlosschleife zur Überwachung&lt;br /&gt;
while true; do&lt;br /&gt;
    # Warten auf Änderungen an den Dateien&lt;br /&gt;
    inotifywait -e close_write &amp;quot;${FILES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Dateien zum Git-Index hinzufügen&lt;br /&gt;
    git add &amp;quot;${FILES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Prüfen, ob Änderungen vorliegen&lt;br /&gt;
    if ! git diff --cached --quiet; then&lt;br /&gt;
        # Commit erstellen und pushen&lt;br /&gt;
        git commit -m &amp;quot;Auto-update: $(date &#039;+%Y-%m-%d %H:%M:%S&#039;)&amp;quot;&lt;br /&gt;
        git push origin main&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Das Skript benötigt die `inotify-tools`. Installation:&lt;br /&gt;
&amp;gt; &amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install inotify-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Skript vorbereiten ==&lt;br /&gt;
&lt;br /&gt;
=== Skript ausführbar machen ===&lt;br /&gt;
Nachdem du die Datei (z. B. als `auto-git-push.sh`) gespeichert hast, musst du sie ausführbar machen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
chmod +x auto-git-push.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Skript kopieren (Optional) ===&lt;br /&gt;
Falls du das Skript in einen anderen Projektordner kopieren möchtest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cp /home/robin/docker/wiki/auto-git-push.sh /home/robin/docker/{{ZielOrdner}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cp /home/robin/docker/wiki/auto-git-push.sh /home/robin/docker/watchtower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Systemd-Dienst einrichten ==&lt;br /&gt;
&lt;br /&gt;
Damit das Skript im Hintergrund läuft, nutzen wir einen Systemd-Service.&lt;br /&gt;
&lt;br /&gt;
=== Service-Datei (nur zur Info) ===&lt;br /&gt;
Speicherort: `/etc/systemd/system/auto-git-push.service`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Auto Git Push Service %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=robin&lt;br /&gt;
WorkingDirectory=/home/robin/docker/%i&lt;br /&gt;
ExecStart=/home/robin/docker/%i/auto-git-push.sh&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dienst aktivieren &amp;amp; starten ===&lt;br /&gt;
Ersetze `{{Ordner}}` durch den Namen deines Projektverzeichnisses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl enable auto-git-push@{{Ordner}}.service&lt;br /&gt;
sudo systemctl start auto-git-push@{{Ordner}}.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel (für Ordner &amp;quot;tower&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl enable auto-git-push@tower.service&lt;br /&gt;
sudo systemctl start auto-git-push@tower.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Wartung &amp;amp; Logs ==&lt;br /&gt;
&lt;br /&gt;
Falls du das Skript aktualisiert hast, musst du den Dienst neu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart auto-git-push@{{Ordner}}.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status und Logs prüfen:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status auto-git-push@{{Ordner}}.service&lt;br /&gt;
journalctl -u auto-git-push@{{Ordner}}.service -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== ✅ Checkliste ==&lt;br /&gt;
* ✅ Skript gespeichert &amp;amp; Pfade in Version 2 angepasst&lt;br /&gt;
* ✅ Skript ausführbar gemacht (`chmod +x`)&lt;br /&gt;
* ✅ Systemd-Service aktiviert und gestartet&lt;br /&gt;
* ✅ Logs auf erfolgreiche Pushes überprüft&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=165</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=165"/>
		<updated>2026-02-14T17:33:16Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Anleitung: Docker-Compose Repository mit Gitea verbinden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für [[MediaWiki]]) in [[Gitea]] versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/mediawiki-server&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/my-docker-repo.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{Beschreibung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Datenbank-Port angepasst&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=164</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=164"/>
		<updated>2026-02-14T17:32:54Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* Anleitung: Docker-Compose Repository mit Gitea verbinden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in [[Gitea]] versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/mediawiki-server&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/my-docker-repo.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{Beschreibung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Datenbank-Port angepasst&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=163</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=163"/>
		<updated>2026-02-14T17:31:50Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in Gitea versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/mediawiki-server&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/my-docker-repo.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{Beschreibung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Datenbank-Port angepasst&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=162</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=162"/>
		<updated>2026-02-14T17:30:10Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 5️⃣ Änderungen in Zukunft hochladen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in Gitea versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{Beschreibung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=161</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=161"/>
		<updated>2026-02-14T17:29:45Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 5️⃣ Änderungen in Zukunft hochladen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in Gitea versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{BeschreibungderÄnderung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=160</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=160"/>
		<updated>2026-02-14T17:29:32Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 5️⃣ Änderungen in Zukunft hochladen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in Gitea versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{Beschreibung_der_Änderung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=159</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=159"/>
		<updated>2026-02-14T17:28:52Z</updated>

		<summary type="html">&lt;p&gt;Saya: /* 5️⃣ Änderungen in Zukunft hochladen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in Gitea versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;{{Beschreibung der Änderung}}&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=158</id>
		<title>Git einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=Git_einrichten&amp;diff=158"/>
		<updated>2026-02-14T17:27:41Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anleitung: Docker-Compose Repository mit Gitea verbinden =&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt, wie du dein Docker-Compose-Projekt (z. B. für MediaWiki) in Gitea versionierst und Änderungen hochlädst.&lt;br /&gt;
&lt;br /&gt;
== 1️⃣ Lokales Git-Repository erstellen ==&lt;br /&gt;
Öffne ein Terminal auf deinem Server und navigiere zu deinem Docker-Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/docker/{{Ordner}}&lt;br /&gt;
git init&lt;br /&gt;
git branch -m main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2️⃣ Dateien für das Repository vorbereiten ==&lt;br /&gt;
Füge deine Docker-Compose-Datei zum Repository hinzu und erstelle den ersten Commit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Initial commit: Docker Compose&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3️⃣ Gitea als Remote hinzufügen ==&lt;br /&gt;
Füge dein Gitea-Repository als Remote hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;dynamic-code&amp;quot;&amp;gt;&lt;br /&gt;
git remote add origin http://192.168.2.217:3060/saya/{{gitName}}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4️⃣ Ersten Push durchführen ==&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Hinweis: Git fragt nach deinem Benutzernamen und Passwort oder Access-Token. Nach erfolgreichem Push ist dein Repository online.&lt;br /&gt;
&lt;br /&gt;
== 5️⃣ Änderungen in Zukunft hochladen ==&lt;br /&gt;
Bei Änderungen am Docker-Setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
git add docker-compose.yml&lt;br /&gt;
git commit -m &amp;quot;Beschreibung der Änderung&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6️⃣ Optional: .gitignore erstellen ==&lt;br /&gt;
Damit Logs, temporäre Dateien oder Container-Daten nicht ins Repository kommen, erstelle eine Datei `.gitignore` im Projektordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;static-code&amp;quot;&amp;gt;&lt;br /&gt;
# Docker&lt;br /&gt;
*.log&lt;br /&gt;
*.env&lt;br /&gt;
docker-compose.override.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=MediaWiki:Gadget-CodeGenerator.js&amp;diff=157</id>
		<title>MediaWiki:Gadget-CodeGenerator.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=MediaWiki:Gadget-CodeGenerator.js&amp;diff=157"/>
		<updated>2026-02-14T17:24:45Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mw.loader.using([&#039;mediawiki.util&#039;]).then(function () {&lt;br /&gt;
&lt;br /&gt;
    // --- Globale Variablen ---&lt;br /&gt;
    const globalVars = {};&lt;br /&gt;
    const seenVars = new Set();&lt;br /&gt;
    const variableBlocks = {};&lt;br /&gt;
&lt;br /&gt;
    // --- Erstellung der Leiste ---&lt;br /&gt;
    const bar = document.createElement(&#039;div&#039;);&lt;br /&gt;
    bar.id = &#039;global-var-bar&#039;;&lt;br /&gt;
    bar.style.display = &#039;none&#039;; &lt;br /&gt;
    bar.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
    bar.style.alignItems = &#039;flex-end&#039;; &lt;br /&gt;
    bar.style.gap = &#039;12px&#039;;&lt;br /&gt;
    bar.style.padding = &#039;12px&#039;;&lt;br /&gt;
    bar.style.border = &#039;1px solid #bbb&#039;;&lt;br /&gt;
    bar.style.borderRadius = &#039;6px&#039;;&lt;br /&gt;
    bar.style.background = &#039;#f5f5f5&#039;;&lt;br /&gt;
    bar.style.marginBottom = &#039;20px&#039;;&lt;br /&gt;
&lt;br /&gt;
    const barTitle = document.createElement(&#039;div&#039;);&lt;br /&gt;
    barTitle.textContent = &#039;Globale Variablen&#039;;&lt;br /&gt;
    barTitle.style.width = &#039;100%&#039;;&lt;br /&gt;
    barTitle.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
    barTitle.style.fontSize = &#039;14px&#039;;&lt;br /&gt;
    barTitle.style.marginBottom = &#039;4px&#039;;&lt;br /&gt;
    barTitle.style.color = &#039;#000&#039;;&lt;br /&gt;
    bar.appendChild(barTitle);&lt;br /&gt;
&lt;br /&gt;
    // KORREKTUR DER POSITION:&lt;br /&gt;
    // Wir setzen die Leiste an den Anfang von #mw-content-text (der eigentliche Artikel-Inhalt)&lt;br /&gt;
    const contentBody = document.querySelector(&#039;#mw-content-text&#039;);&lt;br /&gt;
    if (contentBody) {&lt;br /&gt;
        contentBody.prepend(bar);&lt;br /&gt;
    } else {&lt;br /&gt;
        document.querySelector(&#039;#content&#039;).prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const applyAllBtn = document.createElement(&#039;button&#039;);&lt;br /&gt;
    applyAllBtn.textContent = &#039;→ Auf alle anwenden&#039;;&lt;br /&gt;
    applyAllBtn.style.padding = &#039;6px 12px&#039;;&lt;br /&gt;
    applyAllBtn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    applyAllBtn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
    applyAllBtn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
    applyAllBtn.style.background = &#039;#eee&#039;;&lt;br /&gt;
    applyAllBtn.style.marginLeft = &#039;auto&#039;;&lt;br /&gt;
    applyAllBtn.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
    bar.appendChild(applyAllBtn);&lt;br /&gt;
&lt;br /&gt;
    function addVarOnce(varName, defaultValue = &#039;&#039;) {&lt;br /&gt;
        bar.style.display = &#039;flex&#039;; &lt;br /&gt;
&lt;br /&gt;
        if (seenVars.has(varName)) return;&lt;br /&gt;
        seenVars.add(varName);&lt;br /&gt;
&lt;br /&gt;
        const formattedValue = defaultValue.startsWith(&#039;{{&#039;) ? defaultValue : `{{${defaultValue}}}`;&lt;br /&gt;
        globalVars[varName] = formattedValue;&lt;br /&gt;
&lt;br /&gt;
        const lbl = document.createElement(&#039;label&#039;);&lt;br /&gt;
        lbl.style.display = &#039;flex&#039;;&lt;br /&gt;
        lbl.style.flexDirection = &#039;column&#039;;&lt;br /&gt;
        lbl.style.gap = &#039;4px&#039;;&lt;br /&gt;
&lt;br /&gt;
        const span = document.createElement(&#039;span&#039;);&lt;br /&gt;
        span.textContent = varName + &#039;:&#039;;&lt;br /&gt;
        span.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
        span.style.fontSize = &#039;13px&#039;; &lt;br /&gt;
        span.style.color = &#039;#222&#039;;&lt;br /&gt;
        lbl.appendChild(span);&lt;br /&gt;
&lt;br /&gt;
        const inp = document.createElement(&#039;input&#039;);&lt;br /&gt;
        inp.type = &#039;text&#039;;&lt;br /&gt;
        inp.value = formattedValue;&lt;br /&gt;
        inp.dataset.varId = varName;&lt;br /&gt;
        inp.style.width = &#039;140px&#039;; &lt;br /&gt;
        inp.style.padding = &#039;4px&#039;;&lt;br /&gt;
        inp.style.border = &#039;1px solid #ccc&#039;;&lt;br /&gt;
        inp.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        inp.style.fontFamily = &#039;monospace&#039;;&lt;br /&gt;
        inp.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        lbl.appendChild(inp);&lt;br /&gt;
&lt;br /&gt;
        inp.addEventListener(&#039;input&#039;, () =&amp;gt; {&lt;br /&gt;
            globalVars[varName] = inp.value;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        bar.insertBefore(lbl, applyAllBtn);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- Ab hier bleibt der Rest des Codes (Copy, Highlight, InitPage etc.) identisch zum vorherigen ---&lt;br /&gt;
    // (Um die Nachricht kurz zu halten, habe ich die Funktionen darunter nicht erneut kopiert, &lt;br /&gt;
    // sie müssen aber natürlich in deinem Script bleiben!)&lt;br /&gt;
    &lt;br /&gt;
    // --- [Hier die restlichen Funktionen aus der vorigen Antwort einfügen] ---&lt;br /&gt;
    &lt;br /&gt;
    // --- Hilfsfunktionen (copyText, highlightPlaceholdersAndValues, updateBlockContent) ---&lt;br /&gt;
    // --- Initialisierung (initDynamicCodeBlock, initStaticCodeBlock, initPage) ---&lt;br /&gt;
    // --- CSS &amp;amp; applyAllBtn.onclick ---&lt;br /&gt;
    &lt;br /&gt;
    /* Zur Sicherheit hier nochmal die restlichen Funktionen im Schnelldurchlauf für dein Copy-Paste: */&lt;br /&gt;
&lt;br /&gt;
    function copyText(text, btn) {&lt;br /&gt;
        const plainText = text.replace(/&amp;lt;[^&amp;gt;]+&amp;gt;/g, &#039;&#039;);&lt;br /&gt;
        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
            navigator.clipboard.writeText(plainText).then(() =&amp;gt; success());&lt;br /&gt;
        } else {&lt;br /&gt;
            const textarea = document.createElement(&amp;quot;textarea&amp;quot;);&lt;br /&gt;
            textarea.value = plainText;&lt;br /&gt;
            document.body.appendChild(textarea);&lt;br /&gt;
            textarea.select();&lt;br /&gt;
            document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
            document.body.removeChild(textarea);&lt;br /&gt;
            success();&lt;br /&gt;
        }&lt;br /&gt;
        function success() {&lt;br /&gt;
            btn.textContent = &amp;quot;✅ Kopiert!&amp;quot;;&lt;br /&gt;
            setTimeout(() =&amp;gt; btn.textContent = &amp;quot;📋 Kopieren&amp;quot;, 1500);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightPlaceholdersAndValues(code, replacements) {&lt;br /&gt;
        let highlighted = code.replace(/{{(\w+)}}/g, &#039;&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;{{$1}}&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
        Object.keys(replacements).forEach(varName =&amp;gt; {&lt;br /&gt;
            const val = replacements[varName];&lt;br /&gt;
            if (!val) return;&lt;br /&gt;
            const escapedVal = val.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
            const re = new RegExp(escapedVal, &#039;g&#039;);&lt;br /&gt;
            highlighted = highlighted.replace(/(&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;.*?&amp;lt;\/span&amp;gt;|[^&amp;lt;]+)/g, segment =&amp;gt; {&lt;br /&gt;
                if (segment.startsWith(&#039;&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;&#039;)) return segment;&lt;br /&gt;
                return segment.replace(re, `&amp;lt;span class=&amp;quot;value&amp;quot;&amp;gt;${val}&amp;lt;/span&amp;gt;`);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
        return highlighted;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateBlockContent(pre, inputWrapper, varsInBlock) {&lt;br /&gt;
        const currentValues = {};&lt;br /&gt;
        let updated = pre.dataset.originalCode;&lt;br /&gt;
        varsInBlock.forEach(vv =&amp;gt; {&lt;br /&gt;
            const val = inputWrapper.querySelector(`input[data-var-id=&amp;quot;${vv}&amp;quot;]`).value;&lt;br /&gt;
            updated = updated.replace(new RegExp(`{{${vv}}}`, &#039;g&#039;), val);&lt;br /&gt;
            currentValues[vv] = val;&lt;br /&gt;
        });&lt;br /&gt;
        pre.innerHTML = highlightPlaceholdersAndValues(updated, currentValues);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initDynamicCodeBlock(pre) {&lt;br /&gt;
        if (pre.dataset.dynamicInit) return;&lt;br /&gt;
        pre.dataset.dynamicInit = true;&lt;br /&gt;
        const originalCode = pre.textContent;&lt;br /&gt;
        pre.dataset.originalCode = originalCode;&lt;br /&gt;
        const regex = /{{(\w+)}}/g;&lt;br /&gt;
        const varsInBlock = [];&lt;br /&gt;
        let match;&lt;br /&gt;
        while ((match = regex.exec(originalCode)) !== null) {&lt;br /&gt;
            if (!varsInBlock.includes(match[1])) varsInBlock.push(match[1]);&lt;br /&gt;
        }&lt;br /&gt;
        if (varsInBlock.length === 0) return;&lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.display = &#039;flex&#039;;&lt;br /&gt;
        container.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
        container.style.alignItems = &#039;center&#039;;&lt;br /&gt;
        container.style.justifyContent = &#039;space-between&#039;;&lt;br /&gt;
        container.style.gap = &#039;6px&#039;;&lt;br /&gt;
        container.style.marginBottom = &#039;4px&#039;;&lt;br /&gt;
        container.style.padding = &#039;6px&#039;;&lt;br /&gt;
        container.style.border = &#039;1px solid #ddd&#039;;&lt;br /&gt;
        container.style.borderRadius = &#039;6px&#039;;&lt;br /&gt;
        container.style.background = &#039;#f9f9f9&#039;;&lt;br /&gt;
        const inputWrapper = document.createElement(&#039;div&#039;);&lt;br /&gt;
        inputWrapper.style.display = &#039;flex&#039;;&lt;br /&gt;
        inputWrapper.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
        inputWrapper.style.gap = &#039;8px&#039;;&lt;br /&gt;
        container.appendChild(inputWrapper);&lt;br /&gt;
        varsInBlock.forEach(v =&amp;gt; {&lt;br /&gt;
            const lbl = document.createElement(&#039;label&#039;);&lt;br /&gt;
            lbl.style.display = &#039;flex&#039;;&lt;br /&gt;
            lbl.style.alignItems = &#039;center&#039;;&lt;br /&gt;
            lbl.style.gap = &#039;4px&#039;;&lt;br /&gt;
            lbl.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
            lbl.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
            lbl.textContent = v + &#039;:&#039;;&lt;br /&gt;
            const inp = document.createElement(&#039;input&#039;);&lt;br /&gt;
            inp.type = &#039;text&#039;;&lt;br /&gt;
            inp.value = `{{${v}}}`;&lt;br /&gt;
            inp.dataset.varId = v;&lt;br /&gt;
            inp.style.width = &#039;110px&#039;;&lt;br /&gt;
            inp.style.padding = &#039;2px&#039;;&lt;br /&gt;
            inp.style.border = &#039;1px solid #ccc&#039;;&lt;br /&gt;
            inp.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
            inp.style.fontWeight = &#039;normal&#039;;&lt;br /&gt;
            lbl.appendChild(inp);&lt;br /&gt;
            inputWrapper.appendChild(lbl);&lt;br /&gt;
            inp.addEventListener(&#039;input&#039;, () =&amp;gt; updateBlockContent(pre, inputWrapper, varsInBlock));&lt;br /&gt;
        });&lt;br /&gt;
        const btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
        btn.textContent = &#039;📋 Kopieren&#039;;&lt;br /&gt;
        btn.style.padding = &#039;2px 8px&#039;;&lt;br /&gt;
        btn.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        btn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        btn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
        btn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        btn.style.background = &#039;#eee&#039;;&lt;br /&gt;
        btn.onclick = () =&amp;gt; copyText(pre.innerHTML, btn);&lt;br /&gt;
        container.appendChild(btn);&lt;br /&gt;
        pre.parentNode.insertBefore(container, pre);&lt;br /&gt;
        pre.innerHTML = highlightPlaceholdersAndValues(originalCode, {});&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initStaticCodeBlock(pre) {&lt;br /&gt;
        if (pre.dataset.staticInit) return;&lt;br /&gt;
        pre.dataset.staticInit = true;&lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.position = &#039;relative&#039;;&lt;br /&gt;
        container.style.marginBottom = &#039;6px&#039;;&lt;br /&gt;
        pre.parentNode.replaceChild(container, pre);&lt;br /&gt;
        container.appendChild(pre);&lt;br /&gt;
        const btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
        btn.textContent = &#039;📋 Kopieren&#039;;&lt;br /&gt;
        btn.style.position = &#039;absolute&#039;;&lt;br /&gt;
        btn.style.top = &#039;4px&#039;;&lt;br /&gt;
        btn.style.right = &#039;4px&#039;;&lt;br /&gt;
        btn.style.padding = &#039;2px 6px&#039;;&lt;br /&gt;
        btn.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        btn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        btn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
        btn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        btn.style.background = &#039;#eee&#039;;&lt;br /&gt;
        btn.onclick = () =&amp;gt; copyText(pre.textContent, btn);&lt;br /&gt;
        container.appendChild(btn);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPage() {&lt;br /&gt;
        const dynamicBlocks = document.querySelectorAll(&#039;pre.dynamic-code&#039;);&lt;br /&gt;
        const staticBlocks = document.querySelectorAll(&#039;pre.static-code&#039;);&lt;br /&gt;
        dynamicBlocks.forEach(initDynamicCodeBlock);&lt;br /&gt;
        staticBlocks.forEach(initStaticCodeBlock);&lt;br /&gt;
        dynamicBlocks.forEach(pre =&amp;gt; {&lt;br /&gt;
            const regex = /{{(\w+)}}/g;&lt;br /&gt;
            let match;&lt;br /&gt;
            while ((match = regex.exec(pre.dataset.originalCode || pre.textContent)) !== null) {&lt;br /&gt;
                const varName = match[1];&lt;br /&gt;
                addVarOnce(varName, varName);&lt;br /&gt;
                if (!variableBlocks[varName]) variableBlocks[varName] = [];&lt;br /&gt;
                if (!variableBlocks[varName].includes(pre)) variableBlocks[varName].push(pre);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPage);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPage();&lt;br /&gt;
    }&lt;br /&gt;
    mw.hook(&#039;wikipage.content&#039;).add(initPage);&lt;br /&gt;
&lt;br /&gt;
    const style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.textContent = `&lt;br /&gt;
        .placeholder { color: #d14; font-weight: bold; }&lt;br /&gt;
        .value { color: #1a73e8; font-weight: bold; }&lt;br /&gt;
    `;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
&lt;br /&gt;
    applyAllBtn.onclick = () =&amp;gt; {&lt;br /&gt;
        const allPreBlocks = new Set();&lt;br /&gt;
        Object.values(variableBlocks).forEach(list =&amp;gt; list.forEach(p =&amp;gt; allPreBlocks.add(p)));&lt;br /&gt;
        allPreBlocks.forEach(pre =&amp;gt; {&lt;br /&gt;
            const container = pre.previousSibling;&lt;br /&gt;
            if (!container || !container.querySelector) return;&lt;br /&gt;
            const varsInBlock = [];&lt;br /&gt;
            const regex = /{{(\w+)}}/g;&lt;br /&gt;
            let match;&lt;br /&gt;
            while ((match = regex.exec(pre.dataset.originalCode)) !== null) {&lt;br /&gt;
                if (!varsInBlock.includes(match[1])) varsInBlock.push(match[1]);&lt;br /&gt;
            }&lt;br /&gt;
            varsInBlock.forEach(vName =&amp;gt; {&lt;br /&gt;
                const localInp = container.querySelector(`input[data-var-id=&amp;quot;${vName}&amp;quot;]`);&lt;br /&gt;
                if (localInp &amp;amp;&amp;amp; globalVars[vName] !== undefined) {&lt;br /&gt;
                    localInp.value = globalVars[vName];&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            updateBlockContent(pre, container, varsInBlock);&lt;br /&gt;
        });&lt;br /&gt;
    };&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=MediaWiki:Gadget-CodeGenerator.js&amp;diff=156</id>
		<title>MediaWiki:Gadget-CodeGenerator.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=MediaWiki:Gadget-CodeGenerator.js&amp;diff=156"/>
		<updated>2026-02-14T17:22:58Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mw.loader.using([&#039;mediawiki.util&#039;]).then(function () {&lt;br /&gt;
&lt;br /&gt;
    // --- Globale Variablen ---&lt;br /&gt;
    const globalVars = {};&lt;br /&gt;
    const seenVars = new Set();&lt;br /&gt;
    const variableBlocks = {};&lt;br /&gt;
&lt;br /&gt;
    // --- Erstellung der Leiste ---&lt;br /&gt;
    const bar = document.createElement(&#039;div&#039;);&lt;br /&gt;
    bar.id = &#039;global-var-bar&#039;;&lt;br /&gt;
    bar.style.display = &#039;none&#039;; // Initial versteckt&lt;br /&gt;
    bar.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
    bar.style.alignItems = &#039;flex-end&#039;; // Ausrichtung an der Unterkante der Inputs&lt;br /&gt;
    bar.style.gap = &#039;12px&#039;;&lt;br /&gt;
    bar.style.padding = &#039;12px&#039;;&lt;br /&gt;
    bar.style.border = &#039;1px solid #bbb&#039;;&lt;br /&gt;
    bar.style.borderRadius = &#039;6px&#039;;&lt;br /&gt;
    bar.style.background = &#039;#f5f5f5&#039;;&lt;br /&gt;
    bar.style.marginBottom = &#039;20px&#039;;&lt;br /&gt;
    bar.style.marginTop = &#039;10px&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Kleine Überschrift für die Leiste&lt;br /&gt;
    const barTitle = document.createElement(&#039;div&#039;);&lt;br /&gt;
    barTitle.textContent = &#039;Globale Variablen&#039;;&lt;br /&gt;
    barTitle.style.width = &#039;100%&#039;;&lt;br /&gt;
    barTitle.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
    barTitle.style.fontSize = &#039;14px&#039;;&lt;br /&gt;
    barTitle.style.marginBottom = &#039;4px&#039;;&lt;br /&gt;
    barTitle.style.color = &#039;#000&#039;;&lt;br /&gt;
    bar.appendChild(barTitle);&lt;br /&gt;
&lt;br /&gt;
    // Einbauposition: Unter die Hauptüberschrift (h1) der Seite&lt;br /&gt;
    const pageTitle = document.querySelector(&#039;.firstHeading&#039;);&lt;br /&gt;
    if (pageTitle) {&lt;br /&gt;
        pageTitle.parentNode.insertBefore(bar, pageTitle.nextSibling);&lt;br /&gt;
    } else {&lt;br /&gt;
        document.querySelector(&#039;#content&#039;).prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const applyAllBtn = document.createElement(&#039;button&#039;);&lt;br /&gt;
    applyAllBtn.textContent = &#039;→ Auf alle anwenden&#039;;&lt;br /&gt;
    applyAllBtn.style.padding = &#039;6px 12px&#039;;&lt;br /&gt;
    applyAllBtn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    applyAllBtn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
    applyAllBtn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
    applyAllBtn.style.background = &#039;#eee&#039;;&lt;br /&gt;
    applyAllBtn.style.marginLeft = &#039;auto&#039;;&lt;br /&gt;
    applyAllBtn.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
    bar.appendChild(applyAllBtn);&lt;br /&gt;
&lt;br /&gt;
    function addVarOnce(varName, defaultValue = &#039;&#039;) {&lt;br /&gt;
        bar.style.display = &#039;flex&#039;; // Einblenden sobald Variablen da sind&lt;br /&gt;
&lt;br /&gt;
        if (seenVars.has(varName)) return;&lt;br /&gt;
        seenVars.add(varName);&lt;br /&gt;
&lt;br /&gt;
        const formattedValue = defaultValue.startsWith(&#039;{{&#039;) ? defaultValue : `{{${defaultValue}}}`;&lt;br /&gt;
        globalVars[varName] = formattedValue;&lt;br /&gt;
&lt;br /&gt;
        const lbl = document.createElement(&#039;label&#039;);&lt;br /&gt;
        lbl.style.display = &#039;flex&#039;;&lt;br /&gt;
        lbl.style.flexDirection = &#039;column&#039;;&lt;br /&gt;
        lbl.style.gap = &#039;4px&#039;;&lt;br /&gt;
&lt;br /&gt;
        const span = document.createElement(&#039;span&#039;);&lt;br /&gt;
        span.textContent = varName + &#039;:&#039;;&lt;br /&gt;
        span.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
        span.style.fontSize = &#039;13px&#039;; // Etwas größer&lt;br /&gt;
        span.style.color = &#039;#222&#039;;&lt;br /&gt;
        lbl.appendChild(span);&lt;br /&gt;
&lt;br /&gt;
        const inp = document.createElement(&#039;input&#039;);&lt;br /&gt;
        inp.type = &#039;text&#039;;&lt;br /&gt;
        inp.value = formattedValue;&lt;br /&gt;
        inp.dataset.varId = varName;&lt;br /&gt;
        inp.style.width = &#039;140px&#039;; // Etwas breiter für die Optik&lt;br /&gt;
        inp.style.padding = &#039;4px&#039;;&lt;br /&gt;
        inp.style.border = &#039;1px solid #ccc&#039;;&lt;br /&gt;
        inp.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        inp.style.fontFamily = &#039;monospace&#039;;&lt;br /&gt;
        inp.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        lbl.appendChild(inp);&lt;br /&gt;
&lt;br /&gt;
        inp.addEventListener(&#039;input&#039;, () =&amp;gt; {&lt;br /&gt;
            globalVars[varName] = inp.value;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        bar.insertBefore(lbl, applyAllBtn);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- Hilfsfunktionen ---&lt;br /&gt;
    function copyText(text, btn) {&lt;br /&gt;
        const plainText = text.replace(/&amp;lt;[^&amp;gt;]+&amp;gt;/g, &#039;&#039;);&lt;br /&gt;
        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
            navigator.clipboard.writeText(plainText).then(() =&amp;gt; success());&lt;br /&gt;
        } else {&lt;br /&gt;
            const textarea = document.createElement(&amp;quot;textarea&amp;quot;);&lt;br /&gt;
            textarea.value = plainText;&lt;br /&gt;
            document.body.appendChild(textarea);&lt;br /&gt;
            textarea.select();&lt;br /&gt;
            document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
            document.body.removeChild(textarea);&lt;br /&gt;
            success();&lt;br /&gt;
        }&lt;br /&gt;
        function success() {&lt;br /&gt;
            btn.textContent = &amp;quot;✅ Kopiert!&amp;quot;;&lt;br /&gt;
            setTimeout(() =&amp;gt; btn.textContent = &amp;quot;📋 Kopieren&amp;quot;, 1500);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightPlaceholdersAndValues(code, replacements) {&lt;br /&gt;
        let highlighted = code.replace(/{{(\w+)}}/g, &#039;&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;{{$1}}&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
        Object.keys(replacements).forEach(varName =&amp;gt; {&lt;br /&gt;
            const val = replacements[varName];&lt;br /&gt;
            if (!val) return;&lt;br /&gt;
            const escapedVal = val.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
            const re = new RegExp(escapedVal, &#039;g&#039;);&lt;br /&gt;
&lt;br /&gt;
            highlighted = highlighted.replace(/(&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;.*?&amp;lt;\/span&amp;gt;|[^&amp;lt;]+)/g, segment =&amp;gt; {&lt;br /&gt;
                if (segment.startsWith(&#039;&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;&#039;)) return segment;&lt;br /&gt;
                return segment.replace(re, `&amp;lt;span class=&amp;quot;value&amp;quot;&amp;gt;${val}&amp;lt;/span&amp;gt;`);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
        return highlighted;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateBlockContent(pre, inputWrapper, varsInBlock) {&lt;br /&gt;
        const currentValues = {};&lt;br /&gt;
        let updated = pre.dataset.originalCode;&lt;br /&gt;
        varsInBlock.forEach(vv =&amp;gt; {&lt;br /&gt;
            const val = inputWrapper.querySelector(`input[data-var-id=&amp;quot;${vv}&amp;quot;]`).value;&lt;br /&gt;
            updated = updated.replace(new RegExp(`{{${vv}}}`, &#039;g&#039;), val);&lt;br /&gt;
            currentValues[vv] = val;&lt;br /&gt;
        });&lt;br /&gt;
        pre.innerHTML = highlightPlaceholdersAndValues(updated, currentValues);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- Block Initialisierung ---&lt;br /&gt;
    function initDynamicCodeBlock(pre) {&lt;br /&gt;
        if (pre.dataset.dynamicInit) return;&lt;br /&gt;
        pre.dataset.dynamicInit = true;&lt;br /&gt;
&lt;br /&gt;
        const originalCode = pre.textContent;&lt;br /&gt;
        pre.dataset.originalCode = originalCode;&lt;br /&gt;
&lt;br /&gt;
        const regex = /{{(\w+)}}/g;&lt;br /&gt;
        const varsInBlock = [];&lt;br /&gt;
        let match;&lt;br /&gt;
        while ((match = regex.exec(originalCode)) !== null) {&lt;br /&gt;
            if (!varsInBlock.includes(match[1])) varsInBlock.push(match[1]);&lt;br /&gt;
        }&lt;br /&gt;
        if (varsInBlock.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.display = &#039;flex&#039;;&lt;br /&gt;
        container.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
        container.style.alignItems = &#039;center&#039;;&lt;br /&gt;
        container.style.justifyContent = &#039;space-between&#039;;&lt;br /&gt;
        container.style.gap = &#039;6px&#039;;&lt;br /&gt;
        container.style.marginBottom = &#039;4px&#039;;&lt;br /&gt;
        container.style.padding = &#039;6px&#039;;&lt;br /&gt;
        container.style.border = &#039;1px solid #ddd&#039;;&lt;br /&gt;
        container.style.borderRadius = &#039;6px&#039;;&lt;br /&gt;
        container.style.background = &#039;#f9f9f9&#039;;&lt;br /&gt;
&lt;br /&gt;
        const inputWrapper = document.createElement(&#039;div&#039;);&lt;br /&gt;
        inputWrapper.style.display = &#039;flex&#039;;&lt;br /&gt;
        inputWrapper.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
        inputWrapper.style.gap = &#039;8px&#039;;&lt;br /&gt;
        container.appendChild(inputWrapper);&lt;br /&gt;
&lt;br /&gt;
        varsInBlock.forEach(v =&amp;gt; {&lt;br /&gt;
            const lbl = document.createElement(&#039;label&#039;);&lt;br /&gt;
            lbl.style.display = &#039;flex&#039;;&lt;br /&gt;
            lbl.style.alignItems = &#039;center&#039;;&lt;br /&gt;
            lbl.style.gap = &#039;4px&#039;;&lt;br /&gt;
            lbl.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
            lbl.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
            lbl.textContent = v + &#039;:&#039;;&lt;br /&gt;
&lt;br /&gt;
            const inp = document.createElement(&#039;input&#039;);&lt;br /&gt;
            inp.type = &#039;text&#039;;&lt;br /&gt;
            inp.value = `{{${v}}}`;&lt;br /&gt;
            inp.dataset.varId = v;&lt;br /&gt;
            inp.style.width = &#039;110px&#039;;&lt;br /&gt;
            inp.style.padding = &#039;2px&#039;;&lt;br /&gt;
            inp.style.border = &#039;1px solid #ccc&#039;;&lt;br /&gt;
            inp.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
            inp.style.fontWeight = &#039;normal&#039;;&lt;br /&gt;
&lt;br /&gt;
            lbl.appendChild(inp);&lt;br /&gt;
            inputWrapper.appendChild(lbl);&lt;br /&gt;
            inp.addEventListener(&#039;input&#039;, () =&amp;gt; updateBlockContent(pre, inputWrapper, varsInBlock));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        const btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
        btn.textContent = &#039;📋 Kopieren&#039;;&lt;br /&gt;
        btn.style.padding = &#039;2px 8px&#039;;&lt;br /&gt;
        btn.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        btn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        btn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
        btn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        btn.style.background = &#039;#eee&#039;;&lt;br /&gt;
        btn.onclick = () =&amp;gt; copyText(pre.innerHTML, btn);&lt;br /&gt;
&lt;br /&gt;
        container.appendChild(btn);&lt;br /&gt;
        pre.parentNode.insertBefore(container, pre);&lt;br /&gt;
        pre.innerHTML = highlightPlaceholdersAndValues(originalCode, {});&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initStaticCodeBlock(pre) {&lt;br /&gt;
        if (pre.dataset.staticInit) return;&lt;br /&gt;
        pre.dataset.staticInit = true;&lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.position = &#039;relative&#039;;&lt;br /&gt;
        container.style.marginBottom = &#039;6px&#039;;&lt;br /&gt;
        pre.parentNode.replaceChild(container, pre);&lt;br /&gt;
        container.appendChild(pre);&lt;br /&gt;
&lt;br /&gt;
        const btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
        btn.textContent = &#039;📋 Kopieren&#039;;&lt;br /&gt;
        btn.style.position = &#039;absolute&#039;;&lt;br /&gt;
        btn.style.top = &#039;4px&#039;;&lt;br /&gt;
        btn.style.right = &#039;4px&#039;;&lt;br /&gt;
        btn.style.padding = &#039;2px 6px&#039;;&lt;br /&gt;
        btn.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        btn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        btn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
        btn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        btn.style.background = &#039;#eee&#039;;&lt;br /&gt;
        btn.onclick = () =&amp;gt; copyText(pre.textContent, btn);&lt;br /&gt;
        container.appendChild(btn);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPage() {&lt;br /&gt;
        const dynamicBlocks = document.querySelectorAll(&#039;pre.dynamic-code&#039;);&lt;br /&gt;
        const staticBlocks = document.querySelectorAll(&#039;pre.static-code&#039;);&lt;br /&gt;
        &lt;br /&gt;
        dynamicBlocks.forEach(initDynamicCodeBlock);&lt;br /&gt;
        staticBlocks.forEach(initStaticCodeBlock);&lt;br /&gt;
&lt;br /&gt;
        dynamicBlocks.forEach(pre =&amp;gt; {&lt;br /&gt;
            const regex = /{{(\w+)}}/g;&lt;br /&gt;
            let match;&lt;br /&gt;
            while ((match = regex.exec(pre.dataset.originalCode || pre.textContent)) !== null) {&lt;br /&gt;
                const varName = match[1];&lt;br /&gt;
                addVarOnce(varName, varName);&lt;br /&gt;
                if (!variableBlocks[varName]) variableBlocks[varName] = [];&lt;br /&gt;
                if (!variableBlocks[varName].includes(pre)) variableBlocks[varName].push(pre);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPage);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPage();&lt;br /&gt;
    }&lt;br /&gt;
    mw.hook(&#039;wikipage.content&#039;).add(initPage);&lt;br /&gt;
&lt;br /&gt;
    const style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.textContent = `&lt;br /&gt;
        .placeholder { color: #d14; font-weight: bold; }&lt;br /&gt;
        .value { color: #1a73e8; font-weight: bold; }&lt;br /&gt;
    `;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
&lt;br /&gt;
    applyAllBtn.onclick = () =&amp;gt; {&lt;br /&gt;
        const allPreBlocks = new Set();&lt;br /&gt;
        Object.values(variableBlocks).forEach(list =&amp;gt; list.forEach(p =&amp;gt; allPreBlocks.add(p)));&lt;br /&gt;
&lt;br /&gt;
        allPreBlocks.forEach(pre =&amp;gt; {&lt;br /&gt;
            const container = pre.previousSibling;&lt;br /&gt;
            if (!container || !container.querySelector) return;&lt;br /&gt;
&lt;br /&gt;
            const varsInBlock = [];&lt;br /&gt;
            const regex = /{{(\w+)}}/g;&lt;br /&gt;
            let match;&lt;br /&gt;
            while ((match = regex.exec(pre.dataset.originalCode)) !== null) {&lt;br /&gt;
                if (!varsInBlock.includes(match[1])) varsInBlock.push(match[1]);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            varsInBlock.forEach(vName =&amp;gt; {&lt;br /&gt;
                const localInp = container.querySelector(`input[data-var-id=&amp;quot;${vName}&amp;quot;]`);&lt;br /&gt;
                if (localInp &amp;amp;&amp;amp; globalVars[vName] !== undefined) {&lt;br /&gt;
                    localInp.value = globalVars[vName];&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            updateBlockContent(pre, container, varsInBlock);&lt;br /&gt;
        });&lt;br /&gt;
    };&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
	<entry>
		<id>https://wiki.saya.loseyourip.com/index.php?title=MediaWiki:Gadget-CodeGenerator.js&amp;diff=155</id>
		<title>MediaWiki:Gadget-CodeGenerator.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.saya.loseyourip.com/index.php?title=MediaWiki:Gadget-CodeGenerator.js&amp;diff=155"/>
		<updated>2026-02-14T17:18:11Z</updated>

		<summary type="html">&lt;p&gt;Saya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mw.loader.using([&#039;mediawiki.util&#039;]).then(function () {&lt;br /&gt;
&lt;br /&gt;
    // --- Globale Variablen ---&lt;br /&gt;
    const globalVars = {};&lt;br /&gt;
    const seenVars = new Set();&lt;br /&gt;
    const variableBlocks = {};&lt;br /&gt;
&lt;br /&gt;
    // Leiste oben - Initial ausgeblendet&lt;br /&gt;
    const bar = document.createElement(&#039;div&#039;);&lt;br /&gt;
    bar.id = &#039;global-var-bar&#039;;&lt;br /&gt;
    bar.style.display = &#039;none&#039;; // Wird erst eingeblendet, wenn Variablen gefunden werden&lt;br /&gt;
    bar.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
    bar.style.alignItems = &#039;center&#039;;&lt;br /&gt;
    bar.style.gap = &#039;8px&#039;;&lt;br /&gt;
    bar.style.padding = &#039;8px&#039;;&lt;br /&gt;
    bar.style.border = &#039;1px solid #bbb&#039;;&lt;br /&gt;
    bar.style.borderRadius = &#039;6px&#039;;&lt;br /&gt;
    bar.style.background = &#039;#f5f5f5&#039;;&lt;br /&gt;
    bar.style.marginBottom = &#039;12px&#039;;&lt;br /&gt;
    document.querySelector(&#039;#content&#039;).prepend(bar);&lt;br /&gt;
&lt;br /&gt;
    const applyAllBtn = document.createElement(&#039;button&#039;);&lt;br /&gt;
    applyAllBtn.textContent = &#039;→ Auf alle anwenden&#039;;&lt;br /&gt;
    applyAllBtn.style.padding = &#039;4px 8px&#039;;&lt;br /&gt;
    applyAllBtn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    applyAllBtn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
    applyAllBtn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
    applyAllBtn.style.background = &#039;#eee&#039;;&lt;br /&gt;
    applyAllBtn.style.marginLeft = &#039;auto&#039;;&lt;br /&gt;
    bar.appendChild(applyAllBtn);&lt;br /&gt;
&lt;br /&gt;
    function addVarOnce(varName, defaultValue = &#039;&#039;) {&lt;br /&gt;
        // Leiste anzeigen, sobald eine Variable existiert&lt;br /&gt;
        bar.style.display = &#039;flex&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (seenVars.has(varName)) return;&lt;br /&gt;
        seenVars.add(varName);&lt;br /&gt;
&lt;br /&gt;
        // FIX: Klammern direkt im Speicher initialisieren&lt;br /&gt;
        const formattedValue = defaultValue.startsWith(&#039;{{&#039;) ? defaultValue : `{{${defaultValue}}}`;&lt;br /&gt;
        globalVars[varName] = formattedValue;&lt;br /&gt;
&lt;br /&gt;
        const lbl = document.createElement(&#039;label&#039;);&lt;br /&gt;
        lbl.style.display = &#039;flex&#039;;&lt;br /&gt;
        lbl.style.flexDirection = &#039;column&#039;;&lt;br /&gt;
        lbl.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        lbl.style.color = &#039;#333&#039;;&lt;br /&gt;
&lt;br /&gt;
        const span = document.createElement(&#039;span&#039;);&lt;br /&gt;
        span.textContent = varName + &#039;:&#039;;&lt;br /&gt;
        lbl.appendChild(span);&lt;br /&gt;
&lt;br /&gt;
        const inp = document.createElement(&#039;input&#039;);&lt;br /&gt;
        inp.type = &#039;text&#039;;&lt;br /&gt;
        inp.value = formattedValue;&lt;br /&gt;
        inp.dataset.varId = varName;&lt;br /&gt;
        inp.style.width = &#039;120px&#039;;&lt;br /&gt;
        inp.style.padding = &#039;2px 4px&#039;;&lt;br /&gt;
        inp.style.border = &#039;1px solid #ccc&#039;;&lt;br /&gt;
        inp.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        inp.style.fontFamily = &#039;monospace&#039;;&lt;br /&gt;
        inp.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        lbl.appendChild(inp);&lt;br /&gt;
&lt;br /&gt;
        inp.addEventListener(&#039;input&#039;, () =&amp;gt; {&lt;br /&gt;
            globalVars[varName] = inp.value;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        bar.insertBefore(lbl, applyAllBtn);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- Hilfsfunktionen ---&lt;br /&gt;
    function copyText(text, btn) {&lt;br /&gt;
        const plainText = text.replace(/&amp;lt;[^&amp;gt;]+&amp;gt;/g, &#039;&#039;);&lt;br /&gt;
        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
            navigator.clipboard.writeText(plainText).then(() =&amp;gt; success());&lt;br /&gt;
        } else {&lt;br /&gt;
            const textarea = document.createElement(&amp;quot;textarea&amp;quot;);&lt;br /&gt;
            textarea.value = plainText;&lt;br /&gt;
            document.body.appendChild(textarea);&lt;br /&gt;
            textarea.select();&lt;br /&gt;
            document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
            document.body.removeChild(textarea);&lt;br /&gt;
            success();&lt;br /&gt;
        }&lt;br /&gt;
        function success() {&lt;br /&gt;
            btn.textContent = &amp;quot;✅ Kopiert!&amp;quot;;&lt;br /&gt;
            setTimeout(() =&amp;gt; btn.textContent = &amp;quot;📋 Kopieren&amp;quot;, 1500);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightPlaceholdersAndValues(code, replacements) {&lt;br /&gt;
        let highlighted = code.replace(/{{(\w+)}}/g, &#039;&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;{{$1}}&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
        Object.keys(replacements).forEach(varName =&amp;gt; {&lt;br /&gt;
            const val = replacements[varName];&lt;br /&gt;
            if (!val) return;&lt;br /&gt;
            const escapedVal = val.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
            const re = new RegExp(escapedVal, &#039;g&#039;);&lt;br /&gt;
&lt;br /&gt;
            highlighted = highlighted.replace(/(&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;.*?&amp;lt;\/span&amp;gt;|[^&amp;lt;]+)/g, segment =&amp;gt; {&lt;br /&gt;
                if (segment.startsWith(&#039;&amp;lt;span class=&amp;quot;placeholder&amp;quot;&amp;gt;&#039;)) return segment;&lt;br /&gt;
                return segment.replace(re, `&amp;lt;span class=&amp;quot;value&amp;quot;&amp;gt;${val}&amp;lt;/span&amp;gt;`);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
        return highlighted;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateBlockContent(pre, inputWrapper, varsInBlock) {&lt;br /&gt;
        const currentValues = {};&lt;br /&gt;
        let updated = pre.dataset.originalCode;&lt;br /&gt;
        varsInBlock.forEach(vv =&amp;gt; {&lt;br /&gt;
            const val = inputWrapper.querySelector(`input[data-var-id=&amp;quot;${vv}&amp;quot;]`).value;&lt;br /&gt;
            updated = updated.replace(new RegExp(`{{${vv}}}`, &#039;g&#039;), val);&lt;br /&gt;
            currentValues[vv] = val;&lt;br /&gt;
        });&lt;br /&gt;
        pre.innerHTML = highlightPlaceholdersAndValues(updated, currentValues);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- Block Initialisierung ---&lt;br /&gt;
    function initDynamicCodeBlock(pre) {&lt;br /&gt;
        if (pre.dataset.dynamicInit) return;&lt;br /&gt;
        pre.dataset.dynamicInit = true;&lt;br /&gt;
&lt;br /&gt;
        const originalCode = pre.textContent;&lt;br /&gt;
        pre.dataset.originalCode = originalCode;&lt;br /&gt;
&lt;br /&gt;
        const regex = /{{(\w+)}}/g;&lt;br /&gt;
        const varsInBlock = [];&lt;br /&gt;
        let match;&lt;br /&gt;
        while ((match = regex.exec(originalCode)) !== null) {&lt;br /&gt;
            if (!varsInBlock.includes(match[1])) varsInBlock.push(match[1]);&lt;br /&gt;
        }&lt;br /&gt;
        if (varsInBlock.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.display = &#039;flex&#039;;&lt;br /&gt;
        container.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
        container.style.alignItems = &#039;center&#039;;&lt;br /&gt;
        container.style.justifyContent = &#039;space-between&#039;;&lt;br /&gt;
        container.style.gap = &#039;6px&#039;;&lt;br /&gt;
        container.style.marginBottom = &#039;4px&#039;;&lt;br /&gt;
        container.style.padding = &#039;4px 6px&#039;;&lt;br /&gt;
        container.style.border = &#039;1px solid #ddd&#039;;&lt;br /&gt;
        container.style.borderRadius = &#039;6px&#039;;&lt;br /&gt;
        container.style.background = &#039;#f5f5f5&#039;;&lt;br /&gt;
&lt;br /&gt;
        const inputWrapper = document.createElement(&#039;div&#039;);&lt;br /&gt;
        inputWrapper.style.display = &#039;flex&#039;;&lt;br /&gt;
        inputWrapper.style.flexWrap = &#039;wrap&#039;;&lt;br /&gt;
        inputWrapper.style.gap = &#039;6px&#039;;&lt;br /&gt;
        container.appendChild(inputWrapper);&lt;br /&gt;
&lt;br /&gt;
        varsInBlock.forEach(v =&amp;gt; {&lt;br /&gt;
            const lbl = document.createElement(&#039;label&#039;);&lt;br /&gt;
            lbl.style.display = &#039;flex&#039;;&lt;br /&gt;
            lbl.style.flexDirection = &#039;column&#039;;&lt;br /&gt;
            lbl.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
            lbl.style.color = &#039;#333&#039;;&lt;br /&gt;
            lbl.textContent = v;&lt;br /&gt;
&lt;br /&gt;
            const inp = document.createElement(&#039;input&#039;);&lt;br /&gt;
            inp.type = &#039;text&#039;;&lt;br /&gt;
            inp.value = `{{${v}}}`;&lt;br /&gt;
            inp.dataset.varId = v;&lt;br /&gt;
            inp.style.width = &#039;120px&#039;;&lt;br /&gt;
            inp.style.padding = &#039;2px 4px&#039;;&lt;br /&gt;
            inp.style.border = &#039;1px solid #ccc&#039;;&lt;br /&gt;
            inp.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
            inp.style.fontFamily = &#039;monospace&#039;;&lt;br /&gt;
            inp.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
&lt;br /&gt;
            lbl.appendChild(inp);&lt;br /&gt;
            inputWrapper.appendChild(lbl);&lt;br /&gt;
            inp.addEventListener(&#039;input&#039;, () =&amp;gt; updateBlockContent(pre, inputWrapper, varsInBlock));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        const btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
        btn.textContent = &#039;📋 Kopieren&#039;;&lt;br /&gt;
        btn.style.padding = &#039;2px 6px&#039;;&lt;br /&gt;
        btn.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        btn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        btn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
        btn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        btn.style.background = &#039;#eee&#039;;&lt;br /&gt;
        btn.onclick = () =&amp;gt; copyText(pre.innerHTML, btn);&lt;br /&gt;
&lt;br /&gt;
        container.appendChild(btn);&lt;br /&gt;
        pre.parentNode.insertBefore(container, pre);&lt;br /&gt;
        pre.innerHTML = highlightPlaceholdersAndValues(originalCode, {});&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initStaticCodeBlock(pre) {&lt;br /&gt;
        if (pre.dataset.staticInit) return;&lt;br /&gt;
        pre.dataset.staticInit = true;&lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.position = &#039;relative&#039;;&lt;br /&gt;
        container.style.marginBottom = &#039;6px&#039;;&lt;br /&gt;
        pre.parentNode.replaceChild(container, pre);&lt;br /&gt;
        container.appendChild(pre);&lt;br /&gt;
&lt;br /&gt;
        const btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
        btn.textContent = &#039;📋 Kopieren&#039;;&lt;br /&gt;
        btn.style.position = &#039;absolute&#039;;&lt;br /&gt;
        btn.style.top = &#039;4px&#039;;&lt;br /&gt;
        btn.style.right = &#039;4px&#039;;&lt;br /&gt;
        btn.style.padding = &#039;2px 6px&#039;;&lt;br /&gt;
        btn.style.fontSize = &#039;12px&#039;;&lt;br /&gt;
        btn.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        btn.style.border = &#039;1px solid #888&#039;;&lt;br /&gt;
        btn.style.borderRadius = &#039;4px&#039;;&lt;br /&gt;
        btn.style.background = &#039;#eee&#039;;&lt;br /&gt;
        btn.onclick = () =&amp;gt; copyText(pre.textContent, btn);&lt;br /&gt;
        container.appendChild(btn);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPage() {&lt;br /&gt;
        const dynamicBlocks = document.querySelectorAll(&#039;pre.dynamic-code&#039;);&lt;br /&gt;
        const staticBlocks = document.querySelectorAll(&#039;pre.static-code&#039;);&lt;br /&gt;
        &lt;br /&gt;
        dynamicBlocks.forEach(initDynamicCodeBlock);&lt;br /&gt;
        staticBlocks.forEach(initStaticCodeBlock);&lt;br /&gt;
&lt;br /&gt;
        dynamicBlocks.forEach(pre =&amp;gt; {&lt;br /&gt;
            const regex = /{{(\w+)}}/g;&lt;br /&gt;
            let match;&lt;br /&gt;
            while ((match = regex.exec(pre.dataset.originalCode || pre.textContent)) !== null) {&lt;br /&gt;
                const varName = match[1];&lt;br /&gt;
                addVarOnce(varName, varName);&lt;br /&gt;
                if (!variableBlocks[varName]) variableBlocks[varName] = [];&lt;br /&gt;
                if (!variableBlocks[varName].includes(pre)) variableBlocks[varName].push(pre);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPage);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPage();&lt;br /&gt;
    }&lt;br /&gt;
    mw.hook(&#039;wikipage.content&#039;).add(initPage);&lt;br /&gt;
&lt;br /&gt;
    const style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.textContent = `&lt;br /&gt;
        .placeholder { color: #d14; font-weight: bold; }&lt;br /&gt;
        .value { color: #1a73e8; font-weight: bold; }&lt;br /&gt;
    `;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
&lt;br /&gt;
    applyAllBtn.onclick = () =&amp;gt; {&lt;br /&gt;
        const allPreBlocks = new Set();&lt;br /&gt;
        Object.values(variableBlocks).forEach(list =&amp;gt; list.forEach(p =&amp;gt; allPreBlocks.add(p)));&lt;br /&gt;
&lt;br /&gt;
        allPreBlocks.forEach(pre =&amp;gt; {&lt;br /&gt;
            const container = pre.previousSibling;&lt;br /&gt;
            if (!container || !container.querySelector) return;&lt;br /&gt;
&lt;br /&gt;
            const varsInBlock = [];&lt;br /&gt;
            const regex = /{{(\w+)}}/g;&lt;br /&gt;
            let match;&lt;br /&gt;
            while ((match = regex.exec(pre.dataset.originalCode)) !== null) {&lt;br /&gt;
                if (!varsInBlock.includes(match[1])) varsInBlock.push(match[1]);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            varsInBlock.forEach(vName =&amp;gt; {&lt;br /&gt;
                const localInp = container.querySelector(`input[data-var-id=&amp;quot;${vName}&amp;quot;]`);&lt;br /&gt;
                if (localInp &amp;amp;&amp;amp; globalVars[vName] !== undefined) {&lt;br /&gt;
                    localInp.value = globalVars[vName];&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            updateBlockContent(pre, container, varsInBlock);&lt;br /&gt;
        });&lt;br /&gt;
    };&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Saya</name></author>
	</entry>
</feed>