<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Byte Roast Blog</title>
        <link>https://byteroast.fr/de/blog</link>
        <description>Byte Roast Blog</description>
        <lastBuildDate>Tue, 20 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>de</language>
        <item>
            <title><![CDATA[Roastgate 0.2.0]]></title>
            <link>https://byteroast.fr/de/blog/roastgate-0.2.0</link>
            <guid>https://byteroast.fr/de/blog/roastgate-0.2.0</guid>
            <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Roastgate 0.2.0 ist da: Du kannst jetzt wählen, was Besucher außerhalb deiner Whitelists bekommen, statt des standardmäßigen 403 von nginx.]]></description>
            <content:encoded><![CDATA[<p><strong>Roastgate 0.2.0</strong> ist da: Du kannst jetzt wählen, was Besucher außerhalb deiner Whitelists bekommen, statt des standardmäßigen 403 von nginx.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wähle-wie-abgewiesene-besucher-beantwortet-werden">Wähle, wie abgewiesene Besucher beantwortet werden<a href="https://byteroast.fr/de/blog/roastgate-0.2.0#w%C3%A4hle-wie-abgewiesene-besucher-beantwortet-werden" class="hash-link" aria-label="Direkter Link zur Wähle, wie abgewiesene Besucher beantwortet werden" title="Direkter Link zur Wähle, wie abgewiesene Besucher beantwortet werden" translate="no">​</a></h2>
<p>Bisher hat ein durch eine Whitelist eingeschränkter Proxy oder eine Site allen anderen mit dem nginx-eigenen <strong>403 Forbidden</strong> geantwortet. Das funktioniert, verrät der Welt aber auch, dass hinter dieser Domain etwas läuft.</p>
<p>Der Tab <strong>Access</strong> des Assistenten hat jetzt eine Einstellung <strong>Visitors outside the whitelists</strong>, für Reverse Proxies und gehostete Sites gleichermaßen:</p>
<table><thead><tr><th>Auswahl</th><th>Antwort</th><th>Wann verwenden</th></tr></thead><tbody><tr><td><strong>Forbidden</strong> (Standard)</td><td><code>403</code></td><td>das übliche Verhalten von nginx, für bestehende Konfigurationen ändert sich nichts</td></tr><tr><td><strong>Not found</strong></td><td><code>404</code></td><td>verbirgt, dass die Site existiert</td></tr><tr><td><strong>Close the connection</strong></td><td><code>444</code></td><td>nginx bricht die Verbindung ab, ohne etwas zu senden</td></tr><tr><td><strong>Redirect</strong></td><td><code>302</code> zu einer Adresse deiner Wahl</td><td>Besucher zum Beispiel auf deine Hauptwebsite schicken</td></tr></tbody></table>
<p>Wie immer zeigt der Vorschau-Tab genau, was geschrieben wird. Mit einem 404 sieht der Whitelist-Teil der Konfiguration so aus:</p>
<div class="language-nginx codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-nginx codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">include /etc/nginx/whitelists/office.conf;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">deny all;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">error_page 403 = @rg_denied;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">location @rg_denied {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    allow all;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    return 404;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_mzLb alert alert--info"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_IbPD"><p>Die Antwort ersetzt <strong>jedes</strong> 403 des Servers, nicht nur die der Whitelists: Andere Ablehnungen, etwa blockierte Dotfiles, erhalten dieselbe Antwort.</p></div></div>
<p>Einige Schutzmechanismen kommen dazu:</p>
<ul>
<li class="">Die Einstellung erfordert <strong>mindestens eine Whitelist</strong>: Ohne sie wird niemand abgewiesen, und der Assistent weist dich darauf hin.</li>
<li class="">Die Weiterleitungsadresse wird geprüft, bevor sie in die Datei gelangt: <code>http://</code> oder <code>https://</code>, ein Host, optional Port, Pfad und Query-String, und nichts, was aus der <code>return</code>-Zeile ausbrechen könnte.</li>
<li class="">Die Let's-Encrypt-Challenge bleibt für alle erreichbar, damit Zertifikatserneuerungen unabhängig von deiner Wahl weiter funktionieren.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="wieder-öffnen-und-importieren">Wieder öffnen und importieren<a href="https://byteroast.fr/de/blog/roastgate-0.2.0#wieder-%C3%B6ffnen-und-importieren" class="hash-link" aria-label="Direkter Link zur Wieder öffnen und importieren" title="Direkter Link zur Wieder öffnen und importieren" translate="no">​</a></h3>
<p>Die Einstellung wird aus der Datei zurückgelesen: Das erneute Öffnen einer Konfiguration im Assistenten oder der <a class="" href="https://byteroast.fr/de/blog/roastgate-0.1.0#importing-hand-written-configs">Import einer handgeschriebenen Konfiguration</a> stellt die Auswahl und die Weiterleitungsadresse wieder her. Wenn die Zeile <code>error_page 403 = @rg_denied;</code> oder ihr Block <code>location @rg_denied</code> von Hand so verändert wurde, dass der Assistent sie nicht reproduzieren kann, wird der Import mit Zeilennummer und Begründung abgelehnt, und die Datei bleibt als Rohtext bearbeitbar.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="für-mitwirkende">Für Mitwirkende<a href="https://byteroast.fr/de/blog/roastgate-0.2.0#f%C3%BCr-mitwirkende" class="hash-link" aria-label="Direkter Link zur Für Mitwirkende" title="Direkter Link zur Für Mitwirkende" translate="no">​</a></h2>
<p>Das Projekt hat außerdem bekommen, was es braucht, um Beiträge willkommen zu heißen:</p>
<ul>
<li class="">Einen <a href="https://github.com/ByteRoast/Roastgate/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">Leitfaden für Beiträge</a> zu Codestil, Tests, Commits und der Lizenzvereinbarung für Mitwirkende.</li>
<li class="">Eine <a href="https://github.com/ByteRoast/Roastgate/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">Sicherheitsrichtlinie</a>, um Sicherheitslücken vertraulich zu melden.</li>
<li class="">Issue-Formulare und eine Vorlage für Pull Requests.</li>
</ul>
<p>Das Image unter <code>ghcr.io/byteroast/roastgate</code> ist jetzt öffentlich: Zum Herunterladen ist kein <code>docker login</code> mehr nötig.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wie-bekomme-ich-roastgate-020">Wie bekomme ich Roastgate 0.2.0?<a href="https://byteroast.fr/de/blog/roastgate-0.2.0#wie-bekomme-ich-roastgate-020" class="hash-link" aria-label="Direkter Link zur Wie bekomme ich Roastgate 0.2.0?" title="Direkter Link zur Wie bekomme ich Roastgate 0.2.0?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="update">Update<a href="https://byteroast.fr/de/blog/roastgate-0.2.0#update" class="hash-link" aria-label="Direkter Link zur Update" title="Direkter Link zur Update" translate="no">​</a></h3>
<p>Aus dem Ordner, der <code>docker-compose.yml</code> enthält:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker compose pull</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div></code></pre></div></div>
<p>Die Compose-Datei hat in diesem Release nur zwei Kommentare verloren: Du musst sie nicht erneut herunterladen.</p>
<div class="theme-admonition theme-admonition-warning admonition_mzLb alert alert--warning"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Alpha</div><div class="admonitionContent_IbPD"><p>Roastgate befindet sich noch in den Alpha-Versionen <code>0.x</code>. Sichere das Volume <code>roastgate-data</code> vor dem Update:</p><div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -v roastgate-data:/data -v "$PWD":/backup alpine tar czf /backup/roastgate-data.tgz -C /data .</span><br></div></code></pre></div></div></div></div>
<p>Um bei dieser Version zu bleiben, verwende in <code>docker-compose.yml</code> den Tag <code>0.2.0</code> statt <code>latest</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="neuinstallation">Neuinstallation<a href="https://byteroast.fr/de/blog/roastgate-0.2.0#neuinstallation" class="hash-link" aria-label="Direkter Link zur Neuinstallation" title="Direkter Link zur Neuinstallation" translate="no">​</a></h3>
<p>Folge der <a class="" href="https://byteroast.fr/de/docs/roastgate/installation">Installationsanleitung</a> oder dem Beitrag <a class="" href="https://byteroast.fr/de/blog/roastgate-0.1.0#how-can-i-get-roastgate">Vorstellung von Roastgate 0.1.0</a>: Die Schritte sind dieselben.</p>
<hr>
<ul>
<li class=""><a href="https://github.com/ByteRoast/Roastgate" target="_blank" rel="noopener noreferrer" class="">Roastgate auf GitHub</a></li>
<li class=""><a href="https://github.com/ByteRoast/Roastgate/releases/tag/v0.2.0" target="_blank" rel="noopener noreferrer" class="">Release 0.2.0</a></li>
<li class=""><a href="https://github.com/ByteRoast/Roastgate/issues" target="_blank" rel="noopener noreferrer" class="">Probleme melden</a></li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>roastgate</category>
            <category>nginx</category>
            <category>docker</category>
            <category>dotnet</category>
            <category>self-hosted</category>
        </item>
        <item>
            <title><![CDATA[Music Sharity wird eingestellt]]></title>
            <link>https://byteroast.fr/de/blog/music-sharity-discontinued</link>
            <guid>https://byteroast.fr/de/blog/music-sharity-discontinued</guid>
            <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Music Sharity wird offiziell eingestellt. Das Repository ist jetzt archiviert und das Projekt wird nicht mehr gepflegt.]]></description>
            <content:encoded><![CDATA[<p><strong>Music Sharity</strong> wird offiziell eingestellt. Das Repository ist jetzt archiviert und das Projekt wird nicht mehr gepflegt.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="warum">Warum?<a href="https://byteroast.fr/de/blog/music-sharity-discontinued#warum" class="hash-link" aria-label="Direkter Link zur Warum?" title="Direkter Link zur Warum?" translate="no">​</a></h2>
<p>Vom ersten Tag an war <a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity</a> vollständig von der <a href="https://odesli.co/" target="_blank" rel="noopener noreferrer" class="">Odesli-API</a> (auch bekannt als song.link) abhängig, um Links zwischen Streamingplattformen umzuwandeln. Odesli hat die ganze Schwerarbeit erledigt: Titel und Alben zwischen den Diensten zuordnen und die passenden Links zurückgeben.</p>
<p>Diese API wurde abgeschaltet. Ohne sie kann Music Sharity schlicht nichts mehr umwandeln.</p>
<div class="theme-admonition theme-admonition-danger admonition_mzLb alert alert--danger"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>gefahr</div><div class="admonitionContent_IbPD"><p>Da die Umwandlung vollständig von Odesli abhing, können die bestehenden Versionen von Music Sharity (Android, Windows, Linux und Web) keine Links mehr umwandeln.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="warum-nicht-neu-bauen">Warum nicht neu bauen?<a href="https://byteroast.fr/de/blog/music-sharity-discontinued#warum-nicht-neu-bauen" class="hash-link" aria-label="Direkter Link zur Warum nicht neu bauen?" title="Direkter Link zur Warum nicht neu bauen?" translate="no">​</a></h2>
<p>Der einzige realistische Weg, Odesli zu ersetzen, wäre, die Umwandlung auf Web-Scraping jeder einzelnen Streamingplattform aufzubauen. Das ist fragil, schwer zu warten und nichts, was ich für dieses Projekt verfolgen möchte.</p>
<p>Anstatt eine kaputte App am Leben zu halten, habe ich mich daher entschieden, die Entwicklung einzustellen und das Repository zu archivieren.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="auf-der-suche-nach-einer-alternative">Auf der Suche nach einer Alternative?<a href="https://byteroast.fr/de/blog/music-sharity-discontinued#auf-der-suche-nach-einer-alternative" class="hash-link" aria-label="Direkter Link zur Auf der Suche nach einer Alternative?" title="Direkter Link zur Auf der Suche nach einer Alternative?" translate="no">​</a></h2>
<p>Wenn du Musik zwischen Streamingplattformen teilen möchtest, schau dir <strong><a href="https://songport.link/" target="_blank" rel="noopener noreferrer" class="">SongPort</a></strong> an. Es kann alles, was Music Sharity konnte, und das noch viel besser.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="was-passiert-mit-dem-code">Was passiert mit dem Code?<a href="https://byteroast.fr/de/blog/music-sharity-discontinued#was-passiert-mit-dem-code" class="hash-link" aria-label="Direkter Link zur Was passiert mit dem Code?" title="Direkter Link zur Was passiert mit dem Code?" translate="no">​</a></h2>
<p>Der Code bleibt als Referenz auf <a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">GitHub</a> verfügbar, unter der <strong>GPL v3</strong>-Lizenz. Du kannst ihn gerne durchstöbern, forken oder daraus lernen.</p>
<p>Einige Arbeiten nach dem <a class="" href="https://byteroast.fr/de/blog/music-sharity-1.1.1">Release 1.1.1</a> haben es nie in einen offiziellen Build geschafft, etwa die Seite mit dem Umwandlungsverlauf und einer unteren Navigationsleiste. Wenn du neugierig bist, findest du alles im Repository.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="danke">Danke<a href="https://byteroast.fr/de/blog/music-sharity-discontinued#danke" class="hash-link" aria-label="Direkter Link zur Danke" title="Direkter Link zur Danke" translate="no">​</a></h2>
<p>Danke an alle, die Music Sharity ausprobiert, Probleme gemeldet oder Feedback gegeben haben. Es hat Spaß gemacht, dieses Projekt zu bauen, und ich habe dabei viel gelernt.</p>
<hr>
<ul>
<li class=""><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity auf GitHub</a> (archiviert)</li>
<li class=""><a href="https://songport.link/" target="_blank" rel="noopener noreferrer" class="">SongPort</a></li>
</ul>]]></content:encoded>
            <category>music sharity</category>
            <category>discontinued</category>
        </item>
        <item>
            <title><![CDATA[Vorstellung von Roastgate 0.1.0]]></title>
            <link>https://byteroast.fr/de/blog/roastgate-0.1.0</link>
            <guid>https://byteroast.fr/de/blog/roastgate-0.1.0</guid>
            <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Die erste Version von Roastgate ist da: eine selbst gehostete Weboberfläche, die das bereits auf deinem Server installierte nginx steuert. Dein /etc/nginx bleibt die einzige Quelle der Wahrheit.]]></description>
            <content:encoded><![CDATA[<p>Die erste Version von <strong>Roastgate</strong> ist da: eine selbst gehostete Weboberfläche, die das bereits auf deinem Server installierte nginx steuert. Dein <code>/etc/nginx</code> bleibt die einzige Quelle der Wahrheit.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="was-ist-roastgate">Was ist Roastgate?<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#was-ist-roastgate" class="hash-link" aria-label="Direkter Link zur Was ist Roastgate?" title="Direkter Link zur Was ist Roastgate?" translate="no">​</a></h2>
<p><a href="https://github.com/ByteRoast/Roastgate" target="_blank" rel="noopener noreferrer" class="">Roastgate</a> ist eine Weboberfläche, die in einem Docker-Container neben deinem nginx läuft. Sie verwaltet <strong>Reverse Proxies</strong>, <strong>gehostete Sites</strong>, <strong>IP-Whitelists</strong> und <strong>Let's-Encrypt-Zertifikate</strong>, ohne jemals die nginx-eigenen Dateien zu verlassen.</p>
<p>Kein eigenes Format, keine versteckte Datenbank mit Konfigurationen: Roastgate liest und schreibt die normalen nginx-Dateien (<code>conf.d/</code>, <code>sites-available/</code>, <code>sites-enabled/</code>). Du kannst sie weiterhin von Hand bearbeiten und jederzeit aufhören, Roastgate zu nutzen. Deine Dateien bleiben, wo sie sind.</p>
<div class="theme-admonition theme-admonition-warning admonition_mzLb alert alert--warning"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Alpha</div><div class="admonitionContent_IbPD"><p>Roastgate befindet sich in den Alpha-Versionen <code>0.x</code>: Einstellungen, das Datenbankschema und das Verhalten können sich zwischen Versionen ändern. Sichere das Datenvolume vor jedem Update.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="was-es-verwaltet">Was es verwaltet<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#was-es-verwaltet" class="hash-link" aria-label="Direkter Link zur Was es verwaltet" title="Direkter Link zur Was es verwaltet" translate="no">​</a></h2>
<table><thead><tr><th>Bereich</th><th>Inhalt</th><th>Aktivierung</th></tr></thead><tbody><tr><td><code>conf.d/</code></td><td>Reverse Proxies</td><td><code>.conf</code> und <code>.conf.disabled</code></td></tr><tr><td><code>sites-available/</code></td><td>gehostete Sites</td><td>Symlink in <code>sites-enabled/</code></td></tr><tr><td><code>whitelists/&lt;name&gt;.conf</code></td><td><code>allow &lt;ip&gt;;</code>-Zeilen</td><td>aus deinen Konfigurationen eingebunden</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="ein-sicherer-änderungszyklus">Ein sicherer Änderungszyklus<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#ein-sicherer-%C3%A4nderungszyklus" class="hash-link" aria-label="Direkter Link zur Ein sicherer Änderungszyklus" title="Direkter Link zur Ein sicherer Änderungszyklus" translate="no">​</a></h3>
<p>Jede Änderung durchläuft denselben Zyklus:</p>
<!-- -->
<p>Schreibvorgänge sind atomar (temporäre Datei, dann Umbenennung) und behalten die ursprünglichen Dateiberechtigungen bei. Die 30 neuesten Backups jeder Datei werden aufbewahrt, und auf der Seite <strong>Backups</strong> kannst du jede Version mit der aktuellen Datei vergleichen und wiederherstellen.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="funktionen">Funktionen<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#funktionen" class="hash-link" aria-label="Direkter Link zur Funktionen" title="Direkter Link zur Funktionen" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="erstellungsassistent">Erstellungsassistent<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#erstellungsassistent" class="hash-link" aria-label="Direkter Link zur Erstellungsassistent" title="Direkter Link zur Erstellungsassistent" translate="no">​</a></h3>
<p>Beschreibe einen Reverse Proxy oder eine statische Site in einem Formular und Roastgate schreibt die nginx-Konfiguration: WebSockets, HTTPS mit optionaler Weiterleitung, HTTP/2, HSTS, Upload-Limit, Timeouts, Sicherheits-Header, Whitelists, die Let's-Encrypt-Challenge und freie Direktiven für alles andere. Ein Vorschau-Tab zeigt genau, was geschrieben wird.</p>
<ul>
<li class=""><strong>Sicher durch Konstruktion</strong>: Jeder Wert wird anhand eines strengen Musters geprüft, bevor er in die Datei gelangt.</li>
<li class=""><strong>Kennt dein nginx</strong>: HTTP/2 wird ab nginx 1.25.1 als <code>http2 on;</code> geschrieben, davor als <code>listen ... ssl http2;</code>.</li>
<li class=""><strong>Wieder öffnbar</strong>: Die Einstellungen werden in einem Kommentar am Anfang der generierten Datei gespeichert, sodass das erneute Öffnen das Formular wiederherstellt. Wenn du die Datei von Hand bearbeitet hast, warnt dich der Assistent, bevor er deine Änderungen ersetzt.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="importing-hand-written-configs">Import von handgeschriebenen Konfigurationen<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#importing-hand-written-configs" class="hash-link" aria-label="Direkter Link zur Import von handgeschriebenen Konfigurationen" title="Direkter Link zur Import von handgeschriebenen Konfigurationen" translate="no">​</a></h3>
<p>Du hast schon Konfigurationen? Öffne eine im Assistenten und ihre Einstellungen werden <strong>aus der Datei gelesen</strong>: Namen, Ports, Upstream, Zertifikat, Whitelists, Upload-Limit, WebSocket-Header, Timeouts, Weiterleitung. Alles, wofür das Formular kein Feld hat, bleibt als freie Direktiven erhalten, sodass nichts verloren geht.</p>
<p>Wenn eine Datei nicht originalgetreu reproduziert werden kann (ein <code>upstream</code> auf oberster Ebene, ein <code>server_name</code> als Regex, mehr als zwei Server-Blöcke …), wird sie mit Begründung abgelehnt und bleibt als Rohtext bearbeitbar.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="rohtext-bearbeitung">Rohtext-Bearbeitung<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#rohtext-bearbeitung" class="hash-link" aria-label="Direkter Link zur Rohtext-Bearbeitung" title="Direkter Link zur Rohtext-Bearbeitung" translate="no">​</a></h3>
<p>Jede Datei kann in einem <a href="https://github.com/microsoft/monaco-editor" target="_blank" rel="noopener noreferrer" class="">Monaco-Editor</a> mit nginx-Syntaxhervorhebung bearbeitet werden. Einen Proxy oder eine Site zu aktivieren oder zu deaktivieren, ist ein einziger Schalter.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="lets-encrypt-zertifikate">Let's-Encrypt-Zertifikate<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#lets-encrypt-zertifikate" class="hash-link" aria-label="Direkter Link zur Let's-Encrypt-Zertifikate" title="Direkter Link zur Let's-Encrypt-Zertifikate" translate="no">​</a></h3>
<p>Zertifikate auf der Seite <strong>Certificates</strong> beziehen, auflisten, erneuern und löschen.</p>
<ul>
<li class="">Nutze den <strong>eingebetteten certbot</strong> (im Image enthalten, von Roastgate zweimal täglich erneuert) oder den <strong>auf dem Host installierten</strong>.</li>
<li class="">Zertifikate werden aus den Dateien gelesen, die certbot pflegt: Domains, Aussteller, Ablaufdatum und welche deiner Konfigurationen sie verwenden.</li>
<li class="">nginx wird nur neu geladen, wenn sich ein Zertifikat wirklich geändert hat.</li>
<li class="">Ein <strong>Dry Run</strong> prüft deine Domains zuerst gegen den Staging-Server von Let's Encrypt.</li>
<li class="">Ein Zertifikat, das noch von einer Konfiguration verwendet wird, kann nicht gelöscht werden.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_mzLb alert alert--info"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_IbPD"><p>Wildcard-Zertifikate benötigen eine DNS-Challenge und werden nicht unterstützt.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="ip-whitelists">IP-Whitelists<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#ip-whitelists" class="hash-link" aria-label="Direkter Link zur IP-Whitelists" title="Direkter Link zur IP-Whitelists" translate="no">​</a></h3>
<ul>
<li class="">Ein Listeneditor mit strenger Prüfung von IPv4, IPv6 und CIDR-Bereichen (<code>10.0.0.5/24</code>, das nginx stillschweigend ignoriert, wird markiert).</li>
<li class="">Füge viele Adressen auf einmal ein, oder die Adresse, von der aus du verbunden bist, mit einem Klick.</li>
<li class="">Jede Whitelist zeigt, <strong>wo sie verwendet wird</strong>, und eine noch eingebundene Whitelist kann nicht gelöscht werden.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="sicherheit">Sicherheit<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#sicherheit" class="hash-link" aria-label="Direkter Link zur Sicherheit" title="Direkter Link zur Sicherheit" translate="no">​</a></h2>
<p>Roastgate steuert deinen Webserver: Wer Roastgate kontrolliert, ist in der Praxis root auf dem Host. Deshalb hat die Sicherheit in dieser ersten Version viel Aufmerksamkeit bekommen.</p>
<ul>
<li class=""><strong>Zwei-Faktor-Authentifizierung</strong> (TOTP) mit jeder Authenticator-App und zehn Einmal-Wiederherstellungscodes.</li>
<li class=""><strong>Passkeys</strong>: Anmeldung per Fingerabdruck, Gesicht, Geräte-PIN oder Sicherheitsschlüssel, allein oder als zweiter Schritt. Sobald ein Passkey existiert, reicht das Passwort allein nicht mehr aus.</li>
<li class=""><strong>Rate Limiting</strong>: 5 Fehlversuche pro 15 Minuten und Client-Adresse.</li>
<li class=""><strong>Widerruf von Sitzungen</strong>: Eine Passwortänderung beendet alle offenen Sitzungen auf allen Geräten.</li>
<li class=""><strong>Audit-Log</strong> jeder Anmeldung und jedes Fehlversuchs.</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_mzLb alert alert--danger"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Halte es privat</div><div class="admonitionContent_IbPD"><p>Lass den Port auf <code>127.0.0.1</code> und greife über einen SSH-Tunnel, ein VPN oder einen nginx-Server-Block zu, der durch eine Whitelist und HTTPS geschützt ist.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="how-can-i-get-roastgate">Wie bekomme ich Roastgate?<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#how-can-i-get-roastgate" class="hash-link" aria-label="Direkter Link zur Wie bekomme ich Roastgate?" title="Direkter Link zur Wie bekomme ich Roastgate?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="voraussetzungen">Voraussetzungen<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#voraussetzungen" class="hash-link" aria-label="Direkter Link zur Voraussetzungen" title="Direkter Link zur Voraussetzungen" translate="no">​</a></h3>
<ul>
<li class="">Ein Linux-Server mit <strong>auf dem Host installiertem nginx</strong> (Debian- und Ubuntu-Verzeichnisstrukturen werden unterstützt)</li>
<li class=""><strong>Docker</strong> mit dem Compose-Plugin</li>
<li class="">Optional: <code>certbot</code> auf dem Host</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="installation">Installation<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#installation" class="hash-link" aria-label="Direkter Link zur Installation" title="Direkter Link zur Installation" translate="no">​</a></h3>
<p>Du brauchst nur die Compose-Datei, nicht das ganze Repository. In einem Ordner deiner Wahl:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir roastgate &amp;&amp; cd roastgate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL -o docker-compose.yml https://raw.githubusercontent.com/ByteRoast/Roastgate/refs/heads/main/docker-compose.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker logs roastgate        # gibt das Setup-Token aus</span><br></div></code></pre></div></div>
<p>Oder mit PowerShell (<code>pwsh</code>):</p>
<div class="language-powershell codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-powershell codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">New-Item -ItemType Directory roastgate | Set-Location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Invoke-WebRequest -Uri https://raw.githubusercontent.com/ByteRoast/Roastgate/refs/heads/main/docker-compose.yml -OutFile docker-compose.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker logs roastgate        # gibt das Setup-Token aus</span><br></div></code></pre></div></div>
<p>Das Image wird unter <code>ghcr.io/byteroast/roastgate</code> veröffentlicht. Um bei dieser Version zu bleiben, verwende in <code>docker-compose.yml</code> den Tag <code>0.1.0</code> statt <code>latest</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="aus-dem-quellcode-bauen">Aus dem Quellcode bauen<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#aus-dem-quellcode-bauen" class="hash-link" aria-label="Direkter Link zur Aus dem Quellcode bauen" title="Direkter Link zur Aus dem Quellcode bauen" translate="no">​</a></h3>
<p>Um das Image selbst zu bauen, klone das Repository und baue es dort:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/ByteRoast/Roastgate.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd Roastgate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d --build</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="entwicklungs-image">Entwicklungs-Image<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#entwicklungs-image" class="hash-link" aria-label="Direkter Link zur Entwicklungs-Image" title="Direkter Link zur Entwicklungs-Image" translate="no">​</a></h3>
<p>Du willst die neuesten Änderungen zuerst? <code>docker-compose.dev.yml</code> ist dieselbe Compose-Datei, festgelegt auf das <code>dev</code>-Image, das jedem Push auf den <code>dev</code>-Branch folgt. Lade sie <strong>als <code>docker-compose.yml</code></strong> herunter, alle anderen Befehle bleiben gleich:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL -o docker-compose.yml https://raw.githubusercontent.com/ByteRoast/Roastgate/refs/heads/dev/docker-compose.dev.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose pull</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div></code></pre></div></div>
<div class="language-powershell codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-powershell codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">Invoke-WebRequest -Uri https://raw.githubusercontent.com/ByteRoast/Roastgate/refs/heads/dev/docker-compose.dev.yml -OutFile docker-compose.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose pull</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_mzLb alert alert--warning"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Instabil</div><div class="admonitionContent_IbPD"><p>Das <code>dev</code>-Image bekommt Änderungen zuerst und kann kaputtgehen. Beide Dateien nutzen denselben Container und dasselbe <code>roastgate-data</code>-Volume, ein Wechsel behält also dein Konto. Der Weg zurück von <code>dev</code> zu <code>latest</code> funktioniert jedoch nicht garantiert: <code>dev</code> hat die Datenbank womöglich bereits auf ein Schema aktualisiert, das <code>latest</code> nicht kennt. <strong>Sichere das Volume, bevor du <code>dev</code> ausprobierst.</strong></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="erster-start">Erster Start<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#erster-start" class="hash-link" aria-label="Direkter Link zur Erster Start" title="Direkter Link zur Erster Start" translate="no">​</a></h3>
<p>Öffne <code>http://127.0.0.1:8181</code> (von deinem eigenen Rechner aus liefert dir <code>ssh -L 8181:127.0.0.1:8181 user@server</code> diese Adresse) und folge der Einrichtung:</p>
<ol>
<li class="">Gib das <strong>Setup-Token</strong> aus den Logs ein</li>
<li class="">Lege das <strong>Administratorkonto</strong> an</li>
<li class="">Wähle die <strong>Pfade und Optionen</strong> (nginx-Verzeichnis, Whitelist-Verzeichnis, ACME-Webroot, certbot-Modus)</li>
<li class="">Prüfe die <strong>Host-Diagnose</strong></li>
<li class="">Fertig: Du wirst automatisch angemeldet</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="update">Update<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#update" class="hash-link" aria-label="Direkter Link zur Update" title="Direkter Link zur Update" translate="no">​</a></h3>
<p>Aus dem Ordner, der <code>docker-compose.yml</code> enthält:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker compose pull</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div></code></pre></div></div>
<p>Lade die Compose-Datei nur dann erneut herunter (derselbe <code>curl</code>- oder <code>Invoke-WebRequest</code>-Befehl wie oben), wenn die Release Notes sagen, dass sie sich geändert hat. Sie überschreibt deine Kopie, also wiederhole danach deine eigenen Anpassungen (Ports, Mounts, Setup-Token …). Wenn du aus dem Quellcode gebaut hast: <code>git pull</code>, dann <code>docker compose up -d --build</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="deine-daten-sichern">Deine Daten sichern<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#deine-daten-sichern" class="hash-link" aria-label="Direkter Link zur Deine Daten sichern" title="Direkter Link zur Deine Daten sichern" translate="no">​</a></h3>
<p>Die Datenbank liegt im Volume <code>roastgate-data</code>, sodass dein Konto und deine Backups Updates und <code>docker compose down</code> überstehen. Nur <code>docker compose down --volumes</code> (oder <code>docker volume rm roastgate-data</code>) löscht es. Zum Sichern:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -v roastgate-data:/data -v "$PWD":/backup alpine tar czf /backup/roastgate-data.tgz -C /data .</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="ausgesperrt">Ausgesperrt?<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#ausgesperrt" class="hash-link" aria-label="Direkter Link zur Ausgesperrt?" title="Direkter Link zur Ausgesperrt?" translate="no">​</a></h3>
<p>Passwort vergessen:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker exec -it roastgate roastgate reset-password</span><br></div></code></pre></div></div>
<p>Authenticator-App, Wiederherstellungscodes und Passkeys verloren:</p>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker exec roastgate roastgate disable-2fa</span><br></div></code></pre></div></div>
<p>Das schaltet die Zwei-Faktor-Authentifizierung ab, entfernt alle Passkeys und beendet alle Sitzungen, sodass du dich wieder nur mit dem Passwort anmelden kannst.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="deinstallation">Deinstallation<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#deinstallation" class="hash-link" aria-label="Direkter Link zur Deinstallation" title="Direkter Link zur Deinstallation" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_cGQC theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_jSw7"><pre tabindex="0" class="prism-code language-bash codeBlock_JIo3 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CYJB"><div class="token-line" style="color:#393A34"><span class="token plain">docker compose down            # behält das Datenvolume</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose down --volumes  # löscht auch Konto, Einstellungen und Backup-Verlauf</span><br></div></code></pre></div></div>
<p>Lösche dann den Ordner, der <code>docker-compose.yml</code> enthält, und das Image mit <code>docker image rm ghcr.io/byteroast/roastgate:latest</code> (oder dem Tag, den du verwendet hast). Deine nginx-Dateien bleiben, wo sie sind: Roastgate verschiebt sie nie.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="technische-details">Technische Details<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#technische-details" class="hash-link" aria-label="Direkter Link zur Technische Details" title="Direkter Link zur Technische Details" translate="no">​</a></h2>
<p>Roastgate ist mit <a href="https://github.com/dotnet/core" target="_blank" rel="noopener noreferrer" class="">.NET 10</a> und <a href="https://github.com/MudBlazor/MudBlazor" target="_blank" rel="noopener noreferrer" class="">MudBlazor</a> gebaut, mit <a href="https://github.com/serdarciplak/BlazorMonaco" target="_blank" rel="noopener noreferrer" class="">BlazorMonaco</a> für den Editor. Die Daten werden in SQLite gespeichert.</p>
<p>Der Container läuft <code>privileged</code> mit <code>pid: host</code>, damit er <code>nginx</code> und <code>certbot</code> über <code>nsenter</code> in den Namespaces des Hosts ausführen kann. Befehle werden nie über eine Shell ausgeführt.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="mitwirken">Mitwirken<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#mitwirken" class="hash-link" aria-label="Direkter Link zur Mitwirken" title="Direkter Link zur Mitwirken" translate="no">​</a></h2>
<p>Fehlerberichte, Ideen, Korrekturen an der Dokumentation und Code sind alle willkommen. Roastgate ist in der Alpha-Phase und wird nach bestem Bemühen gepflegt, Antworten können also ein paar Tage dauern.</p>
<ul>
<li class=""><strong>Einen Fehler gefunden oder ein Feature gewünscht?</strong> Eröffne ein Issue über die <a href="https://github.com/ByteRoast/Roastgate/issues/new/choose" target="_blank" rel="noopener noreferrer" class="">Issue-Formulare</a>. Bei allem, was über eine kleine Korrektur hinausgeht, warte auf eine Antwort, bevor du Code schreibst.</li>
<li class=""><strong>Du möchtest Code beitragen?</strong> Forke das Repository, erstelle deinen Branch von <strong><code>dev</code></strong> aus und öffne deinen Pull Request <strong>gegen <code>dev</code></strong>, nicht <code>main</code>. Der <a href="https://github.com/ByteRoast/Roastgate/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">Leitfaden für Beiträge</a> behandelt Codestil, Tests, Commits und die Lizenzvereinbarung für Mitwirkende.</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_mzLb alert alert--danger"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Eine Sicherheitslücke gefunden?</div><div class="admonitionContent_IbPD"><p>Eröffne kein öffentliches Issue. Melde sie vertraulich über <a href="https://github.com/ByteRoast/Roastgate/security/advisories/new" target="_blank" rel="noopener noreferrer" class="">GitHubs private Meldung von Sicherheitslücken</a>, wie in der <a href="https://github.com/ByteRoast/Roastgate/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">Sicherheitsrichtlinie</a> beschrieben. Nur das neueste Release und das <code>dev</code>-Image erhalten Sicherheitskorrekturen.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="lizenz">Lizenz<a href="https://byteroast.fr/de/blog/roastgate-0.1.0#lizenz" class="hash-link" aria-label="Direkter Link zur Lizenz" title="Direkter Link zur Lizenz" translate="no">​</a></h2>
<p>Roastgate ist freie Open-Source-Software unter der Lizenz <strong>AGPL-3.0-or-later</strong>.</p>
<hr>
<ul>
<li class=""><a href="https://github.com/ByteRoast/Roastgate" target="_blank" rel="noopener noreferrer" class="">Roastgate auf GitHub</a></li>
<li class=""><a href="https://github.com/ByteRoast/Roastgate/releases/tag/v0.1.0" target="_blank" rel="noopener noreferrer" class="">Release 0.1.0</a></li>
<li class=""><a href="https://github.com/ByteRoast/Roastgate/issues" target="_blank" rel="noopener noreferrer" class="">Probleme melden</a></li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>roastgate</category>
            <category>nginx</category>
            <category>docker</category>
            <category>dotnet</category>
            <category>self-hosted</category>
        </item>
        <item>
            <title><![CDATA[Music Sharity 1.1.1]]></title>
            <link>https://byteroast.fr/de/blog/music-sharity-1.1.1</link>
            <guid>https://byteroast.fr/de/blog/music-sharity-1.1.1</guid>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Patch-Update für Music Sharity: Behebung eines Problems beim Teilen unter Android]]></description>
            <content:encoded><![CDATA[<p>Patch-Update für <strong>Music Sharity</strong>: Behebung eines Problems beim Teilen unter Android</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="fehlerbehebung">Fehlerbehebung<a href="https://byteroast.fr/de/blog/music-sharity-1.1.1#fehlerbehebung" class="hash-link" aria-label="Direkter Link zur Fehlerbehebung" title="Direkter Link zur Fehlerbehebung" translate="no">​</a></h2>
<ul>
<li class=""><strong>Android</strong>: Abrufen der URL aus geteilten Inhalten korrigiert</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wie-bekomme-ich-music-sharity">Wie bekomme ich Music Sharity?<a href="https://byteroast.fr/de/blog/music-sharity-1.1.1#wie-bekomme-ich-music-sharity" class="hash-link" aria-label="Direkter Link zur Wie bekomme ich Music Sharity?" title="Direkter Link zur Wie bekomme ich Music Sharity?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="android">Android<a href="https://byteroast.fr/de/blog/music-sharity-1.1.1#android" class="hash-link" aria-label="Direkter Link zur Android" title="Direkter Link zur Android" translate="no">​</a></h3>
<ul>
<li class=""><strong>Google Play Store</strong>: <a href="https://play.google.com/store/apps/details?id=fr.byteroast.music_sharity" target="_blank" rel="noopener noreferrer" class="">Bei Google Play herunterladen</a></li>
<li class=""><strong>Direkte APK</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.1/music-sharity-1.1.1+6.apk" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="linux">Linux<a href="https://byteroast.fr/de/blog/music-sharity-1.1.1#linux" class="hash-link" aria-label="Direkter Link zur Linux" title="Direkter Link zur Linux" translate="no">​</a></h3>
<ul>
<li class=""><strong>DEB-Paket</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.1/music-sharity-1.1.1+6-amd64.deb" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a> für Debian/Ubuntu-basierte Distributionen</li>
<li class=""><strong>RPM-Paket</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.1/music-sharity-1.1.1-6.x86_64.rpm" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a> für Fedora/RHEL-basierte Distributionen</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="web-pwa">Web (PWA)<a href="https://byteroast.fr/de/blog/music-sharity-1.1.1#web-pwa" class="hash-link" aria-label="Direkter Link zur Web (PWA)" title="Direkter Link zur Web (PWA)" translate="no">​</a></h3>
<p>Probiere es direkt in deinem Browser aus unter <strong><a href="https://music-sharity.byteroast.fr/" target="_blank" rel="noopener noreferrer" class="">music-sharity.byteroast.fr</a></strong></p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="windows">Windows<a href="https://byteroast.fr/de/blog/music-sharity-1.1.1#windows" class="hash-link" aria-label="Direkter Link zur Windows" title="Direkter Link zur Windows" translate="no">​</a></h3>
<ul>
<li class=""><strong>Installer</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.1/music-sharity-1.1.1+6-windows-x64.msi" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a></li>
</ul>
<p>Das vollständige Release findest du auf der <a href="https://github.com/ByteRoast/music-sharity/releases/tag/v1.1.1" target="_blank" rel="noopener noreferrer" class="">Release-Seite</a>.</p>]]></content:encoded>
            <category>release</category>
            <category>music sharity</category>
            <category>android</category>
            <category>windows</category>
            <category>linux</category>
            <category>flutter</category>
            <category>pwa</category>
        </item>
        <item>
            <title><![CDATA[Music Sharity 1.1.0]]></title>
            <link>https://byteroast.fr/de/blog/music-sharity-1.1.0</link>
            <guid>https://byteroast.fr/de/blog/music-sharity-1.1.0</guid>
            <pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Neues Update für Music Sharity: SoundCloud-Unterstützung, Splashscreens, bessere Erkennung von Tidal-Links und Kopieren in die Zwischenablage auf Desktop/Web]]></description>
            <content:encoded><![CDATA[<p>Neues Update für <strong>Music Sharity</strong>: SoundCloud-Unterstützung, Splashscreens, bessere Erkennung von Tidal-Links und Kopieren in die Zwischenablage auf Desktop/Web</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="was-ist-neu">Was ist neu?<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#was-ist-neu" class="hash-link" aria-label="Direkter Link zur Was ist neu?" title="Direkter Link zur Was ist neu?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="soundcloud-unterstützung">SoundCloud-Unterstützung<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#soundcloud-unterst%C3%BCtzung" class="hash-link" aria-label="Direkter Link zur SoundCloud-Unterstützung" title="Direkter Link zur SoundCloud-Unterstützung" translate="no">​</a></h3>
<p><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity</a> unterstützt jetzt SoundCloud!</p>
<div class="theme-admonition theme-admonition-warning admonition_mzLb alert alert--warning"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warnung</div><div class="admonitionContent_IbPD"><p>Da SoundCloud nicht alle der populärsten Künstler enthält, wird die Umwandlung von einer großen Streamingplattform zu SoundCloud fast sicher nicht funktionieren.</p><p>Von SoundCloud zu anderen Plattformen hast du vielleicht mehr Glück (das hoffe ich zumindest).</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="splashscreens">Splashscreens<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#splashscreens" class="hash-link" aria-label="Direkter Link zur Splashscreens" title="Direkter Link zur Splashscreens" translate="no">​</a></h3>
<p><strong>Music Sharity</strong> hat jetzt Splashscreens. Diese Funktion wurde ursprünglich für die Web-App hinzugefügt, damit Nutzer nicht denken, die App würde nicht funktionieren. Es ist nicht wirklich eine Funktion, aber jetzt ist sie integriert.</p>
<p>Die Splashscreens erscheinen nur unter Android, iOS (wenn du es selbst baust) und im Web.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="bessere-erkennung-von-tidal-links">Bessere Erkennung von Tidal-Links<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#bessere-erkennung-von-tidal-links" class="hash-link" aria-label="Direkter Link zur Bessere Erkennung von Tidal-Links" title="Direkter Link zur Bessere Erkennung von Tidal-Links" translate="no">​</a></h3>
<p>Ich hatte übersehen, dass Tidal noch andere Links zum Teilen von Musik verwendet. Jetzt sollte es richtig funktionieren (hoffe ich).</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="verbessertes-teilen-auf-desktop-und-web">Verbessertes Teilen auf Desktop und Web<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#verbessertes-teilen-auf-desktop-und-web" class="hash-link" aria-label="Direkter Link zur Verbessertes Teilen auf Desktop und Web" title="Direkter Link zur Verbessertes Teilen auf Desktop und Web" translate="no">​</a></h3>
<p>In den Desktop- und Web-Versionen wurde der Teilen-Button im letzten Schritt durch eine Funktion zum <strong>Kopieren in die Zwischenablage</strong> ersetzt. So lässt sich der umgewandelte Link einfacher und schneller teilen.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="fehlerbehebungen-und-verbesserungen">Fehlerbehebungen und Verbesserungen<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#fehlerbehebungen-und-verbesserungen" class="hash-link" aria-label="Direkter Link zur Fehlerbehebungen und Verbesserungen" title="Direkter Link zur Fehlerbehebungen und Verbesserungen" translate="no">​</a></h2>
<ul>
<li class="">Regulären Ausdruck (RegEx) für Tidal korrigiert, um Links besser zu erkennen</li>
<li class="">Code-Refactoring für bessere Wartbarkeit</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wie-bekomme-ich-music-sharity">Wie bekomme ich Music Sharity?<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#wie-bekomme-ich-music-sharity" class="hash-link" aria-label="Direkter Link zur Wie bekomme ich Music Sharity?" title="Direkter Link zur Wie bekomme ich Music Sharity?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="android">Android<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#android" class="hash-link" aria-label="Direkter Link zur Android" title="Direkter Link zur Android" translate="no">​</a></h3>
<ul>
<li class=""><strong>Google Play Store</strong>: <a href="https://play.google.com/store/apps/details?id=fr.byteroast.music_sharity" target="_blank" rel="noopener noreferrer" class="">Bei Google Play herunterladen</a></li>
<li class=""><strong>Direkte APK</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.0/music-sharity-1.1.0+5.apk" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="linux">Linux<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#linux" class="hash-link" aria-label="Direkter Link zur Linux" title="Direkter Link zur Linux" translate="no">​</a></h3>
<ul>
<li class=""><strong>DEB-Paket</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.0/music-sharity-1.1.0+1-amd64.deb" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a> für Debian/Ubuntu-basierte Distributionen</li>
<li class=""><strong>RPM-Paket</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.0/music-sharity-1.1.0-1.x86_64.rpm" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a> für Fedora/RHEL-basierte Distributionen</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="web-pwa">Web (PWA)<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#web-pwa" class="hash-link" aria-label="Direkter Link zur Web (PWA)" title="Direkter Link zur Web (PWA)" translate="no">​</a></h3>
<p>Probiere es direkt in deinem Browser aus unter <strong><a href="https://music-sharity.byteroast.fr/" target="_blank" rel="noopener noreferrer" class="">music-sharity.byteroast.fr</a></strong></p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="windows">Windows<a href="https://byteroast.fr/de/blog/music-sharity-1.1.0#windows" class="hash-link" aria-label="Direkter Link zur Windows" title="Direkter Link zur Windows" translate="no">​</a></h3>
<ul>
<li class=""><strong>Installer</strong>: <a href="https://github.com/ByteRoast/music-sharity/releases/download/v1.1.0/music-sharity-1.1.0+1-windows-x64.msi" target="_blank" rel="noopener noreferrer" class="">Herunterladen</a></li>
</ul>
<p>Das vollständige Release findest du auf der <a href="https://github.com/ByteRoast/music-sharity/releases/tag/v1.1.0" target="_blank" rel="noopener noreferrer" class="">Release-Seite</a>.</p>]]></content:encoded>
            <category>release</category>
            <category>music sharity</category>
            <category>android</category>
            <category>windows</category>
            <category>linux</category>
            <category>flutter</category>
            <category>pwa</category>
        </item>
        <item>
            <title><![CDATA[Vorstellung von Music Sharity 1.0.0]]></title>
            <link>https://byteroast.fr/de/blog/music-sharity-1.0.0</link>
            <guid>https://byteroast.fr/de/blog/music-sharity-1.0.0</guid>
            <pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Ich freue mich, die erste Version von Music Sharity anzukündigen: eine plattformübergreifende App, die Musiklinks sofort zwischen verschiedenen Streamingdiensten umwandelt!]]></description>
            <content:encoded><![CDATA[<p>Ich freue mich, die erste Version von <strong>Music Sharity</strong> anzukündigen: eine plattformübergreifende App, die Musiklinks sofort zwischen verschiedenen Streamingdiensten umwandelt!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="was-ist-music-sharity">Was ist Music Sharity?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#was-ist-music-sharity" class="hash-link" aria-label="Direkter Link zur Was ist Music Sharity?" title="Direkter Link zur Was ist Music Sharity?" translate="no">​</a></h2>
<p><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity</a> ist eine kostenlose Open-Source-App, mit der du Musik mühelos über verschiedene Streamingplattformen hinweg teilen kannst. Schluss mit dem Kopieren von Songtiteln oder der manuellen Suche in verschiedenen Diensten!</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="warum-gibt-es-diese-app">Warum gibt es diese App?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#warum-gibt-es-diese-app" class="hash-link" aria-label="Direkter Link zur Warum gibt es diese App?" title="Direkter Link zur Warum gibt es diese App?" translate="no">​</a></h2>
<p>Stell dir vor: Du entdeckst auf Spotify einen großartigen Song und möchtest ihn mit einem Freund teilen. Der nutzt aber Apple Music. Deine Optionen?</p>
<ol>
<li class="">Ihm nur Titel und Interpret schicken (langweilig)</li>
<li class="">Apple Music öffnen, manuell suchen, den Link kopieren (anstrengend)</li>
<li class=""><strong>Music Sharity nutzen</strong>: sofortige Umwandlung!</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="was-kann-man-teilen">Was kann man teilen?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#was-kann-man-teilen" class="hash-link" aria-label="Direkter Link zur Was kann man teilen?" title="Direkter Link zur Was kann man teilen?" translate="no">​</a></h2>
<p>Aktuell unterstützt Music Sharity:</p>
<ul>
<li class=""><strong>Titel</strong> (einzelne Songs)</li>
<li class=""><strong>Alben</strong> (einschließlich EPs und Singles)</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_mzLb alert alert--info"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_IbPD"><p>Playlists werden nicht unterstützt, da sie plattformspezifisch sind und sich schlecht zwischen Diensten umwandeln lassen.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="unterstützte-streamingplattformen">Unterstützte Streamingplattformen<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#unterst%C3%BCtzte-streamingplattformen" class="hash-link" aria-label="Direkter Link zur Unterstützte Streamingplattformen" title="Direkter Link zur Unterstützte Streamingplattformen" translate="no">​</a></h2>
<p>Music Sharity funktioniert derzeit mit den <strong>5 größten Streamingplattformen</strong>:</p>
<table><thead><tr><th>Plattform</th><th>Marktanteil</th></tr></thead><tbody><tr><td><strong>Spotify</strong></td><td>31 %</td></tr><tr><td><strong>Apple Music</strong></td><td>15 %</td></tr><tr><td><strong>YouTube Music</strong></td><td>8 %</td></tr><tr><td><strong>Deezer</strong></td><td>2 %</td></tr><tr><td><strong>Tidal</strong></td><td>1 %</td></tr></tbody></table>
<p>Für diese erste Version habe ich mich auf die beliebtesten Plattformen konzentriert. Weitere Plattformen könnten in Zukunft hinzukommen, abhängig von der Verfügbarkeit der APIs und dem Interesse der Community!</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wie-bekomme-ich-music-sharity">Wie bekomme ich Music Sharity?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#wie-bekomme-ich-music-sharity" class="hash-link" aria-label="Direkter Link zur Wie bekomme ich Music Sharity?" title="Direkter Link zur Wie bekomme ich Music Sharity?" translate="no">​</a></h2>
<p>Music Sharity ist auf mehreren Plattformen verfügbar:</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="web-pwa">Web (PWA)<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#web-pwa" class="hash-link" aria-label="Direkter Link zur Web (PWA)" title="Direkter Link zur Web (PWA)" translate="no">​</a></h3>
<p>Probiere es direkt in deinem Browser aus unter <strong><a href="https://music-sharity.byteroast.fr/" target="_blank" rel="noopener noreferrer" class="">music-sharity.byteroast.fr</a></strong></p>
<p>Du kannst es auf Android auch als Progressive Web App (PWA) installieren:</p>
<ol>
<li class="">Öffne die Website in Chrome</li>
<li class="">Tippe auf „Installieren“ oder „Zum Startbildschirm hinzufügen“</li>
<li class="">Music Sharity erscheint in deinem Teilen-Menü!</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="android">Android<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#android" class="hash-link" aria-label="Direkter Link zur Android" title="Direkter Link zur Android" translate="no">​</a></h3>
<ul>
<li class=""><strong>Google Play Store</strong>: <a href="https://play.google.com/store/apps/details?id=fr.byteroast.music_sharity" target="_blank" rel="noopener noreferrer" class="">Bei Google Play herunterladen</a></li>
<li class=""><strong>Direkte APK</strong>: Download auf der <a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">GitHub-Releases-Seite</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="windows">Windows<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#windows" class="hash-link" aria-label="Direkter Link zur Windows" title="Direkter Link zur Windows" translate="no">​</a></h3>
<ul>
<li class=""><strong>Installer</strong>: Download auf der <a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">GitHub-Releases-Seite</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="linux">Linux<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#linux" class="hash-link" aria-label="Direkter Link zur Linux" title="Direkter Link zur Linux" translate="no">​</a></h3>
<ul>
<li class=""><strong>DEB-Paket</strong>: für Debian/Ubuntu-basierte Distributionen</li>
<li class=""><strong>RPM-Paket</strong>: für Fedora/RHEL-basierte Distributionen</li>
</ul>
<p>Beide findest du auf der <a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">GitHub-Releases-Seite</a>.</p>
<div class="theme-admonition theme-admonition-warning admonition_mzLb alert alert--warning"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Verfügbarkeit der Plattformen</div><div class="admonitionContent_IbPD"><p>iOS- und macOS-Builds funktionieren, werden aber mangels Hardware nicht offiziell gepflegt. Beiträge aus der Community sind willkommen!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wie-funktioniert-es">Wie funktioniert es?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#wie-funktioniert-es" class="hash-link" aria-label="Direkter Link zur Wie funktioniert es?" title="Direkter Link zur Wie funktioniert es?" translate="no">​</a></h2>
<p>Music Sharity nutzt die <a href="https://odesli.co/" target="_blank" rel="noopener noreferrer" class="">Odesli-API</a> (auch bekannt als song.link), um Links zwischen Plattformen umzuwandeln. Odesli pflegt eine Datenbank der Musik aller großen Streamingdienste und kann Titel anhand verschiedener Kennungen wie ISRC-Codes zuordnen.</p>
<p><strong>Der Umwandlungsprozess:</strong></p>
<ol>
<li class="">Den Quelllink an die Odesli-API senden</li>
<li class="">Alle verfügbaren Plattformlinks abrufen</li>
<li class="">Den umgewandelten Link für die gewählte Plattform anzeigen</li>
</ol>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="technische-details">Technische Details<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#technische-details" class="hash-link" aria-label="Direkter Link zur Technische Details" title="Direkter Link zur Technische Details" translate="no">​</a></h3>
<p>Music Sharity basiert auf zwei Grundprinzipien: Datenschutz und Transparenz.</p>
<p><strong>Native Apps (Android, Windows, Linux)</strong></p>
<ul>
<li class="">Direkte API-Aufrufe an Odesli</li>
<li class="">Keine Zwischenstellen</li>
<li class="">Keine Datenerhebung</li>
</ul>
<p><strong>Web-App (PWA)</strong></p>
<ul>
<li class="">Datenschutzfreundlicher CORS-Proxy über <a href="https://workers.cloudflare.com/" target="_blank" rel="noopener noreferrer" class="">Cloudflare Workers</a></li>
<li class="">Kein Logging, kein Tracking</li>
<li class="">Zustandslose Ausführung am Edge</li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity-proxy" target="_blank" rel="noopener noreferrer" class="">Open-Source-Code des Proxys</a></li>
</ul>
<p><strong>Gemeinsamkeiten</strong></p>
<ul>
<li class="">Keine API-Schlüssel nötig</li>
<li class="">Keine Erhebung von Nutzerdaten</li>
<li class="">Kein Tracking, keine Analytics</li>
<li class="">Vollständig Open Source (GPL v3)</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_mzLb alert alert--info"><div class="admonitionHeading_lshV"><span class="admonitionIcon_iS5N"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Warum ein Proxy für das Web?</div><div class="admonitionContent_IbPD"><p>Browser setzen CORS-Richtlinien (Cross-Origin Resource Sharing) durch, die direkte Aufrufe externer APIs verhindern. Der Cloudflare-Worker-Proxy existiert nur, um diese Browserbeschränkung zu umgehen, und hält dabei unser Versprechen ein, nichts zu protokollieren.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="funktionen">Funktionen<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#funktionen" class="hash-link" aria-label="Direkter Link zur Funktionen" title="Direkter Link zur Funktionen" translate="no">​</a></h2>
<ul>
<li class="">Umwandlung zwischen 5 Plattformen (Spotify, Apple Music, YouTube Music, Deezer, Tidal)</li>
<li class="">Unterstützung für Titel und Alben</li>
<li class="">Schnelle Umwandlung dank Odesli</li>
<li class="">Natives Teilen unter Android (erscheint im Teilen-Menü)</li>
<li class="">Unterstützung als Progressive Web App</li>
<li class="">Modernes dunkles Design mit Material Design 3</li>
<li class="">Datenschutzfreundlich (kein Tracking, keine Analytics, keine Datenerhebung)</li>
<li class="">Plattformübergreifend (Web, Android, Windows, Linux)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="warum-music-sharity">Warum „Music Sharity“?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#warum-music-sharity" class="hash-link" aria-label="Direkter Link zur Warum „Music Sharity“?" title="Direkter Link zur Warum „Music Sharity“?" translate="no">​</a></h2>
<p>Der Name ist eine Mischung aus:</p>
<ul>
<li class=""><strong>Music</strong> (natürlich!)</li>
<li class=""><strong>Share</strong> + <strong>Charity</strong> = <strong>Sharity</strong></li>
</ul>
<p>Die Idee ist, Musik plattformübergreifend im Geist von Großzügigkeit und Offenheit zu <em>teilen</em>.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="screenshots">Screenshots<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#screenshots" class="hash-link" aria-label="Direkter Link zur Screenshots" title="Direkter Link zur Screenshots" translate="no">​</a></h2>
<div style="display:flex;justify-content:space-between;align-items:center;gap:10px"><img src="https://byteroast.fr/de/assets/images/home-page-bd1179bf9241ee2b4f2f7b9c3dcbf22b.png" alt="Startseite" style="width:32%"><img src="https://byteroast.fr/de/assets/images/conversion-page-8575dbff6948c82361dd4a25bb9ccf02.png" alt="Umwandlungsseite" style="width:32%"><img src="https://byteroast.fr/de/assets/images/conversion-success-c1a819654e3bffb76c25969c2d6f993f.png" alt="Erfolgreiche Umwandlung" style="width:32%"></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="wie-geht-es-weiter">Wie geht es weiter?<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#wie-geht-es-weiter" class="hash-link" aria-label="Direkter Link zur Wie geht es weiter?" title="Direkter Link zur Wie geht es weiter?" translate="no">​</a></h2>
<p>Folgendes ist für kommende Versionen geplant:</p>
<ul>
<li class="">Weitere Streamingplattformen</li>
<li class="">Verlauf der Umwandlungen</li>
<li class="">Anzeige der Albumcover</li>
<li class="">Internationalisierung (Französisch, Deutsch)</li>
<li class="">iOS-Unterstützung (Mitwirkende mit Mac gesucht)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="unser-datenschutzversprechen">Unser Datenschutzversprechen<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#unser-datenschutzversprechen" class="hash-link" aria-label="Direkter Link zur Unser Datenschutzversprechen" title="Direkter Link zur Unser Datenschutzversprechen" translate="no">​</a></h2>
<p>Music Sharity ist mit Datenschutz als Grundprinzip gebaut:</p>
<ul>
<li class=""><strong>Keine Benutzerkonten</strong>: einfach öffnen und loslegen</li>
<li class=""><strong>Kein Tracking</strong>: keinerlei Analytics oder Telemetrie</li>
<li class=""><strong>Keine Datenspeicherung</strong>: alles geschieht in Echtzeit</li>
<li class=""><strong>Open Source</strong>: prüfe den Code selbst</li>
<li class=""><strong>Transparente Infrastruktur</strong>: sogar unser Web-Proxy ist <a href="https://github.com/ByteRoast/music-sharity-proxy" target="_blank" rel="noopener noreferrer" class="">Open Source</a></li>
</ul>
<p>Details findest du in unserer vollständigen <a href="https://music-sharity.byteroast.fr/privacy.html" target="_blank" rel="noopener noreferrer" class="">Datenschutzerklärung</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="mitwirken">Mitwirken<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#mitwirken" class="hash-link" aria-label="Direkter Link zur Mitwirken" title="Direkter Link zur Mitwirken" translate="no">​</a></h2>
<p>Music Sharity ist <strong>Open Source</strong> (GPL v3). Beiträge sind willkommen, insbesondere für:</p>
<ul>
<li class="">iOS/macOS-Unterstützung (Mac-Besitzer gesucht)</li>
<li class="">Web-Optimierungen</li>
<li class="">Integration neuer Plattformen</li>
<li class="">Fehlerbehebungen und Dokumentation</li>
</ul>
<p>Wirf einen Blick in den <a href="https://github.com/ByteRoast/music-sharity/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">Leitfaden für Beiträge</a>, um loszulegen!</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="continuous-integration">Continuous Integration<a href="https://byteroast.fr/de/blog/music-sharity-1.0.0#continuous-integration" class="hash-link" aria-label="Direkter Link zur Continuous Integration" title="Direkter Link zur Continuous Integration" translate="no">​</a></h2>
<p>Jeder Push wird automatisch auf allen Plattformen getestet:</p>
<p><a href="https://github.com/ByteRoast/music-sharity/actions/workflows/build_tests.yml" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://github.com/ByteRoast/music-sharity/actions/workflows/build_tests.yml/badge.svg" alt="CI Build Tests" class="img_OVZk"></a></p>
<p>Unsere CI-Pipeline stellt sicher, dass:</p>
<ul>
<li class="">die Android-APK erfolgreich gebaut wird</li>
<li class="">die Web-App korrekt kompiliert</li>
<li class="">die Windows-Anwendung ohne Fehler gebaut wird</li>
<li class="">die Linux-Pakete (DEB/RPM) korrekt gebaut werden</li>
<li class="">der Code die statische Analyse besteht</li>
</ul>
<hr>
<p><strong>Probiere Music Sharity noch heute aus und teile deine Musik ganz mühelos!</strong></p>
<ul>
<li class=""><a href="https://music-sharity.byteroast.fr/" target="_blank" rel="noopener noreferrer" class="">Web-App ausprobieren</a></li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">Auf GitHub herunterladen</a></li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Dem Projekt einen Stern geben</a></li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity/issues" target="_blank" rel="noopener noreferrer" class="">Probleme melden</a></li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>music sharity</category>
            <category>android</category>
            <category>windows</category>
            <category>linux</category>
            <category>flutter</category>
            <category>pwa</category>
        </item>
    </channel>
</rss>