From 7ed1688d7b85b8f84bde572eb6027e1558726568 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Tue, 4 Oct 2016 22:34:03 +0200 Subject: [PATCH 001/122] fix selfhosting.md link --- admindoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admindoc.md b/admindoc.md index 51b59470..76694edb 100644 --- a/admindoc.md +++ b/admindoc.md @@ -2,7 +2,7 @@ *For want of anything better, here is an index of interesting pages for the YunoHost server's administrator.* -* [What is Self-hosting](/self-hosting) +* [What is Self-hosting](/selfhosting) * [Installation guide](/install) * [Compatible hardware](/hardware) * [Available applications](/apps) From 4b18acab8de579a4e1fe73db6391d63b5bdf39e2 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Wed, 5 Oct 2016 23:20:48 +0200 Subject: [PATCH 002/122] hardware translation add hardware english translation --- hardware.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hardware.md b/hardware.md index bca8adc9..28bf881d 100644 --- a/hardware.md +++ b/hardware.md @@ -1,21 +1,21 @@ # Hardware -Every commonly used machine kind is compatible with YunoHost. -It is important to identify your machine kind before proceeding to the installation. +YunoHost is compatible with most of the hardware. +Before proceeding to the installation it is important to identify the model of your computer. -*Click on the corresponding guide.* +*Click on your hardware's guide.* | Arch | Hardware examples | Installation guide | |------|-----------------------|----------------------| -| **x86** | Desktops, Laptops, Mac Intel (after 2007), netbooks, nettops, etc. | [Install via CD/USB](/install_iso) | +| **x86** | Desktops, Laptops, Intel Mac (after 2007), netbooks, nettops, etc. | [Install via CD/USB](/install_iso) | | **armhf** | [ARM board](install_on_arm_board), [Raspberry Pi](/install_on_raspberry), Cubox, Olimex, Beagleboard, etc. | [Install on ARM Debian](/install_on_debian) | ### Minimum requirements - 500MHz CPU -* 256Mo RAM -* 4Go storage space +* 256MB RAM +* 4GB storage capacity ### Recommended * Recent x86 computer, silent and low consumption. -* 512Mo RAM in order to run all the services and apps properly -* 20Go storage in order to store more mails and documents +* 512MB RAM in order to run all the services and apps properly +* 20GB storage in order to store more mails and documents From a347114465aab95bd1029af312e0542acea9c48a Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Thu, 6 Oct 2016 08:08:15 +0200 Subject: [PATCH 003/122] Hardware translation --- install.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/install.md b/install.md index 10eecc57..0e06fdd2 100644 --- a/install.md +++ b/install.md @@ -1,12 +1,12 @@ # Installation guide -You have several ways to install YunoHost. The process may slightly differs whether it takes place at home or if you want to do it remotely, and regarding the hardware used: **[See the requirements](/hardware)** +There are multiple ways to install YunoHost. The process may slightly differs whether it takes place at home or if you want to do it on a remote server, and regarding the hardware used: **[See the requirements](/hardware)** -This page lists few installation guides. +This page lists a few installation guides. --- -

Give a try

+

Give it a try

@@ -52,7 +52,7 @@ This page lists few installation guides. --- -

Virtually

+

On a virtual machine/container

@@ -74,7 +74,7 @@ This page lists few installation guides. --- -

Remotely

+

On a remote server

@@ -94,7 +94,6 @@ This page lists few installation guides.

On Debian

