<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://tabula.tablinum.fr/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Tabula</title>
	<link>https://tabula.tablinum.fr/</link>
	<description>Des tutos, des cheat-sheet, des articles, ...</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="http://tabula.tablinum.fr/spip.php?page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Nettoyer vieux containers Docker</title>
		<link>http://tabula.tablinum.fr/nettoyer-vieux-containers-docker</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/nettoyer-vieux-containers-docker</guid>
		<dc:date>2025-08-12T13:26:09Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;journalctl &#8212;vacuum-size=500M sudo find /var/log/ -type f -regex '.*\.[0-9]+\.gz$' -delete
&lt;br class='autobr' /&gt;
docker system df docker system prune -af &#8212;volumes&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-docker-12-" rel="directory"&gt;Docker&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;journalctl --vacuum-size=500M sudo find /var/log/ -type f -regex '.*\.[0-9]+\.gz$' -delete docker system df docker system prune -af --volumes &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Mettre &#224; jour tous les dockers compose</title>
		<link>http://tabula.tablinum.fr/mettre-a-jour-tous-les-dockers-compose</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/mettre-a-jour-tous-les-dockers-compose</guid>
		<dc:date>2025-08-12T13:21:08Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;Attention : &lt;br class='autobr' /&gt;
* Cela ne fonctionne que pour les docker compose qui tournent actuellement
&lt;br class='autobr' /&gt;
* Si un docker compose a plusieurs containers, alors le pull sera relanc&#233; plusieurs fois pour l'ensemble des docker compose ! docker ps &#8212;format '.Names .Mounts' | while read container mounts ; do echo &#034;&gt; Conteneur : $container&#034; path=$(docker inspect $container | grep 'com.docker.compose.project.working_dir' | awk -F' : ' 'print $2' | tr -d '&#034;,') echo &#034;&gt; Chemin : (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-docker-12-" rel="directory"&gt;Docker&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Attention :&lt;/p&gt;
&lt;p&gt;* Cela ne fonctionne que pour les docker compose qui tournent actuellement&lt;br class='autobr' /&gt;
* Si un docker compose a plusieurs containers, alors le pull sera relanc&#233; plusieurs fois pour l'ensemble des docker compose !&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker ps --format '{{.Names}} {{.Mounts}}' | while read container mounts; do echo &#034;&gt; Conteneur: $container&#034; path=$(docker inspect $container | grep 'com.docker.compose.project.working_dir' | awk -F': ' '{print $2}' | tr -d '&#034;,') echo &#034;&gt; Chemin: $path&#034; cd $path docker compose stop docker compose pull docker compose up -d cd - echo &#034;&#034; done &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Avoir un environnement de travail s&#233;curis&#233;</title>
		<link>http://tabula.tablinum.fr/avoir-un-environnement-de-travail-securise</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/avoir-un-environnement-de-travail-securise</guid>
		<dc:date>2024-11-12T19:39:41Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;$ run &#8212;rm -it -v /tmp/mydir :/tmp alpine:latest /bin/bash $ apk update &amp;&amp; apk upgrade $ apk add gcc git python3 py-pip $ pip3 install logging binascii json struct os glob &#8212;break-system-packages &lt;br class='autobr' /&gt;
(attention : gcc : 224 Mo)
&lt;br class='autobr' /&gt;
Puis faire ce que l'on veut, par exemple : &lt;br class='autobr' /&gt;
$ git clone https://github.com/fcoiffie/decode-ColorNote.git&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-docker-12-" rel="directory"&gt;Docker&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ run --rm -it -v /tmp/mydir:/tmp alpine:latest /bin/bash $ apk update &amp;&amp; apk upgrade $ apk add gcc git python3 py-pip $ pip3 install logging binascii json struct os glob --break-system-packages &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;(attention : gcc : 224 Mo)&lt;br class='autobr' /&gt;
Puis faire ce que l'on veut, par exemple :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$ git clone https://github.com/fcoiffie/decode-ColorNote.git&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Transf&#233;rer des container docker</title>
		<link>http://tabula.tablinum.fr/transferer-des-container-docker</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/transferer-des-container-docker</guid>
		<dc:date>2024-08-31T09:16:07Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;Sur l'ancien serveur &lt;br class='autobr' /&gt;
