<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://byteroast.fr/fr/blog</id>
    <title>Byte Roast Blog</title>
    <updated>2026-10-20T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://byteroast.fr/fr/blog"/>
    <subtitle>Byte Roast Blog</subtitle>
    <icon>https://byteroast.fr/fr/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Roastgate 0.2.0]]></title>
        <id>https://byteroast.fr/fr/blog/roastgate-0.2.0</id>
        <link href="https://byteroast.fr/fr/blog/roastgate-0.2.0"/>
        <updated>2026-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Roastgate 0.2.0 est sortie : vous pouvez désormais choisir ce que reçoivent les visiteurs hors de vos listes blanches, au lieu du 403 par défaut de nginx.]]></summary>
        <content type="html"><![CDATA[<p><strong>Roastgate 0.2.0</strong> est sortie : vous pouvez désormais choisir ce que reçoivent les visiteurs hors de vos listes blanches, au lieu du 403 par défaut de nginx.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="choisir-la-réponse-faite-aux-visiteurs-refusés">Choisir la réponse faite aux visiteurs refusés<a href="https://byteroast.fr/fr/blog/roastgate-0.2.0#choisir-la-r%C3%A9ponse-faite-aux-visiteurs-refus%C3%A9s" class="hash-link" aria-label="Lien direct vers Choisir la réponse faite aux visiteurs refusés" title="Lien direct vers Choisir la réponse faite aux visiteurs refusés" translate="no">​</a></h2>
<p>Jusqu'ici, un proxy ou un site restreint par une liste blanche répondait à tous les autres avec le <strong>403 Forbidden</strong> de nginx. Ça fonctionne, mais ça indique aussi au monde entier que quelque chose se cache derrière ce domaine.</p>
<p>L'onglet <strong>Access</strong> de l'assistant dispose maintenant d'un réglage <strong>Visitors outside the whitelists</strong>, aussi bien pour les reverse proxies que pour les sites hébergés :</p>
<table><thead><tr><th>Choix</th><th>Réponse</th><th>Quand l'utiliser</th></tr></thead><tbody><tr><td><strong>Forbidden</strong> (par défaut)</td><td><code>403</code></td><td>le comportement habituel de nginx, rien ne change pour les configurations existantes</td></tr><tr><td><strong>Not found</strong></td><td><code>404</code></td><td>masque l'existence du site</td></tr><tr><td><strong>Close the connection</strong></td><td><code>444</code></td><td>nginx coupe la connexion sans rien envoyer</td></tr><tr><td><strong>Redirect</strong></td><td><code>302</code> vers l'adresse de votre choix</td><td>renvoyer les visiteurs vers votre site principal, par exemple</td></tr></tbody></table>
<p>Comme toujours, l'onglet d'aperçu montre exactement ce qui sera écrit. Avec un 404, la partie liste blanche de la configuration ressemble à ceci :</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>La réponse remplace <strong>tous</strong> les 403 du serveur, pas seulement ceux des listes blanches : les autres refus, comme les fichiers cachés bloqués, reçoivent la même réponse.</p></div></div>
<p>Quelques garde-fous l'accompagnent :</p>
<ul>
<li class="">Le réglage nécessite <strong>au moins une liste blanche</strong> : sans elle, personne n'est refusé et l'assistant vous le signale.</li>
<li class="">L'adresse de redirection est validée avant d'arriver dans le fichier : <code>http://</code> ou <code>https://</code>, un hôte, un port, un chemin et une query string optionnels, et rien qui puisse sortir de la ligne <code>return</code>.</li>
<li class="">Le challenge Let's Encrypt reste accessible à tous, donc les renouvellements de certificats continuent de fonctionner quel que soit votre choix.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="réouverture-et-import">Réouverture et import<a href="https://byteroast.fr/fr/blog/roastgate-0.2.0#r%C3%A9ouverture-et-import" class="hash-link" aria-label="Lien direct vers Réouverture et import" title="Lien direct vers Réouverture et import" translate="no">​</a></h3>
<p>Le réglage est relu depuis le fichier : rouvrir une configuration dans l'assistant, ou <a class="" href="https://byteroast.fr/fr/blog/roastgate-0.1.0#importing-hand-written-configs">importer une configuration écrite à la main</a>, restaure le choix et l'adresse de redirection. Si la ligne <code>error_page 403 = @rg_denied;</code> ou son bloc <code>location @rg_denied</code> a été modifié à la main en quelque chose que l'assistant ne sait pas reproduire, l'import est refusé avec le numéro de ligne et la raison, et le fichier reste modifiable en texte brut.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="pour-les-contributeurs">Pour les contributeurs<a href="https://byteroast.fr/fr/blog/roastgate-0.2.0#pour-les-contributeurs" class="hash-link" aria-label="Lien direct vers Pour les contributeurs" title="Lien direct vers Pour les contributeurs" translate="no">​</a></h2>
<p>Le projet a aussi reçu ce qu'il lui fallait pour accueillir des contributions :</p>
<ul>
<li class="">Un <a href="https://github.com/ByteRoast/Roastgate/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">guide de contribution</a> qui couvre le style de code, les tests, les commits et l'accord de licence des contributeurs.</li>
<li class="">Une <a href="https://github.com/ByteRoast/Roastgate/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">politique de sécurité</a> pour signaler des vulnérabilités en privé.</li>
<li class="">Des formulaires d'issue et un modèle de pull request.</li>
</ul>
<p>L'image sur <code>ghcr.io/byteroast/roastgate</code> est désormais publique : plus besoin de <code>docker login</code> pour la récupérer.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="comment-obtenir-roastgate-020-">Comment obtenir Roastgate 0.2.0 ?<a href="https://byteroast.fr/fr/blog/roastgate-0.2.0#comment-obtenir-roastgate-020-" class="hash-link" aria-label="Lien direct vers Comment obtenir Roastgate 0.2.0 ?" title="Lien direct vers Comment obtenir Roastgate 0.2.0 ?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="mise-à-jour">Mise à jour<a href="https://byteroast.fr/fr/blog/roastgate-0.2.0#mise-%C3%A0-jour" class="hash-link" aria-label="Lien direct vers Mise à jour" title="Lien direct vers Mise à jour" translate="no">​</a></h3>
<p>Depuis le dossier qui contient <code>docker-compose.yml</code> :</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>Le fichier compose n'a perdu que deux commentaires dans cette version : inutile de le retélécharger.</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 en est toujours à ses versions alpha <code>0.x</code>. Sauvegardez le volume <code>roastgate-data</code> avant de mettre à jour :</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>Pour rester sur cette version, utilisez le tag <code>0.2.0</code> au lieu de <code>latest</code> dans <code>docker-compose.yml</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="nouvelle-installation">Nouvelle installation<a href="https://byteroast.fr/fr/blog/roastgate-0.2.0#nouvelle-installation" class="hash-link" aria-label="Lien direct vers Nouvelle installation" title="Lien direct vers Nouvelle installation" translate="no">​</a></h3>
<p>Suivez le <a class="" href="https://byteroast.fr/fr/docs/roastgate/installation">guide d'installation</a>, ou l'article <a class="" href="https://byteroast.fr/fr/blog/roastgate-0.1.0#how-can-i-get-roastgate">Présentation de Roastgate 0.1.0</a> : les étapes sont les mêmes.</p>
<hr>
<ul>
<li class=""><a href="https://github.com/ByteRoast/Roastgate" target="_blank" rel="noopener noreferrer" class="">Roastgate sur 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="">Signaler un problème</a></li>
</ul>]]></content>
        <author>
            <name>Sikelio</name>
            <uri>https://github.com/sikelio</uri>
        </author>
        <category label="release" term="release"/>
        <category label="roastgate" term="roastgate"/>
        <category label="nginx" term="nginx"/>
        <category label="docker" term="docker"/>
        <category label="dotnet" term="dotnet"/>
        <category label="self-hosted" term="self-hosted"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Music Sharity est abandonné]]></title>
        <id>https://byteroast.fr/fr/blog/music-sharity-discontinued</id>
        <link href="https://byteroast.fr/fr/blog/music-sharity-discontinued"/>
        <updated>2026-10-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Music Sharity est officiellement abandonné. Le dépôt est désormais archivé et le projet n'est plus maintenu.]]></summary>
        <content type="html"><![CDATA[<p><strong>Music Sharity</strong> est officiellement abandonné. Le dépôt est désormais archivé et le projet n'est plus maintenu.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="pourquoi-">Pourquoi ?<a href="https://byteroast.fr/fr/blog/music-sharity-discontinued#pourquoi-" class="hash-link" aria-label="Lien direct vers Pourquoi ?" title="Lien direct vers Pourquoi ?" translate="no">​</a></h2>
<p>Dès le premier jour, <a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity</a> reposait entièrement sur l'<a href="https://odesli.co/" target="_blank" rel="noopener noreferrer" class="">API Odesli</a> (aussi connue sous le nom de song.link) pour convertir les liens entre plateformes de streaming. Odesli faisait tout le gros du travail : faire correspondre les titres et les albums entre les services et renvoyer les liens correspondants.</p>
<p>Cette API a été fermée. Sans elle, Music Sharity ne peut tout simplement plus rien convertir.</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>danger</div><div class="admonitionContent_IbPD"><p>Comme la conversion dépendait entièrement d'Odesli, les versions existantes de Music Sharity (Android, Windows, Linux et Web) ne sont plus capables de convertir des liens.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="pourquoi-ne-pas-le-reconstruire-">Pourquoi ne pas le reconstruire ?<a href="https://byteroast.fr/fr/blog/music-sharity-discontinued#pourquoi-ne-pas-le-reconstruire-" class="hash-link" aria-label="Lien direct vers Pourquoi ne pas le reconstruire ?" title="Lien direct vers Pourquoi ne pas le reconstruire ?" translate="no">​</a></h2>
<p>La seule façon réaliste de remplacer Odesli serait de reconstruire le moteur de conversion en faisant du web scraping sur chaque plateforme de streaming. C'est fragile, difficile à maintenir, et ce n'est pas une voie que je souhaite suivre pour ce projet.</p>
<p>Plutôt que de maintenir en vie une application cassée, j'ai donc décidé d'arrêter le développement et d'archiver le dépôt.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="vous-cherchez-une-alternative-">Vous cherchez une alternative ?<a href="https://byteroast.fr/fr/blog/music-sharity-discontinued#vous-cherchez-une-alternative-" class="hash-link" aria-label="Lien direct vers Vous cherchez une alternative ?" title="Lien direct vers Vous cherchez une alternative ?" translate="no">​</a></h2>
<p>Si vous avez besoin de partager de la musique entre plateformes de streaming, essayez <strong><a href="https://songport.link/" target="_blank" rel="noopener noreferrer" class="">SongPort</a></strong>. Il fait tout ce que faisait Music Sharity, et bien mieux.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="que-devient-le-code-">Que devient le code ?<a href="https://byteroast.fr/fr/blog/music-sharity-discontinued#que-devient-le-code-" class="hash-link" aria-label="Lien direct vers Que devient le code ?" title="Lien direct vers Que devient le code ?" translate="no">​</a></h2>
<p>Le code reste disponible sur <a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">GitHub</a> à titre de référence, sous licence <strong>GPL v3</strong>. N'hésitez pas à le parcourir, le forker ou vous en inspirer.</p>
<p>Une partie du travail réalisé après la <a class="" href="https://byteroast.fr/fr/blog/music-sharity-1.1.1">version 1.1.1</a> n'a jamais été publiée dans une build officielle, comme la page d'historique des conversions avec une barre de navigation en bas. Tout est dans le dépôt si vous êtes curieux.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="merci">Merci<a href="https://byteroast.fr/fr/blog/music-sharity-discontinued#merci" class="hash-link" aria-label="Lien direct vers Merci" title="Lien direct vers Merci" translate="no">​</a></h2>
<p>Merci à toutes celles et ceux qui ont essayé Music Sharity, signalé des problèmes ou partagé leurs retours. C'était un projet amusant à construire, et j'ai beaucoup appris en chemin.</p>
<hr>
<ul>
<li class=""><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity sur GitHub</a> (archivé)</li>
<li class=""><a href="https://songport.link/" target="_blank" rel="noopener noreferrer" class="">SongPort</a></li>
</ul>]]></content>
        <author>
            <name>Sikelio</name>
            <uri>https://github.com/sikelio</uri>
        </author>
        <category label="music sharity" term="music sharity"/>
        <category label="discontinued" term="discontinued"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Présentation de Roastgate 0.1.0]]></title>
        <id>https://byteroast.fr/fr/blog/roastgate-0.1.0</id>
        <link href="https://byteroast.fr/fr/blog/roastgate-0.1.0"/>
        <updated>2026-10-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[La première version de Roastgate est sortie : une interface web auto-hébergée qui pilote le nginx déjà installé sur votre serveur. Votre /etc/nginx reste la source de vérité.]]></summary>
        <content type="html"><![CDATA[<p>La première version de <strong>Roastgate</strong> est sortie : une interface web auto-hébergée qui pilote le nginx déjà installé sur votre serveur. Votre <code>/etc/nginx</code> reste la source de vérité.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="quest-ce-que-roastgate-">Qu'est-ce que Roastgate ?<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#quest-ce-que-roastgate-" class="hash-link" aria-label="Lien direct vers Qu'est-ce que Roastgate ?" title="Lien direct vers Qu'est-ce que Roastgate ?" translate="no">​</a></h2>
<p><a href="https://github.com/ByteRoast/Roastgate" target="_blank" rel="noopener noreferrer" class="">Roastgate</a> est une interface web qui tourne dans un conteneur Docker à côté de votre nginx. Elle gère les <strong>reverse proxies</strong>, les <strong>sites hébergés</strong>, les <strong>listes blanches d'IP</strong> et les <strong>certificats Let's Encrypt</strong>, sans jamais sortir des fichiers propres à nginx.</p>
<p>Pas de format maison, pas de base de configurations cachée : Roastgate lit et écrit les fichiers nginx classiques (<code>conf.d/</code>, <code>sites-available/</code>, <code>sites-enabled/</code>). Vous pouvez continuer à les modifier à la main, et arrêter d'utiliser Roastgate à tout moment. Vos fichiers restent là où ils sont.</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 en est à ses versions alpha <code>0.x</code> : les réglages, le schéma de la base de données et le comportement peuvent changer d'une version à l'autre. Gardez une sauvegarde du volume de données avant chaque mise à jour.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="ce-quelle-gère">Ce qu'elle gère<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#ce-quelle-g%C3%A8re" class="hash-link" aria-label="Lien direct vers Ce qu'elle gère" title="Lien direct vers Ce qu'elle gère" translate="no">​</a></h2>
<table><thead><tr><th>Emplacement</th><th>Contenu</th><th>Activation</th></tr></thead><tbody><tr><td><code>conf.d/</code></td><td>reverse proxies</td><td><code>.conf</code> et <code>.conf.disabled</code></td></tr><tr><td><code>sites-available/</code></td><td>sites hébergés</td><td>lien symbolique dans <code>sites-enabled/</code></td></tr><tr><td><code>whitelists/&lt;name&gt;.conf</code></td><td>lignes <code>allow &lt;ip&gt;;</code></td><td>incluses depuis vos configurations</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="un-cycle-de-modification-sûr">Un cycle de modification sûr<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#un-cycle-de-modification-s%C3%BBr" class="hash-link" aria-label="Lien direct vers Un cycle de modification sûr" title="Lien direct vers Un cycle de modification sûr" translate="no">​</a></h3>
<p>Chaque modification suit le même cycle :</p>
<!-- -->
<p>Les écritures sont atomiques (fichier temporaire, puis renommage) et conservent les permissions d'origine du fichier. Les 30 sauvegardes les plus récentes de chaque fichier sont conservées, et la page <strong>Backups</strong> permet de comparer n'importe quelle version avec le fichier actuel et de la restaurer.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="fonctionnalités">Fonctionnalités<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#fonctionnalit%C3%A9s" class="hash-link" aria-label="Lien direct vers Fonctionnalités" title="Lien direct vers Fonctionnalités" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="assistant-de-création">Assistant de création<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#assistant-de-cr%C3%A9ation" class="hash-link" aria-label="Lien direct vers Assistant de création" title="Lien direct vers Assistant de création" translate="no">​</a></h3>
<p>Décrivez un reverse proxy ou un site statique dans un formulaire et Roastgate écrit la configuration nginx : WebSockets, HTTPS avec redirection optionnelle, HTTP/2, HSTS, limite d'upload, timeouts, en-têtes de sécurité, listes blanches, challenge Let's Encrypt, et directives libres pour tout le reste. Un onglet d'aperçu montre exactement ce qui sera écrit.</p>
<ul>
<li class=""><strong>Sûr par construction</strong> : chaque valeur est validée par un motif strict avant d'arriver dans le fichier.</li>
<li class=""><strong>Adapté à votre nginx</strong> : HTTP/2 est écrit sous la forme <code>http2 on;</code> à partir de nginx 1.25.1, et <code>listen ... ssl http2;</code> avant.</li>
<li class=""><strong>Réouvrable</strong> : les réglages sont stockés dans un commentaire en tête du fichier généré, donc le rouvrir restaure le formulaire. Si vous avez modifié le fichier à la main, l'assistant vous prévient avant d'écraser vos changements.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="importing-hand-written-configs">Import de configurations écrites à la main<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#importing-hand-written-configs" class="hash-link" aria-label="Lien direct vers Import de configurations écrites à la main" title="Lien direct vers Import de configurations écrites à la main" translate="no">​</a></h3>
<p>Vous avez déjà des configurations ? Ouvrez-en une dans l'assistant et ses réglages sont <strong>lus depuis le fichier</strong> : noms, ports, upstream, certificat, listes blanches, limite d'upload, en-têtes WebSocket, timeouts, redirection. Tout ce qui n'a pas de champ dans le formulaire est conservé en directives libres, donc rien n'est perdu.</p>
<p>Lorsqu'un fichier ne peut pas être reproduit fidèlement (un <code>upstream</code> au niveau racine, un <code>server_name</code> en regex, plus de deux blocs server…), il est refusé avec la raison et reste modifiable en texte brut.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="édition-brute">Édition brute<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#%C3%A9dition-brute" class="hash-link" aria-label="Lien direct vers Édition brute" title="Lien direct vers Édition brute" translate="no">​</a></h3>
<p>Chaque fichier peut être modifié dans un <a href="https://github.com/microsoft/monaco-editor" target="_blank" rel="noopener noreferrer" class="">éditeur Monaco</a> avec coloration syntaxique nginx. Activer ou désactiver un proxy ou un site se fait d'un simple interrupteur.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="certificats-lets-encrypt">Certificats Let's Encrypt<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#certificats-lets-encrypt" class="hash-link" aria-label="Lien direct vers Certificats Let's Encrypt" title="Lien direct vers Certificats Let's Encrypt" translate="no">​</a></h3>
<p>Obtenez, listez, renouvelez et supprimez des certificats depuis la page <strong>Certificates</strong>.</p>
<ul>
<li class="">Utilisez le <strong>certbot intégré</strong> (livré dans l'image, renouvelé deux fois par jour par Roastgate) ou celui <strong>installé sur l'hôte</strong>.</li>
<li class="">Les certificats sont lus depuis les fichiers que maintient certbot : domaines, émetteur, expiration, et lesquelles de vos configurations les utilisent.</li>
<li class="">nginx n'est rechargé que lorsqu'un certificat a réellement changé.</li>
<li class="">Un <strong>dry run</strong> valide d'abord vos domaines auprès du serveur de staging de Let's Encrypt.</li>
<li class="">Un certificat encore utilisé par une configuration ne peut pas être supprimé.</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>Les certificats wildcard nécessitent un challenge DNS et ne sont pas pris en charge.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="listes-blanches-dip">Listes blanches d'IP<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#listes-blanches-dip" class="hash-link" aria-label="Lien direct vers Listes blanches d'IP" title="Lien direct vers Listes blanches d'IP" translate="no">​</a></h3>
<ul>
<li class="">Un éditeur de liste avec validation stricte des adresses IPv4, IPv6 et des plages CIDR (<code>10.0.0.5/24</code>, que nginx ignore silencieusement, est signalé).</li>
<li class="">Collez de nombreuses adresses d'un coup, ou ajoutez celle depuis laquelle vous êtes connecté en un clic.</li>
<li class="">Chaque liste blanche indique <strong>où elle est utilisée</strong>, et une liste encore incluse ne peut pas être supprimée.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="sécurité">Sécurité<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#s%C3%A9curit%C3%A9" class="hash-link" aria-label="Lien direct vers Sécurité" title="Lien direct vers Sécurité" translate="no">​</a></h2>
<p>Roastgate contrôle votre serveur web : quiconque contrôle Roastgate est, en pratique, root sur l'hôte. La sécurité a donc reçu beaucoup d'attention pour cette première version.</p>
<ul>
<li class=""><strong>Authentification à deux facteurs</strong> (TOTP) avec n'importe quelle application d'authentification, et dix codes de récupération à usage unique.</li>
<li class=""><strong>Passkeys</strong> : connectez-vous avec une empreinte digitale, votre visage, le code PIN de l'appareil ou une clé de sécurité, seules ou comme second facteur. Dès qu'une passkey existe, le mot de passe seul ne suffit plus.</li>
<li class=""><strong>Limitation de débit</strong> : 5 échecs par tranche de 15 minutes et par adresse client.</li>
<li class=""><strong>Révocation des sessions</strong> : changer le mot de passe met fin à toutes les sessions ouvertes, sur tous les appareils.</li>
<li class=""><strong>Journal d'audit</strong> de chaque connexion et de chaque échec.</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>Gardez-la privée</div><div class="admonitionContent_IbPD"><p>Laissez le port sur <code>127.0.0.1</code> et accédez-y via un tunnel SSH, un VPN, ou un bloc server nginx protégé par une liste blanche et HTTPS.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="how-can-i-get-roastgate">Comment obtenir Roastgate ?<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#how-can-i-get-roastgate" class="hash-link" aria-label="Lien direct vers Comment obtenir Roastgate ?" title="Lien direct vers Comment obtenir Roastgate ?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="prérequis">Prérequis<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#pr%C3%A9requis" class="hash-link" aria-label="Lien direct vers Prérequis" title="Lien direct vers Prérequis" translate="no">​</a></h3>
<ul>
<li class="">Un serveur Linux avec <strong>nginx installé sur l'hôte</strong> (les arborescences Debian et Ubuntu sont prises en charge)</li>
<li class=""><strong>Docker</strong> avec le plugin Compose</li>
<li class="">Optionnel : <code>certbot</code> sur l'hôte</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="installation">Installation<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#installation" class="hash-link" aria-label="Lien direct vers Installation" title="Lien direct vers Installation" translate="no">​</a></h3>
<p>Vous n'avez besoin que du fichier compose, pas du dépôt entier. Dans le dossier de votre choix :</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        # affiche le jeton d'installation</span><br></div></code></pre></div></div>
<p>Ou avec 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        # affiche le jeton d'installation</span><br></div></code></pre></div></div>
<p>L'image est publiée sur <code>ghcr.io/byteroast/roastgate</code>. Pour rester sur cette version, utilisez le tag <code>0.1.0</code> au lieu de <code>latest</code> dans <code>docker-compose.yml</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="compiler-depuis-les-sources">Compiler depuis les sources<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#compiler-depuis-les-sources" class="hash-link" aria-label="Lien direct vers Compiler depuis les sources" title="Lien direct vers Compiler depuis les sources" translate="no">​</a></h3>
<p>Pour construire l'image vous-même, clonez le dépôt et construisez-la depuis celui-ci :</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="image-de-développement">Image de développement<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#image-de-d%C3%A9veloppement" class="hash-link" aria-label="Lien direct vers Image de développement" title="Lien direct vers Image de développement" translate="no">​</a></h3>
<p>Vous voulez les dernières nouveautés en avant-première ? <code>docker-compose.dev.yml</code> est le même fichier compose, épinglé sur l'image <code>dev</code>, qui suit chaque push sur la branche <code>dev</code>. Téléchargez-le <strong>sous le nom <code>docker-compose.yml</code></strong> et toutes les autres commandes restent identiques :</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>Instable</div><div class="admonitionContent_IbPD"><p>L'image <code>dev</code> reçoit les changements en premier et peut casser. Les deux fichiers utilisent le même conteneur et le même volume <code>roastgate-data</code>, donc changer de l'un à l'autre conserve votre compte. En revanche, revenir de <code>dev</code> à <code>latest</code> n'est pas garanti : <code>dev</code> a peut-être déjà migré la base de données vers un schéma que <code>latest</code> ne connaît pas. <strong>Sauvegardez le volume avant d'essayer <code>dev</code>.</strong></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="premier-démarrage">Premier démarrage<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#premier-d%C3%A9marrage" class="hash-link" aria-label="Lien direct vers Premier démarrage" title="Lien direct vers Premier démarrage" translate="no">​</a></h3>
<p>Ouvrez <code>http://127.0.0.1:8181</code> (depuis votre propre machine, <code>ssh -L 8181:127.0.0.1:8181 user@server</code> vous donne cette adresse) et suivez l'installation :</p>
<ol>
<li class="">Saisissez le <strong>jeton d'installation</strong> affiché dans les logs</li>
<li class="">Créez le compte <strong>administrateur</strong></li>
<li class="">Choisissez les <strong>chemins et options</strong> (répertoire nginx, répertoire des listes blanches, webroot ACME, mode certbot)</li>
<li class="">Vérifiez les <strong>diagnostics de l'hôte</strong></li>
<li class="">Terminé : vous êtes connecté automatiquement</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="mise-à-jour">Mise à jour<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#mise-%C3%A0-jour" class="hash-link" aria-label="Lien direct vers Mise à jour" title="Lien direct vers Mise à jour" translate="no">​</a></h3>
<p>Depuis le dossier qui contient <code>docker-compose.yml</code> :</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>Ne retéléchargez le fichier compose (même commande <code>curl</code> ou <code>Invoke-WebRequest</code> que ci-dessus) que lorsque les notes de version indiquent qu'il a changé. Il écrase votre copie, donc refaites vos propres modifications ensuite (ports, montages, jeton d'installation…). Si vous avez compilé depuis les sources : <code>git pull</code>, puis <code>docker compose up -d --build</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="sauvegarder-vos-données">Sauvegarder vos données<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#sauvegarder-vos-donn%C3%A9es" class="hash-link" aria-label="Lien direct vers Sauvegarder vos données" title="Lien direct vers Sauvegarder vos données" translate="no">​</a></h3>
<p>La base de données se trouve dans le volume <code>roastgate-data</code>, donc votre compte et vos sauvegardes survivent aux mises à jour et à <code>docker compose down</code>. Seul <code>docker compose down --volumes</code> (ou <code>docker volume rm roastgate-data</code>) le supprime. Pour le sauvegarder :</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="accès-bloqué-">Accès bloqué ?<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#acc%C3%A8s-bloqu%C3%A9-" class="hash-link" aria-label="Lien direct vers Accès bloqué ?" title="Lien direct vers Accès bloqué ?" translate="no">​</a></h3>
<p>Mot de passe oublié :</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>Application d'authentification, codes de récupération et passkeys perdus :</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>Cette commande désactive l'authentification à deux facteurs, supprime toutes les passkeys et met fin à toutes les sessions, de sorte que le mot de passe seul permet à nouveau de se connecter.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="désinstallation">Désinstallation<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#d%C3%A9sinstallation" class="hash-link" aria-label="Lien direct vers Désinstallation" title="Lien direct vers Désinstallation" 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            # conserve le volume de données</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose down --volumes  # supprime aussi le compte, les réglages et l'historique des sauvegardes</span><br></div></code></pre></div></div>
<p>Supprimez ensuite le dossier qui contient <code>docker-compose.yml</code>, et l'image avec <code>docker image rm ghcr.io/byteroast/roastgate:latest</code> (ou le tag que vous avez utilisé). Vos fichiers nginx restent là où ils sont : Roastgate ne les déplace jamais.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="détails-techniques">Détails techniques<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#d%C3%A9tails-techniques" class="hash-link" aria-label="Lien direct vers Détails techniques" title="Lien direct vers Détails techniques" translate="no">​</a></h2>
<p>Roastgate est construite avec <a href="https://github.com/dotnet/core" target="_blank" rel="noopener noreferrer" class="">.NET 10</a> et <a href="https://github.com/MudBlazor/MudBlazor" target="_blank" rel="noopener noreferrer" class="">MudBlazor</a>, avec <a href="https://github.com/serdarciplak/BlazorMonaco" target="_blank" rel="noopener noreferrer" class="">BlazorMonaco</a> pour l'éditeur. Les données sont stockées dans SQLite.</p>
<p>Le conteneur tourne en mode <code>privileged</code> avec <code>pid: host</code>, afin de pouvoir exécuter <code>nginx</code> et <code>certbot</code> dans les namespaces de l'hôte via <code>nsenter</code>. Les commandes ne passent jamais par un shell.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="contribuer">Contribuer<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#contribuer" class="hash-link" aria-label="Lien direct vers Contribuer" title="Lien direct vers Contribuer" translate="no">​</a></h2>
<p>Les rapports de bugs, les idées, les corrections de documentation et le code sont tous les bienvenus. Roastgate est en alpha et maintenue au mieux, donc les réponses peuvent prendre quelques jours.</p>
<ul>
<li class=""><strong>Vous avez trouvé un bug ou voulez une fonctionnalité ?</strong> Ouvrez une issue avec les <a href="https://github.com/ByteRoast/Roastgate/issues/new/choose" target="_blank" rel="noopener noreferrer" class="">formulaires d'issue</a>. Pour tout ce qui dépasse un petit correctif, attendez une réponse avant d'écrire du code.</li>
<li class=""><strong>Vous voulez contribuer du code ?</strong> Forkez le dépôt, créez votre branche depuis <strong><code>dev</code></strong> et ouvrez votre pull request <strong>vers <code>dev</code></strong>, pas <code>main</code>. Le <a href="https://github.com/ByteRoast/Roastgate/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">guide de contribution</a> couvre le style de code, les tests, les commits et l'accord de licence des contributeurs.</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>Vous avez trouvé une vulnérabilité ?</div><div class="admonitionContent_IbPD"><p>N'ouvrez pas d'issue publique. Signalez-la en privé via le <a href="https://github.com/ByteRoast/Roastgate/security/advisories/new" target="_blank" rel="noopener noreferrer" class="">signalement privé de vulnérabilités de GitHub</a>, comme décrit dans la <a href="https://github.com/ByteRoast/Roastgate/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">politique de sécurité</a>. Seules la dernière version et l'image <code>dev</code> reçoivent les correctifs de sécurité.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="licence">Licence<a href="https://byteroast.fr/fr/blog/roastgate-0.1.0#licence" class="hash-link" aria-label="Lien direct vers Licence" title="Lien direct vers Licence" translate="no">​</a></h2>
<p>Roastgate est libre et open source, sous licence <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 sur 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="">Signaler un problème</a></li>
</ul>]]></content>
        <author>
            <name>Sikelio</name>
            <uri>https://github.com/sikelio</uri>
        </author>
        <category label="release" term="release"/>
        <category label="roastgate" term="roastgate"/>
        <category label="nginx" term="nginx"/>
        <category label="docker" term="docker"/>
        <category label="dotnet" term="dotnet"/>
        <category label="self-hosted" term="self-hosted"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Music Sharity 1.1.1]]></title>
        <id>https://byteroast.fr/fr/blog/music-sharity-1.1.1</id>
        <link href="https://byteroast.fr/fr/blog/music-sharity-1.1.1"/>
        <updated>2026-01-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Correctif pour Music Sharity : résolution d'un problème de partage sur Android]]></summary>
        <content type="html"><![CDATA[<p>Correctif pour <strong>Music Sharity</strong> : résolution d'un problème de partage sur Android</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="correction-de-bug">Correction de bug<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.1#correction-de-bug" class="hash-link" aria-label="Lien direct vers Correction de bug" title="Lien direct vers Correction de bug" translate="no">​</a></h2>
<ul>
<li class=""><strong>Android</strong> : correction de la récupération de l'URL depuis le contenu partagé</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="comment-obtenir-music-sharity-">Comment obtenir Music Sharity ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.1#comment-obtenir-music-sharity-" class="hash-link" aria-label="Lien direct vers Comment obtenir Music Sharity ?" title="Lien direct vers Comment obtenir Music Sharity ?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="android">Android<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.1#android" class="hash-link" aria-label="Lien direct vers Android" title="Lien direct vers 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="">Télécharger sur Google Play</a></li>
<li class=""><strong>APK direct</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="">Télécharger</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="linux">Linux<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.1#linux" class="hash-link" aria-label="Lien direct vers Linux" title="Lien direct vers Linux" translate="no">​</a></h3>
<ul>
<li class=""><strong>Paquet DEB</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="">Télécharger</a> pour les distributions basées sur Debian/Ubuntu</li>
<li class=""><strong>Paquet RPM</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="">Télécharger</a> pour les distributions basées sur Fedora/RHEL</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="web-pwa">Web (PWA)<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.1#web-pwa" class="hash-link" aria-label="Lien direct vers Web (PWA)" title="Lien direct vers Web (PWA)" translate="no">​</a></h3>
<p>Essayez-la directement dans votre navigateur sur <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/fr/blog/music-sharity-1.1.1#windows" class="hash-link" aria-label="Lien direct vers Windows" title="Lien direct vers Windows" translate="no">​</a></h3>
<ul>
<li class=""><strong>Installeur</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="">Télécharger</a></li>
</ul>
<p>Retrouvez la release complète sur la <a href="https://github.com/ByteRoast/music-sharity/releases/tag/v1.1.1" target="_blank" rel="noopener noreferrer" class="">page de release</a>.</p>]]></content>
        <author>
            <name>Sikelio</name>
            <uri>https://github.com/sikelio</uri>
        </author>
        <category label="release" term="release"/>
        <category label="music sharity" term="music sharity"/>
        <category label="android" term="android"/>
        <category label="windows" term="windows"/>
        <category label="linux" term="linux"/>
        <category label="flutter" term="flutter"/>
        <category label="pwa" term="pwa"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Music Sharity 1.1.0]]></title>
        <id>https://byteroast.fr/fr/blog/music-sharity-1.1.0</id>
        <link href="https://byteroast.fr/fr/blog/music-sharity-1.1.0"/>
        <updated>2026-01-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Nouvelle mise à jour de Music Sharity : prise en charge de SoundCloud, écrans de démarrage, meilleure reconnaissance des liens Tidal et copie dans le presse-papiers sur Desktop/Web]]></summary>
        <content type="html"><![CDATA[<p>Nouvelle mise à jour de <strong>Music Sharity</strong> : prise en charge de SoundCloud, écrans de démarrage, meilleure reconnaissance des liens Tidal et copie dans le presse-papiers sur Desktop/Web</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="quoi-de-neuf-">Quoi de neuf ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#quoi-de-neuf-" class="hash-link" aria-label="Lien direct vers Quoi de neuf ?" title="Lien direct vers Quoi de neuf ?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="prise-en-charge-de-soundcloud">Prise en charge de SoundCloud<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#prise-en-charge-de-soundcloud" class="hash-link" aria-label="Lien direct vers Prise en charge de SoundCloud" title="Lien direct vers Prise en charge de SoundCloud" translate="no">​</a></h3>
<p><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity</a> prend désormais en charge 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>attention</div><div class="admonitionContent_IbPD"><p>Comme SoundCloud ne contient pas tous les artistes les plus populaires, il est presque certain qu'une conversion depuis une plateforme de streaming grand public vers SoundCloud ne fonctionnera pas.</p><p>Vous aurez peut-être plus de chance en convertissant depuis SoundCloud vers les autres plateformes (du moins je l'espère).</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="écrans-de-démarrage">Écrans de démarrage<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#%C3%A9crans-de-d%C3%A9marrage" class="hash-link" aria-label="Lien direct vers Écrans de démarrage" title="Lien direct vers Écrans de démarrage" translate="no">​</a></h3>
<p><strong>Music Sharity</strong> dispose maintenant d'écrans de démarrage. Cette fonctionnalité a d'abord été ajoutée pour l'application web, afin que les utilisateurs ne pensent pas que l'application ne fonctionne pas. Ce n'est pas vraiment une fonctionnalité, mais c'est désormais intégré.</p>
<p>Les écrans de démarrage n'apparaissent que sur Android, iOS (si vous le compilez vous-même) et le Web.</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="meilleure-reconnaissance-des-liens-tidal">Meilleure reconnaissance des liens Tidal<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#meilleure-reconnaissance-des-liens-tidal" class="hash-link" aria-label="Lien direct vers Meilleure reconnaissance des liens Tidal" title="Lien direct vers Meilleure reconnaissance des liens Tidal" translate="no">​</a></h3>
<p>J'avais oublié que Tidal propose d'autres formats de liens pour partager de la musique. Ça devrait donc fonctionner correctement (je l'espère).</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="partage-amélioré-sur-desktop-et-web">Partage amélioré sur Desktop et Web<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#partage-am%C3%A9lior%C3%A9-sur-desktop-et-web" class="hash-link" aria-label="Lien direct vers Partage amélioré sur Desktop et Web" title="Lien direct vers Partage amélioré sur Desktop et Web" translate="no">​</a></h3>
<p>Sur les versions Desktop et Web, le bouton de partage de la dernière étape a été remplacé par une fonction de <strong>copie dans le presse-papiers</strong>. Partager le lien converti est ainsi plus simple et plus rapide.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="corrections-de-bugs-et-améliorations">Corrections de bugs et améliorations<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#corrections-de-bugs-et-am%C3%A9liorations" class="hash-link" aria-label="Lien direct vers Corrections de bugs et améliorations" title="Lien direct vers Corrections de bugs et améliorations" translate="no">​</a></h2>
<ul>
<li class="">Correction de l'expression régulière (RegEx) Tidal pour une meilleure reconnaissance des liens</li>
<li class="">Refactorisation du code pour une meilleure maintenabilité</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="comment-obtenir-music-sharity-">Comment obtenir Music Sharity ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#comment-obtenir-music-sharity-" class="hash-link" aria-label="Lien direct vers Comment obtenir Music Sharity ?" title="Lien direct vers Comment obtenir Music Sharity ?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="android">Android<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#android" class="hash-link" aria-label="Lien direct vers Android" title="Lien direct vers 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="">Télécharger sur Google Play</a></li>
<li class=""><strong>APK direct</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="">Télécharger</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="linux">Linux<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#linux" class="hash-link" aria-label="Lien direct vers Linux" title="Lien direct vers Linux" translate="no">​</a></h3>
<ul>
<li class=""><strong>Paquet DEB</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="">Télécharger</a> pour les distributions basées sur Debian/Ubuntu</li>
<li class=""><strong>Paquet RPM</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="">Télécharger</a> pour les distributions basées sur Fedora/RHEL</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="web-pwa">Web (PWA)<a href="https://byteroast.fr/fr/blog/music-sharity-1.1.0#web-pwa" class="hash-link" aria-label="Lien direct vers Web (PWA)" title="Lien direct vers Web (PWA)" translate="no">​</a></h3>
<p>Essayez-la directement dans votre navigateur sur <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/fr/blog/music-sharity-1.1.0#windows" class="hash-link" aria-label="Lien direct vers Windows" title="Lien direct vers Windows" translate="no">​</a></h3>
<ul>
<li class=""><strong>Installeur</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="">Télécharger</a></li>
</ul>
<p>Retrouvez la release complète sur la <a href="https://github.com/ByteRoast/music-sharity/releases/tag/v1.1.0" target="_blank" rel="noopener noreferrer" class="">page de release</a>.</p>]]></content>
        <author>
            <name>Sikelio</name>
            <uri>https://github.com/sikelio</uri>
        </author>
        <category label="release" term="release"/>
        <category label="music sharity" term="music sharity"/>
        <category label="android" term="android"/>
        <category label="windows" term="windows"/>
        <category label="linux" term="linux"/>
        <category label="flutter" term="flutter"/>
        <category label="pwa" term="pwa"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Présentation de Music Sharity 1.0.0]]></title>
        <id>https://byteroast.fr/fr/blog/music-sharity-1.0.0</id>
        <link href="https://byteroast.fr/fr/blog/music-sharity-1.0.0"/>
        <updated>2026-01-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[J'ai le plaisir d'annoncer la première version de Music Sharity, une application multiplateforme qui convertit instantanément les liens musicaux entre les différents services de streaming !]]></summary>
        <content type="html"><![CDATA[<p>J'ai le plaisir d'annoncer la première version de <strong>Music Sharity</strong>, une application multiplateforme qui convertit instantanément les liens musicaux entre les différents services de streaming !</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="quest-ce-que-music-sharity-">Qu'est-ce que Music Sharity ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#quest-ce-que-music-sharity-" class="hash-link" aria-label="Lien direct vers Qu'est-ce que Music Sharity ?" title="Lien direct vers Qu'est-ce que Music Sharity ?" translate="no">​</a></h2>
<p><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Music Sharity</a> est une application libre et open source qui vous permet de partager de la musique entre différentes plateformes de streaming sans effort. Fini le copier-coller de titres ou les recherches manuelles sur chaque service !</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="pourquoi-cette-application-existe-t-elle-">Pourquoi cette application existe-t-elle ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#pourquoi-cette-application-existe-t-elle-" class="hash-link" aria-label="Lien direct vers Pourquoi cette application existe-t-elle ?" title="Lien direct vers Pourquoi cette application existe-t-elle ?" translate="no">​</a></h2>
<p>Imaginez : vous découvrez une chanson géniale sur Spotify et vous voulez la partager avec un ami. Mais il utilise Apple Music. Vos options ?</p>
<ol>
<li class="">Lui envoyer juste le titre et l'artiste (ennuyeux)</li>
<li class="">Ouvrir Apple Music, chercher manuellement, copier le lien (épuisant)</li>
<li class=""><strong>Utiliser Music Sharity</strong> : conversion instantanée !</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="que-peut-on-partager-">Que peut-on partager ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#que-peut-on-partager-" class="hash-link" aria-label="Lien direct vers Que peut-on partager ?" title="Lien direct vers Que peut-on partager ?" translate="no">​</a></h2>
<p>Actuellement, Music Sharity prend en charge :</p>
<ul>
<li class=""><strong>Les titres</strong> (morceaux individuels)</li>
<li class=""><strong>Les albums</strong> (y compris les EP et les 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>Les playlists ne sont pas prises en charge, car elles sont propres à chaque plateforme et se convertissent mal d'un service à l'autre.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="plateformes-de-streaming-prises-en-charge">Plateformes de streaming prises en charge<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#plateformes-de-streaming-prises-en-charge" class="hash-link" aria-label="Lien direct vers Plateformes de streaming prises en charge" title="Lien direct vers Plateformes de streaming prises en charge" translate="no">​</a></h2>
<p>Music Sharity fonctionne actuellement avec les <strong>5 principales plateformes de streaming</strong> :</p>
<table><thead><tr><th>Plateforme</th><th>Part de marché</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>Pour cette première version, je me suis concentré sur les plateformes les plus populaires. D'autres pourront être ajoutées à l'avenir, selon la disponibilité des API et l'intérêt de la communauté !</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="comment-obtenir-music-sharity-">Comment obtenir Music Sharity ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#comment-obtenir-music-sharity-" class="hash-link" aria-label="Lien direct vers Comment obtenir Music Sharity ?" title="Lien direct vers Comment obtenir Music Sharity ?" translate="no">​</a></h2>
<p>Music Sharity est disponible sur plusieurs plateformes :</p>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="web-pwa">Web (PWA)<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#web-pwa" class="hash-link" aria-label="Lien direct vers Web (PWA)" title="Lien direct vers Web (PWA)" translate="no">​</a></h3>
<p>Essayez-la directement dans votre navigateur sur <strong><a href="https://music-sharity.byteroast.fr/" target="_blank" rel="noopener noreferrer" class="">music-sharity.byteroast.fr</a></strong></p>
<p>Vous pouvez aussi l'installer comme Progressive Web App (PWA) sur Android :</p>
<ol>
<li class="">Ouvrez le site dans Chrome</li>
<li class="">Appuyez sur « Installer » ou « Ajouter à l'écran d'accueil »</li>
<li class="">Music Sharity apparaîtra dans votre menu de partage !</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="android">Android<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#android" class="hash-link" aria-label="Lien direct vers Android" title="Lien direct vers 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="">Télécharger sur Google Play</a></li>
<li class=""><strong>APK direct</strong> : téléchargez-le depuis la <a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">page des releases GitHub</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="windows">Windows<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#windows" class="hash-link" aria-label="Lien direct vers Windows" title="Lien direct vers Windows" translate="no">​</a></h3>
<ul>
<li class=""><strong>Installeur</strong> : téléchargez-le depuis la <a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">page des releases GitHub</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="linux">Linux<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#linux" class="hash-link" aria-label="Lien direct vers Linux" title="Lien direct vers Linux" translate="no">​</a></h3>
<ul>
<li class=""><strong>Paquet DEB</strong> : pour les distributions basées sur Debian/Ubuntu</li>
<li class=""><strong>Paquet RPM</strong> : pour les distributions basées sur Fedora/RHEL</li>
</ul>
<p>Les deux sont disponibles sur la <a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">page des releases GitHub</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>Disponibilité des plateformes</div><div class="admonitionContent_IbPD"><p>Les builds iOS et macOS fonctionnent, mais ne sont pas maintenus officiellement faute de matériel. Les contributions de la communauté sont les bienvenues !</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="comment-ça-marche-">Comment ça marche ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#comment-%C3%A7a-marche-" class="hash-link" aria-label="Lien direct vers Comment ça marche ?" title="Lien direct vers Comment ça marche ?" translate="no">​</a></h2>
<p>Music Sharity utilise l'<a href="https://odesli.co/" target="_blank" rel="noopener noreferrer" class="">API Odesli</a> (aussi connue sous le nom de song.link) pour convertir les liens entre plateformes. Odesli maintient une base de données de la musique présente sur tous les grands services de streaming et peut faire correspondre les titres grâce à divers identifiants comme les codes ISRC.</p>
<p><strong>Le processus de conversion :</strong></p>
<ol>
<li class="">Envoi du lien source à l'API Odesli</li>
<li class="">Récupération de tous les liens disponibles par plateforme</li>
<li class="">Affichage du lien converti pour la plateforme choisie</li>
</ol>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_FMEz" id="détails-techniques">Détails techniques<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#d%C3%A9tails-techniques" class="hash-link" aria-label="Lien direct vers Détails techniques" title="Lien direct vers Détails techniques" translate="no">​</a></h3>
<p>Music Sharity repose sur deux principes fondamentaux : la confidentialité et la transparence.</p>
<p><strong>Applications natives (Android, Windows, Linux)</strong></p>
<ul>
<li class="">Appels directs à l'API Odesli</li>
<li class="">Aucun intermédiaire</li>
<li class="">Aucune collecte de données</li>
</ul>
<p><strong>Application web (PWA)</strong></p>
<ul>
<li class="">Proxy CORS respectueux de la vie privée via <a href="https://workers.cloudflare.com/" target="_blank" rel="noopener noreferrer" class="">Cloudflare Workers</a></li>
<li class="">Aucun log, aucun pistage</li>
<li class="">Exécution en edge, sans état</li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity-proxy" target="_blank" rel="noopener noreferrer" class="">Code du proxy open source</a></li>
</ul>
<p><strong>Points communs</strong></p>
<ul>
<li class="">Aucune clé d'API requise</li>
<li class="">Aucune collecte de données utilisateur</li>
<li class="">Aucun pistage ni analytics</li>
<li class="">Entièrement 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>Pourquoi un proxy pour le web ?</div><div class="admonitionContent_IbPD"><p>Les navigateurs appliquent des politiques CORS (Cross-Origin Resource Sharing) qui empêchent les appels directs vers des API externes. Le proxy Cloudflare Worker n'existe que pour contourner cette limitation du navigateur, tout en respectant notre engagement de ne rien journaliser.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="fonctionnalités">Fonctionnalités<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#fonctionnalit%C3%A9s" class="hash-link" aria-label="Lien direct vers Fonctionnalités" title="Lien direct vers Fonctionnalités" translate="no">​</a></h2>
<ul>
<li class="">Conversion entre 5 plateformes (Spotify, Apple Music, YouTube Music, Deezer, Tidal)</li>
<li class="">Prise en charge des titres et des albums</li>
<li class="">Conversion rapide grâce à Odesli</li>
<li class="">Partage natif sur Android (apparaît dans le menu de partage)</li>
<li class="">Prise en charge en tant que Progressive Web App</li>
<li class="">Thème sombre moderne avec Material Design 3</li>
<li class="">Respect de la vie privée (pas de pistage, pas d'analytics, pas de collecte de données)</li>
<li class="">Multiplateforme (Web, Android, Windows, Linux)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="pourquoi--music-sharity--">Pourquoi « Music Sharity » ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#pourquoi--music-sharity--" class="hash-link" aria-label="Lien direct vers Pourquoi « Music Sharity » ?" title="Lien direct vers Pourquoi « Music Sharity » ?" translate="no">​</a></h2>
<p>Le nom est un mélange de :</p>
<ul>
<li class=""><strong>Music</strong> (évidemment !)</li>
<li class=""><strong>Share</strong> + <strong>Charity</strong> = <strong>Sharity</strong></li>
</ul>
<p>L'idée est de <em>partager</em> la musique entre les plateformes dans un esprit de générosité et d'ouverture.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="captures-décran">Captures d'écran<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#captures-d%C3%A9cran" class="hash-link" aria-label="Lien direct vers Captures d'écran" title="Lien direct vers Captures d'écran" translate="no">​</a></h2>
<div style="display:flex;justify-content:space-between;align-items:center;gap:10px"><img src="https://byteroast.fr/fr/assets/images/home-page-bd1179bf9241ee2b4f2f7b9c3dcbf22b.png" alt="Page d'accueil" style="width:32%"><img src="https://byteroast.fr/fr/assets/images/conversion-page-8575dbff6948c82361dd4a25bb9ccf02.png" alt="Page de conversion" style="width:32%"><img src="https://byteroast.fr/fr/assets/images/conversion-success-c1a819654e3bffb76c25969c2d6f993f.png" alt="Conversion réussie" style="width:32%"></div>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="et-ensuite-">Et ensuite ?<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#et-ensuite-" class="hash-link" aria-label="Lien direct vers Et ensuite ?" title="Lien direct vers Et ensuite ?" translate="no">​</a></h2>
<p>Voici ce qui est prévu pour les prochaines versions :</p>
<ul>
<li class="">D'autres plateformes de streaming</li>
<li class="">Historique des conversions</li>
<li class="">Affichage des pochettes d'album</li>
<li class="">Internationalisation (français, allemand)</li>
<li class="">Prise en charge d'iOS (contributeurs avec un Mac recherchés)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="engagement-sur-la-confidentialité">Engagement sur la confidentialité<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#engagement-sur-la-confidentialit%C3%A9" class="hash-link" aria-label="Lien direct vers Engagement sur la confidentialité" title="Lien direct vers Engagement sur la confidentialité" translate="no">​</a></h2>
<p>Music Sharity est conçue avec la confidentialité comme principe fondamental :</p>
<ul>
<li class=""><strong>Pas de compte utilisateur</strong> : il suffit d'ouvrir l'application</li>
<li class=""><strong>Pas de pistage</strong> : aucune analytics ni télémétrie</li>
<li class=""><strong>Pas de stockage de données</strong> : tout se passe en temps réel</li>
<li class=""><strong>Open source</strong> : auditez le code vous-même</li>
<li class=""><strong>Infrastructure transparente</strong> : même notre proxy web est <a href="https://github.com/ByteRoast/music-sharity-proxy" target="_blank" rel="noopener noreferrer" class="">open source</a></li>
</ul>
<p>Consultez notre <a href="https://music-sharity.byteroast.fr/privacy.html" target="_blank" rel="noopener noreferrer" class="">politique de confidentialité</a> complète pour plus de détails.</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="contribuer">Contribuer<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#contribuer" class="hash-link" aria-label="Lien direct vers Contribuer" title="Lien direct vers Contribuer" translate="no">​</a></h2>
<p>Music Sharity est <strong>open source</strong> (GPL v3). Les contributions sont les bienvenues, en particulier pour :</p>
<ul>
<li class="">La prise en charge d'iOS/macOS (propriétaires de Mac recherchés)</li>
<li class="">Les optimisations web</li>
<li class="">L'intégration de nouvelles plateformes</li>
<li class="">Les corrections de bugs et la documentation</li>
</ul>
<p>Consultez le <a href="https://github.com/ByteRoast/music-sharity/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">guide de contribution</a> pour commencer !</p>
<h2 class="anchor anchorTargetStickyNavbar_FMEz" id="intégration-continue">Intégration continue<a href="https://byteroast.fr/fr/blog/music-sharity-1.0.0#int%C3%A9gration-continue" class="hash-link" aria-label="Lien direct vers Intégration continue" title="Lien direct vers Intégration continue" translate="no">​</a></h2>
<p>Chaque push est automatiquement testé sur toutes les plateformes :</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>Notre pipeline de CI garantit que :</p>
<ul>
<li class="">L'APK Android se compile correctement</li>
<li class="">L'application web se compile correctement</li>
<li class="">L'exécutable Windows se compile sans erreur</li>
<li class="">Les paquets Linux (DEB/RPM) se construisent correctement</li>
<li class="">Le code passe l'analyse statique</li>
</ul>
<hr>
<p><strong>Essayez Music Sharity dès aujourd'hui et partagez votre musique sans effort !</strong></p>
<ul>
<li class=""><a href="https://music-sharity.byteroast.fr/" target="_blank" rel="noopener noreferrer" class="">Essayer l'application web</a></li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity/releases" target="_blank" rel="noopener noreferrer" class="">Télécharger sur GitHub</a></li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity" target="_blank" rel="noopener noreferrer" class="">Mettre une étoile au projet</a></li>
<li class=""><a href="https://github.com/ByteRoast/music-sharity/issues" target="_blank" rel="noopener noreferrer" class="">Signaler un problème</a></li>
</ul>]]></content>
        <author>
            <name>Sikelio</name>
            <uri>https://github.com/sikelio</uri>
        </author>
        <category label="release" term="release"/>
        <category label="music sharity" term="music sharity"/>
        <category label="android" term="android"/>
        <category label="windows" term="windows"/>
        <category label="linux" term="linux"/>
        <category label="flutter" term="flutter"/>
        <category label="pwa" term="pwa"/>
    </entry>
</feed>