-If you have already installed **Debian 8** (Jessie) on a server, you are able to **[install YunoHost via script](/install_on_debian)**. +If you have already installed **Debian 8** (Jessie) on a server, you'll be able to **[install YunoHost with a simple script](/install_on_debian)**. - From 1adf3a387024542e68c7fe9bcb4cecb1640307fd Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Fri, 7 Oct 2016 17:28:48 +0200 Subject: [PATCH 004/122] install translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit progress on “install” translation --- admindoc.md | 2 ++ install_on_arm_board.md | 10 +++++----- install_on_raspberry.md | 17 ++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/admindoc.md b/admindoc.md index 76694edb..b929f136 100644 --- a/admindoc.md +++ b/admindoc.md @@ -4,6 +4,8 @@ * [What is Self-hosting](/selfhosting) * [Installation guide](/install) + * [On ARM board](/install_on_arm_board) + * [On Raspberry Pi](/install_on_raspberry) * [Compatible hardware](/hardware) * [Available applications](/apps) * [Administration interface usage](/admin) diff --git a/install_on_arm_board.md b/install_on_arm_board.md index 463a317b..973013ca 100644 --- a/install_on_arm_board.md +++ b/install_on_arm_board.md @@ -7,9 +7,9 @@ -* An ARM board with 500MHz CPU and 512Mo RAM. -* A micro SD card: **4GB** capacity (or more) and **class10** speed rate are highly recommended. -* A [reasonable ISP](/isp), preferably with a good and unlimited upstream bandwidth. +* An ARM board with 500MHz CPU and 512MB RAM. +* A micro SD card: **4GB** capacity (or more), **class10** speed rate is highly recommended. +* A [reasonable ISP](/isp), preferably with a good and unlimited upload bandwidth. --- @@ -28,7 +28,7 @@ --- -#### Recommended after post-installation +#### Recommended after running the post-installation * Use [SSH authentication via key](security) --- @@ -38,4 +38,4 @@ --- -***If you need help during one of these steps, do not hesitate to use [our support tools](/support).*** +***If you need help during one of these steps, do not hesitate to use [our support channel](/support).*** diff --git a/install_on_raspberry.md b/install_on_raspberry.md index be5d0317..1f486b0c 100644 --- a/install_on_raspberry.md +++ b/install_on_raspberry.md @@ -2,21 +2,21 @@ *Find other ways to install YunoHost **[here](/install)**.* -## Pre-requisite +## Requirements - A Raspberry Pi model 1, 2 or 3 -- An SD card: **4GB** capacity (or more) and **class10** speed rate are highly recommended -- An other computer to read this guide and access to your Raspberry Pi -- A screen and a keyboard are recommended to control your Raspberry Pi if a problem occurs. -- A [reasonable ISP](/isp), preferably with a good and unlimited upstream bandwidth +- A SD card: **4GB** capacity (or more) and **class10** speed rate is highly recommended +- A different computer to read this guide and access your Raspberry Pi +- A screen and a keyboard, recommended if a problem occurs and you want to control your Raspberry Pi +- A [reasonable ISP](/isp), preferably with a good and unlimited upload bandwidth - **YunoHost Raspberry Pi images**, available here: - [Official Wheezy/YunoHost 2.2 created the 4th June 2015](https://build.yunohost.org/yunohost-rpi2_wheezy.7z) - [Non-official Jessie/YunoHost 2.2 created the 5th December 2015](https://forum.yunohost.org/t/building-a-new-image-for-raspberry-debian-jessie-fr-en/1101/2) -
**This two images are old**. Nobody is maintaining a YunoHost image for Raspberry Pi. You could [maintain an image](build_arm_image_en) for YunoHost project.
+
**This two images are old**. YunoHost image for Raspberry Pi is not maintained, feel free to contribute and contact us if you would like to [maintain an image](build_arm_image_en) for YunoHost project.
--- @@ -31,7 +31,7 @@ --- -### Recommended after post-installation +### Recommended after running the post-installation * Connect via SSH: **root@IP.OF.RPI** (password: **yunohost**) * Change root password: `passwd root` @@ -42,5 +42,4 @@ #### Build image * [Create a Raspberry Pi image](/build_arm_image_en) -***If you need help during one of these steps, do not hesitate to use [our support tools](/support).*** - +***If you need help during one of these steps, do not hesitate to use [our support channels](/support).*** From e65f751813ddc8d8cf18a9f68a817ef79d095334 Mon Sep 17 00:00:00 2001 From: Moul Date: Sat, 8 Oct 2016 17:46:09 +0200 Subject: [PATCH 005/122] [enh] apps_wishlist: add Koozic streming app. --- apps_wishlist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps_wishlist.md b/apps_wishlist.md index bdf846b0..0b965008 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -68,6 +68,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [Known](https://withknown.com) - [Koel](http://koel.phanan.net) - [Kontalk](http://kontalk.org) +- [Koozip](http://koozic.net) - [KrISS feed](https://github.com/tontof/kriss_feed) - [Kune](https://en.wikipedia.org/wiki/Kune_%28software%29) - [Logstalgia](http://logstalgia.io) From 543451723f9372e779cf6d545c912f99f62a4872 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Sat, 8 Oct 2016 22:52:03 +0200 Subject: [PATCH 006/122] fix support sentence --- install_on_arm_board.md | 2 +- install_on_raspberry.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install_on_arm_board.md b/install_on_arm_board.md index 973013ca..8b56085a 100644 --- a/install_on_arm_board.md +++ b/install_on_arm_board.md @@ -38,4 +38,4 @@ --- -***If you need help during one of these steps, do not hesitate to use [our support channel](/support).*** +***Need help during one of these steps? [Get support!](/support)*** diff --git a/install_on_raspberry.md b/install_on_raspberry.md index 1f486b0c..fc27d7bc 100644 --- a/install_on_raspberry.md +++ b/install_on_raspberry.md @@ -42,4 +42,4 @@ #### Build image * [Create a Raspberry Pi image](/build_arm_image_en) -***If you need help during one of these steps, do not hesitate to use [our support channels](/support).*** +***Need help during one of these steps? [Get support!](/support)*** From 2b41e37f297e8379f1f41c865ce80c92781de80b Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Sun, 9 Oct 2016 22:01:13 +0200 Subject: [PATCH 007/122] update install pages --- admindoc.md | 5 ++++- install_iso.md | 18 +++++++++--------- install_iso_fr.md | 2 +- install_on_debian.md | 7 +++---- install_on_virtualbox.md | 16 ++++++++-------- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/admindoc.md b/admindoc.md index b929f136..cb87d8d1 100644 --- a/admindoc.md +++ b/admindoc.md @@ -3,10 +3,13 @@ *For want of anything better, here is an index of interesting pages for the YunoHost server's administrator.* * [What is Self-hosting](/selfhosting) +* [Compatible hardware](/hardware) * [Installation guide](/install) * [On ARM board](/install_on_arm_board) * [On Raspberry Pi](/install_on_raspberry) -* [Compatible hardware](/hardware) + * [From the ISO image](/install_iso) + * [On Debian](/install_on_debian) + * [On VirtualBox](/install_on_virtualbox) * [Available applications](/apps) * [Administration interface usage](/admin) * [Command-line interface usage](/moulinette) diff --git a/install_iso.md b/install_iso.md index 63b981a5..0b0fddee 100644 --- a/install_iso.md +++ b/install_iso.md @@ -2,21 +2,21 @@ *Find other ways to install YunoHost **[here](/install)**.* -### Pre-requisite +### Requirements -
This images are based on **Debian Wheezy**. Wheezy **won't be maintained** with YunoHost 2.4.
-It's **strongly adviced** to install YunoHost on **Debian Jessie** with the **[install script](/install_on_debian_en)**.
+
These images are based on **Debian Wheezy**. Wheezy **won't be maintained** with YunoHost 2.4.
+It is **strongly recommended** to install YunoHost on **Debian Jessie** with the **[install script](/install_on_debian_en)**.
-* An x86-compatible hardware dedicated to YunoHost: laptop, nettop, netbook, desktop. -You can reuse any computer with **256MB RAM or more**. +* A x86-compatible hardware dedicated to YunoHost: laptop, nettop, netbook, desktop. +You can use any computer with **256MB RAM or more**. * Another computer to read this guide and access to your server. * A [reasonable ISP](/isp), preferably with a good and unlimited upstream bandwidth -* A **USB key** of at least 1GB capacity **OR** a standard **blank CD** -* One of the latest **YunoHost ISO images**, available here (take the 32 bits one if you don't know which one to choose): +* A **USB stick** of at least 1GB capacity **OR** a standard **blank CD** +* One of the latest **YunoHost ISO images**, available here (take the 32 Bits one if you don't know which one to choose):
Torrent:
    @@ -42,10 +42,10 @@ You can reuse any computer with **256MB RAM or more**. --- -For connecting directly on your computer or with [SSH](/ssh) (only local): +To connect directly to your computer or with [SSH](/ssh) (only on local network: * User: **root** * Password: **yunohost** --- -***If you need help during one of these steps, do not hesitate to use [our support tools](/support).*** +***Need help during one of these steps? [Get support!](/support)*** diff --git a/install_iso_fr.md b/install_iso_fr.md index 54301bc4..a2f4850b 100644 --- a/install_iso_fr.md +++ b/install_iso_fr.md @@ -41,7 +41,7 @@ Il est **fortement conseillé** d’installer YunoHost sur **Debian Jessie** ave --- -Pour se connecter directement sur l’ordinateur (uniquement en local) : +Pour se connecter directement sur l’ordinateur (uniquement en local) : * Utilisateur : **root** * Mot de passe : **yunohost** diff --git a/install_on_debian.md b/install_on_debian.md index 3e900f57..599f8671 100644 --- a/install_on_debian.md +++ b/install_on_debian.md @@ -2,7 +2,7 @@ *Find other ways to install YunoHost **[here](/install)**.* -### Pre-requisite +### Requirements @@ -10,7 +10,7 @@ An ARM box, a VPS, a dedicated server, a standard x86 computer, an old Macintosh * with **Debian 8** (Jessie) installed * connected to the Internet -* with a **root access** directly or via SSH +* with a direct **root access** or via SSH @@ -24,5 +24,4 @@ An ARM box, a VPS, a dedicated server, a standard x86 computer, an old Macintosh --- -***If you need help during one of these steps, do not hesitate to use [our support tools](/support).*** - +***Need help during one of these steps? [Get support!](/support)*** diff --git a/install_on_virtualbox.md b/install_on_virtualbox.md index 5c1744fb..b267b44b 100644 --- a/install_on_virtualbox.md +++ b/install_on_virtualbox.md @@ -2,13 +2,13 @@ *Find other ways to install YunoHost **[here](/install)**.* -## Pre-requisite +## Requirements -* An x86 computer with VirtualBox installed and enough RAM capacity to be able to run a small virtual machine. -* The latest **YunoHost ISO image**, available here: - * **Torrent** ([i386](http://build.yunohost.org/yunohostv2-latest-i386.iso.torrent), [amd64](http://build.yunohost.org/yunohostv2-latest-amd64.iso.torrent)): share at least to ratio 1 to assure torrents sustainability +* A x86 computer with VirtualBox installed and enough RAM capacity to be able to run a small virtual machine. +* The latest **YunoHost ISO image**, available here: + * **Torrent** ([i386](http://build.yunohost.org/yunohostv2-latest-i386.iso.torrent), [amd64](http://build.yunohost.org/yunohostv2-latest-amd64.iso.torrent)): share at least to ratio 1 to assure the torrent's sustainability * **Direct download** ([i386](http://build.yunohost.org/yunohostv2-latest-i386.iso), [amd64](http://build.yunohost.org/yunohostv2-latest-amd64.iso)) @@ -28,7 +28,7 @@ ## 2. Change network settings -Go to **Settings** > **Network**, and your interface: +Go to **Settings** > **Network**: @@ -53,7 +53,7 @@ Start the virtual machine You will have to select your ISO image `yunohostv2-latest-amd64.iso` here, then you should see the YunoHost's boot screen.
    - +
    @@ -73,8 +73,8 @@ After the reboot, you will see this screen:
    * The password for root user is "yunohost" -* You can obtain further precisions on post-installation here: **[yunohost.org/postinstall](/postinstall)** +* You can get more information on the post-installation here: **[yunohost.org/postinstall](/postinstall)** --- -***If you need help during one of these steps, do not hesitate to use [our support tools](/support).*** +***Need help during one of these steps? [Get support!](/support)*** From 1834994fe1414c281e1497c9c199971f64da066a Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 10 Oct 2016 09:37:06 +0200 Subject: [PATCH 008/122] [enh] update blacklist form doc: - Update Microsoft blocklist form link. - Use Markdown link syntax. - Update english page from french one. --- blacklist_forms.md | 17 +++++++++-------- blacklist_forms_fr.md | 10 +++++----- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/blacklist_forms.md b/blacklist_forms.md index 23cae943..2fa654c9 100644 --- a/blacklist_forms.md +++ b/blacklist_forms.md @@ -2,18 +2,19 @@ It could happen sometimes that your IP is blacklisted by some email provider, or anti-spam services. +## Test your server + +* [Test sending an email](https://www.mail-tester.com) +- [Test from an IP address](http://whatismyipaddress.com/blacklist-check) + Here is some forms that could help you remove your IP address from these lists ## Email providers -* Hotmail: https://support.live.com/eform.aspx?productKey=edfsmsbl3&ct=eformts&scrx=1 -* GMail : https://support.google.com/mail/contact/msgdelivery +* [Microsoft](https://support.microsoft.com/en-us/getsupport?oaspworkflow=start_1.0.0.0&wfname=capsub&productkey=edfsmsbl3&locale=en-us) +* [GMail](https://support.google.com/mail/contact/msgdelivery) ## Anti-spam services -* SpamHaus: http://www.spamhaus.org/lookup/ - -## Test your server - -* https://www.mail-tester.com/ -* http://whatismyipaddress.com/blacklist-check \ No newline at end of file +* [SpamHaus](http://www.spamhaus.org/lookup) +* http://whatismyipaddress.com/blacklist-check diff --git a/blacklist_forms_fr.md b/blacklist_forms_fr.md index 9c3fb757..2f71a42f 100644 --- a/blacklist_forms_fr.md +++ b/blacklist_forms_fr.md @@ -2,19 +2,19 @@ Il peut arriver que votre serveur (son adresse IP) soit ajouté à la liste noire de certains fournisseurs d’adresse de courrier électronique ou de services anti-spam. Les courriels envoyés à ces adresses sont alors filtrés et n’arrivent pas à destination. #### Testez votre serveur Pour tester si votre serveur est sur une liste noire, vous pouvez utiliser les outils suivants : -* https://www.mail-tester.com/ (test en envoyant un mail) -* http://whatismyipaddress.com/blacklist-check (test à partir de l’adresse IP) +* [https://www.mail-tester.com](Test en envoyant un mail) +* [Test à partir de l’adresse IP](http://whatismyipaddress.com/blacklist-check) Le cas échéant, voici certains des formulaires vous permettant de retirer votre adresse IP de ces listes : ##### Fournisseurs Email -* Hotmail : https://support.live.com/eform.aspx?productKey=edfsmsbl3&ct=eformts&scrx=1 -* GMail : https://support.google.com/mail/contact/msgdelivery +* [Microsoft](https://support.microsoft.com/en-us/getsupport?oaspworkflow=start_1.0.0.0&wfname=capsub&productkey=edfsmsbl3&locale=en-us) +* [GMail](https://support.google.com/mail/contact/msgdelivery) ##### Services anti-spam -* SpamHaus : http://www.spamhaus.org/lookup/ +* [SpamHaus](http://www.spamhaus.org/lookup) Si le fournisseur vous concernant n’apparaît pas dans la liste, cherchez le formulaire adéquat, il existe probablement. From c52ad6c130d1311b2497ba538377e042c709b03c Mon Sep 17 00:00:00 2001 From: Moul Date: Fri, 21 Oct 2016 12:44:16 +0200 Subject: [PATCH 009/122] [mod] diagnostic: use https to access WP. --- diagnostic.md | 2 +- diagnostic_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/diagnostic.md b/diagnostic.md index ce3be89d..6d66493f 100644 --- a/diagnostic.md +++ b/diagnostic.md @@ -48,7 +48,7 @@ You can also redirect ports manually to your server's local IP address on this r ### 4. Do your router has hairpinning ? -If the server is accessible from outside your local network, but unreachable with its domain name on the local network, then your router probably lacks of hairpinning. +If the server is accessible from outside your local network, but unreachable with its domain name on the local network, then your router probably lacks of hairpinning. You cannot avoid that in a simple way. If you know how to do it, just configure the `/etc/hosts` of your local clients to access your server with the local IP. Else, retry the installation with a **.nohost.me** or **.noho.st** domain. diff --git a/diagnostic_fr.md b/diagnostic_fr.md index e21ccade..d3cd00c5 100644 --- a/diagnostic_fr.md +++ b/diagnostic_fr.md @@ -46,7 +46,7 @@ Vous pouvez également rediriger les ports manuellement vers l’adresse IP loca ### 4. Est-ce que votre box/routeur fait du hairpinning ? -Si le serveur est accessible de l’extérieur, mais inatteignable via son nom de domaine dans votre réseau local, votre box/routeur ne fait probablement pas correctement de hairpinning. +Si le serveur est accessible de l’extérieur, mais inatteignable via son nom de domaine dans votre réseau local, votre box/routeur ne fait probablement pas correctement de hairpinning. Voici un [tutoriel](dns_local_network_fr) pour pouvoir accéder à son serveur en réseau local et contourner le problème de hairpinning. Le tutoriel propose en première solution de mettre en place une redirection avec le DNS de la box et en seconde solution de modifier le fichier `hosts` des **clients** pour indiquer qu’il doit accéder au **serveur** via son IP locale. La première solution est préférable car il ne nécessite pas de modifier le fichier `hosts` sur chacun des clients du réseau local. From 1f0249447290de70cd5e64c4d7976333b853df16 Mon Sep 17 00:00:00 2001 From: Genma Date: Fri, 21 Oct 2016 16:09:21 +0200 Subject: [PATCH 010/122] Creation de la page admin_api_fr Reprise de la page https://wiki.chatons.org/doku.php?id=yunohost --- admin_api_fr | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 admin_api_fr diff --git a/admin_api_fr b/admin_api_fr new file mode 100644 index 00000000..2e21e87c --- /dev/null +++ b/admin_api_fr @@ -0,0 +1,42 @@ +# Administration depuis l'API ou une application externe + +Toutes les actions executables en ligne de commande le sont également via une API. + +L'API utilise l'adresse https://VOTRESERVEUR/yunohost/api et toutes les actions sont détaillées sur cette page. + +Il faut d'abord récupérer un cookie de login pour ensuite réaliser les actions. Voici un exemple via curl : +```bash + Login (avec mot de passe admin): curl -k -d “password=XXX” –dump-header headers https://VOTRESERVEUR/yunohost/api/login + GET: curl -k -i -H “Accept: application/json” -H “Content-Type: application/json” -L -b headers -X GET https://VOTRESERVEUR/yunohost/api/ROUTE | grep }| python -mjson.tool +``` +Pour simplifier l'administration à distance d'une instance YunoHost dans le cadre d'un projet CHATON, des classes API ont été développées par des utilisateurs. + +Par exemple, cette classe PHP vous permettra d'administrer votre instance YunoHost depuis une application PHP (site web, outil de provisioning, …). + +Voici un exemple de code PHP permettant d'ajouter un utilisateur dans votre instance YunoHost : + +```bash +require("ynh_api.class.php"); +$ynh = new YNH_API("YunoHost server IP or hostname", "admin password"); + +if ($ynh->login()) { + $domains = $ynh->get("/domains"); + $first_domain = $domains['domains'][0]; + + $arguments = array( + 'username' => 'test', + 'password' => 'yunohost', + 'firstname' => 'Firstname', + 'lastname' => 'Lastname', + 'mail' => 'test@'.$first_domain, + 'mailbox_quota' => '500M' + ); + + $user_add = $ynh->post("/users", $arguments); + print_r($user_add); + +} else { + print("Login to YunoHost failed.\n"); + exit; +} +``` From b97f84a86ca21d3443b70c55904f42be21676bdc Mon Sep 17 00:00:00 2001 From: Genma Date: Fri, 21 Oct 2016 16:10:39 +0200 Subject: [PATCH 011/122] Ajout du lien vers la page admin_api_fr --- admindoc_fr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/admindoc_fr.md b/admindoc_fr.md index a010efbe..5bde3f4d 100644 --- a/admindoc_fr.md +++ b/admindoc_fr.md @@ -40,6 +40,7 @@ * [Orange](/isp_orange_fr) * [Free](/isp_free_fr) * [Administration web](/admin_fr) +* [Administration via l'API](/admin_api_fr) * [Sécurité](/security_fr) * [Authentification SSH par clé](/security_fr) * [Modifier le port SSH](/security_fr) From 65e112215e8c4cd0becc38f2733cd352dc90e366 Mon Sep 17 00:00:00 2001 From: Moul Date: Fri, 21 Oct 2016 16:44:22 +0200 Subject: [PATCH 012/122] [mod] sitemap: add link toward admin_api_fr. --- sitemap_fr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sitemap_fr.md b/sitemap_fr.md index 8a732f75..816cf16d 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -57,6 +57,7 @@ * [Connexion à son serveur avec SSH](/ssh_fr) * [Administration avec la Moulinette](/moulinette_fr) * [Administration web](/admin_fr) + * [Administration via l'API](/admin_api_fr) * [Changer le mot de passe d’administration](/change_admin_password_fr) * [Courrier électronique](email_fr) * [Configuration d’un client email](email_configure_client_fr) From 7d41bc5fbce1b635f668d041c68d4aa0cc5bcc32 Mon Sep 17 00:00:00 2001 From: Moul Date: Thu, 27 Oct 2016 11:06:59 +0200 Subject: [PATCH 013/122] [mod] app_wishlist: remove Hastebin and Flarum, add Matrix. --- apps_wishlist.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps_wishlist.md b/apps_wishlist.md index 0b965008..3d6cd1af 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -36,7 +36,6 @@ The following list is a compiled wishlist of applications that would be nice-to- - [Ethersheet](https://ethersheet.org) - [Fail2web](https://github.com/Sean-Der/fail2web) - [FileTea](https://filetea.me) -- [Flarum](http://flarum.org) - [Fossil](http://www.fossil-scm.org) - [GetSimple CMS](http://get-simple.info) - [Git-annex](http://git-annex.branchable.com) @@ -48,7 +47,6 @@ The following list is a compiled wishlist of applications that would be nice-to- - [Guacamole](http://guac-dev.org) - [h5ai](http://larsjung.de/h5ai) - [Hackpad](https://github.com/dropbox/hackpad) -- [Hastebin](https://github.com/seejohnrun/haste-server) - [Headphones](https://github.com/rembo10/headphones) - [Hi Buddy](http://hibuddy.monkeypatch.me) - [Huginn](https://github.com/cantino/huginn) @@ -78,6 +76,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [Lufi](https://git.framasoft.org/luc/lufi) - [MaidSafe](http://maidsafe.net) - [Mailpile](https://www.mailpile.is) +- [Matrix](https://matrix.org) – [Synapse](https://github.com/matrix-org/synapse) - [MatterMost](https://github.com/mattermost/platform) - [MediaCrush](https://imgrush.com) - [MinigalNano](https://github.com/sebsauvage/MinigalNano) From 5b099b171f28f28b0b74ceea00ab2e8bcc42b73c Mon Sep 17 00:00:00 2001 From: Moul Date: Thu, 27 Oct 2016 11:14:11 +0200 Subject: [PATCH 014/122] [mod] app_wishlist: add DNSchain. --- apps_wishlist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps_wishlist.md b/apps_wishlist.md index 3d6cd1af..73b60859 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -31,6 +31,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [Deluge](http://deluge-torrent.org) (with WebUI) - [DemocracyOS](http://democracyos.org) - [Discourse](http://discourse.org) +- [DNSchain](https://github.com/okTurtles/dnschain) - [Emby](https://emby.media) - [ERPnext](https://erpnext.com/download) - [Ethersheet](https://ethersheet.org) From 211dd00f0c281977e0ee17b21eb24f795a22f53b Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Fri, 28 Oct 2016 18:32:08 +0200 Subject: [PATCH 015/122] fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix typo in “fournirons” word --- apps_in_progress_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps_in_progress_fr.md b/apps_in_progress_fr.md index 757e7f05..acc23b2a 100644 --- a/apps_in_progress_fr.md +++ b/apps_in_progress_fr.md @@ -31,7 +31,7 @@ N’hésitez pas à vous créer un compte GitHub pour faire part de vos remarque

Applications dites fonctionnelles

-

Remarque : c'est le mainteneur de l'application qui la décrit comme fonctionnelle, pas l'équipe de YunoHost. Installez la à vos risques et péril. Nous ne fournirrons pas de support dessus.

+

Remarque : c'est le mainteneur de l'application qui la décrit comme fonctionnelle, pas l'équipe de YunoHost. Installez la à vos risques et péril et soyez conscient que ne fournirons aucune assistance dessus.

From 77336691e4ada311150adc4611f9c0f693798a72 Mon Sep 17 00:00:00 2001 From: Josue-T Date: Sat, 29 Oct 2016 10:00:37 +0200 Subject: [PATCH 016/122] Update app_ffsync_fr.md Update documentation after this pull : https://github.com/YunoHost/apps/pull/86 --- app_ffsync_fr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_ffsync_fr.md b/app_ffsync_fr.md index 605181b6..fd391e1a 100644 --- a/app_ffsync_fr.md +++ b/app_ffsync_fr.md @@ -7,11 +7,11 @@ Configurer Firefox pour utiliser votre serveur pour la synchronisation. #### Firefox bureau Tapez `about:config` dans la barre d’URL. -Recherchez : `services.sync.tokenServerURI`. +Recherchez : `identity.sync.tokenserver.uri`. Remplacez l’URL par la vôtre : https://mondomaine.tld/adresse/token/1.0/sync/1.5 Créez un compte chez Mozilla : https://accounts.firefox.com/signup #### Firefox mobile -Installez le plugin `fxa-custon-server-addon`. \ No newline at end of file +Avec la dernière version de firefox mobile c'est identique que firefox pour le bureau. From 67297aa19b9a11382180811bdfda63158ed73f96 Mon Sep 17 00:00:00 2001 From: Josue-T Date: Sat, 29 Oct 2016 10:00:40 +0200 Subject: [PATCH 017/122] Update app_ffsync.md Update documentation after this pull : https://github.com/YunoHost/apps/pull/86 --- app_ffsync.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_ffsync.md b/app_ffsync.md index af0f616a..eba9979f 100644 --- a/app_ffsync.md +++ b/app_ffsync.md @@ -5,11 +5,11 @@ Firefox Sync permits synchronize plugins, tabs, bookmarks, favorites, history ov #### Firefox desktop In Firefox URL bar put: `about:config`. -Search for: `services.sync.tokenServerURI`. +Search for: `identity.sync.tokenserver.uri`. Replace the URL by: https://mydomain.tld/path/token/1.0/sync/1.5 Create an account at Mozilla: https://accounts.firefox.com/signup #### Firefox mobile -Install the plugin `fxa-custom-server-addon`. \ No newline at end of file +With the last version of firefox mobile it's same than for desktop. From a0a9e64e8cc22585b564283109c2d11cef63cfef Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 2 Nov 2016 07:53:13 +0100 Subject: [PATCH 018/122] [mod] apps_wishlist: add list of awesome Node.js apps. --- apps_wishlist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps_wishlist.md b/apps_wishlist.md index 73b60859..4264303d 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -8,6 +8,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [List of awesome selfhosted apps](https://github.com/Kickball/awesome-selfhosted) - [List of awesome sysadmin apps](https://github.com/kahun/awesome-sysadmin) +- [List of awesome Node.js projects](https://github.com/sqreen/awesome-nodejs-projects) - [10er10](https://github.com/dready92/10er10) - [Ajenti](http://ajenti.org) - [Autoblog](https://github.com/mitsukarenai/Projet-Autoblog) From cb4cb1dc4a8989339aa517fd4dd4fa5db821099c Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 2 Nov 2016 11:22:27 +0100 Subject: [PATCH 019/122] Initial commit: - exact copy from: https://forum.yunohost.org/t/compte-rendu-de-la-reunion-de-gouvernance-du-projet-yunohost/2026 --- yunohost_project_organization_fr.md | 225 ++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 yunohost_project_organization_fr.md diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md new file mode 100644 index 00000000..d9e08819 --- /dev/null +++ b/yunohost_project_organization_fr.md @@ -0,0 +1,225 @@ +# Réunion YunoHost 22 et 23 octobre 2016 à Paris + +L'objectif de cette réunion était de définir le positionnement de YunoHost et d'organiser la prise de décision au sein de l'équipe de contributeurs de YunoHost. Ce document est le bilan du week end, il sera sans doute amélioré dans les jours et semaines à venir. + +Présents : @ljf, @Maniack_Crudelis, @Moul, @theodore + +## Définition de YunoHost + +### Objectifs +Selon le site web : « Le but de YunoHost est de rendre accessibles au plus grand nombre l’installation et l’administration d’un serveur, sans délaisser la qualité et la fiabilité du logiciel. » + +Nous proposons de limiter YunoHost au simple logiciel et de ne traiter aucun service auxiliaire estampillé sous le même nom (support payant, dns, hébergement). La fourniture de services devrait être laissée à d'autres structures gravitant autour du logiciel, qu'elles soient des entreprises ou des associations. Cela afin de concentrer l'activité de Yunohost sur la qualité du logiciel. +Ce postulat pose la question des services comme nohost.me, qui devra être débattue. + +### Valeurs + +Un logiciel libre et communautaire +Par rapport à d'autres initiatives, (InternetCube, Sandstorm, Freedombox, cozy, ArkOS, serveur NAS (synology), kodi) YunoHost se distingue en étant : + +- un logiciel sous licence libre +- entièrement communautaire +- reposant sur des applications libres existantes (roundcube, baikal, etc.) + + +Que chacun peut s'approprier +Historiquement, le projet est très proche des initiatives visant à la création d'un internet neutre et décentralisé. Cette proximité, notamment avec la FFDN, a amené une partie des contributeurs de YunoHost à créer la Brique Internet dont la mission est de faciliter l'auto-hébergement en fournissant une solution complète incluant service (via un VPN) et matériel. Cet aspect militant n'entrave pas des initiatives commerciales du logiciel pour lequel des entreprises pourraient proposer du support ou de l'hébergement. + + +## Organisation de YunoHost + +### Une structure ouverte, organisée par thèmes +L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre de contribuer à l'amélioration du logiciel, que ce soit d'un point de vue technique (développement, packaging d'application) ou non (communication, assistance aux utilisateurs, documentation, etc.). Inspiré par différents projets passés en revue lors de l'événement (Kodi, Debian, Django, Fedora, Wikipédia, etc.) et des idées des contributeurs de YunoHost (Jérôme, Bram, opi, scith, ju), il a été décidé d'une organisation en groupes spécialisés, fédérés par un conseil de contributeurs clés. + +Schéma d’organisation du projet YunoHost : + + +#### Définition et constitution des groupes +La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projet en groupes thématiques : + +- Groupe Core Dev + - Core YunoHost + - Moulinette + - Admin web + - SSOwat + - Dynette + - YNH-Dev + +- Groupe Apps + - Apps Officielles + - Apps Communautaires + - outils de développements d'app (package_checker, package linter) + +- Groupe Communication + - Documentation + - Communication (annonce évolutions du projet sur le forum, réseaux sociaux) + - Traduction + +- Groupe Infra/Adminsys + - Infrastructure + - Site web (wiki, forum, salon de discussion, redmine, mumble) + - Démo + - Services + - ip.yunohost.org + - yunoport + - nohost.me + - yunodash + - yunopaste + +- Groupe Support + +Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. +Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : + +- d'accueillir et fédérer les nouveaux contributeurs réguliers de son groupe +- de tenir informé le conseil des décisions prises au sein du groupe (cf. point suivant) + +Le choix d'un outil de communication est laissé à chaque groupe en fonction de sa pertinence (forum, chat, ML, etc.). + +#### Définition et constitution du Conseil + +YunoHost grandissant, il est important de maintenir une cohérence entre tous les groupes, néanmoins il est impossible d'imposer à chacun des membres des groupes de s'intéresser ou de s'impliquer sur tous les aspects du projet (pour des raisons de temps et de compétence). Pour pallier à cela, il est proposé de créer un meta-groupe, où chaque groupe sera représenté par au moins un de ses membres : le Conseil. +Le Conseil est indépendant des groupes et réuni les contributeurs souhaitant s'impliquer le plus dans le projet, son rôle est de : + +- prendre les décisions importantes sur YunoHost qui ne dépendent pas d'un seul groupe (par exemple changer le moteur du wiki) +- faire des points réguliers sur l'ensemble du projet pour assurer sa cohésion. (réunion Mumble) +- solliciter l'ensemble de la communauté des contributeurs (ou même des utilisateurs) quand une décision divise les groupes et/ou le conseil + +Le choix d'un outil de communication est laissé au conseil, ses décisions doivent néanmoins être consultable par l'ensemble de la communauté de contributeur. +Pour participer aux votes du conseil, il faut avoir contribué au projet et avoir obtenu un droit de vote (ou d'entrée) au sein du conseil. Ce droit est délivré par le conseil (éventuellement sur demande). Le conseil est libre à tout moment de modifier le processus de décision. +Être membre du conseil n'implique pas forcément d'avoir l'ensemble des accès (infra, dépôt etc...). + +### Un processus de prises de décision basé sur un consensus mou + +Les décisions à prendre peuvent être de deux ordres : +1) pour un groupe (par "exemple merger une PR" serait affecté au groupe Dev tandis que "poster un tweet" serait de la responsabilité du groupe Communication) +2) pour l'ensemble du projet (par exemple décider d'une release avec des nouvelles fonctionnalités) + +Si un consensus sur une décision à prendre n'est pas trouvée au sein d'un groupe, ce dernier devra se tourner vers le conseil pour en débattre. Si aucun consensus n'est trouvé, la proposition sera soumise au vote de tous les contributeurs. + +#### Le processus de prise de décision en détail + +##### 1) Initiation d'une décision à prendre + - peut-être initiée par n'importe qui suivant les mediums définis au sein de chacun des groupes (exemple : ouvrir une PR déclenche automatiquement ce processus) + - forcément publique à l'exception de situations bien définies (bug relatif à la sécurité critique ou vote sur les personnes) + - une date de clôture est automatiquement définie par type de proposition. La définition de la date remplie plusieurs fonctions : + - pouvoir laisser le temps à tout le monde de s'exprimer et ne pas prendre la décision trop vite + - maintenir un rythme car si le quota des réponses est rempli avant le temps imparti, il n'y a pas besoin d'attendre l'avis de tout les membres du groupe + - le quota est à évaluer en fonction des personnes inscrites au groupe (ou au conseil selon la situation) qui ont manifesté leurs souhaits d'être considéré comme votant régulier => exemple kload peut vouloir donner son avis ponctuellement, mais à priori il ne souhaitera pas être considéré comme membre votant actif du conseil + - pouvoir être repoussable sur simple demande d'une des personnes du groupe. Et seulement du groupe, pas tous les contrib. +##### 2) Ouverture de la discussion, plusieurs réponses possibles : +Tout le monde peut changer de positions à n'importe quel moment, mais il est de bon ton de laisser au groupe le temps de réagir si cela est nécessaire (pas passer de positif à négatif puis rejeter la proposition 3 min après par exemple.) + +- réponses dites "simple" + - "je suis d'accord" -> vaut pour un avis positif + - "ça me semble bon, mais je préfère m'en remettre aux autres" -> si jamais il n'y a que des avis comme cela (ou le suivant) et au moins un avis positif et que la date est passé, la proposition est acceptée + - "pas d'avis" / "je ne suis pas en position de donner un avis pertinent (exemple: je sais pas coder en X)" +- réponses délayantes/différées + - demande de précisions, dans ce cas la décision est suspendue +- refus + - il y a deux types de refus + - "cela doit être fait autrement" + - "on ne doit pas faire ça" + - tout refus doit être argumenté et justifié +##### 3) Suspension/Repoussement + - tant qu'il n'y a pas de réponse, la décision est suspendue, au moment de la réponse, la date de clôture est automatiquement repoussé (si besoin) (pour une durée, à définir, moins longue que la première fois) + - situation où il y a des avis positifs et négatifs ou situation où il y a un choix à faire entre plusieurs propositions +##### 4) Demande de modifications + - mais il se peut qu'il y ai discussion autour de ces modifications, si c'est le cas, cela devient une nouvelle décision à adjoindre à la liste des décisions à prendre et le processus s'y applique alors (et cela repousse la date) + - dans le cas contraire, un membre du groupe peut demander à ce que l'on fasse un vote qui portera sur la liste des possibilités qui font conflits + "ce vote est mal formulé, reformulons le" + - s'il n'y a pas assez de monde d'accord, la date est repoussée et un rappel doit être envoyé + - si le résultat est vraiment serré, le groupe est invité à rediscuter de la question si elle est importante, car cela pourrait être source de division et de tension à l'avenir +##### 5) Clôture + - si le groupe est unanime dans sa décision + - que des avis positifs + - que des refus + - sans avis (s'en remet aux autres) + - si le quota de réponse est atteint et que la date est atteinte + - s'il n'est pas possible d'avoir assez de monde (vacances, plus assez de membres du groupe pouvant avoir un avis) il est possible pour le groupe de demander la clôture quand même, il y a alors un nouveau décalage de la date et si cette nouvelle date est franchie, la proposition est clôturée + - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) + - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. + +##### 6) Application +Alors un membre du groupe peut annoncer la décision comme effective (et procéder aux actions nécessaires comme releaser, merger, annonce, autre ...). Il est important que s'il y a besoin de certaines actions, des personnes se soient engagées à les faire, une décision sans désigner est moyennement utile + +## Plan d’action + +Différentes idées ont été relevées au cours de la réunion par les personnes présentes. Les décisions du week-end devraient être publiée sur le forum (ou autre) pour être détaillées et discutées, en vue d'être acceptées. + +### Plan de migration +Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefois vu que ce n'est qu'un brouillon, chaque personne est invitée à publier des propositions de modifications/améliorations/précisions et à les soumettre. Les décisions se prendront sur le forum étant donné que Maniack et Moul ont des problèmes techniques de réception ou d'écriture sur la liste de discussion mail. Rappel il est possible de s'abonner par mail au forum, par contre la fonctionnalité de réponse par mail semble ne pas fonctionner. + +Mise en place d’un [système de vote via Discourse](https://blog.discourse.org/2015/08/improved-polls-in-discourse) plus intéressant que par mailling list. + +Conseil : Bram, ju, ljf, Maniack C, Moul, opi, (scith, tostak, theodore) (à élire ? auto-promotion par méritocratie ? renouvellement au lieu de demander un retrait par d’autres membres (processus négatif)) + + - Representants des groupes d’intérêts (élus ou auto-proclamés) : + - Dev : opi, Bram, ju, ljf + - Apps : Maniack, tostaki, Moul, ljf + - Infra : opi, Bram, ju, Moul + - Com + - Com : Bram, Moul + - Doc : Moul, theodore + - Trad : Jean-Batiste + +### Décisions à venir pour les groupes +#### Conseil +- Faut-il élire les membres du conseil plutôt que de les coopter ? Risque de se transformer en "campagne politique"! +- Faut-il limiter l'ouverture des groupes d'intérêts par cooptation comme pour le conseil ? +- Proposition de changer Conseil en Collégiale +- Migrer le serveur d’infrastructure du projet sous YunoHost. (avec apps déjà packagées pad, gogs, mumble?) +- Let's Encrypt +- Nouveau système pour la documentation +- Amélioration de la documentation +- Migration du serveur XMPP +- Hébergement de notre forge git +- Revoir système de build : stable <— testing <— branches +- Gel de nohost.me et question de l'abandon des services + +#### Groupes Dev + - Comment gérer les pull request ? + - Chaque ticket fait l'objet d'une branche et d'un ticket, tu fais une pull/merge request, la communauté vérifie que ça fonctionne, une décision est prise d'intégrer. + + +#### Groupes Apps + - Pour les apps communautaires, les issues sont bien sur Github, les discussions sur le forum + +#### Support +- Rapport de bug à partir du forum +- Faire en sorte de nettoyer le forum pour éviter le bruit +- Proposition de supprimer le salon de support + +#### Autres +- Demande sur le forum avec notification des membres du conseil et des représentants des groupes d’intérêts concernés. +- Vote sur deux semaines par un post sur le forum +- Créer quatre canaux pour le Dev, les Apps, la Communication et l'Infrastructure +- La release devrait être validée par l'ensemble des 4 (ou 5) groupes d’intérêts +- Communication en français et en anglais +- Annuaire ou contact des groupes pour les nouveaux arrivants. Voir peut-être annuaire tout court pour savoir qui fait quoi. https://yunohost.org/#/contribs_fr à compléter. Et à mettre en avant. +- Proposition de laisser les membres YunoHost s'auto déterminer -> Comment gérer les accès ? + + +## Notes +Moyens de communication actuel : + +- IRL +- Réunion Mumble +- Forum +- Listes de diffusion : contrib et app +- Bugtracker Redmine +- Forge git pour les review de code sur les PR +- Salon de discussions XMPP + + +## F.A.Q ? +### Quelle différence avec d'autres projets (ArkOS, Cozy, Sandstorm, etc.) +- Cozy : gouverné par une entreprise qui développe toutes les applications pour une meilleure intégration entre-elles. Basé sur Debian. +- Sandstorm : distribution proche de la distribution YunoHost. +- ArkOS : en développement, basé sur Arch GNU/Linux. + +### Pourquoi continuer YunoHost ? +La communauté de YunoHost est grandissante et beaucoup de gens comptent dessus, son architecture technique basée sur des logiciels existants et sa gestion entièrement communautaire en font un projet unique. Enfin parce que c'est amusant et que l'aventure est belle :) + +## Références +- [Gouvernance du projet Fedora](https://fr.wikipedia.org/wiki/Fedora_(GNU/Linux)#Gouvernance_du_projet_Fedora) +- [Conditions de promotion d’un article Wikipédia au label “Bon article”](https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Bons_contenus/R%C3%A8gles#R.C3.A8gles) From 052f1870939073741901917816e57994a189e8d8 Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 2 Nov 2016 11:33:56 +0100 Subject: [PATCH 020/122] [enh] remove meeting details, add image in repo. --- organization_schema.jpg | Bin 0 -> 40237 bytes yunohost_project_organization_fr.md | 10 ++++------ 2 files changed, 4 insertions(+), 6 deletions(-) create mode 100644 organization_schema.jpg diff --git a/organization_schema.jpg b/organization_schema.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a90d0b19bbc0ee99189a6a515ebd0d101ad1c4ac GIT binary patch literal 40237 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

!$T9NB|K{mp%LHFvJJuXF#lcb)4nsd3GhXK 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 literal 0 HcmV?d00001 diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index d9e08819..16333bc2 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -1,8 +1,4 @@ -# Réunion YunoHost 22 et 23 octobre 2016 à Paris - -L'objectif de cette réunion était de définir le positionnement de YunoHost et d'organiser la prise de décision au sein de l'équipe de contributeurs de YunoHost. Ce document est le bilan du week end, il sera sans doute amélioré dans les jours et semaines à venir. - -Présents : @ljf, @Maniack_Crudelis, @Moul, @theodore +# Organisation du projet YunoHost ## Définition de YunoHost @@ -31,7 +27,9 @@ Historiquement, le projet est très proche des initiatives visant à la créatio ### Une structure ouverte, organisée par thèmes L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre de contribuer à l'amélioration du logiciel, que ce soit d'un point de vue technique (développement, packaging d'application) ou non (communication, assistance aux utilisateurs, documentation, etc.). Inspiré par différents projets passés en revue lors de l'événement (Kodi, Debian, Django, Fedora, Wikipédia, etc.) et des idées des contributeurs de YunoHost (Jérôme, Bram, opi, scith, ju), il a été décidé d'une organisation en groupes spécialisés, fédérés par un conseil de contributeurs clés. -Schéma d’organisation du projet YunoHost : +Schéma d’organisation du projet YunoHost : + +![Schéma d’organisation du projet YunoHost](organization_schema.jpg?raw=true "Schéma d’organisation du projet YunoHost") #### Définition et constitution des groupes From 6a52f98fc364e8a089d9ff585881aa8a83f62bc2 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 2 Nov 2016 13:04:08 +0100 Subject: [PATCH 021/122] =?UTF-8?q?Acc=C3=A8s=20aux=20groupes=20par=20coop?= =?UTF-8?q?tation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La question de l'accès libre ou pas aux groupes. Afin de limiter (si nécessaire) la taille des groupes et afin de s'assurer de n'intégrer que des contributeurs qui partagent les valeurs de Yunohost. Il me semble préférable que l'accès aux groupes se fasse par cooptation, avec éventuellement le même process de décision que d'habitude. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 16333bc2..c8b5b8fc 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -66,7 +66,7 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Groupe Support -Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. +Les groupes sont accessible à tous les contributeurs souhaitant participer au développement de YunoHost, sur simple demande et après accord du groupe. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : - d'accueillir et fédérer les nouveaux contributeurs réguliers de son groupe From 00667ad7bfbc0e3ee27e0e1ca4316d5e7c331a4c Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 2 Nov 2016 13:07:41 +0100 Subject: [PATCH 022/122] Vote uniquement par les membres du groupe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vote ouvert à tous ou limité seulement au membre du groupe. J'ai avis mitigé sur la question. Mais c'est une question qui a été soulevée et qui nécessite donc qu'on lui donne une réponse. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 16333bc2..138e12cf 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -66,7 +66,7 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Groupe Support -Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. +Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : - d'accueillir et fédérer les nouveaux contributeurs réguliers de son groupe From c2c18816df4fcec967c89ee832a64a9a385ff93b Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 2 Nov 2016 13:20:22 +0100 Subject: [PATCH 023/122] =?UTF-8?q?Clot=C3=BBre=20des=20votes=20anticip?= =?UTF-8?q?=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En conflit avec la ligne 105. Pour maintenir le rythme, les votes peuvent être clos avant la date limite si les réponses nécessaires sont déjà données. Il faudrait toutefois une durée minimale pour éviter des décisions prises trop vite ou un effet assemblée nationale en plein été. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 16333bc2..c5738b3e 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -132,7 +132,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - que des avis positifs - que des refus - sans avis (s'en remet aux autres) - - si le quota de réponse est atteint et que la date est atteinte + - si le quota de réponse est atteint avant que la date ne soit atteinte - s'il n'est pas possible d'avoir assez de monde (vacances, plus assez de membres du groupe pouvant avoir un avis) il est possible pour le groupe de demander la clôture quand même, il y a alors un nouveau décalage de la date et si cette nouvelle date est franchie, la proposition est clôturée - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. From 978bd90ffe459557ef6fdf8023efd2fd50f5fb41 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 2 Nov 2016 13:24:59 +0100 Subject: [PATCH 024/122] Ajout groupe distribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comme soulevé par heyyounow sur le forum https://forum.yunohost.org/t/compte-rendu-de-la-reunion-de-gouvernance-du-projet-yunohost/2026/7 On a pas d'image 2.4, si certains contributeurs sont à l'aise avec ça, c'est une bonne idée. --- yunohost_project_organization_fr.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 16333bc2..5bc26f21 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -66,6 +66,10 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Groupe Support +- Groupe distribution + - Création et maintenance des images d'installation sur diverses architectures + - Distribution des images + Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : From 418b60eedf5fc2d208d929d00613620e4840b0b3 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 2 Nov 2016 13:37:28 +0100 Subject: [PATCH 025/122] Update yunohost_project_organization_fr.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La proposition qui avait été faite sur le forum. A laquelle j'ai ajouté une durée minimale en cas d'anticipation de la clôture. Les avis nécessaires devrait, pour moi, être liés à des membres du groupe concerné ou du conseil uniquement. --- yunohost_project_organization_fr.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 16333bc2..cebae025 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -137,6 +137,24 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. +###### Vote Mineur: +Durée initiale: 1 semaine. +Durée minimale: 3 jours. +Décalage, si nécessaire: 3 jours. +Avis nécessaires: 3 dont au moins 2 membres du conseil faisant partie du groupe (celui qui a initié le vote peut voter). + +###### Vote Standard/Moyen: +Durée initiale: 2 semaines. +Durée minimale: 1 semaine. +Décalage, si nécessaire: 1 semaine. +Avis nécessaires: 4 dont au moins 2 membres du conseil faisant partie du groupe (celui qui a initié le vote peut voter). + +###### Vote Majeur : +Durée initiale: 1 mois. +Durée minimale: 2 semaines. +Décalage, si nécessaire: 2 semaines. +Avis nécessaires: 5 et au moins la moitié des membres du conseil actifs faisant partie du groupe (celui qui a initié le vote peut voter). + ##### 6) Application Alors un membre du groupe peut annoncer la décision comme effective (et procéder aux actions nécessaires comme releaser, merger, annonce, autre ...). Il est important que s'il y a besoin de certaines actions, des personnes se soient engagées à les faire, une décision sans désigner est moyennement utile From be123685b576c767a46ebe361d2ae4a7d5388f33 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 2 Nov 2016 13:38:39 +0100 Subject: [PATCH 026/122] Fix typo --- yunohost_project_organization_fr.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 16333bc2..ce1aa494 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -105,6 +105,7 @@ Si un consensus sur une décision à prendre n'est pas trouvée au sein d'un gro - maintenir un rythme car si le quota des réponses est rempli avant le temps imparti, il n'y a pas besoin d'attendre l'avis de tout les membres du groupe - le quota est à évaluer en fonction des personnes inscrites au groupe (ou au conseil selon la situation) qui ont manifesté leurs souhaits d'être considéré comme votant régulier => exemple kload peut vouloir donner son avis ponctuellement, mais à priori il ne souhaitera pas être considéré comme membre votant actif du conseil - pouvoir être repoussable sur simple demande d'une des personnes du groupe. Et seulement du groupe, pas tous les contrib. + ##### 2) Ouverture de la discussion, plusieurs réponses possibles : Tout le monde peut changer de positions à n'importe quel moment, mais il est de bon ton de laisser au groupe le temps de réagir si cela est nécessaire (pas passer de positif à négatif puis rejeter la proposition 3 min après par exemple.) @@ -119,14 +120,17 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - "cela doit être fait autrement" - "on ne doit pas faire ça" - tout refus doit être argumenté et justifié + ##### 3) Suspension/Repoussement - tant qu'il n'y a pas de réponse, la décision est suspendue, au moment de la réponse, la date de clôture est automatiquement repoussé (si besoin) (pour une durée, à définir, moins longue que la première fois) - situation où il y a des avis positifs et négatifs ou situation où il y a un choix à faire entre plusieurs propositions + ##### 4) Demande de modifications - mais il se peut qu'il y ai discussion autour de ces modifications, si c'est le cas, cela devient une nouvelle décision à adjoindre à la liste des décisions à prendre et le processus s'y applique alors (et cela repousse la date) - dans le cas contraire, un membre du groupe peut demander à ce que l'on fasse un vote qui portera sur la liste des possibilités qui font conflits + "ce vote est mal formulé, reformulons le" - s'il n'y a pas assez de monde d'accord, la date est repoussée et un rappel doit être envoyé - si le résultat est vraiment serré, le groupe est invité à rediscuter de la question si elle est importante, car cela pourrait être source de division et de tension à l'avenir + ##### 5) Clôture - si le groupe est unanime dans sa décision - que des avis positifs From 01079532f4e2185197b948477246bcfce9ab1ea7 Mon Sep 17 00:00:00 2001 From: ljf Date: Thu, 3 Nov 2016 11:21:38 +0100 Subject: [PATCH 027/122] [enh] Add LiquidSoap and Airtime to wishlist --- apps_wishlist.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps_wishlist.md b/apps_wishlist.md index 4264303d..4b8cff0b 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -10,6 +10,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [List of awesome sysadmin apps](https://github.com/kahun/awesome-sysadmin) - [List of awesome Node.js projects](https://github.com/sqreen/awesome-nodejs-projects) - [10er10](https://github.com/dready92/10er10) +- [Airtime](https://www.sourcefabric.org/en/airtime/) - [Ajenti](http://ajenti.org) - [Autoblog](https://github.com/mitsukarenai/Projet-Autoblog) - [Auth0 SSO Dashboard](https://github.com/auth0/auth0-sso-dashboard) @@ -71,6 +72,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [Koozip](http://koozic.net) - [KrISS feed](https://github.com/tontof/kriss_feed) - [Kune](https://en.wikipedia.org/wiki/Kune_%28software%29) +- [LiquidSoap](http://savonet.sourceforge.net/) - [Logstalgia](http://logstalgia.io) - [Loomio](https://www.loomio.org) - [The Lounge](https://thelounge.github.io), cf. https://github.com/Kloadut/shout_ynh/issues/4 From 046db17af0dcb4331fdbc27e4160c693e4c15aa3 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Thu, 3 Nov 2016 12:08:01 +0100 Subject: [PATCH 028/122] =?UTF-8?q?Fix=209.=20Cl=C3=B4ture=20de=20d=C3=A9c?= =?UTF-8?q?ision=20avec=20moins=20de=20membres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voir l'issue 9 https://github.com/YunoHost/yunohost-project-organization/issues/9 C'est avant tout un éclaircissement du texte, mais ce point peut porter à débat. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index ce1aa494..3fffb483 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -137,7 +137,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - que des refus - sans avis (s'en remet aux autres) - si le quota de réponse est atteint et que la date est atteinte - - s'il n'est pas possible d'avoir assez de monde (vacances, plus assez de membres du groupe pouvant avoir un avis) il est possible pour le groupe de demander la clôture quand même, il y a alors un nouveau décalage de la date et si cette nouvelle date est franchie, la proposition est clôturée + - s'il n'est pas possible d'avoir assez de monde (vacances, plus assez de membres du groupe pouvant avoir un avis) il est possible pour le groupe de demander la clôture même si le quota d'avis n'est pas atteint, il y a alors un nouveau décalage de la date et si cette nouvelle date est franchie, la proposition est clôturée selon les avis donnés. - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. From ac7bf21293cfce648d11dd013722fad1a926f3b9 Mon Sep 17 00:00:00 2001 From: opi Date: Thu, 3 Nov 2016 14:38:01 +0100 Subject: [PATCH 029/122] add nodebb to wishlist --- apps_wishlist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps_wishlist.md b/apps_wishlist.md index 4b8cff0b..5346c9aa 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -90,6 +90,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [MPD](http://www.musicpd.org) - [NetData](https://github.com/firehol/netdata) - [Nibbleblog](http://www.nibbleblog.com) +- [NodeBB](https://nodebb.org) - [Only Office](http://onlyoffice.org) - [OpenBazaar](https://openbazaar.org) - [OpenJabNab](https://github.com/OpenJabNab/OpenJabNab) From 89d7793d4bc9fa7412ebf87467d20feb499e4c09 Mon Sep 17 00:00:00 2001 From: Moul Date: Thu, 3 Nov 2016 17:24:39 +0100 Subject: [PATCH 030/122] [enh] add document introduction. --- yunohost_project_organization_fr.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index ce1aa494..045b463c 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -1,5 +1,11 @@ # Organisation du projet YunoHost +## Objectif du document +Ce document a pour objectif d’empêcher une prise de pouvoir trop centralisée au sein du projet YunoHost. +Le projet étant communautaire, les prises de décisions ne doivent pas être prises hâtivement par un seul contributeur. +Pour palier à ce problème, les décisions doivent êtres collectives et réfléchies sur un temps minimum. +Un conseil chapeaute le projet et des groupes d’intérêts permettent de représenter des sous projets du projet YunoHost. + ## Définition de YunoHost ### Objectifs From da27e3daedf36485de089066c5fc72234936fdb7 Mon Sep 17 00:00:00 2001 From: Moul Date: Fri, 4 Nov 2016 09:00:23 +0100 Subject: [PATCH 031/122] [enh] introduction: review signification, adjustments. --- yunohost_project_organization_fr.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 045b463c..5c9b8e6e 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -1,10 +1,10 @@ # Organisation du projet YunoHost ## Objectif du document -Ce document a pour objectif d’empêcher une prise de pouvoir trop centralisée au sein du projet YunoHost. -Le projet étant communautaire, les prises de décisions ne doivent pas être prises hâtivement par un seul contributeur. -Pour palier à ce problème, les décisions doivent êtres collectives et réfléchies sur un temps minimum. -Un conseil chapeaute le projet et des groupes d’intérêts permettent de représenter des sous projets du projet YunoHost. +Ce document a pour objectif de permettre aux contributeurs de se sentir légitimes d’effectuer une contribution dans le projet YunoHost avec un avis collectif. +Le projet étant communautaire, les prises de décisions prises hâtivement par un groupe restreins de contributeurs peuvent entraîner des frustrations postérieures. +Pour palier à ce problème, la solution proposée ici est de faire en sorte que les décisions soient prises collectivement et qu’elles soient suffisamment réfléchies. +Un conseil oriente l’évolution du projet YunoHost, et des groupes d’intérêts permettent de contribuer plus efficacement en fonction des domaines de prédilection de chacun. ## Définition de YunoHost From ef95ad96bae8c128322c59c2d470eb6dd7d33ad3 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Fri, 4 Nov 2016 21:31:01 +0100 Subject: [PATCH 032/122] =?UTF-8?q?Clot=C3=BBre=20des=20d=C3=A9cisions=20a?= =?UTF-8?q?nticip=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrections pour faire suite au débat --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index c5738b3e..3093802f 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -132,7 +132,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - que des avis positifs - que des refus - sans avis (s'en remet aux autres) - - si le quota de réponse est atteint avant que la date ne soit atteinte + - Pour une décison mineure ou moyenne/standard, si le quota de réponse est atteint à la durée minimale et que le consensus est obtenu. - s'il n'est pas possible d'avoir assez de monde (vacances, plus assez de membres du groupe pouvant avoir un avis) il est possible pour le groupe de demander la clôture quand même, il y a alors un nouveau décalage de la date et si cette nouvelle date est franchie, la proposition est clôturée - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. From 9da1ceb513397b6838c3f8fe95cdeb1efb3528d0 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Fri, 4 Nov 2016 21:35:29 +0100 Subject: [PATCH 033/122] Ajout des paquets Debian --- yunohost_project_organization_fr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 5bc26f21..9bc082e5 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -69,6 +69,7 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Groupe distribution - Création et maintenance des images d'installation sur diverses architectures - Distribution des images + - Gestion de la distribution des paquets Debian. Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : From 43469cbb78f4e0acad5032768ce7e2ec6de722df Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Fri, 4 Nov 2016 21:58:34 +0100 Subject: [PATCH 034/122] =?UTF-8?q?Mise=20=C3=A0=20jour=20des=20types=20de?= =?UTF-8?q?=20d=C3=A9cision?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yunohost_project_organization_fr.md | 35 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index cebae025..1d3d7cfc 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -137,23 +137,28 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. -###### Vote Mineur: -Durée initiale: 1 semaine. -Durée minimale: 3 jours. -Décalage, si nécessaire: 3 jours. -Avis nécessaires: 3 dont au moins 2 membres du conseil faisant partie du groupe (celui qui a initié le vote peut voter). +###### Micro décision: +- Décision prise et appliquée par un seul membre sans délai. Ce type de décision doit impérativement pouvoir être réversible, et peut être remise en question par n'importe quel membre du groupe. -###### Vote Standard/Moyen: -Durée initiale: 2 semaines. -Durée minimale: 1 semaine. -Décalage, si nécessaire: 1 semaine. -Avis nécessaires: 4 dont au moins 2 membres du conseil faisant partie du groupe (celui qui a initié le vote peut voter). +###### Décision Mineure: +- Durée initiale: 1 semaine. +- Durée minimale: 3 jours. +- Décalage, si nécessaire: 3 jours. +- Avis nécessaires: 3 dont au moins 2 membres du groupe (celui qui a initié le vote peut voter). 4, dont 3 membres du groupe pour anticiper. +- Validation par vote (le cas échéant): 66% de votes positifs. -###### Vote Majeur : -Durée initiale: 1 mois. -Durée minimale: 2 semaines. -Décalage, si nécessaire: 2 semaines. -Avis nécessaires: 5 et au moins la moitié des membres du conseil actifs faisant partie du groupe (celui qui a initié le vote peut voter). +###### Décision Standard/Moyenne: +- Durée initiale: 2 semaines. +- Durée minimale: 1 semaine. +- Décalage, si nécessaire: 1 semaine. +- Avis nécessaires: 50% des membres du groupe (celui qui a initié le vote peut voter). 66% des membres du groupe pour anticiper. +- Validation par vote (le cas échéant): 75% de votes positifs. + +###### Décision Majeure : +- Durée initiale: 1 mois. +- Décalage, si nécessaire: 2 semaines. +- Avis nécessaires: 75% des membres du groupe (celui qui a initié le vote peut voter). +- Validation par vote (le cas échéant): 90% de votes positifs. ##### 6) Application Alors un membre du groupe peut annoncer la décision comme effective (et procéder aux actions nécessaires comme releaser, merger, annonce, autre ...). Il est important que s'il y a besoin de certaines actions, des personnes se soient engagées à les faire, une décision sans désigner est moyennement utile From b4ecc446847b53fa2c8c5e34f3784cf9af515e49 Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 7 Nov 2016 09:22:18 +0100 Subject: [PATCH 035/122] [mod] index: display demo button: remove comments. --- index.md | 2 +- index_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index 93cae4f2..c8b319a9 100644 --- a/index.md +++ b/index.md @@ -42,7 +42,7 @@

diff --git a/index_fr.md b/index_fr.md index 6f354ac5..06c9a35d 100644 --- a/index_fr.md +++ b/index_fr.md @@ -38,7 +38,7 @@
From f0e51ff25a5678f52bebd8d4ff5b0da0b61ca9f7 Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 7 Nov 2016 10:46:47 +0100 Subject: [PATCH 036/122] [mod] security: add grey box audit link. --- security.md | 1 + security_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/security.md b/security.md index 597b55bb..f86176f2 100644 --- a/security.md +++ b/security.md @@ -121,3 +121,4 @@ Some [pentests](https://en.wikipedia.org/wiki/Penetration_test) have been done o - [1) Preparation](https://blog.exadot.fr/2016/07/03/pentest-dune-instance-yunohost-1-preparation) - [2) The functionning](https://blog.exadot.fr/2016/07/12/pentest-dune-instance-yunohost-2-le-fonctionnement) - [3) Black Box Audit](https://blog.exadot.fr/2016/08/26/pentest-dune-instance-yunohost-3-audit-en-black-box) +- [4) Grey Box Audit](https://blog.exadot.fr/2016/11/03/pentest-dune-instance-yunohost-4-audit-en-grey-box) diff --git a/security_fr.md b/security_fr.md index 14b85ae7..15b8b9ab 100644 --- a/security_fr.md +++ b/security_fr.md @@ -129,3 +129,4 @@ Des [pentests](https://fr.wikipedia.org/wiki/pentest) ont été effectués sur u - [1) Préparation](https://blog.exadot.fr/2016/07/03/pentest-dune-instance-yunohost-1-preparation) - [2) Le fonctionnement](https://blog.exadot.fr/2016/07/12/pentest-dune-instance-yunohost-2-le-fonctionnement) - [3) Audit en Black Box](https://blog.exadot.fr/2016/08/26/pentest-dune-instance-yunohost-3-audit-en-black-box) +- [4) Audit en Grey Box](https://blog.exadot.fr/2016/11/03/pentest-dune-instance-yunohost-4-audit-en-grey-box) From e8d08edf9db638de6902056b16f01d44e2f54a00 Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 7 Nov 2016 09:23:05 +0100 Subject: [PATCH 037/122] [mod] demo: replace web4all provider by gitoyen. - remove warning that demo is in beta state. --- try.md | 4 ++-- try_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/try.md b/try.md index f7aba71f..0352fe90 100644 --- a/try.md +++ b/try.md @@ -1,7 +1,7 @@ #Try YunoHost
-**Note:** This demo server runs a **beta version** of the software and **will fail** from time to time. +**Note:** This demo server could be down from time to time.
If it does not work, do consider [trying it at home](/try_at_home). @@ -24,5 +24,5 @@ If it does not work, do consider [trying it at home](/try_at_home).

***Demo server gracefully provided by -*** +Gitoyen***

diff --git a/try_fr.md b/try_fr.md index 2462ea52..bd6c00e3 100644 --- a/try_fr.md +++ b/try_fr.md @@ -1,7 +1,7 @@ #Essayer YunoHost
-**Note :** Cette démo tourne sous une **version bêta** du logiciel et **va cesser de fonctionner** de temps en temps. +**Note :** Cette démo peut cesser de fonctionner de temps en temps.
Si cela ne fonctionne pas, vous pouvez [essayer chez vous](/try_at_home_fr). @@ -24,7 +24,7 @@ Si cela ne fonctionne pas, vous pouvez [essayer chez vous](/try_at_home_fr).

***Le serveur de démo est fourni généreusement par -*** +Gitoyen***

From 72dc2b4d83eec7fb21df06bbded71a53cdcea13e Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Mon, 7 Nov 2016 23:58:27 +0100 Subject: [PATCH 038/122] * packaging_apps.md: Copyedits --- packaging_apps.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packaging_apps.md b/packaging_apps.md index ab2a6264..6f13c7e3 100644 --- a/packaging_apps.md +++ b/packaging_apps.md @@ -1,6 +1,6 @@ # App packaging -This document aimed to learn you how to package an application for YunoHost. +The purpose of this document is to teach you how to package an application for YunoHost. ### Requirements To package an application, here are the requirements: @@ -63,11 +63,11 @@ Note that it also works with a Git URL: yunohost app install https://github.com/author/my_app_package.git ``` -### Enhance package -Here is a list of best practices for application install scripts : +### Packaging best practices +Here is a list of best practices for application install scripts: * scripts should use `sudo cp -a ../sources/. $final_path` instead of `sudo cp -a ../sources/* $final_path`; * install script must contain support in case of script errors to delete residuals files thanks to `set -e` and [trap](packaging_apps_trap_fr); -* install script should use command line method instead of curl call through web install form; +* install script should use the command-line method instead of calls to curl through web install form; * install script should save install answers; * application sources should be checked with a control sum (sha256, sha1 or md5) or a PGP signature; * scripts should be tested on Debian Jessie as well as 32 bits, 64 bits and ARM architectures; @@ -76,18 +76,18 @@ Here is a list of best practices for application install scripts : ### Package script checker Package checker -This is a Python script which check: +This Python script checks: * that the package is up to date wich last specifications * that all files are present -* that the manifest don't have syntax error -* that scripts exit well before modifing the system during verifications. +* that the manifest doesn't have syntax errors +* that scripts exit well before modifing the system during verification. ### Publish and ask for testing your application -* Publishing a [post on the Forum](https://forum.yunohost.org/) with the [`App integration` category](https://forum.yunohost.org/c/app-integration), to ask tests and returns on your application. +* Publishing a [post on the Forum](https://forum.yunohost.org/) with the [`App integration` category](https://forum.yunohost.org/c/app-integration), to ask for testing and feedback on your application. -* Ask to add your application in the [app repository](https://github.com/YunoHost/apps) to be displayed in the [non-official apps list](apps_in_progress_en). Precise his progress state: `notworking`, `inprogress`, or `working`. +* Ask your application to be added to the [app repository](https://github.com/YunoHost/apps) to be displayed in the [non-official apps list](apps_in_progress_en). Specify its progress state: `notworking`, `inprogress`, or `working`. -- Subscribe to the [Apps mailing list](https://list.yunohost.org/cgi-bin/mailman/listinfo/apps) to be informed about packaging evolutions. +- Subscribe to the [Apps mailing list](https://list.yunohost.org/cgi-bin/mailman/listinfo/apps) to be informed about packaging evolution. ### Officalization of an application -To become an official application, it must be enough tested, stable and should work on 64 bits, 32 bits et ARM processor architectures, and on Debian Jessie. If you think those conditions are met, ask for [official integration](https://github.com/YunoHost/apps) of your application. +To become an official application, it must be tested well enough, be stable and should work on 64 bits, 32 bits et ARM processor architectures, and on Debian Jessie. If you think those conditions are met, ask for [official integration](https://github.com/YunoHost/apps) of your application. From 8c13bdb2dba30ec800cc3f53878d2380fae1db87 Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 8 Nov 2016 11:01:55 +0100 Subject: [PATCH 039/122] [enh] add readme as a symbolic link toward the document. --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 120000 README.md diff --git a/README.md b/README.md new file mode 120000 index 00000000..aa9ff0cb --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +yunohost_project_organization_fr.md \ No newline at end of file From e30d51c0bfabf4d0e0770a02cdb762a90abeabfe Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 8 Nov 2016 11:09:36 +0100 Subject: [PATCH 040/122] [mod] sort groups by kinds. Fix md syntax --- yunohost_project_organization_fr.md | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 0ac23df5..6ef53145 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -49,33 +49,33 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Dynette - YNH-Dev -- Groupe Apps - - Apps Officielles - - Apps Communautaires - - outils de développements d'app (package_checker, package linter) - -- Groupe Communication - - Documentation - - Communication (annonce évolutions du projet sur le forum, réseaux sociaux) - - Traduction +- Groupe distribution + - Création et maintenance des images d'installation sur diverses architectures + - Distribution des images + - Gestion de la distribution des paquets Debian. - Groupe Infra/Adminsys - Infrastructure - Site web (wiki, forum, salon de discussion, redmine, mumble) - Démo - Services - - ip.yunohost.org - - yunoport + - ip.yunohost.org + - yunoport - nohost.me - yunodash - yunopaste -- Groupe Support +- Groupe Apps + - Apps Officielles + - Apps Communautaires + - outils de développements d'app (package_checker, package linter) -- Groupe distribution - - Création et maintenance des images d'installation sur diverses architectures - - Distribution des images - - Gestion de la distribution des paquets Debian. +- Groupe Communication + - Documentation + - Communication (annonce évolutions du projet sur le forum, réseaux sociaux) + - Traduction + +- Groupe Support Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : From c56a20beff798e56f8394710908b62dd776f96de Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 8 Nov 2016 11:13:44 +0100 Subject: [PATCH 041/122] [mod] fix markdown syntax. --- yunohost_project_organization_fr.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 6ef53145..781550c1 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -42,12 +42,12 @@ Schéma d’organisation du projet YunoHost : La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projet en groupes thématiques : - Groupe Core Dev - - Core YunoHost - - Moulinette - - Admin web - - SSOwat - - Dynette - - YNH-Dev + - Core YunoHost + - Moulinette + - Admin web + - SSOwat + - Dynette + - YNH-Dev - Groupe distribution - Création et maintenance des images d'installation sur diverses architectures From 351fddcbe44525798fccca827aac28e3993e9c6c Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 8 Nov 2016 11:15:22 +0100 Subject: [PATCH 042/122] [mod] #8: move 'Entraide' group inside 'Communication' group --- yunohost_project_organization_fr.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 781550c1..07d92a87 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -74,8 +74,7 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Documentation - Communication (annonce évolutions du projet sur le forum, réseaux sociaux) - Traduction - -- Groupe Support + - Entraide (support) Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe, de voter et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : From 196816a895e8c01a5ee43e2d31e200a3f9962260 Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 9 Nov 2016 14:58:34 +0100 Subject: [PATCH 043/122] [enh] diagnostic: on english page, the link toward the tutorial was missing. - Translate the section from french. --- diagnostic.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/diagnostic.md b/diagnostic.md index 6d66493f..bca8da4b 100644 --- a/diagnostic.md +++ b/diagnostic.md @@ -50,5 +50,4 @@ You can also redirect ports manually to your server's local IP address on this r If the server is accessible from outside your local network, but unreachable with its domain name on the local network, then your router probably lacks of hairpinning. -You cannot avoid that in a simple way. If you know how to do it, just configure the `/etc/hosts` of your local clients to access your server with the local IP. Else, retry the installation with a **.nohost.me** or **.noho.st** domain. - +Here is a [tutorial](dns_local_network) to access to your server on a local network and bypass hairpinning problem. The tutorial propose in first solution to create a redirection with DNS of the ISP box and on second solution to modify `hosts` file of **clients** to say to access the **server** via it's local IP address. First solution is preferable because it's not needed to modify `hosts` files on every computer of the local network, if using many clients. From 49a95c1574b092e4c9aa42ba7c12783fb73f55b8 Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Wed, 9 Nov 2016 23:07:26 +0100 Subject: [PATCH 044/122] [enh] Add precision about Free ISP --- isp_fr.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/isp_fr.md b/isp_fr.md index 276aeab3..e840aa5d 100644 --- a/isp_fr.md +++ b/isp_fr.md @@ -18,9 +18,10 @@ Tous les fournisseurs d’accès à Internet [membres de la Fédération French | **[UPnP](https://fr.wikipedia.org/wiki/Universal_Plug_and_Play)** | ✔ | ✔ | ✔ | ✔ | ✔ | | **[Port 25 ouvrable](email_fr)**
(fermé par défaut) | ✔ | ✔ | ✘ | ✔ | ✔ | | **[Hairpinning](http://fr.wikipedia.org/wiki/Hairpinning)** | ✔ | ✔/✘ | ✘ | ✔ | ✔ | -| **[Reverse DNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup)
personnalisable ** | ✔ | … | ✘ | ✘ | ✘ | +| **[Reverse DNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup)
personnalisable ** | ✔ (sauf IPv6) | … | ✘ | ✘ | ✘ | | **[IP fixe](/dns_dynamicip_fr)** | ✔ | ✔/✘ | ✘ | ✔ | ✔ | | **[IPv6](https://fr.wikipedia.org/wiki/IPv6)** | ✔ | ✔ | ✔ | … | … | +| **[Non listé sur le DUL](https://en.wikipedia.org/wiki/Dialup_Users_List)** | ✘ | … | … | … | … | Pour une liste plus complète et précise, référez-vous à la très bonne documentation de [wiki.auto-hebergement.fr](http://wiki.auto-hebergement.fr/fournisseurs/fai#d%C3%A9tail_des_fai). **Astuce** : [FDN](http://www.fdn.fr) fournit des [VPN](http://www.fdn.fr/-VPN-.html) permettant de rapatrier une (ou plusieurs sur demande) IPv4 fixe et un /48 en IPv6 et ainsi « nettoyer » votre connexion si vous êtes chez l’un des FAI *limitants* du tableau ci-dessus. @@ -32,4 +33,4 @@ Pour une liste plus complète et précise, référez-vous à la très bonne docu | **Proximus** | BBox2 | oui (activé) | oui | **non** | **non** | **non** | | | BBox3 | oui (activé) | oui | **non** | **non** | **non** | | **Scarlet** | BBox2 | oui (activé) | oui | **non** | **non** | **non** | -**Proximus** ne serait pas ouvert à l’auto-hébergement. L’ouverture des ports serait plus difficile afin d’éviter tout SPAM. Il serait préférable de passer par [Neutrinet](http://neutrinet.be), un des [membres de la Fédération French Data Network](http://www.ffdn.org/fr/membres). \ No newline at end of file +**Proximus** ne serait pas ouvert à l’auto-hébergement. L’ouverture des ports serait plus difficile afin d’éviter tout SPAM. Il serait préférable de passer par [Neutrinet](http://neutrinet.be), un des [membres de la Fédération French Data Network](http://www.ffdn.org/fr/membres). From 80fc862d368158d194aa9c8dac1a47f014673aff Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Thu, 10 Nov 2016 01:07:41 +0100 Subject: [PATCH 045/122] =?UTF-8?q?Prise=20de=20d=C3=A9cision=20au=20lieu?= =?UTF-8?q?=20de=20vote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yunohost_project_organization_fr.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 1d3d7cfc..db223b5f 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -144,20 +144,20 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - Durée initiale: 1 semaine. - Durée minimale: 3 jours. - Décalage, si nécessaire: 3 jours. -- Avis nécessaires: 3 dont au moins 2 membres du groupe (celui qui a initié le vote peut voter). 4, dont 3 membres du groupe pour anticiper. +- Avis nécessaires: 3 dont au moins 2 membres du groupe (celui qui a initié cette prise de décision peux donner son avis). 4, dont 3 membres du groupe pour anticiper. - Validation par vote (le cas échéant): 66% de votes positifs. ###### Décision Standard/Moyenne: - Durée initiale: 2 semaines. - Durée minimale: 1 semaine. - Décalage, si nécessaire: 1 semaine. -- Avis nécessaires: 50% des membres du groupe (celui qui a initié le vote peut voter). 66% des membres du groupe pour anticiper. +- Avis nécessaires: 50% des membres du groupe (celui qui a initié cette prise de décision peux donner son avis). 66% des membres du groupe pour anticiper. - Validation par vote (le cas échéant): 75% de votes positifs. ###### Décision Majeure : - Durée initiale: 1 mois. - Décalage, si nécessaire: 2 semaines. -- Avis nécessaires: 75% des membres du groupe (celui qui a initié le vote peut voter). +- Avis nécessaires: 75% des membres du groupe (celui qui a initié cette prise de décision peux donner son avis). - Validation par vote (le cas échéant): 90% de votes positifs. ##### 6) Application From a2f08679be7ab4de5277b3fe96c997c33d5ce5bd Mon Sep 17 00:00:00 2001 From: julienmalik Date: Fri, 11 Nov 2016 23:35:55 +0100 Subject: [PATCH 046/122] typo --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index fb06b576..6547f7fb 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -2,7 +2,7 @@ ## Objectif du document Ce document a pour objectif de permettre aux contributeurs de se sentir légitimes d’effectuer une contribution dans le projet YunoHost avec un avis collectif. -Le projet étant communautaire, les prises de décisions prises hâtivement par un groupe restreins de contributeurs peuvent entraîner des frustrations postérieures. +Le projet étant communautaire, les décisions prises hâtivement par un groupe restreins de contributeurs peuvent entraîner des frustrations postérieures. Pour palier à ce problème, la solution proposée ici est de faire en sorte que les décisions soient prises collectivement et qu’elles soient suffisamment réfléchies. Un conseil oriente l’évolution du projet YunoHost, et des groupes d’intérêts permettent de contribuer plus efficacement en fonction des domaines de prédilection de chacun. From e9781c315714d68c9776658d5dd6b05e2c5f65ae Mon Sep 17 00:00:00 2001 From: julienmalik Date: Fri, 11 Nov 2016 23:36:57 +0100 Subject: [PATCH 047/122] typo --- yunohost_project_organization_fr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 6547f7fb..9d87e2f0 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -2,8 +2,8 @@ ## Objectif du document Ce document a pour objectif de permettre aux contributeurs de se sentir légitimes d’effectuer une contribution dans le projet YunoHost avec un avis collectif. -Le projet étant communautaire, les décisions prises hâtivement par un groupe restreins de contributeurs peuvent entraîner des frustrations postérieures. -Pour palier à ce problème, la solution proposée ici est de faire en sorte que les décisions soient prises collectivement et qu’elles soient suffisamment réfléchies. +Le projet étant communautaire, les décisions prises hâtivement par un groupe restreint de contributeurs peuvent entraîner des frustrations postérieures. +Pour pallier à ce problème, la solution proposée ici est de faire en sorte que les décisions soient prises collectivement et qu’elles soient suffisamment réfléchies. Un conseil oriente l’évolution du projet YunoHost, et des groupes d’intérêts permettent de contribuer plus efficacement en fonction des domaines de prédilection de chacun. ## Définition de YunoHost From 7309f3b6ef8e4a367a40eb0b1aca514e9778523b Mon Sep 17 00:00:00 2001 From: julienmalik Date: Fri, 11 Nov 2016 23:39:16 +0100 Subject: [PATCH 048/122] style --- yunohost_project_organization_fr.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 9d87e2f0..df16c904 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -16,7 +16,8 @@ Ce postulat pose la question des services comme nohost.me, qui devra être déba ### Valeurs -Un logiciel libre et communautaire +#### Un logiciel libre et communautaire + Par rapport à d'autres initiatives, (InternetCube, Sandstorm, Freedombox, cozy, ArkOS, serveur NAS (synology), kodi) YunoHost se distingue en étant : - un logiciel sous licence libre @@ -24,7 +25,8 @@ Par rapport à d'autres initiatives, (InternetCube, Sandstorm, Freedombox, cozy, - reposant sur des applications libres existantes (roundcube, baikal, etc.) -Que chacun peut s'approprier +#### Que chacun peut s'approprier + Historiquement, le projet est très proche des initiatives visant à la création d'un internet neutre et décentralisé. Cette proximité, notamment avec la FFDN, a amené une partie des contributeurs de YunoHost à créer la Brique Internet dont la mission est de faciliter l'auto-hébergement en fournissant une solution complète incluant service (via un VPN) et matériel. Cet aspect militant n'entrave pas des initiatives commerciales du logiciel pour lequel des entreprises pourraient proposer du support ou de l'hébergement. From d1b38b96a352b4445e32e7b0aaff9d25d1d9d82a Mon Sep 17 00:00:00 2001 From: julienmalik Date: Fri, 11 Nov 2016 23:41:13 +0100 Subject: [PATCH 049/122] typo --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index df16c904..1ce5a459 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -41,7 +41,7 @@ Schéma d’organisation du projet YunoHost : #### Définition et constitution des groupes -La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projet en groupes thématiques : +La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on ne sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projet en groupes thématiques : - Groupe Core Dev - Core YunoHost From 25082cd745d0258c9bdd4bb3e2e632d05cd8e531 Mon Sep 17 00:00:00 2001 From: julienmalik Date: Fri, 11 Nov 2016 23:43:11 +0100 Subject: [PATCH 050/122] Majuscule comme tout le monde --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 1ce5a459..81a03012 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -51,7 +51,7 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Dynette - YNH-Dev -- Groupe distribution +- Groupe Distribution - Création et maintenance des images d'installation sur diverses architectures - Distribution des images - Gestion de la distribution des paquets Debian. From 44b3951c3e43e5b5b64c2af3042321716fa55bf2 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Fri, 11 Nov 2016 23:44:45 +0100 Subject: [PATCH 051/122] updated nohost.me doc Add more detail on the purpose of cohost.me domains as well as the procedure to update or remove an existing domain DNS --- dns_nohost_me_fr.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/dns_nohost_me_fr.md b/dns_nohost_me_fr.md index 32f69476..fd0564f7 100644 --- a/dns_nohost_me_fr.md +++ b/dns_nohost_me_fr.md @@ -1,8 +1,18 @@ # Noms de domaines nohost.me +### Présentation + +Afin de rendre l'auto-hébergement le plus accessible possible, YunoHost offre un service de DNS dynamique par l'intermédiaire des noms de domaine `nohost.me` et `noho.st`. Si vous n'avez pas de nom de domaine, vous pouvez donc obtenir un sous-domaine de type `mondomaine.nohost.me` ou `mondomaine.noho.st`. Pour profiter de ce service, choisissez un domaine se terminant en .nohost.me ou .noho.st, il sera automatiquement rattaché à votre serveur YunoHost, et vous n’aurez pas d’étape de configuration supplémentaire. + ### Sous-domaines -Les noms de domaines `nohost.me` et `noho.st` permettent d'avoir uniquement un sous-domaine du type `pseudo.nohost.me`. -Bien qu'il soit possible d'installer des applications sur des sous-domaines (pour avoir l'application Owncloud accessible -depuis une adresse du type `cloud.mondomaine.org`), il n’est pas possible d’avoir un sous-sous-domaine tel `monapplication.pseudo.nohost.me`. +Utiliser le service de DNS `nohost.me` ou `noho.st` revient a en obtenir un sous-domaine. + +Le service de domaines `nohost.me` et `noho.st` permet d'avoir uniquement un sous-domaine du type `mondomaine.nohost.me` ou `mondomaine.nohost.me` mais n'autorise pas les sous-domaines de sous-domaines. + +Ainsi, même si YunoHost permet l'installation d'applications sur des sous-domaines (par exemple avoir l'application Owncloud accessible depuis l'adresse `cloud.mondomaine.org`), il n’est pas possible d’avoir un sous-sous-domaine tel `monapplication.mondomaine.nohost.me`. Pour pouvoir profiter des applications installables uniquement à la racine d’un nom de domaine, il faut avoir son propre nom de domaine. + +### Récuperer un domaine nohost.me ou noho.st + +Il peut arriver qu'une mise à jour des DNS du domaine soit nécessaire (par exemple lors d'un changement de machine), pour cela vous pouvez poster votre demande de réinitialisation sur le forum, [un fil est dédié à ce sujet](). From ec786afaf7d2d91df8c16099fab98163ef11e5c0 Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Sat, 12 Nov 2016 00:28:07 +0100 Subject: [PATCH 052/122] Mise en forme --- yunohost_project_organization_fr.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 81a03012..9c0ba487 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -102,8 +102,9 @@ Pour participer aux votes du conseil, il faut avoir contribué au projet et avoi ### Un processus de prises de décision basé sur un consensus mou Les décisions à prendre peuvent être de deux ordres : -1) pour un groupe (par "exemple merger une PR" serait affecté au groupe Dev tandis que "poster un tweet" serait de la responsabilité du groupe Communication) -2) pour l'ensemble du projet (par exemple décider d'une release avec des nouvelles fonctionnalités) + +1. pour un groupe (par "exemple merger une PR" serait affecté au groupe Dev tandis que "poster un tweet" serait de la responsabilité du groupe Communication) +2. pour l'ensemble du projet (par exemple décider d'une release avec des nouvelles fonctionnalités) Si un consensus sur une décision à prendre n'est pas trouvée au sein d'un groupe, ce dernier devra se tourner vers le conseil pour en débattre. Si aucun consensus n'est trouvé, la proposition sera soumise au vote de tous les contributeurs. From 4702bdac2795177880b1fb10b778dec6dcd39c3a Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Sat, 12 Nov 2016 00:28:24 +0100 Subject: [PATCH 053/122] update nohost.me doc add cli command detail --- dns_nohost_me_fr.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dns_nohost_me_fr.md b/dns_nohost_me_fr.md index fd0564f7..ddcd5738 100644 --- a/dns_nohost_me_fr.md +++ b/dns_nohost_me_fr.md @@ -6,13 +6,25 @@ Afin de rendre l'auto-hébergement le plus accessible possible, YunoHost offre u ### Sous-domaines -Utiliser le service de DNS `nohost.me` ou `noho.st` revient a en obtenir un sous-domaine. - -Le service de domaines `nohost.me` et `noho.st` permet d'avoir uniquement un sous-domaine du type `mondomaine.nohost.me` ou `mondomaine.nohost.me` mais n'autorise pas les sous-domaines de sous-domaines. +Le service de domaines `nohost.me` et `noho.st` permet d'avoir uniquement un sous-domaine du type `mondomaine.nohost.me` ou `mondomaine.nohost.me` mais n'autorise pas les sous-domaines sur ces sous-domaines. Ainsi, même si YunoHost permet l'installation d'applications sur des sous-domaines (par exemple avoir l'application Owncloud accessible depuis l'adresse `cloud.mondomaine.org`), il n’est pas possible d’avoir un sous-sous-domaine tel `monapplication.mondomaine.nohost.me`. Pour pouvoir profiter des applications installables uniquement à la racine d’un nom de domaine, il faut avoir son propre nom de domaine. +### Obtenir un Sous-domaines + +Pour obtenir un sous-domaine, connecter-vous a votre serveur YunHost, puis en entrez la commande (en remplaçant `mondomaine`par le domaine que vous souhaitez acquérir): + +```bash +sudo yunohost domain add mondomaine.nohost.me +``` + +Vous pouvez ensuite vérifier la création du domaine avec la commande : + +```bash +sudo yunohost domain list +``` + ### Récuperer un domaine nohost.me ou noho.st Il peut arriver qu'une mise à jour des DNS du domaine soit nécessaire (par exemple lors d'un changement de machine), pour cela vous pouvez poster votre demande de réinitialisation sur le forum, [un fil est dédié à ce sujet](). From 93d3cbebcc2b51892068793d248ded81d01060d6 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sat, 12 Nov 2016 00:36:42 +0100 Subject: [PATCH 054/122] remove duplicated lines --- yunohost_project_organization_fr.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 9c0ba487..11a213be 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -151,8 +151,6 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - sans avis (s'en remet aux autres) - Pour une décison mineure ou moyenne/standard, si le quota de réponse est atteint à la durée minimale et que le consensus est obtenu. - s'il n'est pas possible d'avoir assez de monde (vacances, plus assez de membres du groupe pouvant avoir un avis) il est possible pour le groupe de demander la clôture même si le quota d'avis n'est pas atteint, il y a alors un nouveau décalage de la date et si cette nouvelle date est franchie, la proposition est clôturée selon les avis donnés. - - si 1/3 arrondi au supérieur (exemple: 1/3 de 4 == "1.33.." -> 2) [à débattre pour ce %] des participant·e·s s'étant exprimé·e·s sur cette question sont favorables au vote, alors le vote est ouvert et prend fin lorsque tout le monde a répondu (ou si nécessaire, après une date de clôture) - - pourcentage d’avis positifs différents suivant l’importance de la prise de décisions : 50 %, 66 %, 80 %. ###### Micro décision: - Décision prise et appliquée par un seul membre sans délai. Ce type de décision doit impérativement pouvoir être réversible, et peut être remise en question par n'importe quel membre du groupe. From 27c6e9025d5beea15f323b2a75ef80db36a2e81e Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Sat, 12 Nov 2016 14:01:50 +0100 Subject: [PATCH 055/122] =?UTF-8?q?Supprime=20l'ambiguit=C3=A9=20qui=20pou?= =?UTF-8?q?rrait=20laisser=20penser=20qu'il=20n'y=20a=20que=205=20contribu?= =?UTF-8?q?teurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..899914e7 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -33,7 +33,7 @@ Historiquement, le projet est très proche des initiatives visant à la créatio ## Organisation de YunoHost ### Une structure ouverte, organisée par thèmes -L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre de contribuer à l'amélioration du logiciel, que ce soit d'un point de vue technique (développement, packaging d'application) ou non (communication, assistance aux utilisateurs, documentation, etc.). Inspiré par différents projets passés en revue lors de l'événement (Kodi, Debian, Django, Fedora, Wikipédia, etc.) et des idées des contributeurs de YunoHost (Jérôme, Bram, opi, scith, ju), il a été décidé d'une organisation en groupes spécialisés, fédérés par un conseil de contributeurs clés. +L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre de contribuer à l'amélioration du logiciel, que ce soit d'un point de vue technique (développement, packaging d'application) ou non (communication, assistance aux utilisateurs, documentation, etc.). Inspiré par différents projets passés en revue lors de l'événement (Kodi, Debian, Django, Fedora, Wikipédia, etc.) et des idées de contributeur de YunoHost (Jérôme, Bram, opi, scith, ju), il a été décidé d'une organisation en groupes spécialisés, fédérés par un conseil de contributeurs clés. Schéma d’organisation du projet YunoHost : From 627ac991c1724000db9886cbb1c72bb5ccc1855b Mon Sep 17 00:00:00 2001 From: Jeff Date: Sat, 12 Nov 2016 17:58:15 +0100 Subject: [PATCH 056/122] Retrait comparaison Le comparatif avec d'autres projets devrait selon moi faire l'objet d'une autre page. Qui plus est certains de ces projets sont aussi libres et communautaires ... Qu'en dites-vous ? --- yunohost_project_organization_fr.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..86b391af 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -18,11 +18,7 @@ Ce postulat pose la question des services comme nohost.me, qui devra être déba #### Un logiciel libre et communautaire -Par rapport à d'autres initiatives, (InternetCube, Sandstorm, Freedombox, cozy, ArkOS, serveur NAS (synology), kodi) YunoHost se distingue en étant : - -- un logiciel sous licence libre -- entièrement communautaire -- reposant sur des applications libres existantes (roundcube, baikal, etc.) +YunoHost est un logiciel sous licence libre, entièrement communautaire, et reposant sur des applications elles-mêmes communautaires et souvent libres (roundcube, baikal, etc...). #### Que chacun peut s'approprier From a2375c19f5e00ddab27ca2940a5ba9f630f2cf4c Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sat, 12 Nov 2016 18:10:17 +0100 Subject: [PATCH 057/122] [mod] we don't talk about vote for decisions anymore --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..f69f75d7 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -78,7 +78,7 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Traduction - Entraide (support) -Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe et de proposer au vote une décision à la suite d'une étape d'échange et d'amélioration de la proposition. +Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe et de proposer une prise de décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : - d'accueillir et fédérer les nouveaux contributeurs réguliers de son groupe From 4edb50c50a815a8155a03ec197855c465b3f9a00 Mon Sep 17 00:00:00 2001 From: Jeff Date: Sat, 12 Nov 2016 18:13:56 +0100 Subject: [PATCH 058/122] Retrait renvoi site web et YunoHost comme logiciel uniquement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pas besoin de faire référence au site web, ce document faisant référence (boucle infinie XD) Concernant l'absence de consensus sur "YunoHost comme logiciel uniquement" et l'absence de vision sur le devenir des services (nohost), autant carrément enlever ce paragraphe et le remettre quand ce sera plus clair. --- yunohost_project_organization_fr.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..533e3a2c 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -9,10 +9,7 @@ Un conseil oriente l’évolution du projet YunoHost, et des groupes d’intér ## Définition de YunoHost ### Objectifs -Selon le site web : « Le but de YunoHost est de rendre accessibles au plus grand nombre l’installation et l’administration d’un serveur, sans délaisser la qualité et la fiabilité du logiciel. » - -Nous proposons de limiter YunoHost au simple logiciel et de ne traiter aucun service auxiliaire estampillé sous le même nom (support payant, dns, hébergement). La fourniture de services devrait être laissée à d'autres structures gravitant autour du logiciel, qu'elles soient des entreprises ou des associations. Cela afin de concentrer l'activité de Yunohost sur la qualité du logiciel. -Ce postulat pose la question des services comme nohost.me, qui devra être débattue. +Le but de YunoHost est de rendre accessibles au plus grand nombre l’installation et l’administration d’un serveur, sans délaisser la qualité et la fiabilité du logiciel. ### Valeurs From c102eb3d24ce27c30c95002ba67dc2b2e41b98c6 Mon Sep 17 00:00:00 2001 From: Jeff Date: Sat, 12 Nov 2016 21:24:48 +0100 Subject: [PATCH 059/122] Simplification du refus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les "2 types de refus" proposés sont à mon sens trop vastes et peuvent tout contenir. Par exemple "j'aime pas ta gueule" peut être inclus dans "on ne doit pas faire ça" (parce que j'aime pas ta gueule) ... Du coup inutile je trouve. D'ou ma proposition --- yunohost_project_organization_fr.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..ddf49a58 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -128,11 +128,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - "pas d'avis" / "je ne suis pas en position de donner un avis pertinent (exemple: je sais pas coder en X)" - réponses délayantes/différées - demande de précisions, dans ce cas la décision est suspendue -- refus - - il y a deux types de refus - - "cela doit être fait autrement" - - "on ne doit pas faire ça" - - tout refus doit être argumenté et justifié +- refus: tout refus doit être argumenté et justifié ##### 3) Suspension/Repoussement - tant qu'il n'y a pas de réponse, la décision est suspendue, au moment de la réponse, la date de clôture est automatiquement repoussé (si besoin) (pour une durée, à définir, moins longue que la première fois) From 32c63f16d6b57fba61fa3c3452625fc18f17c476 Mon Sep 17 00:00:00 2001 From: Jeff Date: Sat, 12 Nov 2016 21:33:26 +0100 Subject: [PATCH 060/122] Enlever "plan d'action" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Je ne vois pas trop l'intérêt de cette section ? Si vous êtes d'accord, on peut l'enlever pour simplifier Je propose aussi une simplification du plan de migration (on peut se débrouiller pour diffuser les infos, vu que pour l'instant les gens d'impliqués sur ce process sont déjà ici). L'idée étant d'avoir un document propre et efficace. La partie plan de migration a d'ailleurs vocation à disparaitre je suppose ... --- yunohost_project_organization_fr.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..f1c5b651 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -178,14 +178,8 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de ##### 6) Application Alors un membre du groupe peut annoncer la décision comme effective (et procéder aux actions nécessaires comme releaser, merger, annonce, autre ...). Il est important que s'il y a besoin de certaines actions, des personnes se soient engagées à les faire, une décision sans désigner est moyennement utile -## Plan d’action - -Différentes idées ont été relevées au cours de la réunion par les personnes présentes. Les décisions du week-end devraient être publiée sur le forum (ou autre) pour être détaillées et discutées, en vue d'être acceptées. - ### Plan de migration -Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefois vu que ce n'est qu'un brouillon, chaque personne est invitée à publier des propositions de modifications/améliorations/précisions et à les soumettre. Les décisions se prendront sur le forum étant donné que Maniack et Moul ont des problèmes techniques de réception ou d'écriture sur la liste de discussion mail. Rappel il est possible de s'abonner par mail au forum, par contre la fonctionnalité de réponse par mail semble ne pas fonctionner. - -Mise en place d’un [système de vote via Discourse](https://blog.discourse.org/2015/08/improved-polls-in-discourse) plus intéressant que par mailling list. +Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefois vu que ce n'est qu'un brouillon, chaque personne est invitée à publier des propositions de modifications/améliorations/précisions et à les soumettre. Les décisions pourront s'appuyer sur le [système de vote via Discourse](https://blog.discourse.org/2015/08/improved-polls-in-discourse). Conseil : Bram, ju, ljf, Maniack C, Moul, opi, (scith, tostak, theodore) (à élire ? auto-promotion par méritocratie ? renouvellement au lieu de demander un retrait par d’autres membres (processus négatif)) From df38ff7ab4aeebe1258e0d3a7bda8fb2a1b42856 Mon Sep 17 00:00:00 2001 From: Jeff Date: Sat, 12 Nov 2016 21:36:13 +0100 Subject: [PATCH 061/122] =?UTF-8?q?Ajouts=20d=C3=A9cisions=20=C3=A0=20veni?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yunohost_project_organization_fr.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..526b5cd4 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -212,18 +212,20 @@ Conseil : Bram, ju, ljf, Maniack C, Moul, opi, (scith, tostak, theodore) (à él - Revoir système de build : stable <— testing <— branches - Gel de nohost.me et question de l'abandon des services -#### Groupes Dev +#### Groupe Dev - Comment gérer les pull request ? - Chaque ticket fait l'objet d'une branche et d'un ticket, tu fais une pull/merge request, la communauté vérifie que ça fonctionne, une décision est prise d'intégrer. -#### Groupes Apps +#### Groupe Apps - Pour les apps communautaires, les issues sont bien sur Github, les discussions sur le forum -#### Support +#### Groupe Communication - Rapport de bug à partir du forum - Faire en sorte de nettoyer le forum pour éviter le bruit - Proposition de supprimer le salon de support +- Comment rendre le forum plus actif et central +- Comment s'organiser pour les privilèges sur le forum (si les groupes veulent voter sur le forum) #### Autres - Demande sur le forum avec notification des membres du conseil et des représentants des groupes d’intérêts concernés. From cc2ad9d8027f930defa54e72866c1ce0f5c9745b Mon Sep 17 00:00:00 2001 From: Jeff Date: Sat, 12 Nov 2016 21:38:10 +0100 Subject: [PATCH 062/122] Retrait FAQ? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La FAQ est-elle utile dans l'état ? Surtout que vu la jeunesse du document il n'y a pas encore de "questions fréquemment posées" ... - La comparaison avec d'autres devrait avoir une page dédiée selon moi - Pourquoi continuer YunoHost : redondant avec la partie valeur et description (qu'on pourrait rendre plus fun éventuellement) - Références pas très utile dans ce document qui est sensé se suffir à lui même Qu'en dites-vous ? --- yunohost_project_organization_fr.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..325a6e62 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -245,17 +245,3 @@ Moyens de communication actuel : - Bugtracker Redmine - Forge git pour les review de code sur les PR - Salon de discussions XMPP - - -## F.A.Q ? -### Quelle différence avec d'autres projets (ArkOS, Cozy, Sandstorm, etc.) -- Cozy : gouverné par une entreprise qui développe toutes les applications pour une meilleure intégration entre-elles. Basé sur Debian. -- Sandstorm : distribution proche de la distribution YunoHost. -- ArkOS : en développement, basé sur Arch GNU/Linux. - -### Pourquoi continuer YunoHost ? -La communauté de YunoHost est grandissante et beaucoup de gens comptent dessus, son architecture technique basée sur des logiciels existants et sa gestion entièrement communautaire en font un projet unique. Enfin parce que c'est amusant et que l'aventure est belle :) - -## Références -- [Gouvernance du projet Fedora](https://fr.wikipedia.org/wiki/Fedora_(GNU/Linux)#Gouvernance_du_projet_Fedora) -- [Conditions de promotion d’un article Wikipédia au label “Bon article”](https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Bons_contenus/R%C3%A8gles#R.C3.A8gles) From c83294c1bcc6e22400bfde97d547f184726e2624 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sun, 13 Nov 2016 04:19:36 +0100 Subject: [PATCH 063/122] Style : keep consistent titles --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index f1c5b651..89d67fce 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -178,7 +178,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de ##### 6) Application Alors un membre du groupe peut annoncer la décision comme effective (et procéder aux actions nécessaires comme releaser, merger, annonce, autre ...). Il est important que s'il y a besoin de certaines actions, des personnes se soient engagées à les faire, une décision sans désigner est moyennement utile -### Plan de migration +## Plan de migration Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefois vu que ce n'est qu'un brouillon, chaque personne est invitée à publier des propositions de modifications/améliorations/précisions et à les soumettre. Les décisions pourront s'appuyer sur le [système de vote via Discourse](https://blog.discourse.org/2015/08/improved-polls-in-discourse). Conseil : Bram, ju, ljf, Maniack C, Moul, opi, (scith, tostak, theodore) (à élire ? auto-promotion par méritocratie ? renouvellement au lieu de demander un retrait par d’autres membres (processus négatif)) From 84651e0c60c01257a5b48c372879b2f3529d3fc3 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Mon, 14 Nov 2016 09:43:56 +0100 Subject: [PATCH 064/122] update page content Update page structure and some typo fix --- dns_nohost_me_fr.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/dns_nohost_me_fr.md b/dns_nohost_me_fr.md index ddcd5738..2bdaa217 100644 --- a/dns_nohost_me_fr.md +++ b/dns_nohost_me_fr.md @@ -2,18 +2,12 @@ ### Présentation -Afin de rendre l'auto-hébergement le plus accessible possible, YunoHost offre un service de DNS dynamique par l'intermédiaire des noms de domaine `nohost.me` et `noho.st`. Si vous n'avez pas de nom de domaine, vous pouvez donc obtenir un sous-domaine de type `mondomaine.nohost.me` ou `mondomaine.noho.st`. Pour profiter de ce service, choisissez un domaine se terminant en .nohost.me ou .noho.st, il sera automatiquement rattaché à votre serveur YunoHost, et vous n’aurez pas d’étape de configuration supplémentaire. +Afin de rendre l'auto-hébergement le plus accessible possible, YunoHost offre un service de DNS dynamique par l'intermédiaire des noms de domaine `nohost.me` et `noho.st`. Si vous n'avez pas de nom de domaine, vous pouvez donc obtenir un sous-domaine de type `mondomaine.nohost.me` ou `mondomaine.noho.st`. Pour profiter de ce service, choisissez un domaine se terminant en `.nohost.me` ou `.noho.st`, il sera automatiquement rattaché à votre serveur YunoHost, et vous n’aurez pas d’étape de configuration supplémentaire. -### Sous-domaines -Le service de domaines `nohost.me` et `noho.st` permet d'avoir uniquement un sous-domaine du type `mondomaine.nohost.me` ou `mondomaine.nohost.me` mais n'autorise pas les sous-domaines sur ces sous-domaines. +### Obtenir un domaine -Ainsi, même si YunoHost permet l'installation d'applications sur des sous-domaines (par exemple avoir l'application Owncloud accessible depuis l'adresse `cloud.mondomaine.org`), il n’est pas possible d’avoir un sous-sous-domaine tel `monapplication.mondomaine.nohost.me`. -Pour pouvoir profiter des applications installables uniquement à la racine d’un nom de domaine, il faut avoir son propre nom de domaine. - -### Obtenir un Sous-domaines - -Pour obtenir un sous-domaine, connecter-vous a votre serveur YunHost, puis en entrez la commande (en remplaçant `mondomaine`par le domaine que vous souhaitez acquérir): +Pour obtenir un domaine, connectez-vous à votre serveur YunoHost, puis entrez la commande (en remplaçant `mondomaine` par le domaine que vous souhaitez acquérir): ```bash sudo yunohost domain add mondomaine.nohost.me @@ -25,6 +19,16 @@ Vous pouvez ensuite vérifier la création du domaine avec la commande : sudo yunohost domain list ``` -### Récuperer un domaine nohost.me ou noho.st -Il peut arriver qu'une mise à jour des DNS du domaine soit nécessaire (par exemple lors d'un changement de machine), pour cela vous pouvez poster votre demande de réinitialisation sur le forum, [un fil est dédié à ce sujet](). +### Récupérer un domaine nohost.me ou noho.st + +Il peut arriver qu'une mise à jour des DNS du domaine soit nécessaire (par exemple lors d'un changement de machine), pour cela vous pouvez poster votre demande de réinitialisation sur le forum, [un fil est dédié à ce sujet](https://forum.yunohost.org/t/nohost-domain-recovery/442). + + +### Sous-domaines + +Le service de domaines `nohost.me` et `noho.st` n'autorise pas la création de sous-domaines. + +Même si YunoHost permet l'installation d'applications sur des sous-domaines (par exemple avoir l'application Owncloud accessible depuis l'adresse `cloud.mondomaine.org`), cette fonctionnalité n'est pas permise avec les domaines `nohost.me` et `noho.st` et il n’est pas possible d’avoir un sous-sous-domaine tel `monapplication.mondomaine.nohost.me`. + +Pour pouvoir profiter des applications installables uniquement à la racine d’un nom de domaine, il faut avoir son propre nom de domaine. From bb940c5333156b9b9c2546859b077d18ea37c978 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Mon, 14 Nov 2016 12:48:05 +0100 Subject: [PATCH 065/122] Membres du conseil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La question du renouvellement est tout de même à traiter je pense. Et c'est là le conseil après les premières délibérations, il peut encore s'agrandir. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 11a213be..7f81c48c 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -187,7 +187,7 @@ Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefoi Mise en place d’un [système de vote via Discourse](https://blog.discourse.org/2015/08/improved-polls-in-discourse) plus intéressant que par mailling list. -Conseil : Bram, ju, ljf, Maniack C, Moul, opi, (scith, tostak, theodore) (à élire ? auto-promotion par méritocratie ? renouvellement au lieu de demander un retrait par d’autres membres (processus négatif)) +Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Representants des groupes d’intérêts (élus ou auto-proclamés) : - Dev : opi, Bram, ju, ljf From 3f6917d0eb174412886f082b9684d00d597ade9a Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Tue, 15 Nov 2016 08:18:07 +0100 Subject: [PATCH 066/122] corrected my name and remove some useless spaces --- yunohost_project_organization_fr.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index c8da7379..9c268e70 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -179,7 +179,7 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Com - Com : Bram, Moul - Doc : Moul, theodore - - Trad : Jean-Batiste + - Trad : Jean-Baptiste ### Décisions à venir pour les groupes #### Conseil @@ -217,16 +217,16 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - La release devrait être validée par l'ensemble des 4 (ou 5) groupes d’intérêts - Communication en français et en anglais - Annuaire ou contact des groupes pour les nouveaux arrivants. Voir peut-être annuaire tout court pour savoir qui fait quoi. https://yunohost.org/#/contribs_fr à compléter. Et à mettre en avant. -- Proposition de laisser les membres YunoHost s'auto déterminer -> Comment gérer les accès ? +- Proposition de laisser les membres YunoHost s'auto déterminer -> Comment gérer les accès ? ## Notes Moyens de communication actuel : -- IRL -- Réunion Mumble -- Forum -- Listes de diffusion : contrib et app +- IRL +- Réunion Mumble +- Forum +- Listes de diffusion : contrib et app - Bugtracker Redmine - Forge git pour les review de code sur les PR - Salon de discussions XMPP From 9d87f6ecfa82355a7ca11d7d21acd46ae3220c60 Mon Sep 17 00:00:00 2001 From: opi Date: Tue, 15 Nov 2016 15:53:25 +0100 Subject: [PATCH 067/122] Add links --- yunohost_project_organization_fr.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 7e54da90..1d91a7a2 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -50,15 +50,15 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Gestion de la distribution des paquets Debian. - Groupe Infra/Adminsys - - Infrastructure + - Infrastructure - Site web (wiki, forum, salon de discussion, redmine, mumble) - Démo - Services - - ip.yunohost.org - - yunoport - - nohost.me - - yunodash - - yunopaste + - [ip.yunohost.org](https://ip.yunohost.org/) et ip6.yunohost.org + - [yunoports](http://ports.yunohost.org/) + - nohost.me et noho.st + - [yunodash](https://dash.yunohost.org/) + - [yunopaste](http://paste.yunohost.org/) - Groupe Apps - Apps Officielles @@ -225,8 +225,8 @@ Moyens de communication actuel : - IRL - Réunion Mumble -- Forum -- Listes de diffusion : contrib et app -- Bugtracker Redmine -- Forge git pour les review de code sur les PR +- [Forum](https://forum.yunohost.org) +- Listes de diffusion : [contrib](https://list.yunohost.org/cgi-bin/mailman/listinfo/contrib) et [apps](https://list.yunohost.org/cgi-bin/mailman/listinfo/apps) +- [Bugtracker Redmine](https://dev.yunohost.org) +- [Forge git](http://github.com/yunohost/) pour les review de code - Salon de discussions XMPP From c93495b0627e6278a3afa20ebbbe1fde5d73b328 Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 15 Nov 2016 18:04:06 +0100 Subject: [PATCH 068/122] [enh] Add YEP 1.3 about licensing information --- packaging_apps_guidelines_fr.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/packaging_apps_guidelines_fr.md b/packaging_apps_guidelines_fr.md index 68ffd102..b5067f6b 100644 --- a/packaging_apps_guidelines_fr.md +++ b/packaging_apps_guidelines_fr.md @@ -115,7 +115,30 @@ TODO Lien ou information pour réaliser l'inscription.
-#### YEP 1.3 - Indiquer la licence associée au paquet | validé | AUTO | WORKING | +#### YEP 1.3 - Indiquer la licence associée au paquet | brouillon | AUTO | WORKING | +La licence du paquet est à indiquer dans un fichier `LICENSE` à la racine du paquet. Attention à ne pas confondre avec la licence de l'application qui va être installée dont l'acronyme est à renseigner dans le champ `license` du manifeste. + +Les listes d'applications official.json et community.json n'acceptent que les paquets dont la licence est libre, de même pour la licence de l'application contenue. Certaines applications libres nécessitent des dépendances non-libres (exemple: mp3, drivers, etc.). Dans ce cas, il faut ajouter `+dep-non-free` à l'acronyme et si possible donner des précisions dans le README.md du paquet, l'intégration sera dans ce cas acceptée au cas par cas. + +Dans le future, YunoHost affichera sans doute des détails sur la licence de l'application. Pour y parvenir, l'acronyme doit être celui issue de cette [liste de licences répertoriées sur gnu.org](https://www.gnu.org/licenses/license-list.fr.html) (si il y a 2 acronymes, il faut prendre celui contenant le numéro de version). Pour plus de cohérence, la casse doit être respectée. + +Si la licence n'est pas présente dans la liste, dans ce cas il faut indiquer `free` ou `non-free` selon qu'elle est libre ou non et donner l'occasion à l'utilisateur de se renseigner dans le README.md (lien, explications, ...). + +Exemple: pour une licence `GNU Lesser General Public License (LGPL), version 3` l'acronyme est `LGPLv3` si toutefois des dépendances non libres sont utilisées dans ce cas il faudra mettre `LGPLv3+dep-non-free` dans le manifeste. + +Si une application a des modules liés avec une autre licence (Exemple: Odoo 9 LGPLv3 + un module sous licence AGPLv3 ), dans ce cas on indiquera les deux licences séparées par un `+`. + +Si deux applications distinctes sont dans le même paquet d'installation et ont des licences distinctes, dans ce cas on peut utiliser le `&` pour séparer les licences. + +Dans les deux cas, le mainteneur est encouragé à réfléchir à la possibilité de créer deux paquets distincts. Le manifeste permet des questions de type `app` de façon à faire référence à une autre application déjà installée. + +Quelques liens intéressants pour aider au choix de licence: +* [Des fiches explicatives sur les licences libres](https://www.inria.fr/content/download/5896/48452/version/2/file/INRIA_recueil_fiches_licences_libres_vf.pdf) +* [La documentation sur les licences du projet GNU](https://www.gnu.org/licenses/licenses.fr.html) +* [Un guide du projet GNU pour aider au choix d'une licence](https://www.gnu.org/licenses/license-recommendations.fr.html) + + + #### YEP 1.4 - Informer sur l'intention de maintenir un paquet | brouillon | manuel | WORKING | #### YEP 1.5 - Mettre à jour régulièrement le statut de l'app | brouillon | manuel | WORKING | #### YEP 1.6 - Se tenir informé sur l'évolution du packaging d'apps | validé | manuel | OFFICIAL | @@ -133,7 +156,7 @@ Les scripts d'action (install, upgrade, remove, backup et restore) doivent être Ceci étant rien n'empèche à l'intérieur de ces scripts de faire appel à d'autres scripts ou bibliothèques de fonction. Ceux ci ne sont pas obligés d'être en bash. Cependant, il faudra porter une attention particulière à l'affichage correcte des logs d'information, de warning, ou d'erreurs. Afin qu'un utilisateur de la cli/api yunohost puisse comprendre le fonctionnement du script venant d'être executé et au besoin réparer son instance YunoHost. - + #### YEP 2.3 - Sauvegarder les réponses lors de l'installation | validé | manuel | WORKING | Lors de l'installation, il est nécessaire de sauvegarder chaque réponse aux questions du manifeste. En effet, même si au début il n'est pas nécessaire d'écrire un script de mise à jour, par la suite ce sera sans doute le cas. Or, sans les informations initiales, la mise à jour peut être plus fastidieuse. From b7467359cf7e7e5c896a7aa81e5d641d5cab4072 Mon Sep 17 00:00:00 2001 From: Augustin D Date: Thu, 17 Nov 2016 08:18:43 +0000 Subject: [PATCH 069/122] Gandi SHA2 intermediate_certificate link Add link to download Gandi SHA2 intermediate_certificate for certificate which expiration date is after 01/01/2017. Done today for a Yunohost instance hosted by Gandi + tested at https://www.geocerts.com/ssl_checker. More information at https://wiki.gandi.net/fr/ssl/intermediate. Lops --- certificate_fr.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/certificate_fr.md b/certificate_fr.md index 90efdec9..23b9a5ab 100644 --- a/certificate_fr.md +++ b/certificate_fr.md @@ -60,6 +60,9 @@ En fonction de l’autorité d’enregistrement, des certificats intermédiaires > **Gandi** > ```bash > sudo wget https://www.gandi.net/static/CAs/GandiStandardSSLCA.pem -O ae_certs/intermediate_ca.pem``` +> Attention si votre certificat expire après le 01/01/2017, choisissez le certificat intermédiaire SHA2 suivant (à la place du certificat SHA1 précédent) +> ```bash +> sudo wget https://www.gandi.net/static/CAs/GandiStandardSSLCA2.pem -O ae_certs/intermediate_ca.pem``` > **RapidSSL** > ```bash From 1d89e4f616ca6b5b92290f9c5d2c88f5ad7291a6 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Sun, 20 Nov 2016 16:58:28 +0100 Subject: [PATCH 070/122] add web admin section add detail about the web admin domain creation --- dns_nohost_me_fr.md | 8 +++++++- images/dns_nohost_me.png | Bin 0 -> 12617 bytes 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 images/dns_nohost_me.png diff --git a/dns_nohost_me_fr.md b/dns_nohost_me_fr.md index 2bdaa217..e3f10b2f 100644 --- a/dns_nohost_me_fr.md +++ b/dns_nohost_me_fr.md @@ -7,7 +7,13 @@ Afin de rendre l'auto-hébergement le plus accessible possible, YunoHost offre u ### Obtenir un domaine -Pour obtenir un domaine, connectez-vous à votre serveur YunoHost, puis entrez la commande (en remplaçant `mondomaine` par le domaine que vous souhaitez acquérir): +##### Depuis l'interface d'administration +Vous pouvez obtenir un domaine directement depuis l'interface d'administration de YunoHost, en vous rendant dans le menu Domaine et en cliquant sur le bouton "Ajouter un domaine" : + + + +##### En ligne de commande +Après vous être connecté à votre serveur YunoHost, entrez la commande (en remplaçant `mondomaine` par le domaine que vous souhaitez acquérir) : ```bash sudo yunohost domain add mondomaine.nohost.me diff --git a/images/dns_nohost_me.png b/images/dns_nohost_me.png new file mode 100644 index 0000000000000000000000000000000000000000..e28e8c2a955e822cec001e3d07764ebcba4c7179 GIT binary patch literal 12617 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 Date: Sun, 20 Nov 2016 17:08:47 +0100 Subject: [PATCH 071/122] fix some small typos --- dns_nohost_me_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dns_nohost_me_fr.md b/dns_nohost_me_fr.md index e3f10b2f..1b7107c0 100644 --- a/dns_nohost_me_fr.md +++ b/dns_nohost_me_fr.md @@ -8,7 +8,7 @@ Afin de rendre l'auto-hébergement le plus accessible possible, YunoHost offre u ### Obtenir un domaine ##### Depuis l'interface d'administration -Vous pouvez obtenir un domaine directement depuis l'interface d'administration de YunoHost, en vous rendant dans le menu Domaine et en cliquant sur le bouton "Ajouter un domaine" : +Vous pouvez obtenir un domaine directement depuis l'interface d'administration de YunoHost, en vous rendant dans le menu "Domaines" et en cliquant sur le bouton "Ajouter un domaine" : From 33546f56ae9e7623283eaa986dbf48db94bbbef1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 24 Nov 2016 02:37:05 +0100 Subject: [PATCH 072/122] Summary of the steps to contribute/dev on the core of Yunohost --- dev.md | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 dev.md diff --git a/dev.md b/dev.md new file mode 100644 index 00000000..9fa544d2 --- /dev/null +++ b/dev.md @@ -0,0 +1,116 @@ +# Contributing to the Yunohost core + +You wish to implement a new feature in the Yunohost core, but don't know how to +proceed ? This guide takes you through the various steps of the development and +contribution process. + +## Setting up a development environment + +- **Use [ynh-dev](https://github.com/YunoHost/ynh-dev)** (see the README) to + setup a development environment - locally in a virtual machine, or on a VPS. + This will setup a working Yunohost instance, using git repositories and + symlinks. That way, you will be able to edit files, test your changes, commit + stuff and push/pull directly from your development environment. + +- Implement and test your feature. Depending on what you want to develop, you + will want to : + - **Python/CLI core** : work in `/vagrant/yunohost/`, i.e. the Python/CLI core + - **Web administration interface** : work in `/vagrant/yunohost-admin/` + - You can also work on the other projects (SSOwat, moulinette) in similar ways + +## Developping on the Yunohost Python/CLI core + +- Work in `/vagrant/yunohost/` + +- The actionsmap file (`data/actionsmap/yunohost.yml`) defines the various + categories, actions and arguments of the yunohost CLI. Define how you want + users to use your feature, and add/edit the corresponding categories, actions + and arguments. For example in `yunohost domain add some.domain.tld`, the + category is `domain`, the action is `add`, and `some.domain.tld` is an + argument. + +- Moulinette will automatically map commands in the actionsmap to python + functions (and their arguments) located in `src/yunohost/`. For example, typing + `yunohost domain add some.domain.tld` will call the function + `domain_add(domainName)` in `domain.py`, with the argument `domainName` equal + to `"some.domain.tld"`. + +#### Helpers / coding style + +- To handle exceptions, you should raise some `MoulinetteError()` + +- To help with internationalizing the messages, use `m18n.n('some-message-id')` + and put your string in `locales/en.json`. You can also put arguments and use + them in the string with `{{some-argument:s}}`. Don't edit other locales files, + only the en.json ! + +- Yunohost tries to follow the [pep8](http://pep8.org/) coding style. Tools + exist to automatically check conformity. + +- Name of "private" functions should start with a `_` + +#### Don't forget + +- (Might not be necessary anymore) Each time you edit the actionsmap, you should + force the refresh of the cache with `rm + /var/cache/moulinette/actionsmap/yunohost.pkl` + +## Adding stuff to the Yunohost web administration interface + +- Work in `/vagrant/yunohost-admin/src/` + +- Make sure the web admin interface of your development environment works, by + opening `https://domain.tld/yunohost/admin`. If not, run `npm install` and + `npm run build` in `yunohost-admin/src/`. [Not sure about this, to be checked] + +- The web interface uses the API to interact with Yunohost. The API + commands/requests are also defined via the actionsmap. For instance, accessing + the page ```https://domain.tld/yunohost/api/users``` corresponds to a `GET + /domains` requests on the Yunohost API. It is mapped to the function + `user_list()`. Accessing the URL should display the json returned by this + function. 'GET' requests are typically meant to ask information to the server. + 'POST' requests are meant to ask the server to edit/change some information, + or to execute some actions. + +- `js/yunohost/controllers` contains the javascript parts, + and define which requests to make to the API when loading a specific page of + the interface, and how to process the data to generate the page, using + templates. + +- `views` contains the various templates for the pages of the interface. In the + template, data coming from the javascript part can be used with the syntax + `{{some-variable}}`, which will be replaced when building/accessing the page. + It is also possible to have conditions using the + [handlebars.js](http://handlebarsjs.com) syntax : ```{{#if + some-variable}}

Some conditionnal HTML code here !

{{/if}}``` + +- For internationalized strings, use `y18n.t('some-string-code')` in the + javascript, or `{{t 'some-string-code'}}` in the HTML template, and put your + string in `locales/en.json`. Don't edit other locales files, only the + en.json ! + +#### Don't forget + +- Each time you edit the actionsmap, you should restart the yunohost-api : + ```service yunohost-api restart``` + (You'll need to retype your admin password in the web interface) + +- Each time you edit something in the `js` folder, you should re-build with npm : + ```npm run build-dev``` + and clear the cache of your browser. + +- Each time you edit something in the `views` folder, you should clear the cache + of your browser + + +## Your feature is working and you want it to be integrated in Yunohost + +- Fork the relevant repo on Github, and commit stuff to a new branch with a name + like `enh-name-of-feature`. + +- Once you're ready, open a Pull Request on Github + +- After reviewing, testing and validation by other contributors, your branch +should be merged in `testing` (?) ! + + From 0ead41713fa6ae53dd0c414b8163bb0c8ad8c907 Mon Sep 17 00:00:00 2001 From: Moul Date: Thu, 24 Nov 2016 12:49:12 +0100 Subject: [PATCH 073/122] [enh] add forum link on sitemaps. --- sitemap.md | 1 + sitemap_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/sitemap.md b/sitemap.md index 333e5d81..a5d94207 100644 --- a/sitemap.md +++ b/sitemap.md @@ -109,5 +109,6 @@ * [Support](/support_en) * [Art Works](artworks_en) * [Blog](https://forum.yunohost.org/c/announcement) + - [Forum](https://forum.yunohost.org) * [Communication](communication_en) * [Help](/help) diff --git a/sitemap_fr.md b/sitemap_fr.md index 816cf16d..b61caf7a 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -121,6 +121,7 @@ * [Contributeurs](contribs_fr) * [Entraide - support](/support_fr) * [Blog](https://forum.yunohost.org/c/announcement) + - [Forum](https://forum.yunohost.org) * [Conférences](/conf_fr) * [Communication extérieure](communication_fr) * [Travail artistique](artworks_fr) From 82dba52ca535c81ac588614c42981a8e14cf0fcb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 24 Nov 2016 22:23:50 +0100 Subject: [PATCH 074/122] Implementing remarks from @ljf --- dev.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/dev.md b/dev.md index 9fa544d2..9bbc7536 100644 --- a/dev.md +++ b/dev.md @@ -4,6 +4,9 @@ You wish to implement a new feature in the Yunohost core, but don't know how to proceed ? This guide takes you through the various steps of the development and contribution process. +If you're looking for stuff to implement or fix, the bugtracker is +[here](https://dev.yunohost.org/issues/) ! + ## Setting up a development environment - **Use [ynh-dev](https://github.com/YunoHost/ynh-dev)** (see the README) to @@ -63,6 +66,10 @@ contribution process. opening `https://domain.tld/yunohost/admin`. If not, run `npm install` and `npm run build` in `yunohost-admin/src/`. [Not sure about this, to be checked] +- Run `/vagrant/ynh-dev use-git yunohost-admin`. It launches gulp, such as each + time you modify sources, it recompiles the code and you can use it by + refreshing (Ctrl+F5) your web administration. To stop the command, just do Ctrl+C. + - The web interface uses the API to interact with Yunohost. The API commands/requests are also defined via the actionsmap. For instance, accessing the page ```https://domain.tld/yunohost/api/users``` corresponds to a `GET @@ -95,20 +102,21 @@ contribution process. ```service yunohost-api restart``` (You'll need to retype your admin password in the web interface) -- Each time you edit something in the `js` folder, you should re-build with npm : - ```npm run build-dev``` - and clear the cache of your browser. - -- Each time you edit something in the `views` folder, you should clear the cache - of your browser +- You might need to force-clear the cache of your browser sometimes to refresh + the javascript and/or html (so each time you edit something in `js` or `views`). ## Your feature is working and you want it to be integrated in Yunohost -- Fork the relevant repo on Github, and commit stuff to a new branch with a name - like `enh-name-of-feature`. +- Fork the relevant repo on Github, and commit stuff to a new branch. We recommend + to name the branch with the following convention : + - For an enhancement or new feature : `enh-REDMINETICKET-name-of-feature`, where + REDMINETICKET is optional and is the id of a corresponding ticket on RedMine. + - For a bugfix fix-IDREDMINETICKET-description-of-fix", where + REDMINETICKET is optional and is the id of a corresponding ticket on RedMine. -- Once you're ready, open a Pull Request on Github +- Once you're ready, open a Pull Request (PR) on Github. Please include "[fix]" or + "[enh]" at the beginning of the title of your PR. - After reviewing, testing and validation by other contributors, your branch should be merged in `testing` (?) ! From 88f29ddb7ba8677793c88e0dffbdd8ea24f716c6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 27 Nov 2016 04:57:00 +0100 Subject: [PATCH 075/122] Misc + adding links + french translation --- contributordoc_fr.md | 4 +- dev.md | 95 ++++++++++++------- dev_fr.md | 221 ++++++++++++++++++++++++++++--------------- sitemap.md | 22 +++-- sitemap_fr.md | 3 +- ynh_dev_fr.md | 91 ++++++++++++++++++ 6 files changed, 317 insertions(+), 119 deletions(-) create mode 100644 ynh_dev_fr.md diff --git a/contributordoc_fr.md b/contributordoc_fr.md index 80611ac9..6e5bd3b0 100644 --- a/contributordoc_fr.md +++ b/contributordoc_fr.md @@ -9,7 +9,7 @@ * [Développer avec Docker](/docker_fr) * [Builder OpenResty (serveur Web) pour Raspberry Pi](/build_openresty_fr) * [Présentation du fonctionnement de YunoHost](/package_list_fr) - * [Se créer un environnement de développement](/dev_fr) + * [Se créer un environnement de développement](/ynh_dev_fr) * Documentation * [Création d’un compte pour l’édition de la documentation](/accounting_fr) - * [Écrire de la documentation](/write_documentation_fr) \ No newline at end of file + * [Écrire de la documentation](/write_documentation_fr) diff --git a/dev.md b/dev.md index 9bbc7536..f16ac4f6 100644 --- a/dev.md +++ b/dev.md @@ -1,29 +1,34 @@ -# Contributing to the Yunohost core +## Contributing to the Yunohost core -You wish to implement a new feature in the Yunohost core, but don't know how to +You wish to add a new feature in the Yunohost core, but don't know how to proceed ? This guide takes you through the various steps of the development and contribution process. -If you're looking for stuff to implement or fix, the bugtracker is +If you're looking for stuff to implement or fix, the bug-tracker is [here](https://dev.yunohost.org/issues/) ! -## Setting up a development environment +**Come say hi to us in the [dev chatroom](xmpp:dev@conference.yunohost.org?join)** ! If you don't have an XMPP client, you can join using the widget at the bottom right of this page. + +### Setting up a development environment - **Use [ynh-dev](https://github.com/YunoHost/ynh-dev)** (see the README) to setup a development environment - locally in a virtual machine, or on a VPS. - This will setup a working Yunohost instance, using git repositories and - symlinks. That way, you will be able to edit files, test your changes, commit - stuff and push/pull directly from your development environment. + This will setup a working Yunohost instance, using directly the git repositories + (with symlinks). That way, you will be able to edit files, test your changes in real + time, commit stuff and push/pull directly from your development environment. -- Implement and test your feature. Depending on what you want to develop, you +- **Implement and test your feature**. Depending on what you want to develop, you will want to : - - **Python/CLI core** : work in `/vagrant/yunohost/`, i.e. the Python/CLI core + - **Python/CLI core** : work in `/vagrant/yunohost/` - **Web administration interface** : work in `/vagrant/yunohost-admin/` - - You can also work on the other projects (SSOwat, moulinette) in similar ways + - You can also work on the other projects on which Yunohost is built + (SSOwat, moulinette) in similar ways -## Developping on the Yunohost Python/CLI core +### Working on the Yunohost Python/CLI core -- Work in `/vagrant/yunohost/` +- Work in `/vagrant/yunohost/`. + +- Run `/vagrant/ynh-dev use-git yunohost`. - The actionsmap file (`data/actionsmap/yunohost.yml`) defines the various categories, actions and arguments of the yunohost CLI. Define how you want @@ -38,33 +43,29 @@ If you're looking for stuff to implement or fix, the bugtracker is `domain_add(domainName)` in `domain.py`, with the argument `domainName` equal to `"some.domain.tld"`. -#### Helpers / coding style +##### Helpers / coding style - To handle exceptions, you should raise some `MoulinetteError()` - To help with internationalizing the messages, use `m18n.n('some-message-id')` and put your string in `locales/en.json`. You can also put arguments and use them in the string with `{{some-argument:s}}`. Don't edit other locales files, - only the en.json ! + this will be done using [weblate](https://translate.yunohost.org/) ! - Yunohost tries to follow the [pep8](http://pep8.org/) coding style. Tools exist to automatically check conformity. - Name of "private" functions should start with a `_` -#### Don't forget +##### Don't forget - (Might not be necessary anymore) Each time you edit the actionsmap, you should force the refresh of the cache with `rm /var/cache/moulinette/actionsmap/yunohost.pkl` -## Adding stuff to the Yunohost web administration interface +### Working on the Yunohost web administration interface -- Work in `/vagrant/yunohost-admin/src/` - -- Make sure the web admin interface of your development environment works, by - opening `https://domain.tld/yunohost/admin`. If not, run `npm install` and - `npm run build` in `yunohost-admin/src/`. [Not sure about this, to be checked] +- Work in `/vagrant/yunohost-admin/src/`. - Run `/vagrant/ynh-dev use-git yunohost-admin`. It launches gulp, such as each time you modify sources, it recompiles the code and you can use it by @@ -89,14 +90,14 @@ If you're looking for stuff to implement or fix, the bugtracker is `{{some-variable}}`, which will be replaced when building/accessing the page. It is also possible to have conditions using the [handlebars.js](http://handlebarsjs.com) syntax : ```{{#if - some-variable}}

Some conditionnal HTML code here !

{{/if}}``` + some-variable}}

Some conditional HTML code here !

{{/if}}``` - For internationalized strings, use `y18n.t('some-string-code')` in the javascript, or `{{t 'some-string-code'}}` in the HTML template, and put your - string in `locales/en.json`. Don't edit other locales files, only the - en.json ! + string in `locales/en.json`. Don't edit other locales files, + this will be done using [weblate](https://translate.yunohost.org/) ! -#### Don't forget +##### Don't forget - Each time you edit the actionsmap, you should restart the yunohost-api : ```service yunohost-api restart``` @@ -106,19 +107,49 @@ If you're looking for stuff to implement or fix, the bugtracker is the javascript and/or html (so each time you edit something in `js` or `views`). -## Your feature is working and you want it to be integrated in Yunohost +### Your feature is ready and you want it to be integrated in Yunohost - Fork the relevant repo on Github, and commit stuff to a new branch. We recommend to name the branch with the following convention : - - For an enhancement or new feature : `enh-REDMINETICKET-name-of-feature`, where - REDMINETICKET is optional and is the id of a corresponding ticket on RedMine. - - For a bugfix fix-IDREDMINETICKET-description-of-fix", where - REDMINETICKET is optional and is the id of a corresponding ticket on RedMine. + - For an enhancement or new feature : `enh-REDMINETICKET-name-of-feature` + - For a bugfix `fix-REDMINETICKET-description-of-fix` + - `REDMINETICKET` is optional and is the id of a corresponding ticket on RedMine. -- Once you're ready, open a Pull Request (PR) on Github. Please include "[fix]" or - "[enh]" at the beginning of the title of your PR. +- Once you're ready, open a Pull Request (PR) on Github. Please include `[fix]` or + `[enh]` at the beginning of the title of your PR. - After reviewing, testing and validation by other contributors, your branch should be merged in `testing` (?) ! + + + + diff --git a/dev_fr.md b/dev_fr.md index fe8f99a9..4c91094e 100644 --- a/dev_fr.md +++ b/dev_fr.md @@ -1,91 +1,164 @@ -## Créer un environnement de développement +## Contribuer au coeur de Yunohost -
-Attention : cette page de documentation n’est plus à jour. Merci de vous référer à la [documentation du dépôt](https://github.com/YunoHost/ynh-dev). -
+Vous souhaitez ajouter une nouvelle fonctionnalité au coeur de Yunohost, mais ne +savez pas comment procéder ? Ce guide parcours les étapes du développement et du +processus de contribution. -Ce document a pour but de donner les clés pour créer un environnement de développement correct afin de développer sur le cœur de YunoHost. Il peut également vous permettre de tester vos applications que ce soit avec les versions `stable`, `testing`, `unstable` ou même des versions customisées issues des branches des dépôts. +Si vous chercher quelque chose à implémenter ou un bug à réparer, le +bug tracker est [ici](https://dev.yunohost.org/issues/) ! -### Installation de l’environnement de développement -#### Installation du système de virtualisation -Installer, avec le gestionnaire de paquet de votre système d’exploitation, Vagrant. +**Venez dire coucou sur le [salon de +dev](xmpp:dev@conference.yunohost.org?join)** ! Si vous n'avez pas de client +XMPP, vous devriez pouvoir vous connecter à l'aide du widget en bas de la page. -```bash -# Debian, Ubuntu, Mint -sudo apt-get install vagrant -# Fedora -sudo dnf install vagrant -``` +### Mettre en place un environnement de développement -#### Télécharger `ynh-dev` -
-Attention : Cette partie est en cours de rédaction. La ligne de commande `ynh-dev` vient juste d’être créée il est possible qu’il y ait des manques. -
+- **Utilisez [ynh-dev](https://github.com/YunoHost/ynh-dev)** (voir le README) + pour mettre en place un environnement de développement - en local sur une + machine virtuel, ou bien sur un VPS. + Ceci installera une instance fonctionelle de Yunohost, en utilisant + directement les dépôts git à l'aide de liens symboliques. De cette facon, il + vous sera possible de modifier les fichiers, de tester les changements en + temps réel, et de commiter et push/pull directement depuis cet environnement. -Une ligne de commande `ynh-dev` a été créée afin de simplifier la gestion de votre environnement de développement. +- **Implémentez et testez votre fonctionnalité**. Suivant ce sur quoi vous + voulez travailler : + - **Coeur Python/ligne de comande** : allez dans `/vagrant/yunohost/` + - **Interface d'administration web** : allez dans `/vagrant/yunohost-admin/` + - Vous pouvez aussi travailler sur les autres projets liés sur lesquels + s'appuie Yunohost (SSOwat, moulinette) de facon similaire. -```bash -wget https://raw.githubusercontent.com/yunohost/ynh-dev/master/ynh-dev -chmod u+x ynh-dev -``` -Pour créer votre environnement, commencez par faire un `create-env` -```bash -./ynh-dev create-env ~/project/my/yunohost/env -``` -Cette sous commande va cloner les dépôts principaux au fonctionnement de YunoHost et les positionner en `unstable`. Si vous avez vos propres fork, vous pouvez ensuite faire ce qu’il faut pour changer l’origine et le remote repository. +### Travailler sur le coeur Python / ligne de commande -#### Usage -##### Lancer un container -Positionner vous dans votre environnement, puis créer et entrer dans une vm à l’aide de `ynh-dev run` -```bash -cd ~/project/my/yunohost/env -./ynh-dev run exemple.local stable8 -root@yunohost:/# cd yunohost -root@yunohost:/yunohost/# ls -Dockerfile LICENSE README.md SSOwat apps backup moulinette ynh-dev yunohost yunohost-admin yunohost-vagrant -``` +- Allez dans `/vagrant/yunohost/`. -##### Mettre à jour un container -Si la vm n’est pas à jour lancez un `ynh-dev upgrade` : -```bash -root@yunohost:/yunohost/# ./ynh-dev upgrade -``` +- Executez `/vagrant/ynh-dev use-git yunohost`. -##### Déployer les sources présentes dans votre environnement -Pour déployer les sources se trouvant dans votre environnement de développement faites : -```bash -root@yunohost:/yunohost/# ./ynh-dev deploy -``` +- Le fichier actionsmap (`data/actionsmap/yunohost.yml`) défini les différentes + catégories, actions et arguments de la ligne de commande Yunohost. Choisissez + comment vous voulez que les utilisateurs utilise votre fonctionnalité, et + ajoutez/éditez les catégories, actions et arguments correspondants. Par + exemple, dans `yunohost domain add some.domain.tld`, la catégorie est + `domain`, l'action est `add` et `some.domain.tld` est un argument. -
-Attention : pour yunohost-admin vous devez avoir compilé le js avec gulp au préalable -
+- Moulinette va automatiquement faire le lien entre les commandes de + l'actionsmap et les fonctions python (ainsi que leurs arguments) dans + `src/yunohost/`. Par exemple, `yunohost domain add some.domain.tld` + déclenchera un appel de `domain_add(domainName)` dans `domain.py`, avec l'argument + `domainName` qui vaudra `"some.domain.tld"`. -
-Note : vous pouvez sélectionner les paquets à déployer exemple : `./ynh-dev deploy yunohost yunohost-admin` -
+##### Helpers / style de code -##### Lancer la postinstall -Avec VirtualBox/Vagrant -```bash -root@yunohost:/yunohost/# yunohost tools postinstall -``` +- Pour gérer les exceptions, il existe un type `MoulinetteError()` -##### Récupérer l’IP de la vm et paramétrer son `/etc/hosts` -si vous ne connaissez pas l’IP de votre vm : -```bash -root@yunohost:/yunohost/# ./ynh-dev ip -172.17.0.1 -``` +- Pour aider avec l'internationalisation des messages, utilisez `m18n.n('some-message-id')` + et mettez le message correspondant dans `locales/en.json`. Vous pouvez aussi + utiliser des arguments pour construire les messages, avec `{{some-argument:s}}`. + Ne modifiez pas de fichiers de locales autres que en.json, la traduction sera + faite avec [weblate](https://translate.yunohost.org/) ! -Pour tester dans votre navigateur vous pouvez modifier votre fichier `/etc/hosts` afin de faire pointer votre domaine sur la bonne adresse IP. Par exemple en y ajoutant une ligne semblable à celle-ci : -```bash -172.17.0.1 exemple.local -``` +- Yunohost essaye de suivre le style de code [pep8](http://pep8.org/). Des + outils existent pour vérifier automatiquement la conformité du code. + +- Mettre un `_` devant les noms des fonctions "privées". + +##### N'oubliez pas + +- (Peut-être plus nécessaire) À chaque fois que vous modifiez l'actionsmap, il + faut forcer le rafraichissement du cache avec : + `rm /var/cache/moulinette/actionsmap/yunohost.pkl` + +### Travailler sur l'interface d'administration web + +- Allez dans `/vagrant/yunohost-admin/src/`. + +- Executez `/vagrant/ynh-dev use-git yunohost-admin`. Ceci lance gulp, de sorte + à ce que à chaque fois que vous modifiez les sources, il recompilera le code + (js) et vous pourrez voir les changements dans le navigateur web (Ctrl+F5). + Pour stopper la commande, faites simplement Ctrl+C. + +- L'interface web utilise une API pour communiquer avec Yunohost. Les + commandes/requêtes de l'API sont également définie dans l'actionsmap. Par + exemple, accéder à la page ```https://domain.tld/yunohost/api/users``` + corresponds à une requete `GET /domains` vers l'API yunohost. Cette requete + est mappée sur `user_list()`. Accéder à cette URL devrait afficher le json + retourné par cette fonction. Les requetes `GET' sont typiquement destinés à + demander de l'information au serveur, tandis que les requetes `POST` sont + destinées à demander au serveur de modifier/changer des informations ou de + réaliser des actions. + +- `js/yunohost/controllers` contiens les parties javascript, et défini quelles + requêtes faire à l'API pendant le chargement d'une page donnée de l'interface, + et comment traîter les données récupérées pour générer la page, en utilisant + des templates. + +- `views` contiens les templates des pages de l'interface. Dans le template, + les données venant du javascript peuvent êtres utilisées avec la syntaxe + `{{some-variable}}`, qui sera remplacée pendant la construction de la page. + Il est également possible d'avoir des conditions avec la syntaxe + d'[handlebars.js](http://handlebarsjs.com) : ```{{#if + some-variable}}

du HTML conditionnel ici !

{{/if}}``` + +- Pour l'internationalisation des messages, utilisez `y18n.t('some-string-code')` + dans le javascript, ou `{{t 'some-string-code'}}` dans le template HTML, et + mettez votre message dans `locales/en.json`. Ne modifiez pas de fichiers de + locales autres que en.json, la traduction sera faite avec + [weblate](https://translate.yunohost.org/) ! + +##### N'oubliez pas + +- À chaque modification de l'actionsmap, il faut redémarrer l'API yunohost : + ```service yunohost-api restart``` + (Il faudra retaper le mot de passe administrateur dans l'interface web) + +- Il faudra peut-être régulièrement forcer le rafraichissement du cache + navigateur pour propager correctement le javascript et/ou HTML (à chaque fois + que l'on change quelque chose dans `js` ou `views`, donc). + + +### Votre fonctionnalité est prête et vous souhaitez qu'elle soit intégrée dans Yunohost + +- Forkez le dépòt correspondant sur Github, et commitez votre changements dans + une nouvelle branche, Il est recommandé de nommer la branche avec la + convention : + - Pour une nouvelle fonctionnalité ou amélioration : `enh-TICKETREDMINE-description-fonctionnalité` + - Pour une correction de bug : `fix-REDMINETICKET-description-correctif` + - `TICKETREDMINE` est optionnel et correspond au numéro du ticket sur RedMine + +- Une fois prêt, ouvrez une Pull Request (PR) sur Github. De préférence, inclure + `[fix]` ou `[enh]` au début du titre de la PR. + +- Après relecture, test et validation par les autres contributeurs, votre + branche sera mergée dans `testing` (?) ! + + + -##### Déployer les sources au fur et à mesure des modifications -```bash -root@yunohost:/yunohost/# ./ynh-dev watch -``` -Astuce : dans le cas de modification sur yunohost-admin, cette commande est très pratique couplée avec un `gulp watch` sur la machine hôte. diff --git a/sitemap.md b/sitemap.md index 333e5d81..21b98050 100644 --- a/sitemap.md +++ b/sitemap.md @@ -80,16 +80,18 @@ * [Contributor guide](/contribute) * Developement - * [Package new application](/packaging_apps) - * [Manifest](packaging_apps_manifest_en) - * [Scripts](packaging_apps_scripts_en) - * [Arguments management](packaging_apps_arguments_management_en) - * [Nginx configuration](packaging_apps_nginx_conf_en) - * [Multi-instance](packaging_apps_multiinstance_en) - * [Helpers](packaging_apps_helpers_en) - * [Trap usage](packaging_apps_trap_fr) - * [Applications in progress](/apps_in_progress_en) - * [Wishlist of applications](/apps_wishlist_en) + * Applications + * [Package new application](/packaging_apps) + * [Manifest](packaging_apps_manifest_en) + * [Scripts](packaging_apps_scripts_en) + * [Arguments management](packaging_apps_arguments_management_en) + * [Nginx configuration](packaging_apps_nginx_conf_en) + * [Multi-instance](packaging_apps_multiinstance_en) + * [Helpers](packaging_apps_helpers_en) + * [Trap usage](packaging_apps_trap_fr) + * [Applications in progress](/apps_in_progress_en) + * [Wishlist of applications](/apps_wishlist_en) + * [Contributing to the Yunohost core](/dev) * [Creation of system packages](/build_system_en) * [Creation of Debian packages](/build_packages_en) * [Create an ARM board image](/build_arm_image_en) diff --git a/sitemap_fr.md b/sitemap_fr.md index 816cf16d..6d81cc79 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -90,7 +90,7 @@ * [Guide du contributeur](/contribute_fr) * Développement - * [Créer un environnement de développement](dev_fr) + * [Créer un environnement de développement](ynh_dev_fr) * [Présentation du fonctionnement de YunoHost](/package_list_fr) * Applications : * [Packager des applications](/packaging_apps_fr) @@ -103,6 +103,7 @@ * [Usage de trap](packaging_apps_trap_fr) * [Packages d’applications en cours de développement](/apps_in_progress_fr) * [Liste de proposition d’applications](/apps_wishlist_fr) + * [Contribuer au coeur de Yunohost](/dev_fr) * [Création de paquets système](/build_system_fr) * [Création de paquets Debian](/build_packages_fr) * [Créer une image pour carte ARM](/build_arm_image_en) diff --git a/ynh_dev_fr.md b/ynh_dev_fr.md new file mode 100644 index 00000000..fe8f99a9 --- /dev/null +++ b/ynh_dev_fr.md @@ -0,0 +1,91 @@ +## Créer un environnement de développement + +
+Attention : cette page de documentation n’est plus à jour. Merci de vous référer à la [documentation du dépôt](https://github.com/YunoHost/ynh-dev). +
+ +Ce document a pour but de donner les clés pour créer un environnement de développement correct afin de développer sur le cœur de YunoHost. Il peut également vous permettre de tester vos applications que ce soit avec les versions `stable`, `testing`, `unstable` ou même des versions customisées issues des branches des dépôts. + +### Installation de l’environnement de développement +#### Installation du système de virtualisation +Installer, avec le gestionnaire de paquet de votre système d’exploitation, Vagrant. + +```bash +# Debian, Ubuntu, Mint +sudo apt-get install vagrant +# Fedora +sudo dnf install vagrant +``` + +#### Télécharger `ynh-dev` +
+Attention : Cette partie est en cours de rédaction. La ligne de commande `ynh-dev` vient juste d’être créée il est possible qu’il y ait des manques. +
+ +Une ligne de commande `ynh-dev` a été créée afin de simplifier la gestion de votre environnement de développement. + +```bash +wget https://raw.githubusercontent.com/yunohost/ynh-dev/master/ynh-dev +chmod u+x ynh-dev +``` +Pour créer votre environnement, commencez par faire un `create-env` +```bash +./ynh-dev create-env ~/project/my/yunohost/env +``` +Cette sous commande va cloner les dépôts principaux au fonctionnement de YunoHost et les positionner en `unstable`. Si vous avez vos propres fork, vous pouvez ensuite faire ce qu’il faut pour changer l’origine et le remote repository. + +#### Usage +##### Lancer un container +Positionner vous dans votre environnement, puis créer et entrer dans une vm à l’aide de `ynh-dev run` +```bash +cd ~/project/my/yunohost/env +./ynh-dev run exemple.local stable8 +root@yunohost:/# cd yunohost +root@yunohost:/yunohost/# ls +Dockerfile LICENSE README.md SSOwat apps backup moulinette ynh-dev yunohost yunohost-admin yunohost-vagrant +``` + +##### Mettre à jour un container +Si la vm n’est pas à jour lancez un `ynh-dev upgrade` : +```bash +root@yunohost:/yunohost/# ./ynh-dev upgrade +``` + +##### Déployer les sources présentes dans votre environnement +Pour déployer les sources se trouvant dans votre environnement de développement faites : +```bash +root@yunohost:/yunohost/# ./ynh-dev deploy +``` + +
+Attention : pour yunohost-admin vous devez avoir compilé le js avec gulp au préalable +
+ +
+Note : vous pouvez sélectionner les paquets à déployer exemple : `./ynh-dev deploy yunohost yunohost-admin` +
+ +##### Lancer la postinstall +Avec VirtualBox/Vagrant +```bash +root@yunohost:/yunohost/# yunohost tools postinstall +``` + +##### Récupérer l’IP de la vm et paramétrer son `/etc/hosts` +si vous ne connaissez pas l’IP de votre vm : +```bash +root@yunohost:/yunohost/# ./ynh-dev ip +172.17.0.1 +``` + +Pour tester dans votre navigateur vous pouvez modifier votre fichier `/etc/hosts` afin de faire pointer votre domaine sur la bonne adresse IP. Par exemple en y ajoutant une ligne semblable à celle-ci : +```bash +172.17.0.1 exemple.local +``` + +##### Déployer les sources au fur et à mesure des modifications +```bash +root@yunohost:/yunohost/# ./ynh-dev watch +``` + +Astuce : dans le cas de modification sur yunohost-admin, cette commande est très pratique couplée avec un `gulp watch` sur la machine hôte. From a8773ae33d85576a4e55f1bcfc03f7d0cb1c0e6b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 27 Nov 2016 05:13:46 +0100 Subject: [PATCH 076/122] Adding links in 'contribute' page --- contribute.md | 2 +- contribute_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contribute.md b/contribute.md index 4e95f97e..e8dfcb6b 100644 --- a/contribute.md +++ b/contribute.md @@ -47,7 +47,7 @@ Our support relies on contributors like you. Just come to [the XMPP chatroom](/s You can involve in the YunoHost's development regardless of your skill. Sysadmins, web developers, designers and pythonists are welcome!
-A [development chat room](xmpp:dev@conference.yunohost.org?join) and a mailing-list is available. +Learn [how to contribute](/dev), and join us on the [development chat room](xmpp:dev@conference.yunohost.org?join) and the mailing-list.
diff --git a/contribute_fr.md b/contribute_fr.md index 8ec24b6f..0382d0e3 100644 --- a/contribute_fr.md +++ b/contribute_fr.md @@ -45,7 +45,7 @@ Notre support est communautaire et s’appuie sur des contributeurs comme vous.
Vous pouvez vous impliquer dans le développement de YunoHost peu importe votre niveau. Administrateurs système, développeurs web, designers et pythonistes sont les bienvenus.
-Une mailing-list est également disponible. +Découvrez [comment contribuer](/dev_fr), et rejoignez-nous sur le [salon de discussion](xmpp:dev@conference.yunohost.org?join) et la mailing-list !
From c8a9b6d3a75758e0c990c039f53fbcaa2c27c6e6 Mon Sep 17 00:00:00 2001 From: opi Date: Mon, 28 Nov 2016 11:42:32 +0100 Subject: [PATCH 077/122] [enh] Add info about security team and GPG. --- security.md | 2 ++ security_fr.md | 2 ++ security_team.md | 13 +++++++++++++ security_team_fr.md | 14 ++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 security_team.md create mode 100644 security_team_fr.md diff --git a/security.md b/security.md index f86176f2..9720ec12 100644 --- a/security.md +++ b/security.md @@ -10,6 +10,8 @@ Two things remain important to note: *If you need some advises, do not hesitate to [ask us](/support).* +*To talk about security flaws, contact the [YunoHost security team](/security_team).* + --- ## Improve security diff --git a/security_fr.md b/security_fr.md index 15b8b9ab..188146b5 100644 --- a/security_fr.md +++ b/security_fr.md @@ -13,6 +13,8 @@ Deux points sont néanmoins importants à noter : *Si vous avez besoin de conseil, n’hésitez pas à [nous demander](/support_fr).* +*Pour discuter d'une faille de securité, contactez l'[équipe securité de YunoHost](/security_team_fr).* + --- ## Améliorer la sécurité diff --git a/security_team.md b/security_team.md new file mode 100644 index 00000000..0f22817f --- /dev/null +++ b/security_team.md @@ -0,0 +1,13 @@ +# Security team + +Contact the security team by mail: `security@yunohost.org`. + +We strongly advise you to encrypt your mail with GPG. Our public key is available on key servers. Below is our fingerprint + +``` +gpg --fingerprint security@yunohost.org +pub 4096R/17351899 2016-07-01 + Empreinte de la clef = 6CBC 45EB A625 FBF3 513D 1227 749D 8972 1735 1899 +uid YunoHost Security +sub 4096R/446838AF 2016-07-01 +``` \ No newline at end of file diff --git a/security_team_fr.md b/security_team_fr.md new file mode 100644 index 00000000..2ef8db74 --- /dev/null +++ b/security_team_fr.md @@ -0,0 +1,14 @@ +# Équipe securité + +Contactez l'équipe securité par email : `security@yunohost.org`. + +Nous vous recommandons fortement de chiffrer votre mail avec GPG. Notre clé +publique est disponible sur les serveurs de clés. L'empreinte est ci-dessous : + +``` +gpg --fingerprint security@yunohost.org +pub 4096R/17351899 2016-07-01 + Empreinte de la clef = 6CBC 45EB A625 FBF3 513D 1227 749D 8972 1735 1899 +uid YunoHost Security +sub 4096R/446838AF 2016-07-01 +``` \ No newline at end of file From 7f81ce992bfc4a4276ab9fcce601251d7f2da88c Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 29 Nov 2016 18:07:28 +0100 Subject: [PATCH 078/122] [fix] Simone needs bash. --- security_team.md | 4 ++-- security_team_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/security_team.md b/security_team.md index 0f22817f..3b926fdb 100644 --- a/security_team.md +++ b/security_team.md @@ -4,10 +4,10 @@ Contact the security team by mail: `security@yunohost.org`. We strongly advise you to encrypt your mail with GPG. Our public key is available on key servers. Below is our fingerprint -``` +```bash gpg --fingerprint security@yunohost.org pub 4096R/17351899 2016-07-01 Empreinte de la clef = 6CBC 45EB A625 FBF3 513D 1227 749D 8972 1735 1899 uid YunoHost Security sub 4096R/446838AF 2016-07-01 -``` \ No newline at end of file +``` diff --git a/security_team_fr.md b/security_team_fr.md index 2ef8db74..d125c1e1 100644 --- a/security_team_fr.md +++ b/security_team_fr.md @@ -5,10 +5,10 @@ Contactez l'équipe securité par email : `security@yunohost.org`. Nous vous recommandons fortement de chiffrer votre mail avec GPG. Notre clé publique est disponible sur les serveurs de clés. L'empreinte est ci-dessous : -``` +```bash gpg --fingerprint security@yunohost.org pub 4096R/17351899 2016-07-01 Empreinte de la clef = 6CBC 45EB A625 FBF3 513D 1227 749D 8972 1735 1899 uid YunoHost Security sub 4096R/446838AF 2016-07-01 -``` \ No newline at end of file +``` From bb401d2bcbdd78f1d98f4eea0a907bd60ea2ab80 Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 29 Nov 2016 18:09:04 +0100 Subject: [PATCH 079/122] [enh] add new pages security on sitemaps. --- sitemap.md | 1 + sitemap_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/sitemap.md b/sitemap.md index a5d94207..8e85c289 100644 --- a/sitemap.md +++ b/sitemap.md @@ -61,6 +61,7 @@ * [Add a certificate certified by an authority](/certificate) * [Regenerate self-signed certificate](/regenerate_certificate_en) * [Security](/security) + - [Contact security team](security_team) * [Troubleshooting guide](/troubleshooting_guide_en) * [YunoHost Tor Hidden Servicer](/torhiddenservice) * [Unblock an IP address with Fail2ban](/fail2ban_en) diff --git a/sitemap_fr.md b/sitemap_fr.md index b61caf7a..d5eb2a29 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -68,6 +68,7 @@ * [Ajouter un certificat d’une autorité](/certificate_fr) * [Régénérer le certificat auto-signé](/regenerate_certificate_fr) * [Sécurité](/security_fr) + - [Contacter l’équipe de sécurité](security_team_fr) * [Consulter les fichiers de log du système](/check_logfile_fr) * [Guide de dépannage](/troubleshooting_guide_fr) * [YunoHost service caché Tor](/torhiddenservice_fr) From 550b532d42341e4471470d1dd48469b2d23647a3 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Tue, 29 Nov 2016 20:55:11 +0100 Subject: [PATCH 080/122] add Alex to the dev group --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 1d91a7a2..ca61bdba 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -173,7 +173,7 @@ Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefoi Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Representants des groupes d’intérêts (élus ou auto-proclamés) : - - Dev : opi, Bram, ju, ljf + - Dev : opi, Bram, ju, ljf, AlexAubin - Apps : Maniack, tostaki, Moul, ljf - Infra : opi, Bram, ju, Moul - Com From 3286857b6679db772b316cc0b032afe5d14c98ef Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Tue, 29 Nov 2016 22:33:24 +0100 Subject: [PATCH 081/122] fixed some typos Conseil spelling, is based on these french rules : http://j.poitou.free.fr/pro/html/typ/cap-emplois.html --- yunohost_project_organization_fr.md | 48 ++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index ca61bdba..51935a1d 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -20,7 +20,7 @@ YunoHost est un logiciel sous licence libre, entièrement communautaire, et repo #### Que chacun peut s'approprier -Historiquement, le projet est très proche des initiatives visant à la création d'un internet neutre et décentralisé. Cette proximité, notamment avec la FFDN, a amené une partie des contributeurs de YunoHost à créer la Brique Internet dont la mission est de faciliter l'auto-hébergement en fournissant une solution complète incluant service (via un VPN) et matériel. Cet aspect militant n'entrave pas des initiatives commerciales du logiciel pour lequel des entreprises pourraient proposer du support ou de l'hébergement. +Historiquement, le projet est très proche des initiatives visant à la création d'un internet neutre et décentralisé. Cette proximité, notamment avec la [FFDN](https://www.ffdn.org/), a amené une partie des contributeurs de YunoHost à créer la Brique Internet dont la mission est de faciliter l'auto-hébergement en fournissant une solution complète incluant service (via un VPN) et matériel. Cet aspect militant n'entrave pas des initiatives commerciales du logiciel pour lequel des entreprises pourraient proposer du support ou de l'hébergement. ## Organisation de YunoHost @@ -34,9 +34,9 @@ Schéma d’organisation du projet YunoHost : #### Définition et constitution des groupes -La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on ne sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projet en groupes thématiques : +La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on ne sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projets en groupes thématiques : -- Groupe Core Dev +- ##### Groupe Core Dev - Core YunoHost - Moulinette - Admin web @@ -44,12 +44,12 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - Dynette - YNH-Dev -- Groupe Distribution +- ##### Groupe Distribution - Création et maintenance des images d'installation sur diverses architectures - Distribution des images - Gestion de la distribution des paquets Debian. -- Groupe Infra/Adminsys +- ##### Groupe Infra/Adminsys - Infrastructure - Site web (wiki, forum, salon de discussion, redmine, mumble) - Démo @@ -60,46 +60,46 @@ La constitution de groupes part du constat que YunoHost compte beaucoup de sous- - [yunodash](https://dash.yunohost.org/) - [yunopaste](http://paste.yunohost.org/) -- Groupe Apps +- ##### Groupe Apps - Apps Officielles - Apps Communautaires - outils de développements d'app (package_checker, package linter) -- Groupe Communication +- ##### Groupe Communication - Documentation - Communication (annonce évolutions du projet sur le forum, réseaux sociaux) - Traduction - Entraide (support) -Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe et de proposer une prise de décision à la suite d'une étape d'échange et d'amélioration de la proposition. +Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe et de proposer une prise de décision à la suite d'une étape d'échange et d'amélioration de la proposition. Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : - d'accueillir et fédérer les nouveaux contributeurs réguliers de son groupe -- de tenir informé le conseil des décisions prises au sein du groupe (cf. point suivant) +- de tenir informé le Conseil des décisions prises au sein du groupe (cf. point suivant) Le choix d'un outil de communication est laissé à chaque groupe en fonction de sa pertinence (forum, chat, ML, etc.). #### Définition et constitution du Conseil -YunoHost grandissant, il est important de maintenir une cohérence entre tous les groupes, néanmoins il est impossible d'imposer à chacun des membres des groupes de s'intéresser ou de s'impliquer sur tous les aspects du projet (pour des raisons de temps et de compétence). Pour pallier à cela, il est proposé de créer un meta-groupe, où chaque groupe sera représenté par au moins un de ses membres : le Conseil. -Le Conseil est indépendant des groupes et réuni les contributeurs souhaitant s'impliquer le plus dans le projet, son rôle est de : +YunoHost grandissant, il est important de maintenir une cohérence entre tous les groupes, néanmoins il est impossible d'imposer à chacun des membres des groupes de s'intéresser ou de s'impliquer sur tous les aspects du projet (pour des raisons de temps et de compétences). Pour pallier à cela, il est proposé de créer un meta-groupe, où chaque groupe sera représenté par au moins un de ses membres : le Conseil. +Le Conseil est indépendant des groupes et réunit les contributeurs souhaitant s'impliquer le plus dans le projet, son rôle est de : - prendre les décisions importantes sur YunoHost qui ne dépendent pas d'un seul groupe (par exemple changer le moteur du wiki) - faire des points réguliers sur l'ensemble du projet pour assurer sa cohésion. (réunion Mumble) -- solliciter l'ensemble de la communauté des contributeurs (ou même des utilisateurs) quand une décision divise les groupes et/ou le conseil +- solliciter l'ensemble de la communauté des contributeurs (ou même des utilisateurs) quand une décision divise les groupes et/ou le Conseil -Le choix d'un outil de communication est laissé au conseil, ses décisions doivent néanmoins être consultable par l'ensemble de la communauté de contributeur. -Pour participer aux votes du conseil, il faut avoir contribué au projet et avoir obtenu un droit de vote (ou d'entrée) au sein du conseil. Ce droit est délivré par le conseil (éventuellement sur demande). Le conseil est libre à tout moment de modifier le processus de décision. -Être membre du conseil n'implique pas forcément d'avoir l'ensemble des accès (infra, dépôt etc...). +Le choix d'un outil de communication est laissé au Conseil, ses décisions doivent néanmoins être consultables par l'ensemble de la communauté de contributeurs. +Pour participer aux votes du Conseil, il faut avoir contribué au projet et avoir obtenu un droit de vote (ou d'entrée) au sein du Conseil. Ce droit est délivré par le Conseil (éventuellement sur demande). Le Conseil est libre à tout moment de modifier le processus de décision. +Être membre du Conseil n'implique pas forcément d'avoir l'ensemble des accès (infrastructure, dépôt etc...). ### Un processus de prises de décision basé sur un consensus mou -Les décisions à prendre peuvent être de deux ordres : +Les décisions à prendre peuvent être de deux ordres : 1. pour un groupe (par "exemple merger une PR" serait affecté au groupe Dev tandis que "poster un tweet" serait de la responsabilité du groupe Communication) 2. pour l'ensemble du projet (par exemple décider d'une release avec des nouvelles fonctionnalités) -Si un consensus sur une décision à prendre n'est pas trouvée au sein d'un groupe, ce dernier devra se tourner vers le conseil pour en débattre. Si aucun consensus n'est trouvé, la proposition sera soumise au vote de tous les contributeurs. +Si un consensus sur une décision à prendre n'est pas trouvée au sein d'un groupe, ce dernier devra se tourner vers le Conseil pour en débattre. Si aucun consensus n'est trouvé, la proposition sera soumise au vote de tous les contributeurs. #### Le processus de prise de décision en détail @@ -108,8 +108,8 @@ Si un consensus sur une décision à prendre n'est pas trouvée au sein d'un gro - forcément publique à l'exception de situations bien définies (bug relatif à la sécurité critique ou vote sur les personnes) - une date de clôture est automatiquement définie par type de proposition. La définition de la date remplie plusieurs fonctions : - pouvoir laisser le temps à tout le monde de s'exprimer et ne pas prendre la décision trop vite - - maintenir un rythme car si le quota des réponses est rempli avant le temps imparti, il n'y a pas besoin d'attendre l'avis de tout les membres du groupe - - le quota est à évaluer en fonction des personnes inscrites au groupe (ou au conseil selon la situation) qui ont manifesté leurs souhaits d'être considéré comme votant régulier => exemple kload peut vouloir donner son avis ponctuellement, mais à priori il ne souhaitera pas être considéré comme membre votant actif du conseil + - maintenir un rythme car si le quota des réponses est rempli avant le temps imparti, il n'y a pas besoin d'attendre l'avis de tout les membres du groupe + - le quota est à évaluer en fonction des personnes inscrites au groupe (ou au Conseil selon la situation) qui ont manifesté leurs souhaits d'être considéré comme votant régulier => exemple kload peut vouloir donner son avis ponctuellement, mais à priori il ne souhaitera pas être considéré comme membre votant actif du Conseil - pouvoir être repoussable sur simple demande d'une des personnes du groupe. Et seulement du groupe, pas tous les contrib. ##### 2) Ouverture de la discussion, plusieurs réponses possibles : @@ -172,7 +172,7 @@ Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefoi Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - - Representants des groupes d’intérêts (élus ou auto-proclamés) : + - Representants des groupes d’intérêts (élus ou auto-proclamés) : - Dev : opi, Bram, ju, ljf, AlexAubin - Apps : Maniack, tostaki, Moul, ljf - Infra : opi, Bram, ju, Moul @@ -183,8 +183,8 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. ### Décisions à venir pour les groupes #### Conseil -- Faut-il élire les membres du conseil plutôt que de les coopter ? Risque de se transformer en "campagne politique"! -- Faut-il limiter l'ouverture des groupes d'intérêts par cooptation comme pour le conseil ? +- Faut-il élire les membres du Conseil plutôt que de les coopter ? Risque de se transformer en "campagne politique"! +- Faut-il limiter l'ouverture des groupes d'intérêts par cooptation comme pour le Conseil ? - Proposition de changer Conseil en Collégiale - Migrer le serveur d’infrastructure du projet sous YunoHost. (avec apps déjà packagées pad, gogs, mumble?) - Let's Encrypt @@ -211,7 +211,7 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Comment s'organiser pour les privilèges sur le forum (si les groupes veulent voter sur le forum) #### Autres -- Demande sur le forum avec notification des membres du conseil et des représentants des groupes d’intérêts concernés. +- Demande sur le forum avec notification des membres du Conseil et des représentants des groupes d’intérêts concernés. - Vote sur deux semaines par un post sur le forum - Créer quatre canaux pour le Dev, les Apps, la Communication et l'Infrastructure - La release devrait être validée par l'ensemble des 4 (ou 5) groupes d’intérêts @@ -221,7 +221,7 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. ## Notes -Moyens de communication actuel : +Moyens de communication actuels : - IRL - Réunion Mumble From eadc112391959a161b9e630ab7d9934057eec7b8 Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 29 Nov 2016 23:02:55 +0100 Subject: [PATCH 082/122] [mod] add 'Moul' on dev group, rm detail. alignment.. --- yunohost_project_organization_fr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index ca61bdba..28f56212 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -172,8 +172,8 @@ Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefoi Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - - Representants des groupes d’intérêts (élus ou auto-proclamés) : - - Dev : opi, Bram, ju, ljf, AlexAubin + - Representants des groupes d’intérêts : + - Dev : opi, Bram, ju, ljf, AlexAubin, Moul - Apps : Maniack, tostaki, Moul, ljf - Infra : opi, Bram, ju, Moul - Com From 696ed53c9be96a1743c4530b3cc02be26587d863 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Tue, 29 Nov 2016 23:35:11 +0100 Subject: [PATCH 083/122] Update Apps group --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 28f56212..a28df219 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -174,7 +174,7 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Representants des groupes d’intérêts : - Dev : opi, Bram, ju, ljf, AlexAubin, Moul - - Apps : Maniack, tostaki, Moul, ljf + - Apps : Bram, Ju, Ljf, Maniack C, Moul, Scith, Tostaki - Infra : opi, Bram, ju, Moul - Com - Com : Bram, Moul From 37318455472beca97d1af598e1f7275cb3f9f737 Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Wed, 30 Nov 2016 00:18:11 +0100 Subject: [PATCH 084/122] update image --- organization_schema.jpg | Bin 40237 -> 0 bytes yunohost_project_organization_fr.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 organization_schema.jpg diff --git a/organization_schema.jpg b/organization_schema.jpg deleted file mode 100644 index a90d0b19bbc0ee99189a6a515ebd0d101ad1c4ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40237 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

!$T9NB|K{mp%LHFvJJuXF#lcb)4nsd3GhXK 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 diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 29f7cf5c..a1f94d2b 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -30,7 +30,7 @@ L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre d Schéma d’organisation du projet YunoHost : -![Schéma d’organisation du projet YunoHost](organization_schema.jpg?raw=true "Schéma d’organisation du projet YunoHost") +![Schéma d’organisation du projet YunoHost](organization_schema.png?raw=true "Schéma d’organisation du projet YunoHost") #### Définition et constitution des groupes From 1e74edeaa577b7b9052e82ad9ef4f35adda2d81c Mon Sep 17 00:00:00 2001 From: Theodore Faure Date: Wed, 30 Nov 2016 00:20:44 +0100 Subject: [PATCH 085/122] add image --- organization_schema.png | Bin 0 -> 209242 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 organization_schema.png diff --git a/organization_schema.png b/organization_schema.png new file mode 100644 index 0000000000000000000000000000000000000000..e51b0d77576ba9a02cc483ed54e3636396508517 GIT binary patch literal 209242 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%0AOdUiK*#i^0tKv}h10|!0 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 z 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 literal 0 HcmV?d00001 From 9e3c766c0128253c9f9f60e8ab031ec57ffcead6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 30 Nov 2016 05:56:42 +0000 Subject: [PATCH 086/122] Typography (en) --- dev.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dev.md b/dev.md index f16ac4f6..1d677afc 100644 --- a/dev.md +++ b/dev.md @@ -1,7 +1,7 @@ -## Contributing to the Yunohost core +## Contributing to the YunoHost core -You wish to add a new feature in the Yunohost core, but don't know how to -proceed ? This guide takes you through the various steps of the development and +You wish to add a new feature in the YunoHost core, but don't know how to +proceed? This guide takes you through the various steps of the development and contribution process. If you're looking for stuff to implement or fix, the bug-tracker is @@ -13,7 +13,7 @@ If you're looking for stuff to implement or fix, the bug-tracker is - **Use [ynh-dev](https://github.com/YunoHost/ynh-dev)** (see the README) to setup a development environment - locally in a virtual machine, or on a VPS. - This will setup a working Yunohost instance, using directly the git repositories + This will setup a working YunoHost instance, using directly the git repositories (with symlinks). That way, you will be able to edit files, test your changes in real time, commit stuff and push/pull directly from your development environment. @@ -21,10 +21,10 @@ If you're looking for stuff to implement or fix, the bug-tracker is will want to : - **Python/CLI core** : work in `/vagrant/yunohost/` - **Web administration interface** : work in `/vagrant/yunohost-admin/` - - You can also work on the other projects on which Yunohost is built + - You can also work on the other projects on which YunoHost is built (SSOwat, moulinette) in similar ways -### Working on the Yunohost Python/CLI core +### Working on the YunoHost Python/CLI core - Work in `/vagrant/yunohost/`. @@ -52,7 +52,7 @@ If you're looking for stuff to implement or fix, the bug-tracker is them in the string with `{{some-argument:s}}`. Don't edit other locales files, this will be done using [weblate](https://translate.yunohost.org/) ! -- Yunohost tries to follow the [pep8](http://pep8.org/) coding style. Tools +- YunoHost tries to follow the [pep8](http://pep8.org/) coding style. Tools exist to automatically check conformity. - Name of "private" functions should start with a `_` @@ -63,7 +63,7 @@ If you're looking for stuff to implement or fix, the bug-tracker is force the refresh of the cache with `rm /var/cache/moulinette/actionsmap/yunohost.pkl` -### Working on the Yunohost web administration interface +### Working on the YunoHost web administration interface - Work in `/vagrant/yunohost-admin/src/`. @@ -71,10 +71,10 @@ If you're looking for stuff to implement or fix, the bug-tracker is time you modify sources, it recompiles the code and you can use it by refreshing (Ctrl+F5) your web administration. To stop the command, just do Ctrl+C. -- The web interface uses the API to interact with Yunohost. The API +- The web interface uses the API to interact with YunoHost. The API commands/requests are also defined via the actionsmap. For instance, accessing the page ```https://domain.tld/yunohost/api/users``` corresponds to a `GET - /domains` requests on the Yunohost API. It is mapped to the function + /users` requests on the YunoHost API. It is mapped to the function `user_list()`. Accessing the URL should display the json returned by this function. 'GET' requests are typically meant to ask information to the server. 'POST' requests are meant to ask the server to edit/change some information, @@ -107,7 +107,7 @@ If you're looking for stuff to implement or fix, the bug-tracker is the javascript and/or html (so each time you edit something in `js` or `views`). -### Your feature is ready and you want it to be integrated in Yunohost +### Your feature is ready and you want it to be integrated in YunoHost - Fork the relevant repo on Github, and commit stuff to a new branch. We recommend to name the branch with the following convention : From 9205c7fbbbe1ca63d9b9ae214f3865212e78a3b9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 30 Nov 2016 06:03:20 +0000 Subject: [PATCH 087/122] Typos (fr) --- dev_fr.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/dev_fr.md b/dev_fr.md index 4c91094e..e623d853 100644 --- a/dev_fr.md +++ b/dev_fr.md @@ -1,6 +1,6 @@ -## Contribuer au coeur de Yunohost +## Contribuer au cœur de YunoHost -Vous souhaitez ajouter une nouvelle fonctionnalité au coeur de Yunohost, mais ne +Vous souhaitez ajouter une nouvelle fonctionnalité au cœur de YunoHost, mais ne savez pas comment procéder ? Ce guide parcours les étapes du développement et du processus de contribution. @@ -16,27 +16,27 @@ XMPP, vous devriez pouvoir vous connecter à l'aide du widget en bas de la page. - **Utilisez [ynh-dev](https://github.com/YunoHost/ynh-dev)** (voir le README) pour mettre en place un environnement de développement - en local sur une machine virtuel, ou bien sur un VPS. - Ceci installera une instance fonctionelle de Yunohost, en utilisant - directement les dépôts git à l'aide de liens symboliques. De cette facon, il + Ceci installera une instance fonctionelle de YunoHost, en utilisant + directement les dépôts git à l'aide de liens symboliques. De cette façon, il vous sera possible de modifier les fichiers, de tester les changements en temps réel, et de commiter et push/pull directement depuis cet environnement. - **Implémentez et testez votre fonctionnalité**. Suivant ce sur quoi vous voulez travailler : - - **Coeur Python/ligne de comande** : allez dans `/vagrant/yunohost/` + - **Cœur Python/ligne de comande** : allez dans `/vagrant/yunohost/` - **Interface d'administration web** : allez dans `/vagrant/yunohost-admin/` - Vous pouvez aussi travailler sur les autres projets liés sur lesquels - s'appuie Yunohost (SSOwat, moulinette) de facon similaire. + s'appuie YunoHost (SSOwat, moulinette) de façon similaire. -### Travailler sur le coeur Python / ligne de commande +### Travailler sur le cœur Python / ligne de commande - Allez dans `/vagrant/yunohost/`. - Executez `/vagrant/ynh-dev use-git yunohost`. -- Le fichier actionsmap (`data/actionsmap/yunohost.yml`) défini les différentes - catégories, actions et arguments de la ligne de commande Yunohost. Choisissez - comment vous voulez que les utilisateurs utilise votre fonctionnalité, et +- Le fichier actionsmap (`data/actionsmap/yunohost.yml`) définit les différentes + catégories, actions et arguments de la ligne de commande YunoHost. Choisissez + comment vous voulez que les utilisateurs utilisent votre fonctionnalité, et ajoutez/éditez les catégories, actions et arguments correspondants. Par exemple, dans `yunohost domain add some.domain.tld`, la catégorie est `domain`, l'action est `add` et `some.domain.tld` est un argument. @@ -57,7 +57,7 @@ XMPP, vous devriez pouvoir vous connecter à l'aide du widget en bas de la page. Ne modifiez pas de fichiers de locales autres que en.json, la traduction sera faite avec [weblate](https://translate.yunohost.org/) ! -- Yunohost essaye de suivre le style de code [pep8](http://pep8.org/). Des +- YunoHost essaye de suivre le style de code [pep8](http://pep8.org/). Des outils existent pour vérifier automatiquement la conformité du code. - Mettre un `_` devant les noms des fonctions "privées". @@ -65,34 +65,34 @@ XMPP, vous devriez pouvoir vous connecter à l'aide du widget en bas de la page. ##### N'oubliez pas - (Peut-être plus nécessaire) À chaque fois que vous modifiez l'actionsmap, il - faut forcer le rafraichissement du cache avec : + faut forcer le rafraîchissement du cache avec : `rm /var/cache/moulinette/actionsmap/yunohost.pkl` ### Travailler sur l'interface d'administration web - Allez dans `/vagrant/yunohost-admin/src/`. -- Executez `/vagrant/ynh-dev use-git yunohost-admin`. Ceci lance gulp, de sorte - à ce que à chaque fois que vous modifiez les sources, il recompilera le code +- Exécutez `/vagrant/ynh-dev use-git yunohost-admin`. Ceci lance gulp, de sorte + qu'à chaque fois que vous modifiez les sources, il recompilera le code (js) et vous pourrez voir les changements dans le navigateur web (Ctrl+F5). Pour stopper la commande, faites simplement Ctrl+C. -- L'interface web utilise une API pour communiquer avec Yunohost. Les - commandes/requêtes de l'API sont également définie dans l'actionsmap. Par +- L'interface web utilise une API pour communiquer avec YunoHost. Les + commandes/requêtes de l'API sont également définies dans l'actionsmap. Par exemple, accéder à la page ```https://domain.tld/yunohost/api/users``` - corresponds à une requete `GET /domains` vers l'API yunohost. Cette requete + correspond à une requete `GET /users` vers l'API YunoHost. Cette requête est mappée sur `user_list()`. Accéder à cette URL devrait afficher le json - retourné par cette fonction. Les requetes `GET' sont typiquement destinés à - demander de l'information au serveur, tandis que les requetes `POST` sont + retourné par cette fonction. Les requêtes `GET' sont typiquement destinées à + demander de l'information au serveur, tandis que les requêtes `POST` sont destinées à demander au serveur de modifier/changer des informations ou de réaliser des actions. -- `js/yunohost/controllers` contiens les parties javascript, et défini quelles +- `js/yunohost/controllers` contiens les parties javascript, et définit quelles requêtes faire à l'API pendant le chargement d'une page donnée de l'interface, et comment traîter les données récupérées pour générer la page, en utilisant des templates. -- `views` contiens les templates des pages de l'interface. Dans le template, +- `views` contient les templates des pages de l'interface. Dans le template, les données venant du javascript peuvent êtres utilisées avec la syntaxe `{{some-variable}}`, qui sera remplacée pendant la construction de la page. Il est également possible d'avoir des conditions avec la syntaxe @@ -111,14 +111,14 @@ XMPP, vous devriez pouvoir vous connecter à l'aide du widget en bas de la page. ```service yunohost-api restart``` (Il faudra retaper le mot de passe administrateur dans l'interface web) -- Il faudra peut-être régulièrement forcer le rafraichissement du cache +- Il faudra peut-être régulièrement forcer le rafraîchissement du cache navigateur pour propager correctement le javascript et/ou HTML (à chaque fois que l'on change quelque chose dans `js` ou `views`, donc). -### Votre fonctionnalité est prête et vous souhaitez qu'elle soit intégrée dans Yunohost +### Votre fonctionnalité est prête et vous souhaitez qu'elle soit intégrée dans YunoHost -- Forkez le dépòt correspondant sur Github, et commitez votre changements dans +- Forkez le dépòt correspondant sur Github, et commitez vos changements dans une nouvelle branche, Il est recommandé de nommer la branche avec la convention : - Pour une nouvelle fonctionnalité ou amélioration : `enh-TICKETREDMINE-description-fonctionnalité` From 54587d0c629187af54b11ab9aabbda038418bcc0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 30 Nov 2016 06:04:24 +0000 Subject: [PATCH 088/122] Typos --- sitemap_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sitemap_fr.md b/sitemap_fr.md index 6d81cc79..c9c0e84c 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -103,7 +103,7 @@ * [Usage de trap](packaging_apps_trap_fr) * [Packages d’applications en cours de développement](/apps_in_progress_fr) * [Liste de proposition d’applications](/apps_wishlist_fr) - * [Contribuer au coeur de Yunohost](/dev_fr) + * [Contribuer au cœur de YunoHost](/dev_fr) * [Création de paquets système](/build_system_fr) * [Création de paquets Debian](/build_packages_fr) * [Créer une image pour carte ARM](/build_arm_image_en) From 369e611b4131b4899af401ef3c9ad5a866143fe0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 30 Nov 2016 06:05:10 +0000 Subject: [PATCH 089/122] Typos --- sitemap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sitemap.md b/sitemap.md index 21b98050..95dd85b2 100644 --- a/sitemap.md +++ b/sitemap.md @@ -91,7 +91,7 @@ * [Trap usage](packaging_apps_trap_fr) * [Applications in progress](/apps_in_progress_en) * [Wishlist of applications](/apps_wishlist_en) - * [Contributing to the Yunohost core](/dev) + * [Contributing to the YunoHost core](/dev) * [Creation of system packages](/build_system_en) * [Creation of Debian packages](/build_packages_en) * [Create an ARM board image](/build_arm_image_en) From 0908d9c3ae1e5230cac5d3aabc5dda67249a29d2 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 30 Nov 2016 15:12:03 +0100 Subject: [PATCH 090/122] Update groupes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit J'ai mis des majuscules à tout le monde, sauf opi. Si d'autres veulent leur nom sans majuscules, pas de problème ;) J'hésite à ajouter Théodore dans le groupe Maître du monde, on en a pas vraiment discuté... --- yunohost_project_organization_fr.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 29f7cf5c..63331e41 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -173,13 +173,14 @@ Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefoi Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Representants des groupes d’intérêts : - - Dev : opi, Bram, ju, ljf, AlexAubin, Moul + - Core Dev : AlexAubin, Bram, Ju, Ljf, Moul, opi - Apps : Bram, Ju, Ljf, Maniack C, Moul, Scith, Tostaki - - Infra : opi, Bram, ju, Moul - - Com - - Com : Bram, Moul - - Doc : Moul, theodore + - Infra : Bram, Ju, Maniack C, Moul, opi + - Communication + - Com : Bram, Moul, Ljf, opi + - Doc : Moul, Theodore - Trad : Jean-Baptiste + - Distribution : Heyyounow ### Décisions à venir pour les groupes #### Conseil From 8c90bda49eea78d73ed84c203133776245219c5c Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 30 Nov 2016 15:12:54 +0100 Subject: [PATCH 091/122] [enh] change section name. Develop and add links. --- yunohost_project_organization_fr.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 29f7cf5c..288e0191 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -219,14 +219,12 @@ Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Annuaire ou contact des groupes pour les nouveaux arrivants. Voir peut-être annuaire tout court pour savoir qui fait quoi. https://yunohost.org/#/contribs_fr à compléter. Et à mettre en avant. - Proposition de laisser les membres YunoHost s'auto déterminer -> Comment gérer les accès ? +## Moyens de communication actuels -## Notes -Moyens de communication actuels : - -- IRL -- Réunion Mumble -- [Forum](https://forum.yunohost.org) +- Rencontres à des évènements. +- Réunions hébdomadaires Mumble. +- [Forum](https://forum.yunohost.org). - Listes de diffusion : [contrib](https://list.yunohost.org/cgi-bin/mailman/listinfo/contrib) et [apps](https://list.yunohost.org/cgi-bin/mailman/listinfo/apps) -- [Bugtracker Redmine](https://dev.yunohost.org) -- [Forge git](http://github.com/yunohost/) pour les review de code -- Salon de discussions XMPP +- [Bugtracker Redmine](https://dev.yunohost.org). +- Forge git pour la review de code : [YunoHost](https://github.com/YunoHost) [YunoHost-Apps](https://github.com/YunoHost-Apps). +- [Salons discussions XMPP](https://yunohost.org/#/chat_rooms_fr) From 5ca0205ac780f65148b20c105cd63f5627ceaf95 Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 30 Nov 2016 15:20:48 +0100 Subject: [PATCH 092/122] [mod] Change section name. Remove useless text. --- yunohost_project_organization_fr.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 288e0191..86d39e9a 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -167,8 +167,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de ##### 6) Application Alors un membre du groupe peut annoncer la décision comme effective (et procéder aux actions nécessaires comme releaser, merger, annonce, autre ...). Il est important que s'il y a besoin de certaines actions, des personnes se soient engagées à les faire, une décision sans désigner est moyennement utile -## Plan de migration -Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefois vu que ce n'est qu'un brouillon, chaque personne est invitée à publier des propositions de modifications/améliorations/précisions et à les soumettre. Les décisions pourront s'appuyer sur le [système de vote via Discourse](https://blog.discourse.org/2015/08/improved-polls-in-discourse). +## Composition des groupes Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. From 6ed2bbabd080f7b7d8696a649a7fed1a9932f431 Mon Sep 17 00:00:00 2001 From: Moul Date: Tue, 29 Nov 2016 08:39:15 +0100 Subject: [PATCH 093/122] =?UTF-8?q?[enh]=20wishlist:=20add=20ferment:?= =?UTF-8?q?=C2=A0P2P=20audio=20streaming=20app.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps_wishlist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps_wishlist.md b/apps_wishlist.md index 5346c9aa..8f2c94d8 100644 --- a/apps_wishlist.md +++ b/apps_wishlist.md @@ -38,6 +38,7 @@ The following list is a compiled wishlist of applications that would be nice-to- - [ERPnext](https://erpnext.com/download) - [Ethersheet](https://ethersheet.org) - [Fail2web](https://github.com/Sean-Der/fail2web) +- [Ferment](https://github.com/mmckegg/ferment) - [FileTea](https://filetea.me) - [Fossil](http://www.fossil-scm.org) - [GetSimple CMS](http://get-simple.info) From 4b45ae2f25e26c81d46aa8afc9768085ecf8388c Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Wed, 30 Nov 2016 18:56:06 +0100 Subject: [PATCH 094/122] [fix] Change Ljf into ljf --- yunohost_project_organization_fr.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 63331e41..46400e2a 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -173,11 +173,11 @@ Il est proposé d'appliquer dés à présent ce processus décisionnel, toutefoi Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - Representants des groupes d’intérêts : - - Core Dev : AlexAubin, Bram, Ju, Ljf, Moul, opi - - Apps : Bram, Ju, Ljf, Maniack C, Moul, Scith, Tostaki + - Core Dev : AlexAubin, Bram, Ju, ljf, Moul, opi + - Apps : Bram, Ju, ljf, Maniack C, Moul, Scith, Tostaki - Infra : Bram, Ju, Maniack C, Moul, opi - Communication - - Com : Bram, Moul, Ljf, opi + - Com : Bram, Moul, ljf, opi - Doc : Moul, Theodore - Trad : Jean-Baptiste - Distribution : Heyyounow From d0e85171d9ec6989cd49c4fcc898db3e3c99fac1 Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 30 Nov 2016 20:19:33 +0100 Subject: [PATCH 095/122] [mod] groups composition: same alignment for all groups. --- yunohost_project_organization_fr.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 28e2f944..749ec4a5 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -169,17 +169,15 @@ Alors un membre du groupe peut annoncer la décision comme effective (et procéd ## Composition des groupes -Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. - - - Representants des groupes d’intérêts : - - Core Dev : AlexAubin, Bram, Ju, ljf, Moul, opi - - Apps : Bram, Ju, ljf, Maniack C, Moul, Scith, Tostaki - - Infra : Bram, Ju, Maniack C, Moul, opi - - Communication - - Com : Bram, Moul, ljf, opi - - Doc : Moul, Theodore - - Trad : Jean-Baptiste - - Distribution : Heyyounow +- Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. +- Core Dev : AlexAubin, Bram, Ju, ljf, Moul, opi +- Apps : Bram, Ju, ljf, Maniack C, Moul, Scith, Tostaki +- Infra : Bram, Ju, Maniack C, Moul, opi +- Communication + - Com : Bram, Moul, ljf, opi + - Doc : Moul, Theodore + - Trad : Jean-Baptiste +- Distribution : Heyyounow ### Décisions à venir pour les groupes #### Conseil From ce63efe32bd8dbe67a5460284940d9121fb092f5 Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 30 Nov 2016 21:59:27 +0100 Subject: [PATCH 096/122] [enh] add symbolic link toward page of the subtree. - add new page link on sitemaps. --- project_organization_fr.md | 1 + sitemap.md | 1 + sitemap_fr.md | 1 + 3 files changed, 3 insertions(+) create mode 120000 project_organization_fr.md diff --git a/project_organization_fr.md b/project_organization_fr.md new file mode 120000 index 00000000..87648596 --- /dev/null +++ b/project_organization_fr.md @@ -0,0 +1 @@ +orga/yunohost_project_organization_fr.md \ No newline at end of file diff --git a/sitemap.md b/sitemap.md index 8e85c289..2e278c9d 100644 --- a/sitemap.md +++ b/sitemap.md @@ -107,6 +107,7 @@ * [Roadmap](/roadmap) * [Frequently asked questions](/faq_en) * [Contributors](contribs) + - [Project organization](project_organization_fr) * [Support](/support_en) * [Art Works](artworks_en) * [Blog](https://forum.yunohost.org/c/announcement) diff --git a/sitemap_fr.md b/sitemap_fr.md index d5eb2a29..70cd42bb 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -119,6 +119,7 @@ * [Journal des modifications v.2.2](/changelog_2_2_en) * [Feuille de route](/roadmap_en) * [Foire aux questions](/faq_fr) + - [Organisation du projet](project_organization_fr) * [Contributeurs](contribs_fr) * [Entraide - support](/support_fr) * [Blog](https://forum.yunohost.org/c/announcement) From 48567e2b3ca01cacf4b87973b51eaecda97fbca8 Mon Sep 17 00:00:00 2001 From: Moul Date: Thu, 24 Nov 2016 14:08:10 +0100 Subject: [PATCH 097/122] [enh] add explaination how XMPP chat rooms of YunoHost project. - french and english pages. - add links on sitemaps and buttons on homepages. --- chat_rooms.md | 26 ++++++++++++++++++++++++++ chat_rooms_fr.md | 26 ++++++++++++++++++++++++++ index.md | 1 + index_fr.md | 1 + sitemap.md | 1 + sitemap_fr.md | 1 + 6 files changed, 56 insertions(+) create mode 100644 chat_rooms.md create mode 100644 chat_rooms_fr.md diff --git a/chat_rooms.md b/chat_rooms.md new file mode 100644 index 00000000..16ff6827 --- /dev/null +++ b/chat_rooms.md @@ -0,0 +1,26 @@ +## Chat rooms + +Amoung other communication tools, YunoHost project use chat rooms to communicate. + +This instant messaging chat rooms, which uses [XMPP protocol](XMPP_en), are hosted on our XMPP server. + +You could join this chat rooms with an [XMPP client](https://en.wikipedia.org/wiki/Comparison_of_instant_messaging_clients#XMPP-related_features). + +### Chat rooms +#### Mutual aid +[Mutual aid](support_en) chat room is here to allow YunoHost's users to help each other. + +- A [web client](https://chat.yunohost.org) is here to easily join _mutual aid_ chat room. +- **[support@conference.yunohost.org](xmpp:support@conference.yunohost.org?join)** + +#### Development +YunoHost core development chat room. +- **[dev@conference.yunohost.org](xmpp:dev@conference.yunohost.org?join)** + +#### Applications +Application packaging development chat room. It allow packagers to help each other. +It also allow to discuss packaging evolution, continuous integration tools. +- **[apps@conference.yunohost.org](xmpp:apps@conference.yunohost.org?join)** + +### Discussions logs +Discussions are logged during four days. diff --git a/chat_rooms_fr.md b/chat_rooms_fr.md new file mode 100644 index 00000000..b3bc462d --- /dev/null +++ b/chat_rooms_fr.md @@ -0,0 +1,26 @@ +## Salons de discussions + +Parmi d’autres outils de communications, le projet YunoHost se sert de salons de discussions pour communiquer. + +Ces salons de messagerie instantanées, qui utilisent le [protocole XMPP](XMPP_fr), sont hébergés sur notre serveur XMPP. + +Vous pouvez rejoindre ces salons avec un [client XMPP](https://fr.wikipedia.org/wiki/Liste_de_clients_XMPP). + +### Salons +#### Entraide +Salon d’[entraide](support_fr) est là pour permettre aux utilisateurs de YunoHost de s’entraider. + +- Un [client web](https://chat.yunohost.org) est à votre disposition pour rejoindre facilement le salon d’entraide. +- **[support@conference.yunohost.org](xmpp:support@conference.yunohost.org?join)** + +#### Développement +Salon de développement du cœur de YunoHost. +- **[dev@conference.yunohost.org](xmpp:dev@conference.yunohost.org?join)** + +#### Applications +Salon de développement du packaging d’application. Il permet aux packageurs de s’entraider. +Il sert également à discuter de l’évolution du packaging, des outils d’intégration continue sur les applications. +- **[apps@conference.yunohost.org](xmpp:apps@conference.yunohost.org?join)** + +### Historique des discussions +L’historique des discussions sont enregistrées pendant quatre jours. diff --git a/index.md b/index.md index c8b319a9..d6db518a 100644 --- a/index.md +++ b/index.md @@ -95,6 +95,7 @@ Documentation Get involved Forum + Chat rooms Latest news Support diff --git a/index_fr.md b/index_fr.md index 06c9a35d..9933ac45 100644 --- a/index_fr.md +++ b/index_fr.md @@ -94,6 +94,7 @@ Documentation Comment contribuer Forum + Salons de discussions Dernières nouvelles Support diff --git a/sitemap.md b/sitemap.md index a5d94207..efbdfcfe 100644 --- a/sitemap.md +++ b/sitemap.md @@ -110,5 +110,6 @@ * [Art Works](artworks_en) * [Blog](https://forum.yunohost.org/c/announcement) - [Forum](https://forum.yunohost.org) + - [Chat rooms](chat_rooms_en) * [Communication](communication_en) * [Help](/help) diff --git a/sitemap_fr.md b/sitemap_fr.md index b61caf7a..4ed42ce6 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -122,6 +122,7 @@ * [Entraide - support](/support_fr) * [Blog](https://forum.yunohost.org/c/announcement) - [Forum](https://forum.yunohost.org) + - [Salons de discussions](chat_rooms_fr) * [Conférences](/conf_fr) * [Communication extérieure](communication_fr) * [Travail artistique](artworks_fr) From ff686ae04a3dfbd47c7457f4219d02e57a63d546 Mon Sep 17 00:00:00 2001 From: Moul Date: Wed, 30 Nov 2016 15:49:26 +0100 Subject: [PATCH 098/122] [enh] Add the fact that dev chat room is the main one for contributions. - Dev chat room is not for support discussions. --- chat_rooms.md | 6 ++---- chat_rooms_fr.md | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/chat_rooms.md b/chat_rooms.md index 16ff6827..bae801ed 100644 --- a/chat_rooms.md +++ b/chat_rooms.md @@ -14,13 +14,11 @@ You could join this chat rooms with an [XMPP client](https://en.wikipedia.org/wi - **[support@conference.yunohost.org](xmpp:support@conference.yunohost.org?join)** #### Development -YunoHost core development chat room. +YunoHost core development chat room. Currently, the main chat room for contributions on YunoHost project. +For help, thanks to do it on `support` chat room. - **[dev@conference.yunohost.org](xmpp:dev@conference.yunohost.org?join)** #### Applications Application packaging development chat room. It allow packagers to help each other. It also allow to discuss packaging evolution, continuous integration tools. - **[apps@conference.yunohost.org](xmpp:apps@conference.yunohost.org?join)** - -### Discussions logs -Discussions are logged during four days. diff --git a/chat_rooms_fr.md b/chat_rooms_fr.md index b3bc462d..b7eaac70 100644 --- a/chat_rooms_fr.md +++ b/chat_rooms_fr.md @@ -14,13 +14,11 @@ Salon d’[entraide](support_fr) est là pour permettre aux utilisateurs de Yuno - **[support@conference.yunohost.org](xmpp:support@conference.yunohost.org?join)** #### Développement -Salon de développement du cœur de YunoHost. +Salon de développement du cœur de YunoHost. Actuellement utilisé comme salon principal pour les contributions autour du projet. +Pour de l’aide, merci de le faire sur le salon d’entraide. - **[dev@conference.yunohost.org](xmpp:dev@conference.yunohost.org?join)** #### Applications Salon de développement du packaging d’application. Il permet aux packageurs de s’entraider. Il sert également à discuter de l’évolution du packaging, des outils d’intégration continue sur les applications. - **[apps@conference.yunohost.org](xmpp:apps@conference.yunohost.org?join)** - -### Historique des discussions -L’historique des discussions sont enregistrées pendant quatre jours. From e45255f0c09f559e77fe0620498293a245d2023f Mon Sep 17 00:00:00 2001 From: opi Date: Thu, 1 Dec 2016 21:58:36 +0100 Subject: [PATCH 099/122] [enh] Quick french doc about creating a new release with GitHub --- build_system_fr.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/build_system_fr.md b/build_system_fr.md index fd3fa2ab..c1f34536 100644 --- a/build_system_fr.md +++ b/build_system_fr.md @@ -122,6 +122,24 @@ Il peut arriver, de façon exceptionnelle, qu’on ait besoin de faire un hotfix **TODO** dev un helper 'git yunohotfix...' qui commit dans stable et cherry-pick tout de suite dans daily ? ou l’inverse ? +#### Publier une release testing ou stable + +Pour l'instant, on passe par une release via GitHub pour déclencher le build du paquet. + +Aller sur https://github.com/YunoHost/{moulinette, yunohost, yunohost-admin, ssowat}/releases/new + +1/ Choisir la branche cible en premier (testing ou stable). +Ex: "target: Testing" + +2/ Choisir le tag concerné, généralement le dernier +Ex: "debian/2.4.1" + +3/ Release title: "v2.4.1" ("v" + le numéro de version) + +4/ Commentaire +Reprendre le changelog depuis `debian/changelog`. Remercier les contributeurs/traducteurs +( Pour voir le dernier commit : `git show HEAD` ) + #### Paquets non YunoHost Pour les paquets « non-YunoHost » (par exemple `rspamd`) le paquet ne passe pas par le composant `unstable`, mais uniquement `testing` et `stable` une fois les tests effectués sur ce paquet. From b992c796f41dae5e1a7dd122a15952eefa8222c6 Mon Sep 17 00:00:00 2001 From: Moul Date: Sun, 4 Dec 2016 16:55:04 +0100 Subject: [PATCH 100/122] [mod] move image on folder to be displayed on website documentation. --- .../organization_schema.png | Bin yunohost_project_organization_fr.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename organization_schema.png => images/organization_schema.png (100%) diff --git a/organization_schema.png b/images/organization_schema.png similarity index 100% rename from organization_schema.png rename to images/organization_schema.png diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index a0654930..673d5381 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -30,7 +30,7 @@ L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre d Schéma d’organisation du projet YunoHost : -![Schéma d’organisation du projet YunoHost](organization_schema.png?raw=true "Schéma d’organisation du projet YunoHost") +![Schéma d’organisation du projet YunoHost](images/organization_schema.png?raw=true "Schéma d’organisation du projet YunoHost") #### Définition et constitution des groupes From b25f1100e03e8a19d98765dfcb02ae65f175d41d Mon Sep 17 00:00:00 2001 From: Moul Date: Sun, 4 Dec 2016 18:18:37 +0100 Subject: [PATCH 101/122] Revert "[mod] move image on folder to be displayed on website documentation." This reverts commit b992c796f41dae5e1a7dd122a15952eefa8222c6. --- ...ganization_schema.png => organization_schema.png | Bin yunohost_project_organization_fr.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename images/organization_schema.png => organization_schema.png (100%) diff --git a/images/organization_schema.png b/organization_schema.png similarity index 100% rename from images/organization_schema.png rename to organization_schema.png diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 673d5381..a0654930 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -30,7 +30,7 @@ L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre d Schéma d’organisation du projet YunoHost : -![Schéma d’organisation du projet YunoHost](images/organization_schema.png?raw=true "Schéma d’organisation du projet YunoHost") +![Schéma d’organisation du projet YunoHost](organization_schema.png?raw=true "Schéma d’organisation du projet YunoHost") #### Définition et constitution des groupes From 1f7954de3e10dda72fa9c7057f814c407d58452c Mon Sep 17 00:00:00 2001 From: Moul Date: Sun, 4 Dec 2016 18:22:17 +0100 Subject: [PATCH 102/122] [mod] display image from raw.git. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index a0654930..95883497 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -30,7 +30,7 @@ L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre d Schéma d’organisation du projet YunoHost : -![Schéma d’organisation du projet YunoHost](organization_schema.png?raw=true "Schéma d’organisation du projet YunoHost") +![Schéma d’organisation du projet YunoHost](https://raw.githubusercontent.com/YunoHost/yunohost-project-organization/master/organization_schema.png "Schéma d’organisation du projet YunoHost") #### Définition et constitution des groupes From 3cc79ceedd0365caf67465416aa331c4e21b51b6 Mon Sep 17 00:00:00 2001 From: Moul Date: Sun, 4 Dec 2016 16:31:57 +0100 Subject: [PATCH 103/122] [mod] readme: update Simone link, layout --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 97b0670f..207de741 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # YunoHost Documentation -* [Web Site](https://yunohost.org/#/) -* Based on [Simone](https://github.com/Kloadut/Simone) +* [Web Site](https://yunohost.org) +* Based on [Simone](https://github.com/YunoHost/Simone) -Please report issues here (no registration needed): -https://dev.yunohost.org/projects/yunohost/issues +Please report [issues on YunoHost bugtracker](https://dev.yunohost.org/projects/yunohost/issues) (no registration needed). From 023bbfb16c2c2ff4a94edf57270e1c0a46e00a8c Mon Sep 17 00:00:00 2001 From: Moul Date: Sun, 4 Dec 2016 18:47:12 +0100 Subject: [PATCH 104/122] [mod] use img balise to precise size for a webpage. --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 95883497..5bda209f 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -30,7 +30,7 @@ L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre d Schéma d’organisation du projet YunoHost : -![Schéma d’organisation du projet YunoHost](https://raw.githubusercontent.com/YunoHost/yunohost-project-organization/master/organization_schema.png "Schéma d’organisation du projet YunoHost") + #### Définition et constitution des groupes From 79df7c18dc6cd9c0f89455b10637f80bc6dab8f9 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 7 Dec 2016 10:54:03 +0100 Subject: [PATCH 105/122] Regen contribs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A discuter et améliorer. J'ai repensé à ce que disais Bram hier à propos de Jean-Baptiste, alors un coup de pied au cul et on démarre cette page de contrib. Chaque contrib mérite sa place ici, on leur doit au moins ça. Des liens hypertextes sur les noms me semble pas inintéressant, pour bien cerner qui est cité. Mais pointant où? Git? Forum? Site perso? --- contribs_fr.md | 70 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/contribs_fr.md b/contribs_fr.md index a5b78c61..7a08281e 100644 --- a/contribs_fr.md +++ b/contribs_fr.md @@ -2,21 +2,65 @@ Liste non exhaustive des principaux contributeurs : -* kload +#### Fondateurs +* kload * beudbeud +#### Conseil + +* Bram +* ju +* ljf +* Maniack +* Moul +* opi +* Théodore + +#### Groupe Core Dev + +* AlexAubin +* Bram +* Ju +* ljf +* Moul +* opi + +#### Groupe Apps + +* Bram +* Ju +* ljf +* Maniack C +* Moul +* Scith +* Tostaki + +#### Groupe Apps + +* Bram +* Ju +* Maniack C +* Moul +* opi + +#### Groupe Communication + +* Bram +* Moul +* ljf +* opi +* Théodore +* Jean-Baptiste + +#### Groupe Distribution + +* Heyyounow + +* Jerome + + * jerome : développeur de la [Moulinette](moulinette_fr) - -* opi : développeur de l’[interface d’admininstation web](admin_fr) - -* ju : applications - -* Moul : - * Documentation - * Cubieboard - * moul[at]moul.re - * courgette : design - -* titoko \ No newline at end of file +* titoko +* Genma From 1a4be99e0a0eec361d4d7ce2efd6f2900090a8d0 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 7 Dec 2016 11:02:40 +0100 Subject: [PATCH 106/122] Groupe Apps en double --- contribs_fr.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/contribs_fr.md b/contribs_fr.md index 7a08281e..74afc51c 100644 --- a/contribs_fr.md +++ b/contribs_fr.md @@ -36,14 +36,6 @@ Liste non exhaustive des principaux contributeurs : * Scith * Tostaki -#### Groupe Apps - -* Bram -* Ju -* Maniack C -* Moul -* opi - #### Groupe Communication * Bram From d508c7d571139742e84650806927583a1909ab0a Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 7 Dec 2016 13:19:00 +0100 Subject: [PATCH 107/122] Les bases du packaging d'app --- start_packaging_apps_fr.md | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 start_packaging_apps_fr.md diff --git a/start_packaging_apps_fr.md b/start_packaging_apps_fr.md new file mode 100644 index 00000000..0f46b406 --- /dev/null +++ b/start_packaging_apps_fr.md @@ -0,0 +1,53 @@ +Petite introduction au packaging d'application, pour comprendre de quoi nous parlons et comment ça marche. +Cette documentation s'adresse avant tout aux packageurs débutants qui ne sont pas à l'aise avec les concepts de shell, parsing et administration système de manière générale. + +Nous verrons ici ce qu'est un package d'application Yunohost, comment cela fonctionne, comment faire pour écrire un package et comment se lancer dans l'aventure sans être tout seul. + +### De quoi on parle en fait ? + +Avant de démarrer, la bonne question c'est "Qu'est-ce qu'un package d'application !?" + +Pour répondre à cette question, il faut revenir à ce qu'est Yunohost, c'est un système d’exploitation serveur visant à simplifier l’auto-hébergement de services Internet. Et pour faire ça, Yunohost met à disposition, entre autre, une interface d'administration permettant d'installer des applications en quelques clics. +Or si vous avez déjà installé une application web à la main, vous savez qu'en réalité c'est bien plus compliqué que quelques clics sur une jolie interface. + +C'est là que le package d'application entre en jeu, c'est un ensemble de scripts qui automatise l'installation d'une application web et la préconfigure pour que l'utilisateur final n'ai besoin que de quelques clics pour l'installer facilement. + +### Mais alors, comment ça marche ? + +Du point de vue de l'utilisateur, c'est très simple, on choisit une application, on répond à quelques questions, ça mouline et c'est prêt. + +Mais il se passe bien plus de choses derrière. +Tout d'abord, lorsque l'application est sélectionnée, Yunohost va aller chercher son package sur Github, par exemple l'application [Custom Webapp](https://github.com/YunoHost-Apps/my_webapp_ynh). +Ensuite, Yunohost lit le fichier manifest.json pour connaître les questions à poser à l'utilisateur. + +Mais ces questions anodines sont très importantes, on retrouvera souvent le domaine sur lequel installer l'application, l'adresse à laquelle elle sera accessible, l'utilisateur qui en sera l'administrateur et la langue par défaut de l'application. + +Ce sont là des éléments essentiels pour configurer correctement notre application web lors de son installation. Pour ce faire, Yunohost va récupérer les réponses données par l'utilisateur et les envoyer au script install qui se trouve dans le dossier scripts du package. + +Le script install va se charger d'installer l'application, en prenant en compte les réponses données par l'utilisateur. Ce script va simplement faire ce que vous auriez fait si vous aviez installé l'application à la main. + +Si par la suite l'utilisateur souhaite supprimer l'application, Yunohost utilisera le script remove du dossier script, qui se chargera à la place de l'utilisateur de supprimer l'application, ses dossiers et tout ses fichiers de configuration. + +### Qu'il y a-t-il dans ces scripts pour que tout soit si simple pour l'utilisateur ? + +Les scripts d'un package d'application sont simplement des commandes bash les unes à la suite des autres. + +#### ... Et c'est quoi une commande bash ? + +Une commande [bash](https://fr.wikipedia.org/wiki/Bourne-Again_shell) c'est une ligne de texte qui sera interprétée et produira un résultat. C'est ce qu'on a l'habitude d'appeler la ligne de commande. +Or puisque votre serveur, sur lequel est installé Yunohost, ne dispose pas d'une interface graphique, vous n'avez que la ligne de commande de disponible. Vous l'atteignez en général après vous être connecté avec [ssh](/ssh_fr). + +Les scripts d'un package ne sont donc qu'une succession de commandes bash, comme si vous les aviez tapées directement dans la console ssh pour installer l'application. + +Pour savoir quoi écrire dans un script bash, je vous conseille de commencer par la lecture d'un [tuto simple](https://debian-facile.org/doc:programmation:shells:debuter-avec-les-scripts-shell-bash). Et si vous avez vraiment envie de lire, il y a aussi un [tuto plus complet](http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/index.html) + +### Ok, je crois que j'ai compris ! Par où on commence? + +Avant d'envisager de faire un package d'application, il faut réussir à installer correctement la dites application. Car le script ne fera que ce que vous lui direz de faire. + +Ensuite, il faut aller lire (et oui encore) la documentation sur le packaging, mais la vrai cette fois, [celle qui emploie des mots bizarres](/packaging_apps_fr). +Mais maintenant vous devriez les comprendre tout ces mots étranges. + +Mais heureusement, vous n'êtes pas seul pour affronter cette épreuve titanesque, il y a d'autres packageurs que vous pouvez venir rencontrer sur le [forum](https://forum.yunohost.org/c/apps-packaging) et sur le [salon de discussion](xmpp:apps@conference.yunohost.org?join). +N'hésitez pas à venir poser des questions sur ce que vous ne comprenez pas, il y aura toujours quelqu'un pour vous répondre. +Et vous constaterez bien vite que ce n'est pas si difficile de packager une application. From d613c25e9d1e6704537599cc2b0c3b7a6d7d3e36 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 7 Dec 2016 13:26:25 +0100 Subject: [PATCH 108/122] Update packaging_apps_fr.md --- packaging_apps_fr.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packaging_apps_fr.md b/packaging_apps_fr.md index bbfad997..186737d2 100644 --- a/packaging_apps_fr.md +++ b/packaging_apps_fr.md @@ -8,6 +8,8 @@ Pour packager une application, voici les prérequis : * Maîtriser un minimum `git`, le Shell et d’autres notions de programmation ; * Une [machine virtuelle ou sur un serveur distant](/install_fr) ou un [environnement de développement](https://github.com/yunohost/ynh-dev) pour packager et tester son paquet. +Si vous ne comprenez pas ces prérequis, ou si vous ne savez pas comment écrire du code, consulter d'abord l'[introduction au packaging](/start_packaging_apps_fr.md). + ### Contenu Un paquet YunoHost est composé : From a84de6391caa015d8880389dbb497524e6b33128 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 7 Dec 2016 13:29:33 +0100 Subject: [PATCH 109/122] Update sitemap_fr.md --- sitemap_fr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sitemap_fr.md b/sitemap_fr.md index 4693043f..ca2f6e56 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -95,6 +95,7 @@ * [Présentation du fonctionnement de YunoHost](/package_list_fr) * Applications : * [Packager des applications](/packaging_apps_fr) + * [Introduction](start_packaging_apps_fr.md) * [Manifeste](packaging_apps_manifest_fr) * [Scripts](packaging_apps_scripts_fr) * [Gestion des arguments](packaging_apps_arguments_management_fr) From 803fc6d5209846a6734d1521253c26b4636f22cc Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Wed, 7 Dec 2016 14:10:41 +0100 Subject: [PATCH 110/122] [enh] Add recap about number of point of view --- yunohost_project_organization_fr.md | 38 ++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 5bda209f..5a2904e8 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -148,7 +148,7 @@ Tout le monde peut changer de positions à n'importe quel moment, mais il est de - Durée initiale: 1 semaine. - Durée minimale: 3 jours. - Décalage, si nécessaire: 3 jours. -- Avis nécessaires: 3 dont au moins 2 membres du groupe (celui qui a initié cette prise de décision peux donner son avis). 4, dont 3 membres du groupe pour anticiper. +- Avis nécessaires: 2 membres du groupe (celui qui a initié cette prise de décision peux donner son avis). 3, dont 2 membres du groupe pour anticiper. - Validation par vote (le cas échéant): 66% de votes positifs. ###### Décision Standard/Moyenne: @@ -179,6 +179,42 @@ Alors un membre du groupe peut annoncer la décision comme effective (et procéd - Trad : Jean-Baptiste - Distribution : Heyyounow +## Tableau récapitualtif du nombre d'avis nécéssaire pour la prise de décision +_Les valeurs sont arrondies (exemple: 5,4 => 5 et 5,5 => 6)._ +| | **Mineure** | **Standard** | **Majeure** | +|----------------------|---------|----------|---------| +| **Conseil** | +| Clôture classique | 2 | 4 | 5 | +| Clôture anticipée | 3* | 5 | +| Clôture par vote | 5 | 5 | 6 | +| **Core Dev** | +| Clôture classique | 2 | 3 | 5 | +| Clôture anticipée | 3* | 4 | +| Clôture par vote | 4 | 5 | 5 | +| **Apps** | +| Clôture classique | 2 | 4 | 5 | +| Clôture anticipée | 3* | 5 | +| Clôture par vote | 5 | 5 | 6 | +| **Infra** | +| Clôture classique | 2 | 3 | 4 | +| Clôture anticipée | 3* | 3 | +| Clôture par vote | 3 | 4 | 5 | +| **Communication -> Com** | +| Clôture classique | 2 | 2 | 3 | +| Clôture anticipée | 3* | 3 | +| Clôture par vote | 3 | 3 | 4 | +| **Communication -> Doc** | +| Clôture anticipée | 2* | +| **Distribution** | +| Clôture classique | 1 | +| Clôture anticipée | 1 | +| Clôture par vote | 1 | + +\* dont 1 avis qui peut être externe au groupe +Pour la traduction, le processus reste à adapter. +Pour la doc, le nombre d'avis pour la cloture anticipée d'une décision mineure est pour le moment réduit (vu qu'il n'y a que 2 personnes dans le groupe). Les autres types de décisions sont prises par le conseil. +Pour le groupe distribution, étant donné qu'il n'y a pour l'instant que Heyyounow, je propose que le Conseil soit sollicité pour les décisions Standard ou Majeure. + ### Décisions à venir pour les groupes #### Conseil - Faut-il élire les membres du Conseil plutôt que de les coopter ? Risque de se transformer en "campagne politique"! From 506e51bff864bfb0b654f4777dc6c068f453119b Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Wed, 7 Dec 2016 14:12:14 +0100 Subject: [PATCH 111/122] [fix] Mardown issue --- yunohost_project_organization_fr.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 5a2904e8..6dcd2d5d 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -180,7 +180,9 @@ Alors un membre du groupe peut annoncer la décision comme effective (et procéd - Distribution : Heyyounow ## Tableau récapitualtif du nombre d'avis nécéssaire pour la prise de décision + _Les valeurs sont arrondies (exemple: 5,4 => 5 et 5,5 => 6)._ + | | **Mineure** | **Standard** | **Majeure** | |----------------------|---------|----------|---------| | **Conseil** | @@ -211,8 +213,11 @@ _Les valeurs sont arrondies (exemple: 5,4 => 5 et 5,5 => 6)._ | Clôture par vote | 1 | \* dont 1 avis qui peut être externe au groupe + Pour la traduction, le processus reste à adapter. + Pour la doc, le nombre d'avis pour la cloture anticipée d'une décision mineure est pour le moment réduit (vu qu'il n'y a que 2 personnes dans le groupe). Les autres types de décisions sont prises par le conseil. + Pour le groupe distribution, étant donné qu'il n'y a pour l'instant que Heyyounow, je propose que le Conseil soit sollicité pour les décisions Standard ou Majeure. ### Décisions à venir pour les groupes From 0147e4277be8cc1eb6272bbac2cc6cbe8379d019 Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Wed, 7 Dec 2016 14:13:54 +0100 Subject: [PATCH 112/122] [fix] Sentences --- yunohost_project_organization_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 6dcd2d5d..52a86571 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -218,7 +218,7 @@ Pour la traduction, le processus reste à adapter. Pour la doc, le nombre d'avis pour la cloture anticipée d'une décision mineure est pour le moment réduit (vu qu'il n'y a que 2 personnes dans le groupe). Les autres types de décisions sont prises par le conseil. -Pour le groupe distribution, étant donné qu'il n'y a pour l'instant que Heyyounow, je propose que le Conseil soit sollicité pour les décisions Standard ou Majeure. +Pour le groupe distribution, étant donné qu'il n'y a pour l'instant que Heyyounow, le Conseil sera sollicité pour les décisions Standard ou Majeure. ### Décisions à venir pour les groupes #### Conseil From 57a612dabe87e4c2a2d84e037eaff81c4520e97d Mon Sep 17 00:00:00 2001 From: Zamentur aka ljf Date: Wed, 7 Dec 2016 14:27:13 +0100 Subject: [PATCH 113/122] [enh] Adapt Doc and Distribution number of pov --- yunohost_project_organization_fr.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/yunohost_project_organization_fr.md b/yunohost_project_organization_fr.md index 52a86571..35aa1885 100644 --- a/yunohost_project_organization_fr.md +++ b/yunohost_project_organization_fr.md @@ -206,11 +206,13 @@ _Les valeurs sont arrondies (exemple: 5,4 => 5 et 5,5 => 6)._ | Clôture anticipée | 3* | 3 | | Clôture par vote | 3 | 3 | 4 | | **Communication -> Doc** | -| Clôture anticipée | 2* | +| Clôture classique | 1 | 1 | Conseil | +| Clôture anticipée | 2* | 2* | +| Clôture par vote | Conseil | Conseil | Conseil | | **Distribution** | -| Clôture classique | 1 | -| Clôture anticipée | 1 | -| Clôture par vote | 1 | +| Clôture classique | 1 | Conseil | Conseil | +| Clôture anticipée | 1 | Conseil | +| Clôture par vote | 1 | Conseil | Conseil | \* dont 1 avis qui peut être externe au groupe From 3b24f005ffc5b0735929e03cfb159dca419145ff Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 7 Dec 2016 16:19:34 +0100 Subject: [PATCH 114/122] Typo --- dev_fr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev_fr.md b/dev_fr.md index e623d853..1acd96da 100644 --- a/dev_fr.md +++ b/dev_fr.md @@ -82,8 +82,8 @@ XMPP, vous devriez pouvoir vous connecter à l'aide du widget en bas de la page. exemple, accéder à la page ```https://domain.tld/yunohost/api/users``` correspond à une requete `GET /users` vers l'API YunoHost. Cette requête est mappée sur `user_list()`. Accéder à cette URL devrait afficher le json - retourné par cette fonction. Les requêtes `GET' sont typiquement destinées à - demander de l'information au serveur, tandis que les requêtes `POST` sont + retourné par cette fonction. Les requêtes 'GET' sont typiquement destinées à + demander de l'information au serveur, tandis que les requêtes 'POST' sont destinées à demander au serveur de modifier/changer des informations ou de réaliser des actions. From 8eaea6e8e09cbe04545e25fdbdaa50c965380089 Mon Sep 17 00:00:00 2001 From: Moul Date: Sat, 10 Dec 2016 12:13:17 +0100 Subject: [PATCH 115/122] [mod] split ditribution group from other contribs. --- contribs_fr.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contribs_fr.md b/contribs_fr.md index 74afc51c..4dcc6df2 100644 --- a/contribs_fr.md +++ b/contribs_fr.md @@ -46,12 +46,9 @@ Liste non exhaustive des principaux contributeurs : * Jean-Baptiste #### Groupe Distribution - * Heyyounow -* Jerome - - +#### Autres contributeurs * jerome : développeur de la [Moulinette](moulinette_fr) * courgette : design * titoko From 477b60725f8e4f24d731a4520c03998659af439d Mon Sep 17 00:00:00 2001 From: Moul Date: Sat, 10 Dec 2016 12:21:07 +0100 Subject: [PATCH 116/122] [mod] use same file name beginning as convention. --- packaging_apps_fr.md | 2 +- start_packaging_apps_fr.md => packaging_apps_start_fr.md | 0 sitemap_fr.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename start_packaging_apps_fr.md => packaging_apps_start_fr.md (100%) diff --git a/packaging_apps_fr.md b/packaging_apps_fr.md index 186737d2..9dc64fe6 100644 --- a/packaging_apps_fr.md +++ b/packaging_apps_fr.md @@ -8,7 +8,7 @@ Pour packager une application, voici les prérequis : * Maîtriser un minimum `git`, le Shell et d’autres notions de programmation ; * Une [machine virtuelle ou sur un serveur distant](/install_fr) ou un [environnement de développement](https://github.com/yunohost/ynh-dev) pour packager et tester son paquet. -Si vous ne comprenez pas ces prérequis, ou si vous ne savez pas comment écrire du code, consulter d'abord l'[introduction au packaging](/start_packaging_apps_fr.md). +Si vous ne comprenez pas ces prérequis, ou si vous ne savez pas comment écrire du code, consulter d'abord l'[introduction au packaging](packaging_apps_start_fr.md). ### Contenu Un paquet YunoHost est composé : diff --git a/start_packaging_apps_fr.md b/packaging_apps_start_fr.md similarity index 100% rename from start_packaging_apps_fr.md rename to packaging_apps_start_fr.md diff --git a/sitemap_fr.md b/sitemap_fr.md index ca2f6e56..1ba1fcfa 100644 --- a/sitemap_fr.md +++ b/sitemap_fr.md @@ -95,7 +95,7 @@ * [Présentation du fonctionnement de YunoHost](/package_list_fr) * Applications : * [Packager des applications](/packaging_apps_fr) - * [Introduction](start_packaging_apps_fr.md) + * [Introduction](packaging_apps_start_fr.md) * [Manifeste](packaging_apps_manifest_fr) * [Scripts](packaging_apps_scripts_fr) * [Gestion des arguments](packaging_apps_arguments_management_fr) From 2883881a60791649a4433943c0f576d3186deb8f Mon Sep 17 00:00:00 2001 From: Moul Date: Sat, 10 Dec 2016 12:25:06 +0100 Subject: [PATCH 117/122] =?UTF-8?q?[mod]=20typo:=C2=A0YunoHost.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packaging_apps_start_fr.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packaging_apps_start_fr.md b/packaging_apps_start_fr.md index 0f46b406..cdd8d7fc 100644 --- a/packaging_apps_start_fr.md +++ b/packaging_apps_start_fr.md @@ -1,13 +1,13 @@ Petite introduction au packaging d'application, pour comprendre de quoi nous parlons et comment ça marche. Cette documentation s'adresse avant tout aux packageurs débutants qui ne sont pas à l'aise avec les concepts de shell, parsing et administration système de manière générale. -Nous verrons ici ce qu'est un package d'application Yunohost, comment cela fonctionne, comment faire pour écrire un package et comment se lancer dans l'aventure sans être tout seul. +Nous verrons ici ce qu'est un package d'application YunoHost, comment cela fonctionne, comment faire pour écrire un package et comment se lancer dans l'aventure sans être tout seul. ### De quoi on parle en fait ? Avant de démarrer, la bonne question c'est "Qu'est-ce qu'un package d'application !?" -Pour répondre à cette question, il faut revenir à ce qu'est Yunohost, c'est un système d’exploitation serveur visant à simplifier l’auto-hébergement de services Internet. Et pour faire ça, Yunohost met à disposition, entre autre, une interface d'administration permettant d'installer des applications en quelques clics. +Pour répondre à cette question, il faut revenir à ce qu'est YunoHost, c'est un système d’exploitation serveur visant à simplifier l’auto-hébergement de services Internet. Et pour faire ça, YunoHost met à disposition, entre autre, une interface d'administration permettant d'installer des applications en quelques clics. Or si vous avez déjà installé une application web à la main, vous savez qu'en réalité c'est bien plus compliqué que quelques clics sur une jolie interface. C'est là que le package d'application entre en jeu, c'est un ensemble de scripts qui automatise l'installation d'une application web et la préconfigure pour que l'utilisateur final n'ai besoin que de quelques clics pour l'installer facilement. @@ -17,16 +17,16 @@ C'est là que le package d'application entre en jeu, c'est un ensemble de script Du point de vue de l'utilisateur, c'est très simple, on choisit une application, on répond à quelques questions, ça mouline et c'est prêt. Mais il se passe bien plus de choses derrière. -Tout d'abord, lorsque l'application est sélectionnée, Yunohost va aller chercher son package sur Github, par exemple l'application [Custom Webapp](https://github.com/YunoHost-Apps/my_webapp_ynh). -Ensuite, Yunohost lit le fichier manifest.json pour connaître les questions à poser à l'utilisateur. +Tout d'abord, lorsque l'application est sélectionnée, YunoHost va aller chercher son package sur Github, par exemple l'application [Custom Webapp](https://github.com/YunoHost-Apps/my_webapp_ynh). +Ensuite, YunoHost lit le fichier manifest.json pour connaître les questions à poser à l'utilisateur. Mais ces questions anodines sont très importantes, on retrouvera souvent le domaine sur lequel installer l'application, l'adresse à laquelle elle sera accessible, l'utilisateur qui en sera l'administrateur et la langue par défaut de l'application. -Ce sont là des éléments essentiels pour configurer correctement notre application web lors de son installation. Pour ce faire, Yunohost va récupérer les réponses données par l'utilisateur et les envoyer au script install qui se trouve dans le dossier scripts du package. +Ce sont là des éléments essentiels pour configurer correctement notre application web lors de son installation. Pour ce faire, YunoHost va récupérer les réponses données par l'utilisateur et les envoyer au script install qui se trouve dans le dossier scripts du package. Le script install va se charger d'installer l'application, en prenant en compte les réponses données par l'utilisateur. Ce script va simplement faire ce que vous auriez fait si vous aviez installé l'application à la main. -Si par la suite l'utilisateur souhaite supprimer l'application, Yunohost utilisera le script remove du dossier script, qui se chargera à la place de l'utilisateur de supprimer l'application, ses dossiers et tout ses fichiers de configuration. +Si par la suite l'utilisateur souhaite supprimer l'application, YunoHost utilisera le script remove du dossier script, qui se chargera à la place de l'utilisateur de supprimer l'application, ses dossiers et tout ses fichiers de configuration. ### Qu'il y a-t-il dans ces scripts pour que tout soit si simple pour l'utilisateur ? @@ -35,7 +35,7 @@ Les scripts d'un package d'application sont simplement des commandes bash les un #### ... Et c'est quoi une commande bash ? Une commande [bash](https://fr.wikipedia.org/wiki/Bourne-Again_shell) c'est une ligne de texte qui sera interprétée et produira un résultat. C'est ce qu'on a l'habitude d'appeler la ligne de commande. -Or puisque votre serveur, sur lequel est installé Yunohost, ne dispose pas d'une interface graphique, vous n'avez que la ligne de commande de disponible. Vous l'atteignez en général après vous être connecté avec [ssh](/ssh_fr). +Or puisque votre serveur, sur lequel est installé YunoHost, ne dispose pas d'une interface graphique, vous n'avez que la ligne de commande de disponible. Vous l'atteignez en général après vous être connecté avec [ssh](/ssh_fr). Les scripts d'un package ne sont donc qu'une succession de commandes bash, comme si vous les aviez tapées directement dans la console ssh pour installer l'application. From 442323de9ade53944c09f9b04ad2b9456478c5c7 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Tue, 27 Dec 2016 12:03:52 +0100 Subject: [PATCH 118/122] Update packaging_apps_guidelines_fr.md --- packaging_apps_guidelines_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging_apps_guidelines_fr.md b/packaging_apps_guidelines_fr.md index b5067f6b..e305d1d3 100644 --- a/packaging_apps_guidelines_fr.md +++ b/packaging_apps_guidelines_fr.md @@ -120,7 +120,7 @@ La licence du paquet est à indiquer dans un fichier `LICENSE` à la racine du p Les listes d'applications official.json et community.json n'acceptent que les paquets dont la licence est libre, de même pour la licence de l'application contenue. Certaines applications libres nécessitent des dépendances non-libres (exemple: mp3, drivers, etc.). Dans ce cas, il faut ajouter `+dep-non-free` à l'acronyme et si possible donner des précisions dans le README.md du paquet, l'intégration sera dans ce cas acceptée au cas par cas. -Dans le future, YunoHost affichera sans doute des détails sur la licence de l'application. Pour y parvenir, l'acronyme doit être celui issue de cette [liste de licences répertoriées sur gnu.org](https://www.gnu.org/licenses/license-list.fr.html) (si il y a 2 acronymes, il faut prendre celui contenant le numéro de version). Pour plus de cohérence, la casse doit être respectée. +Dans le futur, YunoHost affichera sans doute des détails sur la licence de l'application. Pour y parvenir, l'acronyme doit être celui issu de cette [liste de licences répertoriées sur gnu.org](https://www.gnu.org/licenses/license-list.fr.html) (si il y a 2 acronymes, il faut prendre celui contenant le numéro de version). Pour plus de cohérence, la casse doit être respectée. Si la licence n'est pas présente dans la liste, dans ce cas il faut indiquer `free` ou `non-free` selon qu'elle est libre ou non et donner l'occasion à l'utilisateur de se renseigner dans le README.md (lien, explications, ...). From 3f92f17dce9ef247d36423467f6a54c7f2da81de Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Tue, 27 Dec 2016 16:58:34 +0100 Subject: [PATCH 119/122] [enh] Use a bigger list of accronym and avoid conflict with delimiter --- packaging_apps_guidelines_fr.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packaging_apps_guidelines_fr.md b/packaging_apps_guidelines_fr.md index e305d1d3..b3c7e121 100644 --- a/packaging_apps_guidelines_fr.md +++ b/packaging_apps_guidelines_fr.md @@ -118,17 +118,17 @@ TODO Lien ou information pour réaliser l'inscription. #### YEP 1.3 - Indiquer la licence associée au paquet | brouillon | AUTO | WORKING | La licence du paquet est à indiquer dans un fichier `LICENSE` à la racine du paquet. Attention à ne pas confondre avec la licence de l'application qui va être installée dont l'acronyme est à renseigner dans le champ `license` du manifeste. -Les listes d'applications official.json et community.json n'acceptent que les paquets dont la licence est libre, de même pour la licence de l'application contenue. Certaines applications libres nécessitent des dépendances non-libres (exemple: mp3, drivers, etc.). Dans ce cas, il faut ajouter `+dep-non-free` à l'acronyme et si possible donner des précisions dans le README.md du paquet, l'intégration sera dans ce cas acceptée au cas par cas. +Les listes d'applications official.json et community.json n'acceptent que les paquets dont la licence est libre, de même pour la licence de l'application contenue. Certaines applications libres nécessitent des dépendances non-libres (exemple: mp3, drivers, etc.). Dans ce cas, il faut ajouter `&dep-non-free` à l'acronyme et si possible donner des précisions dans le README.md du paquet, l'intégration sera dans ce cas acceptée au cas par cas. -Dans le futur, YunoHost affichera sans doute des détails sur la licence de l'application. Pour y parvenir, l'acronyme doit être celui issu de cette [liste de licences répertoriées sur gnu.org](https://www.gnu.org/licenses/license-list.fr.html) (si il y a 2 acronymes, il faut prendre celui contenant le numéro de version). Pour plus de cohérence, la casse doit être respectée. +Dans le futur, YunoHost affichera sans doute des détails sur la licence de l'application. Pour y parvenir, l'acronyme doit être celui issu de cette [liste de licences répertoriées du SPDX](https://spdx.org/licenses/) (si il y a 2 acronymes, il faut prendre celui contenant le numéro de version). Pour plus de cohérence, la casse doit être respectée. Si la licence n'est pas présente dans la liste, dans ce cas il faut indiquer `free` ou `non-free` selon qu'elle est libre ou non et donner l'occasion à l'utilisateur de se renseigner dans le README.md (lien, explications, ...). -Exemple: pour une licence `GNU Lesser General Public License (LGPL), version 3` l'acronyme est `LGPLv3` si toutefois des dépendances non libres sont utilisées dans ce cas il faudra mettre `LGPLv3+dep-non-free` dans le manifeste. +Exemple: pour une licence `GNU Lesser General Public License (LGPL), version 3` l'acronyme est `LGPL-3.0` si toutefois des dépendances non libres sont utilisées dans ce cas il faudra mettre `LGPL-3.0&dep-non-free` dans le manifeste. -Si une application a des modules liés avec une autre licence (Exemple: Odoo 9 LGPLv3 + un module sous licence AGPLv3 ), dans ce cas on indiquera les deux licences séparées par un `+`. +Si une application a des modules liés avec une autre licence (Exemple: Odoo 9 LGPL-3.0 + un module sous licence AGPL-3.0 ), dans ce cas on indiquera les deux licences séparées par un `&`. -Si deux applications distinctes sont dans le même paquet d'installation et ont des licences distinctes, dans ce cas on peut utiliser le `&` pour séparer les licences. +Si deux applications distinctes sont dans le même paquet d'installation et ont des licences distinctes, dans ce cas on peut utiliser le `,` pour séparer les licences. Dans les deux cas, le mainteneur est encouragé à réfléchir à la possibilité de créer deux paquets distincts. Le manifeste permet des questions de type `app` de façon à faire référence à une autre application déjà installée. From 16109db9a16d7ce49fda15bdfb190ec3f1a0e35b Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Tue, 27 Dec 2016 17:06:59 +0100 Subject: [PATCH 120/122] [enh] Add explanation about app type --- packaging_apps_guidelines_fr.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packaging_apps_guidelines_fr.md b/packaging_apps_guidelines_fr.md index b3c7e121..1e506bbc 100644 --- a/packaging_apps_guidelines_fr.md +++ b/packaging_apps_guidelines_fr.md @@ -130,7 +130,9 @@ Si une application a des modules liés avec une autre licence (Exemple: Odoo 9 L Si deux applications distinctes sont dans le même paquet d'installation et ont des licences distinctes, dans ce cas on peut utiliser le `,` pour séparer les licences. -Dans les deux cas, le mainteneur est encouragé à réfléchir à la possibilité de créer deux paquets distincts. Le manifeste permet des questions de type `app` de façon à faire référence à une autre application déjà installée. +Dans les deux cas, le mainteneur est encouragé à réfléchir à la possibilité de créer deux paquets distincts. Le manifeste de chaque application permet de poser des questions de type `app` de façon à faire référence à une autre application déjà installée. + +Rappel: une question de type `app` prend pour réponse l'identifiant d'une des apps déjà installée. Quelques liens intéressants pour aider au choix de licence: * [Des fiches explicatives sur les licences libres](https://www.inria.fr/content/download/5896/48452/version/2/file/INRIA_recueil_fiches_licences_libres_vf.pdf) From b09e1a429fae942f7013df79dc676d00b13feae4 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Tue, 27 Dec 2016 20:26:26 +0100 Subject: [PATCH 121/122] [enh] add architecture schema --- architecture.png | Bin 0 -> 46893 bytes architecture.xml | 1 + 2 files changed, 1 insertion(+) create mode 100644 architecture.png create mode 100644 architecture.xml diff --git a/architecture.png b/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..12c1f4713b67f259fb854d3c0d9d49f44b4122f8 GIT binary patch literal 46893 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

_2qD|4IG_uXmuo8 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�>HKDdcV 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 literal 0 HcmV?d00001 diff --git a/architecture.xml b/architecture.xml new file mode 100644 index 00000000..b1084892 --- /dev/null +++ b/architecture.xml @@ -0,0 +1 @@ +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 \ No newline at end of file From 9a1b2c79e7098164e0d33463df9498069aeab270 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 11 Jan 2017 23:13:20 +0100 Subject: [PATCH 122/122] Correction lien interne --- packaging_apps_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging_apps_fr.md b/packaging_apps_fr.md index 9dc64fe6..e61519cd 100644 --- a/packaging_apps_fr.md +++ b/packaging_apps_fr.md @@ -8,7 +8,7 @@ Pour packager une application, voici les prérequis : * Maîtriser un minimum `git`, le Shell et d’autres notions de programmation ; * Une [machine virtuelle ou sur un serveur distant](/install_fr) ou un [environnement de développement](https://github.com/yunohost/ynh-dev) pour packager et tester son paquet. -Si vous ne comprenez pas ces prérequis, ou si vous ne savez pas comment écrire du code, consulter d'abord l'[introduction au packaging](packaging_apps_start_fr.md). +Si vous ne comprenez pas ces prérequis, ou si vous ne savez pas comment écrire du code, consulter d'abord l'[introduction au packaging](/packaging_apps_start_fr). ### Contenu Un paquet YunoHost est composé :