Pr&#233;paration : r&#233;cup&#233;rer les fichiers non pr&#233;sents dans le dossier &#224; l'origine &lt;br class='autobr' /&gt;
Recopier le fichier de config nginx nettoy&#233; du certificat SSL bash SERVICE_DIR=&#034;myservice&#034; &amp;amp ;&amp;amp ; SERVICE_URL=&#034;exemple.fr&#034; &amp;amp ;&amp;amp ; CONF_FILE=$(grep -l &#034;server_name.*$SERVICE_URL&#034; /etc/nginx/conf.d/*.conf) &amp;amp ;&amp;amp ; cp &#034;$CONF_FILE&#034; &#034;$SERVICE_DIR/&#034; &amp;amp ;&amp;amp ; sed -i '/# managed by Certbot/d ; (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-documentation-" rel="directory"&gt;Documentation&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;h1&gt;Sur l'ancien serveur&lt;/h1&gt;&lt;h2&gt;Pr&#233;paration : r&#233;cup&#233;rer les fichiers non pr&#233;sents dans le dossier &#224; l'origine&lt;/h2&gt;&lt;h3&gt;Recopier le fichier de config nginx nettoy&#233; du certificat SSL&lt;/h3&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;SERVICE_DIR=&#034;myservice&#034; &amp;&amp; SERVICE_URL=&#034;exemple.fr&#034; &amp;&amp; CONF_FILE=$(grep -l &#034;server_name.*$SERVICE_URL&#034; /etc/nginx/conf.d/*.conf) &amp;&amp; cp &#034;$CONF_FILE&#034; &#034;$SERVICE_DIR/&#034; &amp;&amp; sed -i '/# managed by Certbot/d; /ssl_certificate/d; /ssl_certificate_key/d; /include \/etc\/letsencrypt/d; /ssl_dhparam/d; /if ($host =/d; /listen 443 ssl;/d; /return 301/d; /return 404;/d' &#034;$SERVICE_DIR/$(basename &#034;$CONF_FILE&#034;)&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Attention : supprimer la derni&#232;re section et repasser le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;listen 80;&lt;/code&gt; dans la section &#034;server&#034; du haut !&lt;/p&gt;
&lt;h3&gt;R&#233;cup&#233;rer les volumes qui ne sont pas des fichiers (s'il y en a)&lt;/h3&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ docker volume ls &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker run --rm -v mydockervolume:/data -v $(pwd):/backup alpine tar czvf /backup/mydockervolume.tar.gz -C /data &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;1. Cr&#233;er une archive&lt;/h2&gt;&lt;h3&gt;a. En une commande&lt;/h3&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; SERVICE_DIR=&#034;myservice&#034; &amp;&amp; VOLUMES_TO_BACKUP=&#034;volumeOne volumeTwo&#034; &amp;&amp; cd &#034;$SERVICE_DIR&#034; &amp;&amp; docker run --rm -v $(pwd):/backup alpine tar -C /backup -cvf /backup/volume_backup.tar $VOLUMES_TO_BACKUP &amp;&amp; echo &#034;volumes: $VOLUMES_TO_BACKUP saved&#034; &amp;&amp; cd .. &amp;&amp; tar cvf ${SERVICE_DIR}.tar --exclude-from=&lt;(echo -e &#034;${VOLUMES_TO_BACKUP// /\\n}\nother_file.txt&#034;) &#034;$SERVICE_DIR&#034; &amp;&amp; echo &#034;service: $SERVICE_DIR saved&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Changer &#034;myservice&#034; et &#034;volumeOne volumeTwo&#034; par le nom du r&#233;pertoire du service et par les diff&#233;rents volumes &#224; enlever.&lt;br class='autobr' /&gt;
Ensuite, on a directement une archive &#224; envoyer&lt;/p&gt;
&lt;h3&gt;b. en plusieurs commandes&lt;/h3&gt;
&lt;h4&gt;1. Cr&#233;er une archive avec les volumes&lt;/h4&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ docker run --rm -v $(pwd):/backup alpine tar -C /backup -cvf /backup/volume_backup.tar volumeOne volumeTwo volumeThree &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;2. Cr&#233;er une archive avec tous les fichiers du dossier, sauf les volumes&lt;/h4&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ tar cvf myservice.tar --exclude-from=&lt;(echo -e &#034;config\naddons\nweb-datas\n*~&#034;) myservice &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;2. Envoyer l'archive&lt;/h2&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;rsync -avzP --delete -e &#034;ssh -p 22 -T -o Compression=no -x&#034; /opt/docker/myservice.tar username@ip:/opt/docker/ &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;V&#233;rifier l'int&#233;grit&#233; de l'archive (checksum) : l'option &#034;p&#034; est chang&#233;e par &#034;c&#034;&lt;br class='autobr' /&gt;
rsync -avzc &#8212;delete -e &#034;ssh -p 22 -T -o Compression=no -x&#034; /opt/docker/myservice.tar username@ip :/opt/docker/&lt;/p&gt;
&lt;h2&gt;3. Extraire sur le serveur distant&lt;/h2&gt;
&lt;p&gt;Attention &#224; ouvrir les ports 80, 88 et 334 (http, https) si ce n'est pas encore le cas.&lt;/p&gt;
&lt;p&gt;Il faut que rsync, docker, nginx et letsencrypt soient install&#233;s.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;SERVICE_DIR=&#034;myservice&#034; &amp;&amp; echo &#034;&#034; &amp;&amp; tar xvf ${SERVICE_DIR}.tar &amp;&amp; cd $SERVICE_DIR &amp;&amp; [ -f &#034;volume_backup.tar&#034; ] &amp;&amp; (tar -xvf &#034;volume_backup1.tar&#034; 2&gt;/dev/null || echo &#034;**WARNING** Il n'y a pas de volume &#224; extraire.&#034;) &amp;&amp; rm -rf volume_backup.tar &amp;&amp; cd .. &amp;&amp; echo &#034;&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Configurer letsencrypy&lt;/h3&gt;
&lt;p&gt;Pour rappel, voici un tuto &lt;a href=&#034;https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-11&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Et il faut que l'utilisateur ai les droits ou &#234;tre en root : &lt;br class='autobr' /&gt;
Pour donner &#224; l'utilisateur les droits :&lt;br class='autobr' /&gt;
# vi /etc/nginx/nginx.conf # : user : doit &#234;tre sur www-data&lt;br class='autobr' /&gt;
# chgrp www-data /etc/nginx/conf.d&lt;br class='autobr' /&gt;
# chmod g+w /etc/nginx/conf.d/&lt;br class='autobr' /&gt;
# # ls -la /etc/nginx/conf.d&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# cp myservice/myurl.fr.conf /etc/nginx/conf.d/ &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;D&#233;compresser les volumes docker&lt;/h3&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar xzvf /backup/myvolume.tar.gz -C /data &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;============&lt;/p&gt;
&lt;h1&gt;Ce qui m'a aid&#233; (&#224; nettoyer)&lt;/h1&gt;
&lt;p&gt;(Perplexity)&lt;/p&gt;
&lt;p&gt;Pour transf&#233;rer enti&#232;rement un volume Docker d'un VPS vers un autre, voici la proc&#233;dure recommand&#233;e :&lt;/p&gt;
&lt;p&gt;## &#201;tape 1 : Sauvegarde du volume sur le VPS source&lt;/p&gt;
&lt;p&gt;1. Arr&#234;tez le conteneur utilisant le volume :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker stop &lt;nom_conteneur&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2. Cr&#233;ez une archive tar du volume :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker run --rm -v &lt;nom_volume&gt;:/source -v $(pwd):/backup alpine tar cvf /backup/volume_backup.tar /source &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette commande cr&#233;e une archive &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;volume_backup.tar&lt;/code&gt; dans le r&#233;pertoire courant.&lt;/p&gt;
&lt;p&gt;## &#201;tape 2 : Transfert de l'archive vers le nouveau VPS&lt;/p&gt;
&lt;p&gt;Utilisez scp pour transf&#233;rer l'archive :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;scp volume_backup.tar utilisateur@nouveau_vps:/chemin/destination/ &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;## &#201;tape 3 : Restauration du volume sur le nouveau VPS&lt;/p&gt;
&lt;p&gt;1. Sur le nouveau VPS, cr&#233;ez un nouveau volume Docker :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker volume create &lt;nouveau_nom_volume&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2. Restaurez les donn&#233;es dans le nouveau volume :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;docker run --rm -v &lt;nouveau_nom_volume&gt;:/destination -v /chemin/destination:/backup alpine sh -c &#034;cd /destination &amp;&amp; tar xvf /backup/volume_backup.tar --strip 1&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;## &#201;tape 4 : Utilisation du volume restaur&#233;&lt;/p&gt;
&lt;p&gt;Modifiez votre fichier docker-compose.yml ou la commande docker run pour utiliser le nouveau volume :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;yaml&#034; class='spip_code spip_code_block language-yaml' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;volumes: - &lt;nouveau_nom_volume&gt;:/chemin/dans/conteneur &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;## Consid&#233;rations importantes&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; **Taille du volume** : Pour les volumes volumineux, envisagez de compresser l'archive ou d'utiliser un transfert par morceaux[1].&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; **Coh&#233;rence des donn&#233;es** : Assurez-vous que le conteneur est arr&#234;t&#233; pendant la sauvegarde pour garantir l'int&#233;grit&#233; des donn&#233;es[4].&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; **Permissions** : V&#233;rifiez que les permissions des fichiers sont correctement pr&#233;serv&#233;es lors de la restauration[2].&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; **Noms de volumes** : Adaptez les noms des volumes dans vos configurations Docker sur le nouveau VPS si n&#233;cessaire[5].&lt;/p&gt;
&lt;p&gt;En suivant ces &#233;tapes, vous pouvez transf&#233;rer efficacement et en toute s&#233;curit&#233; un volume Docker complet d'un VPS &#224; un autre, en pr&#233;servant toutes les donn&#233;es et la structure du volume.&lt;/p&gt;
&lt;p&gt;Citations :&lt;br class='autobr' /&gt;
[1] &lt;a href=&#034;https://bitlaunch.io/blog/how-to-transfer-docker-volumes-between-your-vps-and-local-pc/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://bitlaunch.io/blog/how-to-transfer-docker-volumes-between-your-vps-and-local-pc/&lt;/a&gt;&lt;br class='autobr' /&gt;
[2] &lt;a href=&#034;https://vsys.host/how-to/transferring-a-docker-volume-to-another-host&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://vsys.host/how-to/transferring-a-docker-volume-to-another-host&lt;/a&gt;&lt;br class='autobr' /&gt;
[3] &lt;a href=&#034;https://www.ionos.fr/digitalguide/serveur/know-how/volumes-de-conteneurs-docker/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.ionos.fr/digitalguide/serveur/know-how/volumes-de-conteneurs-docker/&lt;/a&gt;&lt;br class='autobr' /&gt;
[4] &lt;a href=&#034;https://docs.docker.com/engine/storage/volumes/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.docker.com/engine/storage/volumes/&lt;/a&gt;&lt;br class='autobr' /&gt;
[5] &lt;a href=&#034;https://www.reddit.com/r/docker/comments/18oxsk7/how_to_move_everything/?tl=fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.reddit.com/r/docker/comments/18oxsk7/how_to_move_everything/?tl=fr&lt;/a&gt;&lt;br class='autobr' /&gt;
[6] &lt;a href=&#034;https://mondedie.fr/d/10982-migrations-conteneurs&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://mondedie.fr/d/10982-migrations-conteneurs&lt;/a&gt;&lt;br class='autobr' /&gt;
[7] &lt;a href=&#034;https://www.youtube.com/watch?v=0ZcePSwZ41w&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.youtube.com/watch?v=0ZcePSwZ41w&lt;/a&gt;&lt;br class='autobr' /&gt;
[8] &lt;a href=&#034;https://cnil.fr/fr/les-outils-de-securisation-dapplications-web-dans-linformatique-en-nuage-cloud&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://cnil.fr/fr/les-outils-de-securisation-dapplications-web-dans-linformatique-en-nuage-cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;=====================================================&lt;/p&gt;
&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;Pour copier efficacement et compl&#232;tement les donn&#233;es d'un VPS vers un autre en utilisant rsync, tout en maximisant la vitesse de transfert, voici la proc&#233;dure recommand&#233;e :&lt;/p&gt;
&lt;p&gt;## Pr&#233;paration&lt;/p&gt;
&lt;p&gt;1. Assurez-vous que rsync est install&#233; sur les deux VPS. Si ce n'est pas le cas, installez-le :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt-get install rsync # Pour Debian/Ubuntu sudo yum install rsync # Pour CentOS/RHEL &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2. V&#233;rifiez que vous avez un acc&#232;s SSH aux deux VPS.&lt;/p&gt;
&lt;p&gt;## Commande rsync optimis&#233;e&lt;/p&gt;
&lt;p&gt;Utilisez la commande suivante depuis le VPS de destination :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;rsync -avzP --delete --exclude={&#034;/dev/*&#034;,&#034;/proc/*&#034;,&#034;/sys/*&#034;,&#034;/tmp/*&#034;,&#034;/run/*&#034;,&#034;/mnt/*&#034;,&#034;/media/*&#034;,&#034;/lost+found&#034;} -e &#034;ssh -p 22 -T -c aes128-gcm@openssh.com -o Compression=no -x&#034; root@IP_SOURCE:/ / &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;## Explication des options&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-a&lt;/code&gt; : mode archive (pr&#233;serve les permissions, propri&#233;t&#233;s, etc.)
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-v&lt;/code&gt; : mode verbeux
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-z&lt;/code&gt; : compresse les donn&#233;es pendant le transfert
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-P&lt;/code&gt; : montre la progression et permet la reprise des transferts interrompus
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--delete&lt;/code&gt; : supprime les fichiers de destination qui n'existent plus &#224; la source
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--exclude&lt;/code&gt; : exclut certains r&#233;pertoires non n&#233;cessaires ou probl&#233;matiques
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-e &#034;ssh ...&#034;&lt;/code&gt; : options SSH pour optimiser la vitesse :&lt;br class='autobr' /&gt; - &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-T&lt;/code&gt; : d&#233;sactive l'allocation de pseudo-terminal&lt;br class='autobr' /&gt; - &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-c aes128-gcm@openssh.com&lt;/code&gt; : utilise un chiffrement rapide&lt;br class='autobr' /&gt; - &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-o Compression=no&lt;/code&gt; : d&#233;sactive la compression SSH (rsync s'en charge)&lt;br class='autobr' /&gt; - &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-x&lt;/code&gt; : d&#233;sactive le transfert X11&lt;/p&gt;
&lt;p&gt;## Consid&#233;rations importantes&lt;/p&gt;
&lt;p&gt;1. **Arr&#234;t des services** : Arr&#234;tez les services critiques sur le VPS source pour assurer la coh&#233;rence des donn&#233;es.&lt;/p&gt;
&lt;p&gt;2. **V&#233;rification** : Apr&#232;s le transfert, v&#233;rifiez l'int&#233;grit&#233; des donn&#233;es :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;rsync -avzc --delete [m&#234;mes options que pr&#233;c&#233;demment] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-c&lt;/code&gt; effectue une v&#233;rification par checksum.&lt;/p&gt;
&lt;p&gt;3. **Permissions** : Assurez-vous que les permissions sont correctement transf&#233;r&#233;es, particuli&#232;rement pour les fichiers syst&#232;me critiques.&lt;/p&gt;
&lt;p&gt;4. **Bande passante** : Cette m&#233;thode utilise beaucoup de bande passante. Assurez-vous que cela ne pose pas de probl&#232;me avec votre fournisseur VPS.&lt;/p&gt;
&lt;p&gt;5. **Temps** : Le processus peut prendre plusieurs heures selon la quantit&#233; de donn&#233;es et la vitesse de connexion.&lt;/p&gt;
&lt;p&gt;En suivant cette m&#233;thode, vous obtiendrez une copie compl&#232;te et fid&#232;le de votre VPS source vers le VPS de destination, tout en optimisant la vitesse du transfert.&lt;/p&gt;
&lt;p&gt;Citations :&lt;br class='autobr' /&gt;
[1] &lt;a href=&#034;https://www.hostwinds.fr/tutorials/how-to-sync-a-vps-to-your-local-computer-with-rsync-linux&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.hostwinds.fr/tutorials/how-to-sync-a-vps-to-your-local-computer-with-rsync-linux&lt;/a&gt;&lt;br class='autobr' /&gt;
[2] &lt;a href=&#034;https://www.hostinger.fr/tutoriels/commande-rsync-linux&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.hostinger.fr/tutoriels/commande-rsync-linux&lt;/a&gt;&lt;br class='autobr' /&gt;
[3] &lt;a href=&#034;https://eroambahub.com/transferer-vos-donnees-autrement-rsync-et-scp/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://eroambahub.com/transferer-vos-donnees-autrement-rsync-et-scp/&lt;/a&gt;&lt;br class='autobr' /&gt;
[4] &lt;a href=&#034;https://www.ionos.fr/digitalguide/serveur/outils/creer-une-sauvegarde-de-serveur-avec-rsync/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.ionos.fr/digitalguide/serveur/outils/creer-une-sauvegarde-de-serveur-avec-rsync/&lt;/a&gt;&lt;br class='autobr' /&gt;
[5] &lt;a href=&#034;https://www.easyhoster.com/aide/migration-rsync/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.easyhoster.com/aide/migration-rsync/&lt;/a&gt;&lt;br class='autobr' /&gt;
[6] &lt;a href=&#034;https://www.scrample.xyz/sauvegarde-avec-rsync/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.scrample.xyz/sauvegarde-avec-rsync/&lt;/a&gt;&lt;br class='autobr' /&gt;
[7] &lt;a href=&#034;https://bitlaunch.io/blog/how-to-transfer-docker-volumes-between-your-vps-and-local-pc/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://bitlaunch.io/blog/how-to-transfer-docker-volumes-between-your-vps-and-local-pc/&lt;/a&gt;&lt;br class='autobr' /&gt;
[8] &lt;a href=&#034;https://www.webhi.com/how-to/fr/comment-utiliser-rsync-pour-copier-des-fichiers-via-ssh/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.webhi.com/how-to/fr/comment-utiliser-rsync-pour-copier-des-fichiers-via-ssh/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Annuaire de sites catholiques g&#233;n&#233;ralistes et d'informations</title>
		<link>http://tabula.tablinum.fr/annuaire-de-sites-catholiques-generalistes-et-d-informations</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/annuaire-de-sites-catholiques-generalistes-et-d-informations</guid>
		<dc:date>2024-04-13T20:24:35Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;Nota : ce classement est fait &#224; titre personnel, vous avez le droit de ne pas &#234;tre d'accord avec celui-ci, mais j'essaye de le faire le plus honn&#234;tement possible et dans un esprit d'ouverture. Les sites pr&#233;sentant des positions fermes et sans justification au regard de l'Amour de Dieu seront automatiquement d&#233;valoris&#233; dans ce classement, bien que certains de leurs articles puissent &#234;tre pertinents et int&#233;ressants &lt;br class='autobr' /&gt;
Pratiques &lt;br class='autobr' /&gt;
Messes Horaire des messes : https://messes.info Aide : (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-catholique-" rel="directory"&gt;Catholique&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Nota : ce classement est fait &#224; titre personnel, vous avez le droit de ne pas &#234;tre d'accord avec celui-ci, mais j'essaye de le faire le plus honn&#234;tement possible et dans un esprit d'ouverture. Les sites pr&#233;sentant des positions fermes et sans justification au regard de l'Amour de Dieu seront automatiquement d&#233;valoris&#233; dans ce classement, bien que certains de leurs articles puissent &#234;tre pertinents et int&#233;ressants&lt;/p&gt;
&lt;h1&gt;Pratiques&lt;/h1&gt;&lt;h2&gt;Messes&lt;/h2&gt;
&lt;h3&gt;Horaire des messes : &lt;a href=&#034;https://messes.info&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://messes.info&lt;/a&gt;&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Aide : &lt;a href=&#034;http://aide.egliseinfo.catholique.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://aide.egliseinfo.catholique.fr&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Contributions&lt;/strong&gt; : &lt;a href=&#034;http://aide.egliseinfo.catholique.fr/contributeurs&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://aide.egliseinfo.catholique.fr/contributeurs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Partitions pour la messe : &lt;a href=&#034;https://secli.cef.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://secli.cef.fr&lt;/a&gt;&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Gr&#233;gorien :
&lt;br /&gt;&#8212; &lt;a href=&#034;https://gregobase.selapa.net/scores.php&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://gregobase.selapa.net/scores.php&lt;/a&gt;
&lt;br /&gt;&#8212; &lt;a href=&#034;https://www.gregorian-chant-hymns.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.gregorian-chant-hymns.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Informations g&#233;n&#233;rales sur la liturgie : &lt;a href=&#034;https://liturgie.catholique.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://liturgie.catholique.fr&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Le site propose beaucoup de ressources&lt;/p&gt;
&lt;h3&gt;Site de l'AELF (Bible, liturgie des heures : &lt;a href=&#034;https://aelf.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://aelf.org&lt;/a&gt; )&lt;/h3&gt;
&lt;p&gt;De nombreux sites reprennent leurs donn&#233;es, avec plus ou moins de valeur ajout&#233;e, je ne les listerai pas ici.&lt;/p&gt;
&lt;h3&gt;Bible annot&#233;e : &lt;a href=&#034;https://bibleart.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://bibleart.com&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bible de J&#233;rusalem annot&#233;e, et en ligne&lt;/p&gt;
&lt;h2&gt;&#201;v&#233;nements&lt;/h2&gt;
&lt;h3&gt;Jeunes &#224; Paris : &lt;a href=&#034;http://www.jeunesaparis.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://www.jeunesaparis.org&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dioc&#232;se de Paris, mais propose des retraites parfois en dehors de Paris aussi&lt;/p&gt;
&lt;h3&gt;Cathosph&#232;re : &lt;a href=&#034;https://cathosphere.co&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://cathosphere.co&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Application contributive&lt;/p&gt;
&lt;h2&gt;&#201;glise en France : autres sites&lt;/h2&gt;
&lt;h3&gt;Portail : &lt;a href=&#034;https://eglise.catholique.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://eglise.catholique.fr&lt;/a&gt;&lt;/h3&gt;
&lt;h3&gt;Saint du jour : &lt;a href=&#034;https://nominis.cef.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://nominis.cef.fr&lt;/a&gt;&lt;/h3&gt;&lt;h2&gt;&#201;glise romaine : autres sites&lt;/h2&gt;
&lt;h3&gt;vatican.va&lt;/h3&gt;
&lt;h3&gt;Documents du Vatican&lt;/h3&gt;&lt;h1&gt;Actualit&#233;s&lt;/h1&gt;
&lt;h2&gt;Sites officiels&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://www.vatican.va/content/vatican/fr.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.vatican.va/content/vatican/fr.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.vaticannews.va/fr.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.vaticannews.va/fr.html&lt;/a&gt; : VaticanNews&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Agr&#233;gateur&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; cathoscan.com : Tr&#232;s complet&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Autres sites d'actualit&#233;s recommand&#233;s&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://fr.zenit.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://fr.zenit.org&lt;/a&gt; : l'actualit&#233; romaine&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://fr.aleteia.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://fr.aleteia.org&lt;/a&gt; : Un peu racolleur mais ok (source acceptable par Wikip&#233;dia, mais &#224; &#233;viter)&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.famillechretienne.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.famillechretienne.fr&lt;/a&gt; : incontournable, droite lib&#233;rale-conservatrice&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.france-catholique.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.france-catholique.fr&lt;/a&gt; : tr&#232;s conservateur&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.revue-etudes.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.revue-etudes.com&lt;/a&gt; : Magasine j&#233;suite tr&#232;s int&#233;ressant&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.laciviltacattolica.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.laciviltacattolica.fr&lt;/a&gt; : ==&gt; &#224; revoir&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.terresainte.net&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.terresainte.net&lt;/a&gt; : ==&gt; &#224; revoir&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://lanef.net&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://lanef.net&lt;/a&gt; : conservateur&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://l1visible.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://l1visible.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Blogs&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://www.larebellution.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.larebellution.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;&#201;dification&lt;/h1&gt;
&lt;h2&gt;Cath&#233;chismes&lt;/h2&gt;
&lt;p&gt;Tous les sites ici sont sous la direction d'un pr&#234;tre missionn&#233; pour cela&lt;/p&gt;
&lt;h3&gt;L'Amour Vaincra : &lt;a href=&#034;https://academy.lamourvaincra.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://academy.lamourvaincra.com&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;G&#233;n&#233;raliste, &#224; destination des jeunes (16-30 ans) principalement&lt;/p&gt;
&lt;h3&gt;Th&#233;odom : &lt;a href=&#034;https://www.theodom.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.theodom.org&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Th&#233;ologie, pr&#233;sent&#233; par des dominicains, plus pouss&#233; que l'Amour Vaincra.&lt;/p&gt;
&lt;h3&gt;Porta Fidei : &lt;a href=&#034;https://portafidei.fr/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://portafidei.fr/&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Semble &#224; destination des autres confessions/religions, contenu plut&#244;t light&lt;/p&gt;
&lt;h2&gt;Sur la messe&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pour les servants de messe : &lt;a href=&#034;https://www.ceremoniaire.net&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.ceremoniaire.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt; PGMR :&lt;/li&gt;&lt;li&gt; MR (Missel Romain) :&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Documents officiels de l'&#201;glise catholique&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; CEC (Cat&#233;chisme de l'&#201;glise catho) :&lt;/li&gt;&lt;li&gt; CIC (Code du Droit Canonique) :&lt;/li&gt;&lt;li&gt; DSE (Compendium de la Doctrine Sociale) :&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Autres sites pour se former&lt;/h2&gt;
&lt;h3&gt;Couple, cheminement, fiancailles, mariage : &lt;a href=&#034;https://fiancailles.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://fiancailles.org&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Site de questions/r&#233;ponses (d&#233;velopp&#233;es), permettant d'avoir des pistes de r&#233;flexion&lt;/p&gt;
&lt;h3&gt;Agr&#233;gateurs&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://www.holychatter.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.holychatter.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://theostream.com/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://theostream.com/&lt;/a&gt; catho, protestant, allant &#224; l'encontre du CEC potentiellement...&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;D&#233;conseill&#233;s&lt;/h3&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://unpretrevousrepond.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://unpretrevousrepond.org&lt;/a&gt; =&gt; pas toujours tr&#232;s &#233;clair&#233;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://gotquestions.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://gotquestions.org&lt;/a&gt; =&gt; protestant&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;&#192; ranger&lt;/h1&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://www.portstnicolas.org&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.portstnicolas.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://cybercure.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://cybercure.fr&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.introibo.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.introibo.fr&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.jesus-islam.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.jesus-islam.fr&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.hackmychurch.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.hackmychurch.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://eglise.in&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://eglise.in&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Migration Gandi -&gt; Infomaniak</title>
		<link>http://tabula.tablinum.fr/migration-gandi-infomaniak</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/migration-gandi-infomaniak</guid>
		<dc:date>2024-01-09T11:15:14Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;Todo&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-desktop-" rel="directory"&gt;Desktop&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Todo&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Configuration mails &amp; agendas</title>
		<link>http://tabula.tablinum.fr/configuration-mails-agendas</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/configuration-mails-agendas</guid>
		<dc:date>2024-01-09T11:15:10Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;### Thunderbird &lt;br class='autobr' /&gt;
#### Configuration Gnome3
&lt;br class='autobr' /&gt;
Mettre Thunderbird par d&#233;faut :
&lt;br class='autobr' /&gt;
&#8211; Mails : ??
&lt;br class='autobr' /&gt;
&#8211; Calendrier : org.gnome.desktop.default-applications.office.calendar &gt; thunderbird &#8212;calendar
&lt;br class='autobr' /&gt;
&#8211; T&#226;ches : org.gnome.desktop.default-applications.office.tasks &gt; ??? &lt;br class='autobr' /&gt;
&#8211; Plugin gnome3 : ?? &lt;br class='autobr' /&gt;
#### Dans Thunderbird
&lt;br class='autobr' /&gt;
&#8211; Radicale : Lecture : ok | &#233;criture : ok
&lt;br class='autobr' /&gt;
&#8211; Gandi : Lecture : ok | &#233;criture : pas ok
&lt;br class='autobr' /&gt;
&#8211; Infomaniak : Lecture : ok | &#233;criture : ok ATTENTION : utiliser l'assistant de synchronisation pour (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-desktop-" rel="directory"&gt;Desktop&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;### Thunderbird&lt;/p&gt;
&lt;p&gt;#### Configuration Gnome3&lt;br class='autobr' /&gt;
Mettre Thunderbird par d&#233;faut :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Mails : ??
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Calendrier : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;org.gnome.desktop.default-applications.office.calendar&lt;/code&gt; &gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;thunderbird --calendar&lt;/code&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; T&#226;ches : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;org.gnome.desktop.default-applications.office.tasks&lt;/code&gt; &gt; ???&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Plugin gnome3 : ??&lt;/p&gt;
&lt;p&gt;#### Dans Thunderbird
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;Radicale : Lecture : ok | &#233;criture : ok&lt;/strong&gt;
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Gandi : Lecture : ok | &#233;criture : pas ok
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;strong&gt;Infomaniak : Lecture : ok | &#233;criture : ok&lt;/strong&gt; ATTENTION : utiliser l'assistant de synchronisation pour pouvoir avoir l'acc&#232;s en &#233;criture ! &lt;a href=&#034;https://config.infomaniak.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://config.infomaniak.com&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Python - test unitaire</title>
		<link>http://tabula.tablinum.fr/python-test-unitaire</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/python-test-unitaire</guid>
		<dc:date>2023-06-03T15:06:32Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;Pr&#233;ambule : toute fonction Python n'a pas vocation &#224; accueillir des tests unitaires. Les tests unitaires ne sont utiles que pour des fonctions &#034;outils&#034;, pas pour des codes complexes avec mes milliers de param&#232;tres. &lt;br class='autobr' /&gt;
D&#233;buter les tests unitaires Principe Le test unitaire consiste &#224; tester le comportement d'une fonction pour s'assurer que pour une entr&#233;e donn&#233;e, le r&#233;sultat donne bien la sortie attendue. Cela permet notamment de s'assurer de la non-regression (qu'une modification dans le code (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-python-aller-plus-loin-" rel="directory"&gt;Python - Aller plus loin&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;strong&gt;Pr&#233;ambule&lt;/strong&gt; : toute fonction Python n'a pas vocation &#224; accueillir des tests unitaires.&lt;br class='autobr' /&gt;
Les tests unitaires ne sont utiles que pour des fonctions &#034;outils&#034;, pas pour des codes complexes avec mes milliers de param&#232;tres.&lt;/p&gt;
&lt;h1&gt;D&#233;buter les tests unitaires&lt;/h1&gt;
&lt;h2&gt;Principe&lt;/h2&gt;
&lt;p&gt;Le test unitaire consiste &#224; tester le comportement d'une fonction pour s'assurer que pour une entr&#233;e donn&#233;e, le r&#233;sultat donne bien la sortie attendue.&lt;br class='autobr' /&gt;
Cela permet notamment de s'assurer de la non-regression (qu'une modification dans le code ne va pas cr&#233;er une erreur qui se propage dans un code existant).&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Ici, j'utilise le paquet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;converage.py&lt;/code&gt; (&lt;a href=&#034;https://coverage.readthedocs.io/en/coverage-5.0.4/index.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://coverage.readthedocs.io/en/coverage-5.0.4/index.html&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ pip3 install coverage &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Utilisation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Intro&lt;/strong&gt; Ici, le test va s'effectuer automatiquement, sans que l'on ait &#224; pr&#233;ciser le nom des fichiers : l'avantage est que cela permet d'avoir plusieurs fichiers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tests/test_monmodule1.py&lt;/code&gt; assez petit et donc qu'il est facile de s'y retrouver.&lt;br class='autobr' /&gt;
L'inconv&#233;nient est que l'on n'a pas la main sur tout...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remarque :&lt;/strong&gt; Il faut se placer dans le dossier ./tests (si on y a mis ses tests)&lt;/p&gt;
&lt;p&gt;* Avant de lancer le test, il faut s'assurer qu'il n'y ait pas d'anciennes donn&#233;es, sans quoi le test risque de se faire dedans aussi, ce qui ne marchera pas !&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ coverage erase &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;* Lancer le test, avec une d&#233;tection automatique des fichiers sources&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ python3 --branch -m unittest discover &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;* Cr&#233;er le rapport&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ coverage report &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;* Cr&#233;er une copie des sources dans ./tests/Annotate et y mettre les annotations d'utilisation&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ coverage annotate -d ./Annotate &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1&gt;Test et gitlab&lt;/h1&gt;
&lt;h2&gt;Int&#233;gration continue&lt;/h2&gt;
&lt;p&gt;&lt;bloc&gt;&lt;br class='autobr' /&gt;
Extrait du .gitlab-ci.yml&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;test: stage: test script: - echo &#034;Testing...&#034; - pip3 install .[test] - cd tests &amp;&amp; coverage erase - coverage run -m unittest discover - coverage report - coverage xml - sed -i 's|&#034; filename=&#034;|&#034; filename=&#034;./|g' coverage.xml coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' artifacts: paths: - tests/coverage.xml reports: coverage_report: coverage_format: cobertura path: tests/coverage.xml &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/bloc&gt;
&lt;p&gt;Quelques remarques :&lt;br class='autobr' /&gt;
* Ici, les modules pour le test sont pr&#233;cis&#233; dans extra_requires/doc du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;setup.cfg&lt;/code&gt;&lt;br class='autobr' /&gt;
* Je ne pourrais pas dire &#224; quoi servent individuellement toutes ces lignes (en particulier le sed, et les balises &#034;coverage&#034; et &#034;artifacts&#034;, mais visiblement, elles sont n&#233;cessaires. Quand je saurais, j'&#233;diterais cet article.&lt;/p&gt;
&lt;h2&gt;Ajout d'un badge dans Gitlab&lt;/h2&gt;
&lt;p&gt;Parceque c'est inutile, donc indispensable, mais tout de m&#234;me plus joli ^^&lt;br class='autobr' /&gt;
(sans compter que &#231;a donne mauvaise conscience d'avoir un mauvais rating...)&lt;/p&gt;
&lt;p&gt;Il se pr&#233;sente sous la forme :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;![coverage](https://gitlab.example.com/&lt;namespace&gt;/&lt;project&gt;/badges/&lt;branch&gt;/coverage.svg?job=coverage) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et on peut avoir le lien directement en allant dans :&lt;br class='autobr' /&gt;
`project &gt; settings &gt; CI/CD &gt; General Pipelines [expand] &gt; Pipeline Status&lt;/p&gt;
&lt;h1&gt;Ressources&lt;/h1&gt;
&lt;p&gt;* Visualisation dans Gitlab : &lt;a href=&#034;https://docs.gitlab.com/ee/ci/testing/test_coverage_visualization.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.gitlab.com/ee/ci/testing/test_coverage_visualization.html&lt;/a&gt;&lt;br class='autobr' /&gt;
* Inclure &#224; la doc Sphinx : &lt;a href=&#034;https://stackoverflow.com/questions/65944916/how-to-use-sphixs-sphinx-ext-coverages-coverage-show-missing-items&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://stackoverflow.com/questions/65944916/how-to-use-sphixs-sphinx-ext-coverages-coverage-show-missing-items&lt;/a&gt; &lt;a href=&#034;https://www.sphinx-doc.org/ar/master/usage/extensions/coverage.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.sphinx-doc.org/ar/master/usage/extensions/coverage.html&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://gricad-gitlab.univ-grenoble-alpes.fr/continuous-everything/ci&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://gricad-gitlab.univ-grenoble-alpes.fr/continuous-everything/ci&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://docs.gitlab.com/ee/ci/testing/test_coverage_visualization.html#python-example&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.gitlab.com/ee/ci/testing/test_coverage_visualization.html#python-example&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Cr&#233;ation d'un package Python (Pypi)</title>
		<link>http://tabula.tablinum.fr/creation-d-un-package-python-pypi</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/creation-d-un-package-python-pypi</guid>
		<dc:date>2023-05-29T20:56:52Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;* https://test.pypi.org/manage/project/ Dans le doute, passer par un test !!! * https://pypi.org/manage/project/ &lt;br class='autobr' /&gt;
Arborescence et fichiers &lt;br class='autobr' /&gt;
Arborescence du projet git_my_name_module &#9500;&#9472;&#9472; docs &#9474; &#9500;&#9472;&#9472; make.bat &#9474; &#9500;&#9472;&#9472; Makefile &#9474; &#9492;&#9472;&#9472; source &#9474; &#9500;&#9472;&#9472; conf.py &#9474; &#9500;&#9472;&#9472; index.rst &#9474; &#9500;&#9472;&#9472; parserhtml.rst &#9474; &#9492;&#9472;&#9472; readme.rst &#9500;&#9472;&#9472; LICENSE &#9500;&#9472;&#9472; README.md &#9500;&#9472;&#9472; requirements.txt &#9500;&#9472;&#9472; setup.cfg &#9500;&#9472;&#9472; setup.py &#9492;&#9472;&#9472; src &#9500;&#9472;&#9472; my_name_module &#9474; &#9500;&#9472;&#9472; __init__.py &#9474; &#9500;&#9472;&#9472; _members.py &#9474; (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-python-aller-plus-loin-" rel="directory"&gt;Python - Aller plus loin&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;* &lt;a href=&#034;https://test.pypi.org/manage/project/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://test.pypi.org/manage/project/&lt;/a&gt; &lt;strong&gt;Dans le doute, passer par un test !!!&lt;/strong&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://pypi.org/manage/project/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://pypi.org/manage/project/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Arborescence et fichiers&lt;/h2&gt;
&lt;p&gt;&lt;bloc&gt;Arborescence du projet&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;git_my_name_module &#9500;&#9472;&#9472; docs &#9474; &#9500;&#9472;&#9472; make.bat &#9474; &#9500;&#9472;&#9472; Makefile &#9474; &#9492;&#9472;&#9472; source &#9474; &#9500;&#9472;&#9472; conf.py &#9474; &#9500;&#9472;&#9472; index.rst &#9474; &#9500;&#9472;&#9472; parserhtml.rst &#9474; &#9492;&#9472;&#9472; readme.rst &#9500;&#9472;&#9472; LICENSE &#9500;&#9472;&#9472; README.md &#9500;&#9472;&#9472; requirements.txt &#9500;&#9472;&#9472; setup.cfg &#9500;&#9472;&#9472; setup.py &#9492;&#9472;&#9472; src &#9500;&#9472;&#9472; my_name_module &#9474; &#9500;&#9472;&#9472; __init__.py &#9474; &#9500;&#9472;&#9472; _members.py &#9474; &#9492;&#9472;&#9472; ... &#9492;&#9472;&#9472; tests &#9500;&#9472;&#9472; __init__.py &#9492;&#9472;&#9472; test_my_name_module.py &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/bloc&gt;
&lt;p&gt;&lt;bloc&gt;setup.cfg :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# setup.cfg file at the root directory [metadata] name = my_name_module version = 0.0.1a0 author = Pierre description = Une courte description (bandeau de Pypi) long_description = file:README.md long_description_content_type = text/markdown url = url_doc_par_exemple project_urls = Source Code = url_git keywords = mots-clefs [options] python_requires = &gt;=3.9, &lt;4 install_requires = module&gt;=version package_dir= =src packages=my_name_module [options.extras_require] doc = sphinx==6.2.1 sphinx-rtd-theme==1.2.1 myst-parser==1.0.0 tests = pytest &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/bloc&gt;
&lt;p&gt;&lt;bloc&gt;setup.py :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import sys if __name__ == '__main__': try: import sphinx except ImportError: sphinxInstalled=False else: sphinxInstalled=True #endTry if not sphinxInstalled: sys.stderr.write(f&#034;&gt; Warning, Sphinx is not installed ; I'll try it.\n&#034;) #endIf setup() #endIf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/bloc&gt;
&lt;h2&gt;Pr&#233;installation&lt;/h2&gt;
&lt;p&gt;* Il est important de v&#233;rifier que le module marche bien avant &lt;strong&gt;(sur Pypi, impossible de supprimer module pour rollback la version !)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ python3 -m venv pppmod $ source pppmod/bin/activate $ cd git_my_name_module $ pip3 install --upgrade --force-reinstall . $ python3 &gt; import my_name_module &gt; my_name_module.MyClass() $ pip uninstall my_name_module $ deactivate # Quitter l'environnement &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;* Si toutes les &#233;tapes pr&#233;c&#233;dentes sont bonnes, alors on peut passer &#224; la suite : la cr&#233;ation du module proprement dit et l'upload&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ python3.9 setup.py sdist bdist_wheel $ twine upload dist/my_name_module-0.0.1a0.tar.gz $ source pppmod/bin/activate $ pip3 install my_name_module &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1&gt;&#192; faire&lt;/h1&gt;
&lt;p&gt;* Compiler !&lt;/p&gt;
&lt;h1&gt;Sources&lt;/h1&gt;
&lt;p&gt;* &lt;a href=&#034;https://towardsdatascience.com/create-your-own-python-package-and-publish-it-into-pypi-9306a29bc116&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://towardsdatascience.com/create-your-own-python-package-and-publish-it-into-pypi-9306a29bc116&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://sebsauvage.net/streisand.me/sametmax/?20181206_110748_Vive_setup.cfg__et_mort_a_pyproject.toml___&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://sebsauvage.net/streisand.me/sametmax/?20181206_110748_Vive_setup.cfg__et_mort_a_pyproject.toml___&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://stackoverflow.com/questions/32688688/how-to-write-setup-py-to-include-a-git-repository-as-a-dependency&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://stackoverflow.com/questions/32688688/how-to-write-setup-py-to-include-a-git-repository-as-a-dependency&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://peps.python.org/pep-0440/#post-releases&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://peps.python.org/pep-0440/#post-releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Badges :&lt;/p&gt;
&lt;p&gt;* &lt;a href=&#034;https://docs.gitlab.com/ee/user/project/badges.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.gitlab.com/ee/user/project/badges.html&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://docs.gitlab.com/ee/api/project_badges.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.gitlab.com/ee/api/project_badges.html&lt;/a&gt;&lt;br class='autobr' /&gt;
* &lt;a href=&#034;https://gitlab.com/gitlab-org/gitlab/-/issues/29457&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://gitlab.com/gitlab-org/gitlab/-/issues/29457&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>G&#233;n&#233;ration d'une documentation d'API interactive</title>
		<link>http://tabula.tablinum.fr/generation-d-une-documentation-d-api-interactive</link>
		<guid isPermaLink="true">http://tabula.tablinum.fr/generation-d-une-documentation-d-api-interactive</guid>
		<dc:date>2023-05-27T08:36:25Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierre</dc:creator>



		<description>
&lt;p&gt;Attention : je mets ici mes notes, g&#233;n&#233;r&#233;es par ChatGPT, mais &#231;a ne fonctionne pas ! &lt;br class='autobr' /&gt; 1. Installez le package n&#233;cessaire pour int&#233;grer Swagger UI ou ReDoc. Par exemple, pour Swagger UI, vous pouvez installer sphinxcontrib-httpdomain en utilisant pip : &lt;br class='autobr' /&gt;
pip install sphinxcontrib-httpdomain &lt;br class='autobr' /&gt;
2. Ajoutez les directives HTTP appropri&#233;es dans vos fichiers de documentation pour documenter votre API en utilisant la syntaxe de sphinxcontrib-httpdomain. Vous pouvez utiliser les directives telles (&#8230;)&lt;/p&gt;


-
&lt;a href="http://tabula.tablinum.fr/-sphinx-aller-plus-loin-" rel="directory"&gt;Sphinx - aller plus loin&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;strong&gt;Attention : je mets ici mes notes, g&#233;n&#233;r&#233;es par ChatGPT, mais &#231;a ne fonctionne pas !&lt;br class='autobr' /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. Installez le package n&#233;cessaire pour int&#233;grer Swagger UI ou ReDoc. Par exemple, pour Swagger UI, vous pouvez installer sphinxcontrib-httpdomain en utilisant pip :&lt;/p&gt;
&lt;p&gt;pip install sphinxcontrib-httpdomain&lt;/p&gt;
&lt;p&gt;2. Ajoutez les directives HTTP appropri&#233;es dans vos fichiers de documentation pour documenter votre API en utilisant la syntaxe de sphinxcontrib-httpdomain. Vous pouvez utiliser les directives telles que http:get, http:post, etc., pour d&#233;crire les endpoints de l'API et leurs param&#232;tres.&lt;/p&gt;
&lt;p&gt;3. Pour int&#233;grer Swagger UI, vous pouvez utiliser l'extension Sphinx appel&#233;e sphinxcontrib-httpdomain avec le th&#232;me sphinx_rtd_theme. Assurez-vous d'avoir ces extensions install&#233;es. Ajoutez les lignes suivantes dans votre fichier conf.py :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;python&#034; class='spip_code spip_code_block language-python' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;extensions = [ # ... 'sphinxcontrib.httpdomain', 'sphinx_rtd_theme', # ... ] html_theme = 'sphinx_rtd_theme' &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;4. G&#233;n&#233;rez votre documentation Sphinx en utilisant la commande appropri&#233;e, comme make html si vous utilisez le Makefile fourni avec Sphinx.&lt;/p&gt;
&lt;p&gt;5. Int&#233;grez Swagger UI ou ReDoc dans votre documentation g&#233;n&#233;r&#233;e. Pour cela, vous pouvez utiliser les directives de sphinxcontrib-httpdomain sp&#233;cifiques &#224; Swagger UI ou ReDoc.&lt;/p&gt;
&lt;p&gt;Pour int&#233;grer Swagger UI ou ReDoc dans votre documentation Sphinx, vous pouvez utiliser les directives sp&#233;cifiques fournies par sphinxcontrib-httpdomain. Voici les d&#233;tails pour chaque option :&lt;/p&gt;
&lt;p&gt;Swagger UI&lt;/p&gt;
&lt;p&gt;Pour int&#233;grer Swagger UI, utilisez la directive http:swagger-ui dans votre fichier de documentation Sphinx. Voici un exemple :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;rst&#034; class='spip_code spip_code_block language-rst' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;.. http:swagger-ui:: /path/to/swagger.json &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voici un exemple de fichier swagger.json correspondant &#224; l'exemple d'API que j'ai donn&#233; pour la documentation Sphinx :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;json&#034; class='spip_code spip_code_block language-json' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;{ &#034;openapi&#034;: &#034;3.0.0&#034;, &#034;info&#034;: { &#034;title&#034;: &#034;Example API&#034;, &#034;version&#034;: &#034;1.0.0&#034; }, &#034;paths&#034;: { &#034;/users/{id}&#034;: { &#034;get&#034;: { &#034;summary&#034;: &#034;Get user details&#034;, &#034;parameters&#034;: [ { &#034;name&#034;: &#034;id&#034;, &#034;in&#034;: &#034;path&#034;, &#034;required&#034;: true, &#034;schema&#034;: { &#034;type&#034;: &#034;string&#034; } }, { &#034;name&#034;: &#034;param1&#034;, &#034;in&#034;: &#034;query&#034;, &#034;schema&#034;: { &#034;type&#034;: &#034;string&#034; } }, { &#034;name&#034;: &#034;param2&#034;, &#034;in&#034;: &#034;query&#034;, &#034;schema&#034;: { &#034;type&#034;: &#034;string&#034; } } ], &#034;responses&#034;: { &#034;200&#034;: { &#034;description&#034;: &#034;Successful response&#034; }, &#034;404&#034;: { &#034;description&#034;: &#034;User not found&#034; } } } } } } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans cet exemple, nous avons un endpoint GET /users/&lt;i&gt;id&lt;/i&gt; avec deux param&#232;tres de requ&#234;te optionnels (param1 et param2). Les param&#232;tres sont d&#233;finis dans le tableau parameters avec leurs noms, emplacements (path ou query), et types (string dans cet exemple).&lt;/p&gt;
&lt;p&gt;Les codes de statut de r&#233;ponse attendus sont d&#233;finis dans le tableau responses, avec les descriptions correspondantes.&lt;/p&gt;
&lt;p&gt;Cet exemple de fichier swagger.json peut &#234;tre utilis&#233; pour g&#233;n&#233;rer la documentation interactive de votre API en utilisant Swagger UI ou ReDoc. Assurez-vous d'adapter ce fichier en fonction de votre API r&#233;elle et de ses endpoints.&lt;/p&gt;
&lt;p&gt;Remplacez /path/to/swagger.json par le chemin relatif vers votre fichier de sp&#233;cification OpenAPI (par exemple, un fichier JSON ou YAML) qui d&#233;crit votre API.&lt;/p&gt;
&lt;p&gt;Assurez-vous d'avoir install&#233; sphinxcontrib-httpdomain et sphinx_rtd_theme et que ces extensions sont ajout&#233;es dans la configuration de Sphinx (conf.py).&lt;/p&gt;
&lt;p&gt;Apr&#232;s avoir g&#233;n&#233;r&#233; votre documentation Sphinx, vous verrez l'interface interactive de Swagger UI affichant votre documentation API avec la possibilit&#233; d'explorer et de tester les endpoints.&lt;/p&gt;
&lt;p&gt;ReDoc&lt;/p&gt;
&lt;p&gt;Pour int&#233;grer ReDoc, utilisez la directive http:redoc dans votre fichier de documentation Sphinx. Voici un exemple :&lt;/p&gt;
&lt;p&gt;rst&lt;/p&gt;
&lt;p&gt;.. http:redoc: : /path/to/redoc.html&lt;/p&gt;
&lt;p&gt;Remplacez /path/to/redoc.html par le chemin relatif vers votre fichier HTML contenant la configuration ReDoc.&lt;/p&gt;
&lt;p&gt;Assurez-vous d'avoir install&#233; sphinxcontrib-httpdomain et sphinx_rtd_theme et que ces extensions sont ajout&#233;es dans la configuration de Sphinx (conf.py).&lt;/p&gt;
&lt;p&gt;Apr&#232;s avoir g&#233;n&#233;r&#233; votre documentation Sphinx, vous verrez l'interface interactive de ReDoc affichant votre documentation API avec la possibilit&#233; d'explorer et de tester les endpoints.&lt;/p&gt;
&lt;p&gt;Assurez-vous d'avoir correctement configur&#233; votre fichier de sp&#233;cification OpenAPI pour que Swagger UI ou ReDoc puisse l'utiliser pour afficher l'interface interactive.&lt;/p&gt;
&lt;p&gt;6. R&#233;g&#233;n&#233;rez votre documentation Sphinx pour prendre en compte les modifications.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
