Compare commits

...
Sign in to create a new pull request.

42 commits

Author SHA1 Message Date
de9228c0f8 minor: ordre des pages
All checks were successful
ci/woodpecker/push/preprod Pipeline was successful
2025-04-16 23:09:18 +02:00
d30bb00302 maintien en condition 2025-04-16 23:09:18 +02:00
b49d1fb373 déplacement 'sauvegardes' & 'supervision' vers Infra 2025-04-16 23:09:18 +02:00
7400f6eddf déplacement 'installer un noeud' vers Infra 2025-04-16 23:09:18 +02:00
d3693c36bf déplacement 'installer un site' vers Infra 2025-04-16 23:09:18 +02:00
539e6c8327 minor: deplacement fichiers 2025-04-16 23:09:18 +02:00
a30479ee9b polissage des créations logicielles et ajout du guide opérations 'mot de passe' (ex-Guichet) 2025-04-16 23:09:18 +02:00
68b6a28abb Réorganisation Opérations & incorporation de pages de Opérations dedans Infrastructures 2025-04-16 23:09:18 +02:00
b43122e975 fix(nav): arborescence qui fonctionn 2025-04-16 23:09:18 +02:00
6b103e45ce Fin refonte guide web 2025-04-16 23:09:18 +02:00
fc732f201c Update woodpecker config from main 2025-04-16 23:09:18 +02:00
4bc239ee82 Coquilles dans 1e0183a1cc 2025-04-16 23:09:18 +02:00
c93acb801f minor: aria-hidden around kaemoji 2025-04-16 23:09:18 +02:00
56bf75f18e rewrite(services): main page, organisation of pages in section, shmol stuff 2025-04-16 23:09:18 +02:00
97802d3478 rewrite: services/jitsi 2025-04-16 23:09:18 +02:00
4c3527cc63 Progression guide hébergement web 2025-04-16 23:09:18 +02:00
fab933a970 minor: 'dernière mise à jour du site le ...' 2025-04-16 23:09:18 +02:00
9ab51aa8c1 section calendrier et contacts 2025-04-16 23:09:18 +02:00
07e323f312 hello world ci 2025-04-16 23:09:18 +02:00
d4d55c0cd1 minor: aria-hidden around kaemoji 2025-04-16 23:09:18 +02:00
1730c8a4e2 rewrite(services): main page, organisation of pages in section, shmol stuff 2025-04-16 23:09:18 +02:00
77348fd872 rewrite: services/jitsi 2025-04-16 23:09:18 +02:00
5a69b07156 minor 2025-04-16 23:09:18 +02:00
a4814a552c rollback .woodpecker.yaml 2025-04-16 23:09:18 +02:00
bbe715bdb8 feat: correction de coquilles et titre Sommaire sur téléphone 2025-04-16 23:09:18 +02:00
53d07178c7 minor 2025-04-16 23:09:18 +02:00
51bb51e5bb feat(nav): soulignage de la section active dans la topbar 2025-04-16 23:09:18 +02:00
f195e10ed0 feat(infrastructure): relecture et modification de contenu 2025-04-16 23:09:18 +02:00
6f097a8c2d feat: graphisme de la navigation supérieure 2025-04-16 23:09:18 +02:00
b57269b7c0 feat(services): petites modifs textuelles sur la doc matrix 2025-04-16 23:09:18 +02:00
6251ff03bf WIP: plein de changement de titre + le dossier motivation du commit précédent 2025-04-16 23:09:18 +02:00
7ee11ca988 revert: 'Motivations' est définitivement plus classe que 'Vision' 2025-04-16 23:09:18 +02:00
e808252294 feat(services): relecture de la page d'accueil des services 2025-04-16 23:09:18 +02:00
6cd8ba8e44 feat(accueil): ajout d'un lien vers deuxfleurs.fr et suppression des guidelines obsolètes 2025-04-16 23:09:18 +02:00
107d5af637 feat: desactivation de l'affichage de sections dans le menu superieur via le camp extra->hide_from_menu du header de la section 2025-04-16 23:09:18 +02:00
66b67b4980 fix: compilation du site grace a l'ajout du dossier (section) 'vision' 2025-04-16 23:09:18 +02:00
ec8b36ebba Add web content first part 2025-04-16 23:09:18 +02:00
968cedb0c3 Add cryptpad.md 2025-04-16 23:09:18 +02:00
eb2fa5a3ce Copie de contenu existant dans services/ 2025-04-16 23:09:18 +02:00
9d7ea5b870 Ajout fichier vide pour résoudre les liens 2025-04-16 23:09:18 +02:00
2367eaa4b2 maj README avec le compte rendu de la refonte 2025-04-16 23:09:18 +02:00
1e4b0af3e0 Rewrite services _index.md 2025-04-16 23:09:18 +02:00
94 changed files with 10016 additions and 184 deletions

View file

@ -9,7 +9,10 @@ zola build
## Déployer
```bash
# Pousser sur https://guide.deuxfleurs.fr
aws s3 sync ./public s3://guide.deuxfleurs.fr
# Pousser sur https://preprod-guide.web.deuxfleurs.fr
aws s3 sync ./public s3://preprod-guide
```
## Développer
@ -18,4 +21,25 @@ aws s3 sync ./public s3://guide.deuxfleurs.fr
zola serve
```
# Refonte du guide
> TODO:
> - [ ] Incorporer la section **Opérations**
>
Notre guide contient toutes les informations relatives à l'association, ses services, son infrastructure, et ses idées. C'est donc un lieu crucial, sur lequel sont amenés à tomber de bien nombreux acteur·ices et personnes externes. Nous sommes aussi insatisfait·es avec certain de ses aspects : nous trouvons que les catégories se recoupent et peuvent porter à confusion. La navigation sur mobile pose certains problèmes, et modifier son contenu demande un certain processus.
Les cinq catégories actuelles, Prise en main, Se former, Vie associative, Infrastructures, et Opérations proviennent de l'application des recommandations de Diátaxis. En pratique, nous constatons qu'elles se révèlent pénibles à utiliser. Elles sont loin d'être exclusives, et il est loin d'être rare que lorsqu'on cherche une information spécifique, celle-ci ait le potentiel de se trouver dans deux ou trois d'entre elles. Nous avons convergé vers une nouvelle organisation. La page d'accueil contiendrait les informations pour découvrir Deuxfleurs, puis présenterait ces quatre catégories :
Utilisation des services : dédiée aux usager·es, aussi technophobes qu'ils peuvent potentiellement être, afin de leur expliquer simplement et clairement comment utiliser nos services.
Motivations : dédiée à la présentation de nos idées, réflexions, arguments, désirs, inspirations et motivations.
Vie associative : dédiée au contenu administratif, et aux considérations autour de Deuxfleurs en tant qu'association.
Infrastructure : dédiée à du contenu technique, pour les administrateur·ices système ou curieux·euses de savoir comment tout cela fonctionne.
Malgré tout, nous pensons qu'il ne faudra pas hésiter à mettre en place des liens pour que les usager·es passent facilement d'une section à l'autre : un sujet peut arborer plusieurs facettes, se plaçant ainsi à plusieurs endroits du guide. De même, la réorganisation va générer beaucoup de liens morts, et s'en occuper demandera un certain travail qu'il ne faudra pas négliger.
Sur mobile, le guide n'affiche pas le menu des sections en permanence. Implémenter un fil d'Ariane permettrait de clarifier cette situation, pour améliorer l'ergonomie.
Il y a donc une quantité de travail non négligeable à réaliser sur notre guide. Nous avons tout intérêt à réaliser la transition le plus en douceur possible. Pour cela, nous allons travailler sur une duplication du guide, à une adresse différente. Une fois la nouvelle version finalisée, nous la mettrons à jour avec les contributions réalisées entre-temps, puis validerons la transition.

View file

@ -2,22 +2,23 @@
title: Guide Deuxfleurs
sort_by: weight
---
Bienvenue sur le guide de [Deuxfleurs](https://deuxfleurs.fr) !
# Découvrir
[Prise en main](@/prise_en_main/_index.md) - Ce manuel vous accompagne dans la découverte de nos outils. C'est par là que vous devriez commencer si vous venez d'arriver, on vous explique comment utiliser nos outils pour rester en contact avec votre famille, organiser une réunion avec votre association ou encore publier une tribune sur le web.
[Utilisation des services](@/services/_index.md) — Ce manuel vous accompagne dans la découverte de nos outils numériques : e-mail, site web, conversation instantanée, édition partagée....
[Se former](@/formations/_index.md) - Ce manuel vous propose de vous former sur les questions portées par l'association, que ce soit sur l'impact social du numérique ou l'administration d'une machine Linux, avec dans l'idée que vous pourrez vous impliquer d'avantage dans nos activités après, en faisant des ateliers ou en participant à opérer les machines et les logiciels.
[Motivations](@/motivations/_index.md) — Cette section est dédiée à la présentation de nos idées, réflexions, arguments, désirs, inspirations et motivations.
[Vie associative](@/vie_associative/_index.md) - Ce manuel traite de tout ce qui concerne l'association, comme ses aspects légaux, les délibérations, ou l'organisation des personnes.
[Vie associative](@/vie_associative/_index.md) — Cette section traite de contenu administratif, et de Deuxfleurs en tant qu'association.
[Infrastructures](@/infrastructures/_index.md) - Ce manuel documente la dimension matérielle du numérique chez Deuxfleurs. On y recense les ordinateurs, le lieu où ils sont, les connexions réseaux nécessaires, l'énergie consommée, l'impact de fabrication, de fin de vie, etc.
[Opérations](@/operations/_index.md) - Ce manuel recense notre savoir-faire technique, il a pour but d'accompagner nos opérateur·ices dans la réalisation de leurs tâches.
[Infrastructure](@/infrastructures/_index.md) — Cette section est dédiée à du contenu technique, pour les administrateur·ices système ou curieux·euses de savoir comment tout cela fonctionne.
# Contribuer
Afin d'apporter une contribution impactante, il est recommandé de lire [Diátaxis](https://diataxis.fr/), un site web qui théorise la documentation. Pour le style d'écriture, les conseils de [StaticCMS](https://www.staticcms.org/docs/writing-style-guide) sont intéressants.
Pour contribuer à ce guide, le plus simple est d'agréger les modifications que vous voulez apporter dans un fichier texte ou LibreOffice et de nous l'envoyer par email à coucou (arobase) deuxfleurs.fr. Un membre de l'association reportera alors vos propositions sur le site web.
Si vous êtes plus expert·e, vous pouvez demander des accès à [l'interface d'administration](https://guide.deuxfleurs.fr/admin/) pour faire directement vos modifications. Si vous connaissez git, vous pourriez aussi vouloir [forker notre dépôt](https://git.deuxfleurs.fr/Deuxfleurs/guide.deuxfleurs.fr).
Si vous êtes plus expert·e, vous pouvez demander des accès à [l'interface d'administration](https://guide.deuxfleurs.fr/admin/) pour faire directement vos modifications.
Si vous connaissez git, vous pourriez aussi vouloir [étudier notre dépôt de code](https://git.deuxfleurs.fr/Deuxfleurs/guide.deuxfleurs.fr).

View file

@ -5,6 +5,7 @@ weight: 30
sort_by: "weight"
extra:
parent: 'formations/_index.md'
hide_from_menu: true
---
Ce manuel vous propose de vous former sur les questions portées par l'association, que ce soit sur l'impact social du numérique ou l'administration d'une machine Linux, avec dans l'idée que vous pourrez vous impliquer d'avantage dans nos activités après, en faisant des ateliers ou en participant à opérer les machines et les logiciels.

View file

@ -1,11 +1,35 @@
---
title: "Infrastructures"
description: "Infrastructures"
weight: 90
weight: 40
sort_by: weight
extra:
parent: 'infrastructures/_index.md'
---
Ce manuel documente la dimension matérielle du numérique chez Deuxfleurs. On y recense les ordinateurs, le lieu où ils sont, les connexions réseaux nécessaires, l'énergie consommée, l'impact de fabrication, de fin de vie, etc.
Cette section du Guide documente la dimension matérielle et opérationnelle du numérique chez Deuxfleurs.
* Inspectez [la salle des machines](@/infrastructures/machines.md), réparties en différents _clusters_ ou [grappes](@/infrastructures/grappes.md)
* Découvrez notre [logithèque](@/infrastructures/logitheque.md), ainsi que nos [créations logicielles](@/infrastructures/creations.md)
* Ouvrez les volumineux manuels d'[opérations](@/infrastructures/operations.md).
# Notre jargon
* _Un nœud_ (ou _node_ en anglais), c'est un **ordinateur unique** configuré pour fournir un **service** en collaborant avec d'autres.
* _Un site_ ou _une zone_, c'est un **ensemble d'ordinateurs qui sont situés au même endroit géographique**.
* _Une grappe_ (ou _cluster_ en anglais), c'est **un ensemble de nœuds** qui **coopèrent** pour fournir un **service**. Même si c'est normalement le cas, une grappe n'est pas forcément composée de plusieurs sites! On peut avoir une grappe sur une seule zone.
Une grappe est **gérée de façon cohérente** (avec le même système logiciel), **plus ou moins autonome** (elle ne dépend pas du reste du monde pour fournir des services web), **par une entité définie** (une personne physique ou un groupe de personnes).
* _Les [opérateur·ices](@/vie_associative/charte_operateurice.md)_ de la grappe ont **deux responsabilités** principales : **la maintenance** de la grappe, et **la protection des données hébergées**.
## _Nota Bene_ : Le Guide n'est jamais à jour
> L'état à jour de nos infrastructures est décrit dans le dépôt [`nixcfg`](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg).
Vu la quantité de logiciels et de machines impliquées (et la fâcheuse tendance de nos membres à déménager), il est fort probable que les informations présentées ici ne soient pas à jour.
Cependant, ces pages ont été vraies il n'y a pas si longtemps : leur lecture vous informera quand même sur notre pratique de l'hébergement de services numériques.
Pour connaître l'état précis de nos infrastructures, il faudrait plutôt lire notre dépôt [`nixcfg`](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg) – qui décrit techniquement nos machines et services à tout instant.
Bonne lecture !

View file

@ -0,0 +1,13 @@
---
title: "Accès opérateurice"
description: "Accès opérateurice"
sort_by: "weight"
weight: 1
extra:
parent: 'infrastructures/operations.md'
---
Ici l'on traite de comment gagner accès au cluster de Deuxfleurs, quand on a reçu la _terrible responsabilité_ de sysadmin. Vous êtes prêt⋅e ? Les étapes sont les suivantes :
- [le dépôt des secrets](@/infrastructures/pass.md)
- [SSH](@/infrastructures/ssh.md)
- [mot de passe linux](@/infrastructures/user_passwd.md)

View file

@ -0,0 +1,22 @@
---
title: "Accès usager⋅e"
description: "Accès usager⋅e"
weight: 2
sort_by: "weight"
extra:
parent: 'infrastructures/operations.md'
---
## Remplacer un mot de passe dans Guichet
> Un⋅e usager⋅e a perdu son mot de passe et ne peut donc plus se connecter à [Guichet](@/infrastructures/guichet.md) pour en changer ?
> Opérateurice, c'est à vous de lui en affecter un temporaire, pour qu'iel retrouve accès à nos infrastructures.
- Rendez-vous à la page de modification d'un utilisateur [Guichet](https://guichet.deuxfleurs.fr), puis cherchez le champ `userpassword` (et s'il n'existe créez ce champ en mettant `userpassword` dans le champ gauche de la dernière ligne de la section « Attributs »).
- On s'intéresse désormais au champ à droite de `userpassword`, que vous souhaitez créer/modifier. Pour créer ledit hash du mot de passe, on vous recommande l'outil suivant (_one-liner_) :
docker run --rm -it dxflrs/guichet:m1gzk1r00xp0kz566fwbpc87z7haq7xj cli -passwd
- Entrez le mot de passe, et copiez-collez dans le champ sus-mentionné la fin de la ligne commençant par « Passowrd: » _en incluant `{SSHA512}`_. Validez. Si le nouveau champ n'apparaît pas, rechargez la page Guichet en cliquant dans la barre d'adresse et en appuyant sur Entrée (pour ne pas renvoyer la requête).

View file

@ -0,0 +1,25 @@
---
title: "Aerogramme"
description: "Aerogramme : le serveur e-mail du futur"
date: 2021-11-09T12:42:17.716Z
dateCreated: 2021-11-09T12:42:15.729Z
weight: 300
extra:
parent: 'infrastructures/creations.md'
---
<img src="/img/aerogramme-logo.svg" alt="Logo officiel d'Aerogramme : un joli timbre poste" width="200px">
- [Site officiel](https://aerogramme.deuxfleurs.fr)
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/aerogramme/)
- [Canal de discussion](https://matrix.to/#/%23aerogramme:deuxfleurs.fr)
Aerogramme est un serveur IMAP ([_Internet Message Access Protocol_](https://fr.wikipedia.org/wiki/Internet_Message_Access_Protocol)) chiffré et distribué reposant sur [Garage](@/infrastructures/garage.md).
## Statut du développement
⚠️ Pas encore fonctionnel, pas utilisé en production chez Deuxfleurs : en cours de développement.\
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/aerogramme>

View file

@ -1,18 +1,25 @@
---
title: "Bottin"
description: "Un annuaire LDAP pour le distribué"
description: "Bottin : l'annuaire LDAP distribué"
date: 2021-11-09T12:40:01.746Z
dateCreated: 2021-11-09T12:39:59.725Z
weight: 10
weight: 100
extra:
parent: 'infrastructures/logiciels.md'
parent: 'infrastructures/creations.md'
---
# Bottin
<img src="/img/bottin-logo.png" alt="Logo officieux de bonhomme : un homme bien habillté au téléphone" width="200px">
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/bottin/)
- [Canal de discussion](https://matrix.to/#/%23bottin:deuxfleurs.fr)
Bottin est un annuaire LDAP (pour [_Lightweight Directory Access Protocol_](https://fr.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)) distribué développé en Go visant la simplicité d'installation et d'utilisation (comparé à des solutions comme OpenLDAP ou Keycloak) tout en offrant la résilience que l'on peut attendre d'un système d'authentification.
L'interface d'administration de l'association, [Guichet](@/infrastructures/guichet.md), repose sur Bottin.\
Le stockage des données de Bottin est assuré par le service distribué [Consul](https://www.consul.io/).
Bottin est un annuaire LDAP distribué développé en Go visant la simplicité d'installation et d'utilisation (comparé à des solutions comme OpenLDAP ou Keycloak) tout en offrant la résilience que l'on peut attendre d'un système d'authentification. Il se base pour le stockage distribué sur [Consul](https://www.consul.io/).
## Statut du développement
Bottin est actuellement utilisé en production pour deuxfleurs. Il est cependant toujours en développement actif.
Le code de Bottin se trouve ici : <https://git.deuxfleurs.fr/Deuxfleurs/bottin>
Bottin est actuellement utilisé en production par deuxfleurs. Il est cependant toujours en développement actif.\
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/bottin>

View file

@ -0,0 +1,100 @@
---
title: "Créer une BDD psql"
description: "Création d'une base de données PostgreSQL pour une nouvelle application"
date: 2025-02-25
dateCreated: 2022-12-22
weight: 12
extra:
parent: 'infrastructures/deployer.md'
---
## Le besoin
On déploie une application sur l'infra Deuxfleurs, et cette application a besoin de stocker des données dans une base PostgreSQL.
On utilise pour cela le service PostgreSQL existant de Deuxfleurs, déployé en cluster avec [Stolon](@/infrastructures/stolon.md).
Pour mettre en place l'accès nécessaire à cette nouvelle application, nous avons besoin de :
- créer un utisateur pour que l'application puisse se connecter à PostgreSQL
- générer un mot de passe associé
- créer une ou plusieurs bases de données dans PostgreSQL
Ces trois éléments seront ensuite utilisés dans la configuration de l'application.
## Comment ça marche
- **utilisateur et mot de passe :** PostgreSQL est configuré pour
authentifier les connexions via le LDAP de Deuxfleurs, géré par Bottin.
Il faut donc créer un nouvel "utilisateur de service" dans le LDAP
Deuxfleurs (avec un mot de passe associé).
- **base de données :** On crée une base de données pour chaque
application, et seul l'utilisateur associé a le droit d'accéder à cette
base. Cela sépare bien les différentes applications.
- **nom de la base de données :** Cas simple où l'application a besoin
d'une seule base de données : on lui donne le nom de l'application. Cas
complexe avec plusieurs bases : on préfixe par le nom de l'application.
- **configuration de l'application :** On veut passer quatre éléments à
l'application : l'adresse/port du service PostgreSQL, le nom
d'utilisateur, le mot de passe, et le nom de la base de données. Les
applications se configurent généralement soit via des variables
d'environnement, soit via un fichier de configuration. Chez Deuxfleurs,
on stocke les secrets dans Consul, et on utilise des templates pour
injecter ces secrets dans la configuration de l'application. Voir dépôt
nixcfg pour des exemples, ou ici un exemple simple :
```
DATABASE_URL=postgres://monapplication:{{ key "secrets/monapplication/postgres_pwd" | trimSpace }}@{{ env "meta.site" }}.psql-proxy.service.prod.consul:5432/monapplication
```
## Etapes de création de l'utilisateur et base de données
### 1. Création de l'utilisateur dans LDAP (méthode automatisée à privilégier)
Voir la page de [secretmgr](@/infrastructures/secretmgr.md)
Gros avantage : le script va également copier les secrets dans Consul, ce qui facilitera la configuration de l'application.
### 1.bis Création de l'utilisateur dans LDAP (méthode manuelle au cas où)
Si la méthode automatique ne convient pas, commencer par générer un mot de passe (sur votre laptop, ou depuis une machine Deuxfleurs, peu importe) :
1. Générer un mot de passe aléatoire avec la commande `openssl rand -base64 32`
2. Hasher ce mot de passe avec la commande `slappasswd`
Puis aller sur https://guichet.deuxfleurs.fr :
1. Il est nécessaire d'être admin Guichet
2. Trouver l'arbre LDAP des utilisateurs de service `ou=services,ou=users,dc=deuxfleurs,dc=fr`
3. Créer un nouvel utilisateur dans cet arbre, par exemple `monapplication` (nom de l'application)
4. Ajouter un champ `userpassword` avec le hash du mot de passe obtenu précédemment
### 2. Se connecter en admin au PostgreSQL de production
Installer le client postgresql (paquet `postgresql-client` sous Debian).
Se connecter en SSH sur une machine de prod en faisant un tunnel vers
`psql-proxy.service.prod.consul:5432` (c'est automatique avec [la
configuration SSH recommandée]
(https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/doc/onboarding.md))
On peut alors se connecter au serveur PostgreSQL de production :
```bash
psql -h localhost -U postgres -W postgres
```
TODO : demande un mot de passe, où est-il stocké ?
### 3. Créer l'utilisateur et la base de données dans PostgreSQL
Dans le client `psql`, lancer les commandes SQL suivantes. Il faut adapter le nom de l'application et le nom de la base de données.
```sql
CREATE USER monapplication;
CREATE DATABASE monapplication WITH OWNER monapplication ENCODING 'utf8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE template0;
```

View file

@ -1,19 +1,34 @@
---
title: Développement logiciel
description: Logiciels
weight: 90
title: "Nos créations"
description: "Les logiciels que l'on développe"
weight: 30
sort_by: weight
draft: false
date: 2024-01-24
extra:
parent: infrastructures/_index.md
parent: infrastructures/logitheque.md
---
Cette section recense les logiciels développés par Deuxfleurs pour les besoins spécifiques de son infra.
Cette section recense les logiciels développés par Deuxfleurs pour les besoins spécifiques de son infrastructure :
- [Garage](@/infrastructures/garage.md) : stockage objet réparti
- [Tricot](@/infrastructures/tricot.md) : proxy inverse HTTP
- [Guichet](@/infrastructures/guichet.md) : interface web d'administraiton des comptes
- [Bottin](@/infrastructures/bottin.md) : annuaire LDAP
- [Diplonat](@/infrastructures/diplonat.md) : négociation avec routeur au domicile
- [D53](@/infrastructures/d53.md) : configurateur DNS
- [Aerogramme](@/infrastructures/aerogramme.md) : l'e-mail du futur
Cette page en particulier présente nos choix de conception.
# Principes de conception
Nou essayons de suivre plusieurs principes pour une conception qui correspond au besoin tout en ayant un ensemble de logiciels homogènes.
Deuxfleurs reconnaît l'importance sociale des choix techniques.
N'importe quel outil est imbibé de l'idéologie de la société qui l'a vu naître &ndash; et en retour, il impose son idéologie aux sociétés à venir.
Sachant cela, on arbitre nos choix techniques en regardant en premier lieu ce qu'ils vont impliquer socialement.
Cela fait de nos infrastructures une bizarrerie pour qui est habitué⋅e aux pratiques de l'informatique industrielle.
Nous essayons de suivre plusieurs principes pour une conception qui correspond au besoin tout en ayant un ensemble de logiciels homogènes.
## Vie privée
@ -23,48 +38,52 @@ Que ce soit à l'intérieur ou l'extérieur de l'association, des demandes pour
Quelques propriétés en vrac qu'on peut, ou ne pas, désirer :
### Messagerie instantanée
#### Messagerie instantanée
- Je ne veux pas que le contenu de mes messages et des fichiers que je partage soient accessibles (eg. une photo que j'ai prise, mes réactions)
- Je ne veux pas que les métadonnées autour de mes messages soient accessibles (eg. les salons de discussions auxquels je prends pars, l'horodatage des messages, les personnes avec qui j'échange)
- Je ne veux pas que les métadonnées de communication soient accessibles (eg. quand je me connecte au service, depuis où, si j'intéragis sur le réseau, etc.), ces données permettent parfois d'inférer des métadonnées sur le protocole (autres personnes dans le salon de communication, horodatage, etc.)
- Je ne veux pas que le contenu de mes messages et des fichiers que je partage soient accessibles à des tiers (_e.g._ une photo que j'ai prise, mes réactions).
- Je ne veux pas que les métadonnées autour de mes actions soient accessibles à des tiers (_e.g._ les salons de discussions auxquels je prends part, l'horodatage des messages, les personnes avec qui j'échange).
- Je ne veux pas que mes métadonnées de communication soient accessibles (_e.g._ quand je me connecte à un service, depuis où, si j'intéragis sur le réseau, etc.), ces données permettent parfois d'inférer des métadonnées sur le protocole (autres personnes dans le salon de communication, horodatage, etc.).
### Courrier électronique (de l'email au mixnet)
#### Courrier électronique (de l'e-mail au mixnet)
- Je ne veux pas que le contenu de mes emails et pièces jointes soit lisible (eg. le doc que j'ai joint)
- Je ne veux pas que les métadonnées autour de mon message soient accessibles (eg. le destinataire, l'expéditeur, l'horodatage, le client email utilisé, le sujet du mail, le dossier dans lequel il est stocké)
- Je ne veux pas que les métadonnées de communication soient accessibles (eg. quand je me connecte au service email, depuis où, quand j'intéragis sur le réseau), ces données permettent parfois d'inférer des métadonnées sur le protocole (destinataires, présence de pièce jointe, etc.)
- Je ne veux pas que le contenu de mes e-mails et pièces jointes soit lisibles par des tiers (_e.g._ le doc que j'ai joint).
- Je ne veux pas que les métadonnées autour de mon message soient accessibles (_e.g._ le destinataire, l'expéditeur, l'horodatage, le client e-mail utilisé, le sujet du mail, le dossier dans lequel il est stocké).
- Je ne veux pas que mes métadonnées de communication soient accessibles (_e.g._ quand je me connecte au service e-mail, depuis où, quand j'intéragis sur le réseau).
Ces données peuvent permettre d'inférer des informations importantes sur mes correspondant⋅es et moi-même (destinataires, présence de pièce jointe, etc.).
### Synchronisation et collaboration sur des fichiers
- Je ne veux pas que le contenu de mes fichiers soit accessible
- Je ne veux pas que les métadonnées de mon fichier soient accessibles (eg. nom du fichier, dossier, format, taille, hash, etc.)
- Je ne veux pas que les métadonnées de communication soient accessibles (eg. quand j'accède au document, depuis où, qui d'autre, combien de fois, etc.), ces données permettent parfois d'inférer des métadonnées sur le protocole (taille, collaborateurs, type, etc.)
#### Synchronisation et collaboration sur des fichiers
- Je ne veux pas que le contenu de mes fichiers soit accessible à des personnes non autorisées.
- Je ne veux pas que les métadonnées de mes fichiers soient accessibles (_e.g._ nom du fichier, dossier, format, taille, hash, etc.).
- Je ne veux pas que mes métadonnées de communication soient accessibles (_e.g._ quand j'accède au document, depuis où, qui d'autre, combien de fois, etc.).
Ces données peuvent permettre d'inférer des informations importantes sur mes correspondant⋅es et moi-même (taille, collaborateurs, type, etc.).
## Attaquants
## Modèles d'attaquants
Quelques attaquants que l'on peut, ou ne pas, considérer :
Dans le domaine de la sécurité, on commence toujours par décrire l'« attaquant » : ses capacités, le temps dont iel dispose...
Car il n'existe aucune défense qui protège de toutes les attaques : il faut donc savoir contre qui on est en mesure de se défendre, ou pas.
Suivent quelques attaquants potentiels :
- Hébergeur de la machine (eg. branche un clavier et un écran sur l'ordi et récupère un accès admin)
- Administrateur Système (eg. utilise ses accès privilégiés pour accéder volontairement ou non à du contenu privé)
- Développeurs (eg. ajout d'une porte dérobée au moment de l'écriture du code)
- Chaîne logistique (eg. ajout d'une porte dérobée au moment de déployer l'app sur les serveurs ou le terminal de l'utilisateur)
- Opérateur Internet (eg. Orange)
- Regroupement d'opérateurs internet (cf "Tor netflow")
- Personne externe via internet (eg. hacker)
- Personne externe physique (eg. voleur)
- Regroupement d'acteurs (eg. opérateurs internet, externe physique ET internet)
- Utilisateurs (eg. pas de chiffrement sur son téléphone)
- Administrateur Système (_e.g._ utilise ses accès privilégiés pour accéder volontairement ou non à du contenu privé)
- Hébergeur de la machine non administrateur (_e.g._ branche un clavier et un écran sur l'ordi et récupère un accès admin)
- Développeurs (_e.g._ ajout d'une porte dérobée au moment de l'écriture du code d'un logiciel qu'on utilise)
- Chaîne logistique (_e.g._ ajout d'une porte dérobée au moment de déployer un logiciel sur les serveurs ou le terminal de l'utilisateur)
- Opérateur Internet (_e.g._ Orange), voit passer une partie de notre trafic
- Regroupement d'opérateurs Internet (cf "Tor netflow")
- Personne externe via Internet (_e.g._ hacker)
- Personne externe physique (_e.g._ voleur)
- Regroupement d'acteurs (_e.g._ opérateurs internet, externe physique ET internet)
- Usager⋅es, qui peuvent se faire pirateur leurs données par ailleurs (_e.g._ téléphone non protégé)
## Un exemple de ce qu'on pourrait faire
Prenons l'exemple de la messagerie instantanée. Pour l'instant, on peut définir les types de réseaux suivants :
- centralisé, pas chiffré (Messenger)
- centralisé, chiffé de bout en bout (avec toute une gamme d'implems, la meilleure étant peut-être Signal)
- fédéré, pas chiffré (E-mail, IRC, XMPP sans omemo, Matrix sans E2EE)
- centralisé, chiffé de bout en bout (il y en a une grande quantité, la meilleure étant peut-être Signal)
- fédéré, pas chiffré (E-mail, IRC, Matrix sans chiffrement de boût en boût (E2EE), XMPP sans Omemo)
- fédéré, chiffré (XMPP + Omemo, Matrix + E2EE)
- distribué, chiffré (Tox, Retroshare)
- distribué avec des mécanisme d'anonymat fort (Freenet, Mix networks, ...)
- distribué avec des mécanisme d'anonymat fort (Freenet, Mix networks)
Seule la dernière catégorie s'adresse au cas d'un "global passive attacker". On peut imaginer d'abandonner l'idée d'avoir une protection très efficace contre ce dernier car ça serait très contraignant sur le design et l'utilisabilité, et les cas où on en aurait vraiment besoin sont des cas particuliers où on peut faire l'effort d'utiliser une solution adaptée.
@ -92,5 +111,5 @@ Concernant la seconde approche, celle-ci semble beaucoup plus à notre portée :
## Ressources
- https://about.psyc.eu/Federation et https://about.psyc.eu/PSYC2
- Définition d'un mixnet : https://www.youtube.com/watch?v=dQtk0NcTseg
- [https://about.psyc.eu/Federation](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg) et [https://about.psyc.eu/PSYC2](https://about.psyc.eu/PSYC2)
- Définition d'un mixnet : [https://www.youtube.com/watch?v=dQtk0NcTseg](https://www.youtube.com/watch?v=dQtk0NcTseg)

View file

@ -0,0 +1,20 @@
---
title: "D53"
description: "D53 : entretient les petites routes DNS"
date: 2025-04-13T23:53:00.000Z
dateCreated: 2021-11-09T12:39:25.808Z
weight: 210
extra:
parent: 'infrastructures/creations.md'
---
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/d53/)
D53 est un outil de mise à jour automatique de routes DNS.\
Ses données de configuration sont hébergées de façon distribuée par [Consul](https://www.consul.io/).\
Il utilise l'API de l'hébergeur de nos zones DNS (à date, Gandi, que nous ne conseillons pas) pour les mettre à jour.
## Statut du développement
D53 est actuellement utilisé en production par Deuxfleurs. Il est cependant toujours en développement actif.\
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/d53>

View file

@ -0,0 +1,43 @@
---
title: "Déployer du logiciel"
description: "Déploiement d'un logiciel"
sort_by: "weight"
date: 2022-12-22
weight: 30
extra:
parent: 'infrastructures/operations.md'
---
# Empaqueter
Packager avec nix un conteneur Docker, le publier.
# Secrets
Créer les secrets avec [secretmgr](@/infrastructures/secretmgr.md)
# Base de données SQL
Si besoin, [créer une base de données PostgreSQL](@/infrastructures/create_database.md)
# Service Nomad
Créer un service Nomad
Voir les différentes déclarations dans [nixcfg cluster/prod](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/cluster/prod/app) :
- `core/deploy/diplonat.hcl`
- `core/deploy/tricot.hcl`
- `guichet/deploy/guichet.hcl`
Voir la [documentation nixcfg](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/doc/architecture.md#deploying-stuff-on-nomad) pour utiliser la ligne de commande Nomad.
# Sauvegardes
Voir la section appropriée : [Sauvegardes](@/infrastructures/sauvegardes.md)
# Supervision
Voir la section appropriée : [Supervision](@/infrastructures/supervision.md)

View file

@ -1,9 +1,9 @@
---
title: "Développement"
description: "Développement"
weight: 30
weight: 40
extra:
parent: 'infrastructures/machines.md'
parent: 'infrastructures/grappes.md'
---
Les serveurs de développement hébergent les outils qui nous permettent de travailler sur le logiciel,

View file

@ -1,17 +1,21 @@
---
title: "Diplonat"
description: ""
description: "Diplonat : murmure à l'oreille des routeurs"
date: 2021-11-09T12:42:17.716Z
dateCreated: 2021-11-09T12:42:15.729Z
weight: 30
weight: 200
extra:
parent: 'infrastructures/logiciels.md'
parent: 'infrastructures/creations.md'
---
# Diplonat
<img src="/img/diplonat-logo.jpg" alt="Logo officieux de Tricot : un col blanc et une cravate rouge" width="200px">
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/diplonat/)
- [Canal de discussion](https://matrix.to/#/%23diplonat:deuxfleurs.fr)
Diplonat est un utilitaire qui facilite l'hébergement de services dans un environnement réseau dynamique. Le cas le plus commun est lorsqu'il faut exposer un serveur situé dans un sous-réseau domestique, derrière un routeur souvent fourni par un FAI grand public. Diplonat aide alors à gérer les règles NAT de la passerelle, les règles de pare-feu du serveur lui-même, et potentiellement l'enregistrement DNS pour qu'il suive l'IP dynamique du sous-réseau.
## Status du développement
## Statut du développement
Diplonat est en développement, le code est versionné ici : <https://git.deuxfleurs.fr/Deuxfleurs/diplonat>. Il est exploité dans le cadre des activités de deuxfleurs.
Diplonat est actuellement utilisé en production par Deuxfleurs. Il est cependant toujours en développement actif.\
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/diplonat>

View file

@ -0,0 +1,191 @@
---
title: E-mails
description: Comprendre le fonctionnement des e-mails
weight: 55
draft: false
date: 2023-03-16
extra:
parent: 'infrastructures/operations.md'
---
## Serveurs
- SMTP: Postfix
- IMAP: Dovecot (fixé sur une machine avec un backup)
## Enregistrements DNS de la zone `deuxfleurs.fr`
| nom | type | valeur | signification |
| --- | ---- | ------ | ------------- |
| `@` | `MX` | `12 smtp.deuxfleurs.fr` | Serveur que chercheront à joindre les gens qui veulent envoyer un courrier à une addresse `@deuxfleurs.fr` |
| `smtp._domainkey` | `TXT` | `v=DKIM1; p=<clef publique>` | Enregistrement DKIM (voir ci-dessous) |
| `default._domainkey` | `TXT` | `v=DKIM1; p=<clef publique>` | Ancien enregistrement DKIM (voir ci-dessous) |
| `@` | `TXT` | `v=spf1 [...] -all` | Enregistrement SPF (voir ci-dessous) |
| `_dmarc` | `TXT` | `v=DMARC1; [...]` | Enregistrement DMARC (voir ci-dessous) |
| `smtp` | `A` | défini par D53 | Addresse IPv4 pour parler au serveur Postfix |
| `imap` | `A` | défini par D53 | Addresse IPv4 pour parler au serveur Dovecot |
| `201.80.66.82.in-addr.arpa.` | `PTR` | `orion.site.deuxfleurs.fr.` | Reverse DNS indiquant le nom de domaine correspondant à l'IP du serveur Postfix |
| `orion.site` | `A` | `82.66.80.201` | Reverse DNS indiquant le nom de domaine correspondant à l'IP du serveur Postfix |
## DKIM
Le mécanisme DKIM permet au serveur d'ajouter une signature sur les messages qui sortent de Deuxfleurs, pour que les destinataires puissent en attester la validité.
Il s'agit d'une signature RSA basée sur une paire de clefs privée/publique. La clef publique est donée dans l'enregistrement DNS DKIM, et la clef privée est connue
uniquement du serveur Postfix. La signature de chaque message est ajoutée dans un en-tête spécifique.
Référence : <https://www.cloudflare.com/learning/dns/dns-records/dns-dkim-record/>
**Exemple d'enregistrements DNS :**
```
default._domainkey.deuxfleurs.fr. 10800 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtdZp4qrgZR+6R7HeAkuLGJ/3L/6Ungvf5zwrMq6T8Tu931j2G4lYuPtsxyn9fZkT4y7DlX0waktLDB" "OCwf7X78nLEWjAFWiJTeWGRGhRdYRUFpscs9NUN0P+46jKlabibG3XTKd1DeAmywTu6o1oO03yiolrgKD1zgyDRFeUTfSwZIdPrdbcBSA1arda4WFtcBIrSygM9b4jtlqfQwGDrsMLbCBfVHDn4Wfm" "DWyNg0gDAkuLrYClNETk6aqIyj9fC8srKri0Qp3cRagCn+fjBvuxP35qWWJH7Rnnh/tuEDr1ufuNYO2KgJZ7JdMidUotxXE8cfU+OrEWQf4mIYeJ4wIDAQAB"
smtp._domainkey.deuxfleurs.fr. 1800 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtdZp4qrgZR+6R7HeAkuLGJ/3L/6Ungvf5zwrMq6T8Tu931j2G4lYuPtsxyn9fZkT4y7DlX0waktLDB" "OCwf7X78nLEWjAFWiJTeWGRGhRdYRUFpscs9NUN0P+46jKlabibG3XTKd1DeAmywTu6o1oO03yiolrgKD1zgyDRFeUTfSwZIdPrdbcBSA1arda4WFtcBIrSygM9b4jtlqfQwGDrsMLbCBfVHDn4Wfm" "DWyNg0gDAkuLrYClNETk6aqIyj9fC8srKri0Qp3cRagCn+fjBvuxP35qWWJH7Rnnh/tuEDr1ufuNYO2KgJZ7JdMidUotxXE8cfU+OrEWQf4mIYeJ4wIDAQAB"
default._domainkey.adnab.me. 3600 IN TXT "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHd2zQXgGAoFX2CFaRqvWw1oBGhbUIRB5QXPxE9nvWwe/og5LjZBcnKoInPWsKYEz/f5kmpTDq4RZT3PMmjm+u5IuvyQ2LJcdIKSW6t8KWa7yztk2D87f3Lono6WJwvY8RHdGPqKS5RXfEdQFriXiSCAO5ZSQrNXQ5yiQ9T1ptGwIDAQAB; t=s"
```
**Structure :**
- Le nom de domaine est composé d'un selecteur (souvent `default`, on a ici aussi `smtp`) qui permet de distinguer différentes clefs pour signer les messages.
Il est formé de la manière suivante: `<selecteur>._domainkey.<domaine>`
- La valeur est composé de plusieurs champs entre guillemets séparés par des `;`, le champ `v` peut contenir la version de DKIM utilisée (ici `v=DKIM1`)
- Le champ `p` contient la clef publique
- Les autres champs sont optionels
**Application à la vérification d'une signature (exemple) :**
Prenons la signature suivante :
```
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=deuxfleurs.fr; s=smtp;
t=1679050854; bh=AkDk3Tm0bnC7b6dvTjRXJbThLE6h/IStsBGIYGa+q7c=;
h=Date:To:From:Subject:From;
b=Qll5ASi9DmD2rw9LK1vJOahE77Pd/HNDbmrkrOCt4S8Nu42WtJXXOtiwo9J3KGPzR
zA2Cw5oCUB0HW5ere8RkINsUj9X/nxOovxFaJw4LSrgEYxQh7unaGBs6Ecw6k2Aqc/
oMhNE2OVCSlLkJVUQbgzwBUcZuwndlki6yYoJXkSPMuZ4tFbhgjSaxneRgUvPocYw3
Vqc/yMEAbofrlaEf6nSNQZL+LSE4IEBeudsv3JodMn12OYAijhO0rrHHsinK9UkM3M
PEEISyatG6RzE6veh4VVv3PTyJMYouQI7fKNooLuDmlGsdSTV9HRo4UvQeOQT1SL/7
KvgJtR0Hqz3mQ==
```
Cette signature contient les champs suivants :
- `v` (obligatoire) indique la version, doit toujours être à `1`
- `a` (obligatoire) indique l'algorithme de signature, généralement `rsa-sha256`
- `d` (obligatoire) indique le domaine pour lequel la signature est produite
- `s` (obligatoire) indique le sélecteur de la clef DKIM utilisée (ici `smtp` pour utiliser la clef `smtp._domainkey.deuxfleurs.fr`)
- `h` (obligatoire) indique la liste des en-têtes signés
- `bh` (obligatoire) donne le hash du contenu du message
- `b` (obligatoire) donne la signature à proprement parler, qui signe les en-têtes `h` et le hash du contenu `bh`
- `t` (recomandé) donne le timestamp de la signature, i.e. sa date et son heure
- `c` est un paramètre additionnel de la méthode de calcul de la signature
**Chez Deuxfleurs:**
- L'en-tête de signature est rajouté par notre serveur Postfix.
- La clef privée est stockée dans Consul, et est injectée dans le conteneur Postfix au lancement.
- Les enregistrements DNS pour DKIM sont installés manuellement.
- Pour tous les autres domaines dont le courrier est traîté par les serveurs Deuxfleurs, on utilise un enregistrement DKIM en CNAME vers `smtp._domainkey.deuxfleurs.fr` pour que la gestion des règles soit centralisée via l'enregistrement défini sur les DNS Deuxfleurs.
## SPF
L'enregistrement SPF sert à aider le serveur de destination à déterminer si le message reçu est légitime ou non, en vérifiant des contraintes sur l'addresse IP par laquelle il a été reçu.
Normalement, c'est l'addresse IP du serveur SMTP de Deuxfleurs, donc on sait qu'on doit rejeter tous les messages venant d'autres addresses.
Références : <https://fr.wikipedia.org/wiki/Sender_Policy_Framework>
**Exemple d'enregistrements DNS :**
```
deuxfleurs.fr. 300 IN TXT "v=spf1 mx:deuxfleurs.fr a:orion.site.deuxfleurs.fr ip4:82.66.80.201 ip6:2a01:e0a:28f:5e60::/64 -all"
adnab.me. 3600 IN TXT "v=spf1 mx mx:adnab.me include:mx.ovh.com -all"
ietf.org. 1794 IN TXT "v=spf1 ip4:50.223.129.192/26 ip6:2001:559:c4c7::/48 a:ietf.org mx:mail.ietf.org ip4:192.95.54.32/27 ip6:2607:5300:60:9ccf::/64 ip4:158.69.166.0/27 ip6:2607:5300:203:1b26::/64 ip4:4.31.198.32/27 ip6:2001:1900:3001:11::/64 include:_spf.google.com ~all"
```
**Structure :**
L'enregistrement commence par `v=spf1`, puis contient un ensemble de directives formées de la manière suivante:
- Un préfixe pouvant être `+` (résultat favorable), `?` (résultat neutre/aucune règle), `~` (entre le neutre et l'échec, utile pour déboguer), `-` (échec/défavorable). Le préfixe peut être omis, ce qui est interprété comme le préfixe `+`.
- Une paire type/valeur, avec les types suivants:
- `mx` : utiliser un enregistrement DNS de type MX. L'enregistrement `MX` donne un ou plusieurs noms d'hôtes, qui sont eux-même des noms DNS. Ces noms sont ensuite résolus en `A` ou `AAAA` pour trouver les addresses correspondantes. Attention, un enregistrement `MX` n'est pas sensé pointer sur un `CNAME`, il doit pointer directement sur des enregistrements `A` et `AAAA` !
- `ip4` : contient directement une plage d'addresses IPv4
- `ip6` : contient directement une plage d'addresses IPv6
- `a` : contient un nom d'hôte à résoudre en `A` ou `AAAA` (pouvant utiliser des `CNAME`)
- `include` : contient un nom de domaine ayant une autre règle SPF à inclure
- `ptr` : désuet
- Ou bien le mot `all`, qui correspond à tous les expéditeurs dont l'addresse ne correspond pas aux autres règles
Par exemple, dans les exemples ci-dessus, voici comment interpréter les différentes règles:
- `mx:deuxfleurs.fr` : accepter le message si l'IP de l'expéditeur est trouvable en suivant les enregistrements `MX` associés à `deuxfleurs.fr`.
- `ip4:82.66.80.201` : accepter le message si l'IP de l'expéditeur est `82.66.80.201`
- `include:mx.ovh.com` : accepter le message si il serait accepté par la règle du domaine `mx.ovh.com` (consultable en faisant `dig TXT mx.ovh.com`)
- `a:ietf.org` : accepter le message si il vient de l'addresse IP de `ietf.org` (consultable en faisant `dig A ietf.org`)
- `-all` : rejeter strictement tous les messages venant d'une autre addresse IP
**Chez Deuxfleurs :**
- L'enregistrement SPF, installé manuellement, contient `mx:deuxfleurs.fr`, ce qui signifie que les addresses IP sont celles présentes dans l'enregistrement `MX` pour `deuxfleurs.fr`.
- Cet enregistrement est fixé manuellement pour pointer sur le serveur `smtp.deuxfleurs.fr`.
L'enregistrement `A` pour `smtp.deuxfleurs.fr` est mis à jour automatiquement par D53 pour pointer vers l'IPv4 de la machine sur laquelle tourne Postfix.
- L'enregistrement SPF contient également `a:orion.site.deuxfleurs.fr`, qui contient également l'IPv4 de cette machine ; on garde cette règle en second recours au cas où il y aurait un problème avec la précédente, pour éviter de rejeter du courrier valide.
- L'enregistrement SPF contient également l'addresse IPv4 et la plage d'addresses IPv6 de la box à Orion (site où le serveur SMTP est actuellement déployé), pour en dernier recours éviter de rejeter des mails en cas de soucis avec les règles précédentes.
- **L'enregistrement SPF doit être mis à jour manuellement en cas de reconfiguration du serveur SMTP, en particulier si celui-ci change de site ou si les addresses IP changent.**
- Pour tous les autres domaines dont le courrier est traîté par les serveurs Deuxfleurs, on utilise un enregistrement SPF `include:deuxfleurs.fr` pour que la gestion des règles soit centralisée via l'enregistrement défini sur les DNS Deuxfleurs.
## DMARC
DMARC est un mécanisme qui permet de mieux contrôler la réaction des serveurs de destination en fonction des tests DKIM et SPF.
Par exemple, on peut préciser que tous les messages sont authentifiés par DKIM et SPF, et si un de ces tests échoue, le message doit nécessairement être rejeté.
On peut aussi demander à recevoir des rapports en cas d'échec.
Référence : <https://fr.wikipedia.org/wiki/DMARC>
**Exemple d'enregistrements DNS :**
```
_dmarc.deuxfleurs.fr. 300 IN TXT "v=DMARC1; p=reject; sp=reject; adkim=s; fo=1; aspf=s; ruf=mailto:prod-sysadmin@deuxfleurs.fr; rua=mailto:prod-sysadmin@deuxfleurs.fr; rf=afrf; pct=100; ri=86400"
_dmarc.adnab.me. 3600 IN TXT "v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; rua=mailto:postmaster@adnab.me!10m; ruf=mailto:postmaster@adnab.me!10m; rf=afrf; pct=100; ri=86400"
```
L'enregistrement peut contenir les champs suivants:
- `v=DMARC1` indique la version de DMARC utilisée
- `p` : procédure en cas d'échec avec le domaine principal (`none/quarantaine/reject`)
- `sp` : comme `p` mais s'applique aux sous-domaines
- `adkim` : indique si on doit appliquer la règle DKIM de manière stricte (`s`, le nom de domaine doit correspondre exactement) ou relaxée (`r`, des variations sur le nom de domaine sont permises)
- `aspf` : indique si on doit appliquer la règle SPF de manière stricte (`s`) ou relaxée (`r`)
- `ruf` : addresse mail à laquelle envoyer un rapport d'échec détaillé à chaque échec de validation
- `fo` : condition pour l'envoi d'un rapport d'échec détaillé (1 = si soit DKIM soit SPF a échoué)
- `rua` : addresse mail à laquelle envoyer un rapport d'échec aggrégé périodiquement
- `ri` : intervalle en secondes entre l'envoi des rapports aggrégés (86400 = 24h)
- `rf` : format des rapports (`afrf` est la seule valeur officiellement supportée)
- `pct` : proportion de messages à rejeter en cas d'échec
**Chez Deuxfleurs :**
- L'enregistrement DMARC est configuré pour rejeter de manière strict tout message ne passant pas la vérification SPF ou DKIM.
- Les rapports d'erreur doivent être envoyés à l'addresse `prod-sysadmin@deuxfleurs.fr` qui est consultés par les administrateurs systèmes de Deuxfleurs.
- Pour tous les autres domaines dont le courrier est traîté par les serveurs Deuxfleurs, on utilise un enregistrement DMARC en CNAME vers `_dmarc.deuxfleurs.fr` pour que la gestion des règles soit centralisée via l'enregistrement défini sur les DNS Deuxfleurs.
## Reverse DNS
L'enregistrement reverse DNS peut être utilisé par le serveur de destination
pour connaître le nom d'hôte correspondant à l'addresse IP du serveur qui a
envoyé le mail. Cet enregistrement doit idéalement correspondre à un nom de
domaine qui lui-même résoud à nouveau vers la même addresse IP.
L'application de cette règle de filtrage est à la discrétion des différents hébergeurs
mail, elle ne rentre pas dans le cadre défini par DMARC.
**Exemple d'enregistrements reverse DNS :**
```
201.80.66.82.in-addr.arpa. 86179 IN PTR orion.site.deuxfleurs.fr.
206.118.187.37.in-addr.arpa. 86400 IN PTR shiki.adnab.me.
```

View file

@ -0,0 +1,85 @@
---
title: Nom de domaine personnalisé
description: Nom de domaine personnalisé (+ migration d'une boîte existante)
weight: 10
draft: false
date: 2023-03-16
extra:
parent: 'infrastructures/email.md'
---
Deuxfleurs peut héberger vos e-mails, même s'ils ne finissent pas en `@deuxfleurs.fr` !
> Vous voulez votre propre nom de domaine mais ne savez pas comment faire ? [On vous l'explique ici](@/services/mettre-place-DNS.md).
Nous vous expliquons ici comment héberger une boîte mail avec un nom de domaine vous appartenant, en incluant la récupération (optionnelle) des e-mails existants chez votre ancien fournisseur vers les serveurs de Deuxfleurs.
1. Si vous souhaitez rapatrier vos anciens e-mails de l'ancien fournisseur vers Deuxfleurs, sauvegardez vos e-mails sur votre machine :
> Nous présentons une méthode fiable ([cf. ce guide](https://github.com/joeyates/imap-backup/blob/main/docs/migrate-server-keep-address.md)), mais qui demande de bonnes connaissances en informatique. Vous pourriez avoir besoin de l'aide d'un⋅e administrateur⋅ice de Deuxfleurs.
>
> Si vous lui déléguez complètement l'opération, iel aura besoin de vos mots de passe chez votre ancien opérateur mail, chez Deuxfleurs, et manipulera votre sauvegarde d'e-mails. On vous recommande dans ce cas de changer vos mots de passe avant et après l'opération, et de vous armer de confiance.
* Faites de la place ! Chez votre fournisseur actuel, supprimez votre corbeille, vos vieux e-mails volumineux et inutiles, etc.
* Téléchargez l'outil [`imap-backup`](https://github.com/joeyates/imap-backup/).
* Utilisez `imap-backup setup` pour renseigner vos identifiants ainsi que le serveur IMAP de votre fournisseur mail actuel.
* Lancez `imap-backup backup --accounts=<votre_adresse_mail>`, ce qui va télécharger tous vos e-mails sur votre ordinateur (c'est long).
1. Communiquez l'adresse courriel souhaitée à un⋅e administrateur⋅ice de Deuxfleurs. Iel devra réaliser les opérations suivantes :
* ajouter le nom de domaine à la liste des [domaines gérés par Deuxfleurs dans le LDAP](https://guichet.deuxfleurs.fr/admin/ldap/ou=domains,ou=groups,dc=deuxfleurs,dc=fr). Pour cela, une fois sur la page guichet :
* appuyer sur le bouton vert « +objet »
* Dans `Identifiant`, on peut mettre l'identifiant de l'usager⋅e concerné⋅e
* Dans `Description`, mettre quelque chose comme `Nom de domaine de XXX`
* Dans `StructuralObjectClass`, mettre `groupOfNames`
* Dans `ObjectClass`, mettre `groupOfNames`, puis, à la ligne, `top`, et, encore à la ligne, `dNSDomain`
* Valider avec le bouton « Créer l'objet »
* Ajouter un attribut `domain` et y mettre le nom de domaine de l'adresse courriel souhaitée
* ajouter le nom de domaine à la [table de signature DKIM](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/cluster/prod/app/email/config/dkim/signingtable). Une fois fait, iel devra la déployer :
* il faut lancer le `tlsproxy` du dépôt `nixcfg` en visant `prod`
* sur un autre terminal, se connecter en SSH sur une de ces machines
* sur encore un autre terminal, en local, à l'intérieur du dossier `nixcfg`, se situer à l'emplacement `cluster/prod/app/email/deploy`. Puis lancer `nomad plan email.hcl`. Si et seulement si la sortie paraît satisfaisante, alors lancer `noman run email.hcl`.
* ajouter l'adresse courriel dans l'entrée `mail` de votre profil utilisateur LDAP. Il doit y avoir une adresse courriel par ligne, et il faut laisser l'adresse en `@deuxfleurs.fr` à la première. On peut ici ajouter autant d'alias que l'on veut, et tout sera reçu sur la même boîte de réception.
1. Vous devez ensuite rajouter les entrées pour votre nom de domaine en éditant votre zone DNS (si vous n'y comprenez rien, faites-vous aider de l'admin) :
```
# L'entrée MX pour recevoir les e-mails
@ MX 10 smtp.deuxfleurs.fr.
# L'entrée SPF pour autoriser notre IP à délivrer des e-mails en votre nom
@ TXT "v=spf1 include:deuxfleurs.fr -all"
# L'entrée DKIM pour autoriser notre postfix+opendkim à délivrer des e-mails en votre nom
smtp._domainkey CNAME smtp._domainkey.deuxfleurs.fr.
# L'entrée DMARC pour indiquer le comportement à adopter si les contraintes précédentes ne sont pas satisfaites
_dmarc CNAME _dmarc.deuxfleurs.fr.
```
1. À partir de ce point, vous pouvez envoyer et recevoir vos e-mails via notre infrastructure. [Suivez le Guide !](@/prise_en_main/email.md)
Il faudra par contre attendre 24/48h pour que les changements DNS se propagent dans le monde entier. Vous pourriez encore recevoir quelques e-mails chez votre ancien fournisseur dans l'intervalle. Passé ce délai, vérifiez dans l'interface e-mail de votre ancien fournisseur.
1. Si vous avez sauvegardé vos e-mails sur votre machine, il est finalement temps de les envoyer sur les serveurs de Deuxfleurs (toujours avec l'aide optionnelle de l'admin, si vous êtes bloqué⋅e) :
* Assurez-vous d'avoir terminé la sauvegarde en étape 1.
* Trouvez sur votre machine le dossier contenant la configuration d'`imap-backup` et votre sauvegarde d'e-mails (`~/.imap-backup/` sur Linux).
* Modifiez manuellement le fichier de configuration d'`imap-backup` et le nom du dossier de votre sauvegarde comme expliqué dans [le guide sus-cité](https://github.com/joeyates/imap-backup/blob/main/docs/migrate-server-keep-address.md). Imaginons que votre adresse mail est `moi@chezmoi.fr` :
* Remplacez à la ligne `username` votre e-mail par `moi-avant@chezmoi.fr` dans le fichier de configuration `config.json` d'`imap-backup`.
* Dans le même fichier, à la ligne `local_path`, remplacez le nom du dossier `moi_chezmoi.fr` par `moi-avant_chezmoi.fr`.
* Renommez le dossier `moi_chezmoi.fr` en `moi-avant_chezmoi.fr` dans le dossier d'`imap-backup`.
* Utilisez `imap-backup setup` pour renseigner vos identifiants Deuxfleurs (toujours le même e-mail, et votre mot de passe chez nous), ainsi que le serveur IMAP de Deuxfleurs (`imap.deuxfleurs.fr`).
* C'est le grand moment de la migration. Toujours en imaginant que votre adresse mail est `moi@chezmoi.fr`, lancez la commande suivante :
```imap-backup migrate moi-avant@chezmoi.fr moi@chezmoi.fr --destination-delimiter "."```
La commande devrait produire peu de lignes, et vous devriez voir (par exemple sur [sogo.deuxfleurs.fr](https://sogo.deuxfleurs.fr)) vos anciens e-mails apparaître. Si ce n'est pas le cas, appelez à l'aide.
Une fois cette longue commande terminée, c'est terminé. Bienvenu⋅e chez nous :)

View file

@ -3,9 +3,9 @@ title: "Énergie"
description: "Consommation électrique"
date: 2021-11-09T12:54:33.129Z
dateCreated: 2021-11-09T12:54:30.985Z
weight: 20
weight: 40
extra:
parent: 'infrastructures/_index.md'
parent: 'infrastructures/machines.md'
---

View file

@ -1,14 +1,19 @@
---
title: "Garage"
description: ""
description: "Garage : le stockage objet distribué"
date: 2021-11-09T12:42:59.273Z
dateCreated: 2021-11-09T12:42:57.245Z
weight: 40
weight: 10
extra:
parent: 'infrastructures/logiciels.md'
parent: 'infrastructures/creations.md'
---
# Garage
<img src="/img/garage-logo.svg" alt="Logo officiel de Garage : une sorte de crabe" width="200px">
- [Site officiel](https://garagehq.deuxfleurs.fr)
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/garage/)
- [Canal de discussion](https://matrix.to/#/%23garage:deuxfleurs.fr)
Garage est un utilitaire de stockage d'objets léger, distribué, et compatible avec l'interface Amazon S3. Il poursuit les objectifs suivants :
@ -24,17 +29,24 @@ Il ne cherche pas à :
* implémenter complètement l'API de S3
* implémenter des codes d'effacement (notre modèle consiste en dupliquer les données telles quelles sur plusieurs nœuds)
À l'heure actuelle, Garage est déployé sur notre grappe de serveurs (ce site même est hébergé sur Garage !), mais doit tout de même être considéré comme une démonstration technique.
## Statut du développement
Si vous voulez en savoir plus sur Garage, vous pouvez consulter notre [documentation](https://garagehq.deuxfleurs.fr/) :
Garage est un logiciel mature (v1.0 en avril 2024), déployé en [production](@/infrastructures/production.md) par Deuxfleurs depuis 2020, soutenu par une communauté mondiale qui le développe et l'administre, de la plus petite à la plus grand échelle.\
Le développement de Garage a bénéficié de plusieurs subventions européennes NGI/NLnet.
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/garage>
## En savoir plus
Pour plus d'information, vous pouvez consulter la [documentation de Garage](https://garagehq.deuxfleurs.fr/) :
* [Introduction rapide](https://garagehq.deuxfleurs.fr/documentation/quick-start/) : apprenez à interagir efficacement avec Garage
* [Travaux liés](https://garagehq.deuxfleurs.fr/documentation/design/related-work/) : pour comprendre pourquoi nous avons développé notre propre logiciel au lieu d'en choisir un existant
* [Technique interne](https://garagehq.deuxfleurs.fr/documentation/design/internals/) : une brève description des modèles de données utilisés dans Garage
Liens externes :
Ou lire nos communications :
* [Dépôt](https://git.deuxfleurs.fr/Deuxfleurs/garage/) : Garage est un logiciel libre développé sur notre propre instance Gitea
* Article de médiation scientifique (PDF, français) : [Présentation de Deuxfleurs & Garage](https://www.societe-informatique-de-france.fr/wp-content/uploads/2023/11/1024_22_2023_171.html), novembre 2023
* Présentation scientifique (PDF, anglais) : [Deuxfleurs & Garage presentation](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/branch/main/doc/talks/2023-01-18-tocatta/talk.pdf), janvier 2023
* Présentation militante (vidéo & PDF, français) : [De l'auto-hébergement à l'entre-hébergement : Garage, pour conserver ses données ensemble](@/formations/capitole-du-libre-2022.md), novembre 2022

View file

@ -0,0 +1,51 @@
---
title: "Grappes"
description: "Les grappes"
weight: 10
sort_by: "weight"
extra:
parent: 'infrastructures/machines.md'
---
Les machines gérées par Deuxfleurs ont différents _rôles_, qui définissent à quelle grappe ou _cluster_ elles appartiennent.
\
Elles séjournent dans différentes _zones géographiques_, au domicile de certain⋅es des [opérateur⋅ices](@/vie_associative/charte_operateurice.md), souvent par groupe de 2 ou 3 machines.
<!-- Nous avons mis en réseau une dizaine de machines, des ordinateurs de bureau, réunies en deux principaux rôles ou _clusters_ : -->
- [Production](@/infrastructures/production.md) - Les serveurs de production sont ceux qui font tourner les [services](@/services/_index.md) accédés par les usager·es ([sites web](@/services/web.md), [e-mails](@/services/email.md), clavardage, visio...).
C'est la grappe la plus critique,
S'ils sont inaccessibles, alors les services ne fonctionnent plus.
Et si une personne malveillante y accède, elle peut avoir accès à des données personnelles des usager·es.
- Orsay (Neptune)
- Lyon (Orion)
- Bruxelles (Bespin)
- [Expérimentation](@/infrastructures/xp.md) (_staging_) - Les serveurs d'expérimentation servent à tester les nouvelles configurations, les nouveaux logiciels, et le nouveau matériel.
Ils permettent aux opérateur·ices de se familiariser avec leurs modifications et de minimiser l'impact d'un changement sur les serveurs de production, et donc sur la disponibilité des services.
Ces machines ne contiennent pas de données personnelles et ne sont pas critiques, elles n'ont pas besoin de rester tout le temps allumées.
Il n'est pas nécessaire d'être opérateur·ice pour gérer une de ces machines.
- Suresnes (Mercure)
- Rennes (Jupiter)
Il est des fonctions annexes (comme les sauvegardes, le développement ou la supervision) qu'il convient de ne pas héberger directement sur les ordinateurs que l'on administre :
au cas où ce seraient justement nos logiciels d'administration qui déconnent, ainsi que pour éviter que les dysfonctionnements de ces machines n'impactent les services en production.
On compte deux clusters de ce type :
- [Support](@/infrastructures/support.md) - Les serveurs de support servent pour les sauvegardes et la supervision des serveurs de production (eg. Grafana, Minio).
Ils participent au bon fonctionnement de la production.
Ils n'ont pas de données personnelles brutes mais contiennent des métriques qui reflètent le comportement des usager·es ; ainsi que nos sauvegardes régulières, qui sont chiffrées (et donc illisibles sans la bonne clé), mais contiennent tout de même des données personnelles.
- Bruxelles (Bespin)
- [Développement](@/infrastructures/developpement.md) - Les serveurs de développement hébergent les outils qui nous permettent de travailler sur le logiciel, les configurations, les tickets, ou la compilation.
Ils ne contiennent pas de données personnelles mais peuvent être utilisés pour des attaques de chaîne d'approvisionnement (*supply chain attack*).
À terme, ce rôle pourrait être fusionné avec la production.
- Orsay (Neptune)
- Rennes (Jupiter)

View file

@ -1,19 +1,20 @@
---
title: "Guichet"
description: ""
description: "Guichet : l'interface d'administration de l'asso"
date: 2021-11-09T12:39:27.819Z
dateCreated: 2021-11-09T12:39:25.808Z
weight: 20
weight: 50
extra:
parent: 'infrastructures/logiciels.md'
parent: 'infrastructures/creations.md'
---
# Guichet
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/guichet/)
Guichet est une interface de gestion utilisateur LDAP pour Bottin.
Il vise notamment à permettre aux utilisateurs de modifier leurs identifiants ainsi que leurs données personnelles.
Guichet est l'interface web d'administration de Deuxfleurs.
Il vise notamment à permettre aux usager⋅es à visualiser et modifier leurs données personnelles.\
Il repose sur le serveur LDAP [Bottin](@/infrastructures/bottin.md), une autre de nos créations.
## Statut du développement
Guichet est actuellement utilisé en production pour Deuxfleurs. Il est cependant toujours en développement actif.
Guichet est actuellement utilisé en production par Deuxfleurs. Il est cependant toujours en développement actif.\
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/guichet>

View file

@ -0,0 +1,110 @@
---
title: "Créer un nœud"
description: "Guide d'initialisation de nœud Deuxfleurs"
date: 2022-08-23
dateCreated: 2022-08-23
weight: 11
extra:
parent: 'infrastructures/noeud.md'
---
Ce guide explique comment initialiser un nœud pour l'infrastructure de Deuxfleurs. Nous partons de zéro, c'est-à-dire avec une machine que nous venons de récupérer, avec une mémoire vide, et que nous venons de brancher. À titre d'exemple, nous illustrerons de temps en temps les opérations avec une de nos machines (un Thinkcentre de Lenovo).
## Configuration de l'UEFI
Configurons d'abord quelques paramètres dans l'UEFI de la machine. Démarrez-là et appuyez sur la touche pour accéder à ce menu. Chez nous, il s'agit de F1. Si le PXE est activé, désactivons-le : un attaquant présent sur le réseau local pourrait faire démarrer une machine sur une installation malveillante. Vérifions que les *C-States* sont pris en charge, cela permet une meilleure gestion de l'énergie. Configurons également la machine pour qu'elle démarre après avoir subi une coupure électrique, cela se révèlera pratique lorsqu'il y en aura une. Si l'option est là, autorisons le démarrage sans clavier branché, pour ne pas être embêté lorsque nous démarrons une machine pour SSH dessus. Enfin, dans le cadre de l'infrastructure Deuxfleurs, nous supporterons uniquement l'UEFI, nous pouvons donc désactiver les options de compatibilité BIOS.
## Installation de NixOS
> Aucun écran ou clavier n'est disponible pour l'ordinateur cible ? NixOS peut être installé en SSH, une page y est dédiée : [Installer NixOS sans écran](@/infrastructures/ssh_sans_ecran.md).
Pour installer NixOS, nous aurons besoin d'une clé USB avec une image amorçable (*live*) de NixOS dessus. Nous pouvons télécharger la distribution linux en 64 bits et en version minimale (sans interface graphique et avec moins d'utilitaires) sur le [site officiel](https://nixos.org/download.html). Pour écrire l'image sur le support USB, on peut faire `dd if=chemin-vers-le-fichier-iso of=/dev/sdX status=progress; sync`, en remplaçant `sdX` par le fichier périphérique correspondant à la clé, trouvé avec `lsblk` par exemple.
Alternativement, cela peut être l'occasion de créer une clé USB formatée avec [Ventoy](https://ventoy.net), un utilitaire très pratique
qui permet d'avoir plusieurs images ISO bootables depuis une même clef USB (utile si vous n'arrêtez pas de reformater vos clefs pour passer d'une distribution à une autre!)
Branchons la clé USB et démarrons dessus. Chez nous, c'est possible grâce à un menu accessible via la touche F12. Lançons NixOS sans option particulière. Accordons-nous tous les droits et configurons un clavier habituel. On peut également vérifier la connexion internet :
```
$ sudo su
# loadkeys fr-latin9
# ping deuxfleurs.fr
```
Nous pouvons faire `lsblk` pour examiner les disques de la machine. Chez nous, nous avons simplement un disque dur complètement vide de 500Go associé à `/dev/sda`. Nous allons formater le disque avec `cgdisk` :
```
# cgdisk /dev/sda
```
Nous créons d'abord, avec l'option `New`, une partition qui commence au début, fait 512Mo, avec un code hexadécimal `EF00`, et que nous appelerons «EFI» : c'est le secteur de démarrage.
Puis nous créons à la suite une partition de 8Go, avec un code hexadécimal `8200`, nommée «swap» : c'est l'espace d'échange.
Enfin sur tout le reste, nous créons une partition avec un code hexadécimal `8300`, que nous appelerons par exemple «root» : c'est la racine du système linux.
Pour appliquer les changements, nous utilisons l'option `Write`. Nous pouvons ensuite quitter avec `Quit`, et éventuellement vérifier le résultat avec `lsblk`.
Finalisons les partitions. Dans notre cas, nous devons créer les systèmes avec :
```
# mkfs.fat -F 32 /dev/sda1
# mkswap /dev/sda2
# mkfs.xfs /dev/sda3
```
Nous utilisons ici xfs car nous sommes équipés d'un disque rotatif.
Montons les partitions fraîchement créées.
```
# mount /dev/sda3 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
# swapon /dev/sda2
```
> (06/2023) Alors qu'ils avaient directement monté un second disque sur `/mnt/mnt/storage`, Adrien & Lauric on vu échouer `nixos-install` avec l'erreur suivante :
>
> `rmdir: Failed to remove '/mnt': Directory not empty`.
>
> Si vous avez le même problème, essayez de recommencer l'installation avec uniquement le disque contenant le système (et configurez les autres disques plus tard).
Le résultat est vérifiable avec `df -h`. À ce stade, nous pouvons générer la configuration de NixOS dans cette arborescence, et l'éditer par exemple avec `nano` :
```
# nixos-generate-config --root /mnt
# nano /mnt/etc/nixos/configuration.nix
```
Ce fichier décrit la configuration du système de manière générale. NixOS le versionne, et à l'utilisation, chaque modification génère une nouvelle «génération». En cas d'erreur par exemple, nous pourrons revenir facilement à une génération précédente. Ainsi nous décrivons ici la première génération de notre système à venir. Nous n'allons en réalité modifier que quelques choses par rapport à la configuration par défaut. Décommentons et définissons le nom d'hôte et le fuseau horaire :
```
networking.hostName = "nomDeLaMachine";
```
```
time.timeZone = "Europe/Paris";
```
Pour les propriétés d'internationalisation, nous pouvons par exemple définir ceci :
```
i18n.defaultLocale = "fr_FR.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "fr-latin9";
};
```
Attention en tout cas à ne pas définir en même temps `keyMap` et `useXkbConfig`, ces deux options peuvent se contredire. Pour l'utilisateur et les paquets du système, nous pouvons par exemple partir sur :
```
users.users.nomUtilisateur = {
isNormalUser = true;
extraGroups = [ "wheel" ];
};
```
```
environment.systemPackages = with pkgs; [
vim
git
wget
emacs
];
```
L'installation de git est nécessaire pour rejoindre un cluster Deuxfleurs.
Enfin activons le serveur SSH en décommentant :
```
services.openssh.enable = true;
```
Nous pouvons enregistrer et fermer le fichier, puis lancer l'installation avec :
```
# nixos-install
```
Au bout d'un certain temps, le processus va nous demander le mot de passe pour le compte root. Une fois donné, l'installation devrait être terminée. Nous pouvons redémarrer sur la machine, et nous connecter en tant que root. Définissons le mot de passe de l'utilisateur spécifié dans la configuration auparavant (nomUtilisateur) avec :
```
# passwd nomUtilisateur
```
Nous pouvons si nous le voulons nous déconnecter avec `exit` et tester la connexion sur nomUtilisateur en local ou en SSH.

View file

@ -1,14 +1,20 @@
---
title: "Services"
description: "Annuaire des services hébergés chez Deuxfleurs"
weight: 10
title: "Liste exhaustive"
description: "Liste exhaustive des logiciels utilisés par Deuxfleurs"
sort_by: "weight"
weight: 60
extra:
parent: 'infrastructures/_index.md'
parent: 'infrastructures/logitheque.md'
---
Cette page tente de recenser de façon exhaustive l'ensemble des services qui
fonctionnent actuellement sur les machines de Deuxfleurs, dans les différents
rôles identifiés : production, développement, expérimentation, etc.
Cette page a été élaborée en 2022 dans le cadre de [notre candidature au collectif CHATONS](https://framagit.org/chatons/CHATONS/-/issues/188), et est _parfois_ mise à jour.\
Elle tente de recenser de façon exhaustive l'ensemble des applications qui assurent le fonctionnement de Deuxfleurs, et leurs [rôles](@/infrastructures/grappes.md) respectifs (production, support...).\
La liste des logiciels que l'on développe nous-mêmes est disponible à la page « [Nos créations](@/infrastructures/creations.md) ».
> On répète que cette liste est condamnée à être toujours obsolète, n'étant pas mise à jour à chaque modification de nos infrastructures.\
> Si vous voulez connaître l'état du monde à l'instant _t_, équipez-vous d'une personne technicienne et allez plutôt lire notre dépôt [`nixcfg`](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg) &ndash; qui décrit formellement l'état de toutes nos machines.
## La liste à la Prévert
| Service | Rôle | Site | Description |
| -- | -- | -- | -- |
@ -29,7 +35,7 @@ rôles identifiés : production, développement, expérimentation, etc.
| Prometheus | production | Neptune, Bespin | Interface de monitoring de l'infrastructure |
| [Grafana](https://grafana.deuxfleurs.fr) | production | Neptune | Interface de monitoring de l'infrastructure |
| [Forgejo](https://git.deuxfleurs.fr) | développement | Bespin | Forge logicielle |
| [Drone](https://drone.deuxfleurs.fr) | développement | Neptune | Serveur d'intégration continue |
| [Woodpecker](https://woodpecker.deuxfleurs.fr/) | développement | Neptune | Serveur d'intégration continue |
| Drone (runner) | développement | Bespin | Worker pour l'intégration continue |
| SSH | sauvegarde | Mercure | Target de backups (Consul) |
| [Minio](https://s3.deuxfleurs.shirokumo.net) | sauvegarde | Mercure | Target de backups restic |
@ -41,12 +47,9 @@ rôles identifiés : production, développement, expérimentation, etc.
| [Grafana](https://grafana.staging.deuxfleurs.org) | expérimentation | Neptune/Jupiter | Interface de monitoring |
| [Jaeger](https://jaeger.staging.deuxfleurs.org) | expérimentation | Neptune/Jupiter | Interface de monitoring |
Une liste de sites séparés par des virgules (e.g. Neptune, Orion) indique un service qui stocke des données
et dont le fonctionnement est simultanément assuré par plusieurs sites pour garantir la disponibilité des données
lorsqu'un des sites est indisponible.
Une liste de sites séparés par des slash (e.g. Neptune/Jupiter) indique un service qui ne stocke pas lui-même
de données, et dont le basculement d'un site à un autre est automatisé en cas de panne.
<small>
Sur le cluster de production, notre serveur Garage stocke des données sur les 4 sites (Neptune, Orion, Jupiter, Bespin),
mais l'accès extérieur se fait uniquement par les noeuds de Orion.
- Une liste de sites séparés par des virgules (e.g. Neptune, Orion) indique un service qui stocke des données et dont le fonctionnement est simultanément assuré par plusieurs sites pour garantir la disponibilité des données lorsqu'un des sites est indisponible.
- Une liste de sites séparés par des slash (e.g. Neptune/Jupiter) indique un service qui ne stocke pas lui-même de données, et dont le basculement d'un site à un autre est automatisé en cas de panne.
</small>

View file

@ -0,0 +1,67 @@
---
title: "Logithèque"
description: "Bibliothèque des logiciels de Deuxfleurs"
weight: 20
extra:
parent: 'infrastructures/_index.md'
---
Ces rayonnages électriques documentent les logiciels utilisés pour faire fonctionner nos infrastructures.
- Épluchez le [registre exhaustif](@/infrastructures/liste_logiciels.md) des logiciels dont on dépend
- Découvrez [nos créations](@/infrastructures/creations.md), les logiciels que l'on développe nous-même
<!-- *Ajouter un schéma* -->
# Les composants
**Orchestrateur** - L'orchestrateur est en charge de placer les applications
sur les serveurs de sorte qu'en cas de crash, une application soit relancée ailleurs.
En fonctionnement nominal, l'orchestrateur se charge de placer les applications de sorte
à ce que les ressources soient utilisées au mieux. Nous utilison le logiciel Nomad à ces fins.
[↣ Accéder au code source de Nomad](https://github.com/hashicorp/nomad)
**Catalogue de service** - Le catalogue de service permet aux services ayant des dépendances, par exemple
Matrix a une dépendance sur PostgreSQL et Garage, de savoir comment contacter ces dépendances.
Pour ce faire, nous utilisons Consul, qui nous sert également à gérer nos secrets.
[↣ Accéder au code source de Consul](https://github.com/hashicorp/consul/)
**Base de données relationnelle** - Les bases de données relationnelles sont au coeur de
la plupart des applications web car elles permettent de requêter efficacement des données structurées.
Nous utilisons PostgreSQL qui est un des standard du libre, et afin de le distribuer, nous utilisons
Stolon.
[↣ Accéder au code source de PostgreSQL](https://git.postgresql.org/gitweb/?p=postgresql.git;a=summary)
[↣ Accéder au code source de Stolon](https://github.com/sorintlab/stolon)
**Base de données NoSQL** - Nous prévoyions certains développements spécifiques,
pour lesquels nous avons le loisir de définir la structure de données.
Dans ce cas, nous pouvons l'optimiser pour Garage K2V qui est bien plus facile à opérer que PostgreSQL.
[↣ Accéder au code source de Garage](https://git.deuxfleurs.fr/Deuxfleurs/garage)
**Stockage objet** - De nombreuses applications ont besoin de stocker des fichiers également,
des données considérées non structurées dans ce cas. Ici l'enjeu n'est plus tant de pouvoir
requêter les données avec souplesse que de pouvoir stocker de grands volumes.
On peut prendre comme exemple les médias (photo, vidéo) partagés sur Matrix.
Nous utilisons l'API S3 de Garage pour ces besoins.
[↣ Accéder au code source de Garage](https://git.deuxfleurs.fr/Deuxfleurs/garage)
**Authentification** - Afin de faciliter la vie des usager-es, il est possible de proposer un système d'authentification unique.
Pour commencer, nous avons choisi le protocole LDAP qui a pour principal avantage d'être largement installé et compatible,
principalement grâce à son ancienneté. Nous utilisons notre propre implémentation, nommée Bottin.
[↣ Accéder au code source de Bottin](https://git.deuxfleurs.fr/Deuxfleurs/bottin)
**Conteneurs** - Afin de packager, publier et isoler les différentes applications qui fonctionnent sur nos serveurs,
nous utilisons des conteneurs Linux, et plus précisément, Docker. Afin de créer des images les plus petites possibles,
nous utilisons NixOS. Pour certaines vieilles images, nous utilisons encore Debian.
[↣ Accéder au code source de Docker](https://github.com/moby/moby)
[↣ Accéder au code source de Nix](https://github.com/NixOS/nixpkgs)
[↣ Accéder au code source de Debian](https://www.debian.org/distrib/packages)

View file

@ -1,53 +1,21 @@
---
title: "Serveurs"
description: "Serveurs"
weight: 40
title: "Les machines"
description: "Salle des machines"
weight: 10
sort_by: "weight"
extra:
parent: 'infrastructures/_index.md'
---
# Rôles
Ce coin du Guide présente [les ordinateurs](infrastructures/grappes.md) qui constituent notre infrastructure : leurs [rôles](@/infrastructures/grappes.md), les lieux où ils sont hébergés, les [connexions réseaux](@/infrastructures/reseau.md) nécessaires, l'[énergie consommée](@/infrastructures/energie.md), l'impact de leur fabrication, de leur fin de vie...
Nous avons identifié 4 rôles pour nos serveurs, en fonction de la criticité des charges de travail
et des données qu'ils auront à gérer.
Promouvant la **sobriété numérique**, on veille à ne pas consommer plus de ressources que nécessaire pour fournir les services de l'association.
On utilise par exemple exclusivement des ordinateurs de bureau datés de quelques années (souvent rachetés à bas prix au [domaine](https://encheres-domaine.gouv.fr/hermes/biens-mobiliers/high-tech)).
Car un serveur n'est jamais qu'un ordinateur qui exécute des logiciels fournissant des services. Votre téléphone pourrait tout aussi bien assurer cette mission.
Mais un serveur, ça doit être prêt à répondre aux requêtes à n'importe quelle heure.
Toutes les machines présentées ici sont donc branchées 24/7 dans l'attente que vous vous y connectiez.
Ça en fait de la [consommation électrique](@/infrastructures/energie.md) !
[Production](@/infrastructures/production.md) - Les serveurs de productions sont ceux qui font tourner les services accédés par les usager·es (eg. Plume, Matrix, Cryptpad).
Si ils sont inaccessibles, alors les services ne fonctionnent plus. Et si une personne malveillante y accède, elle peut avoir accès à des données
personnelles des usager·es. C'est donc le rôle le plus critique.
[Support](@/infrastructures/support.md) - Les serveurs de support servent pour les sauvegardes et la supervision des serveurs de production (eg. Grafana, Minio).
De par leur rôle, ils participent au bon fonctionnement de la production.
Ils n'ont pas de données personnelles brutes mais les métriques collectées peuvent refléter certains comportement des usager·es
et les sauvegardes, bien qu'elles soient chiffrées, contiennent tout de même des données personnelles.
[Développement](@/infrastructures/developpement.md) - Les serveurs de développement hébergent les outils qui nous permettent de travailler sur le logiciel,
les configurations, les tickets, ou la compilation. Ils ne contiennent pas de données personnelles mais peuvent être utilisés pour
des attaques de chaîne d'approvisionnement (*supply chain attack*). À terme, ce rôle pourrait être fusionné avec la production.
[Expérimentation](@/infrastructures/xp.md) - Les serveurs d'expérimentation servent à tester les nouvelles configurations, les nouveaux logiciels,
et le nouveau matériel. Ils permettent aux opérateur·ices de se familiariser avec leurs modifications et de minimiser l'impact d'un changement sur les serveurs de production,
et donc sur la disponibilité des services. Ces machines ne contiennent pas de données personnelles et ne sont pas critiques, elles n'ont pas besoin de rester tout le temps allumées.
Il n'est pas nécessaire d'être opérateur·ice pour gérer une de ces machines.
# Zones
En fonction des propriétés voulues, nous pouvons être amenés à répartir les serveurs d'un rôle spécifique entre plusieurs lieux géographiques,
que nous appelons des zones.
Nous avons 3 zones pour la production :
- Orsay (Neptune)
- Lyon (Orion)
- Bruxelles (Bespin)
Nous avons 2 zones pour le support :
- Suresnes (Mercure)
- Rennes (Jupiter)
Nous avons 1 zones pour le développement :
- Bruxelles (Bespin)
Nous avons plusieurs zones pour l'expérimentation :
- Orsay (Neptune)
- Rennes (Jupiter)
Notre approche vers la sobriété, c'est de **visibiliser la matérialité** du numérique.
C'est le but de ces pages : qu'on puisse constater ce qu'il en coûte matériellement que d'héberger vos e-mails et sites web de façon sobre et résiliente.

View file

@ -0,0 +1,11 @@
---
title: "Maintien en condition"
description: "Maintien en condition"
sort_by: "weight"
weight: 40
extra:
parent: 'infrastructures/operations.md'
---
- [Mettre à jour Matrix (Synapse/Element)](@/infrastructures/maj_matrix.md)
- Mettre à jour les certificats du cluster : cf. [feuille de route de l'atelier 2024](https://pad.deuxfleurs.fr/code/#/2/code/view/mYz4-9xVfeuCUxkYbqB2vuT7gkGbmNPa-v+jRLhP+50/)

View file

@ -0,0 +1,97 @@
---
title: "MàJ Matrix"
description: "Mise à jour de Matrix (Synapse/Element)"
date: 2022-12-22
dateCreated: 2022-12-22
weight: 11
extra:
parent: 'infrastructures/maintien_en_condition.md'
---
## 1. Build the new containers
Often, I update Riot Web and Synapse at the same time.
* Open `app/docker-compose.yml` and locate `riot` (the Element Web service) and `synapse` (the Matrix Synapse server). There are two things you need to do for each service:
* Set the `VERSION` argument to the target service version (e.g. `1.26.0` for Synapse). This argument is then used to template the Dockerfile.
The `VERSION` value should match a github release, the link to the corresponding release page is put as a comment next to the variable in the compose file;
* Tag the image with a new incremented version tag. For example: `superboum/amd64_riotweb:v17` will become `superboum/amd64_riotweb:v18`.
We use the docker hub to store our images. So, if you are not `superboum` you must change the name with your own handle, eg. `john/amd64_riotweb:v18`. This requires that you registered an account (named `john`) on https://hub.docker.com.
So, from now we expect you have:
* changed the `VERSION` value and `image` name/tag of `riot`
* changed the `VERSION` value and `image` name/tag of `synapse`
From the `/app` folder, you can now simply build and push the new images:
```bash
docker-compose build riot synapse
```
And then send them to the docker hub:
```
docker-compose push riot synapse
```
Don't forget to commit and push your changes before doing anything else!
## 2. Deploy the new containers
Now, we will edit the deployment file `app/im/deploy/im.hcl`.
Find where the image is defined in the file, for example Element-web will look like that:
```hcl
group "riotweb" {
count = 1
task "server" {
driver = "docker"
config {
image = "superboum/amd64_riotweb:v17"
port_map {
web_port = 8043
}
```
And replace the `image =` entry with its new version created above.
Do the same thing for the `synapse` service.
Now, you need a way to access the cluster to deploy this file.
To do this, you must bind nomad on your machine through a SSH tunnel.
If you have access to the Nomad web UI when entering http://127.0.0.1:4646
you are ready to go.
Now, on your machine and from the `app/im/deploy` folder, you must be able to run:
```
nomad plan im.hcl
```
Check that the proposed diff corresponds to what you have in mind.
If it seems OK, just copy paste the `nomad job run ... im.hcl` command proposed as part of the output of the `nomad plan` command.
From now, it will take around ~2 minutes to deploy the new images.
You can follow the deployment from the Nomad UI.
Bear in mind that, once the deployment is done on Nomad, you may still need to wait some minutes that Traefik refreshes its configuration.
If everythings worked as intended, you can commit and push your deployment file.
If something went wrong, you must rollback your deployment.
1. First, find a working deployment with [nomad job history](https://www.nomadproject.io/docs/commands/job/history)
2. Revert to this deployment with [nomad job revert](https://www.nomadproject.io/docs/commands/job/revert)
Now, if the deployment failed, you should probably investigate what went wrong offline.
I built a test stack with docker-compose in `app/<service>/integration` that should help you out (for now, test suites are only written for plume and jitsi).

View file

@ -0,0 +1,21 @@
---
title: "nixcfg"
description: "Le dépôt nixcfg"
weight: 20
date: 2022-12-22
sort_by: "weight"
extra:
parent: 'infrastructures/noeud.md'
---
## Installation
Pointer vers le dépot [`nixcfg`](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg).
Passer sur Wireguard, Nomad, Consul, Diplonat, (Tricot, Garage), etc.
## Les secrets
## Découverte des noeuds

View file

@ -0,0 +1,15 @@
---
title: "Installer un noeud"
description: "Déployer un nœud au sein de l'infrastructure Deuxfleurs"
date: 2022-08-23
dateCreated: 2021-08-23
weight: 20
extra:
parent: 'infrastructures/operations.md'
---
Déployer un nœud au sein de l'infrastructure Deuxfleurs demande un certaine préparation et représente un processus particulier.
Avant de se lancer, [mieux vaut vérifier les prérequis pour y parvenir](@/infrastructures/prerequis.md). Une fois ceci fait, on peut suivre [le guide décrivant la procédure](@/infrastructures/guide_creation_noeud.md).
Si vous avez une machine à installer, mais aucun écran & clavier à brancher dessus pour la configurer, référez-vous au [guide d'installation de NixOs en SSH](@/infrastructures/ssh_sans_ecran.md).

View file

@ -0,0 +1,10 @@
---
title: "Opérations"
description: "Manuels d'opération"
weight: 40
sort_by: weight
extra:
parent: 'infrastructures/_index.md'
---
Bla.

View file

@ -0,0 +1,195 @@
---
title: Le dépôt des secrets
description: Le dépôt des secrets
weight: 10
draft: false
date: 2024-03-16
extra:
parent: "infrastructures/acces_operateurice.md"
---
We use [pass, 'the standard unix password manager'](https://www.passwordstore.org/), to manage our key store securely at Deuxfleurs. Getting access to our production involves publishing one's GPG key (through Gitea) and importing/verifying/signing every other sysadmin's key, before setting up `pass`. Lastly, you will be able to set your shell password on the desired cluster (`prod` or `staging`, at the time of writing).
Our process was adapted from [this Medium article](https://medium.com/@davidpiegza/using-pass-in-a-team-1aa7adf36592) — thanks, David!
## You are new and want to access the secrets repository
You need a GPG key to start with.
If you do not already have one, you can generate a new one with:
```bash
gpg2 --expert --full-gen-key
# Personnaly I use `9) ECC and ECC`, `1) Curve 25519`, and `5y`
# Pour le nom, il vous identifie vous, vous pouvez l'utiliser pour signer des mails par exemple.
```
(Il se peut que vous n'ayez que la commande `gpg` sur votre PC parce qu'il est moderne. Faites `gpg --version` pour vérifier.)
In any case, you need to export your public key. Upload the output (public key) of the following command to [your Gitea account](https://git.deuxfleurs.fr/user/settings/keys).
```bash
gpg2 --export --armor <your email address>
```
It is now publicly accessible at `https://git.deuxfleurs.fr/<your_gitea_username>.gpg`
### Inform the other sysadmins that you have published your key
Download the `secrets` repository:
```
mkdir -p ~/.password-store
cd ~/.password-store
git clone git@git.deuxfleurs.fr:Deuxfleurs/secrets.git deuxfleurs
```
Get the `<hexa_of_your_gpg_key>`, which you can get with `gpg --list-keys --keyid-format 0xLONG` .
It's in the format `0x0123456789ABCDEF`.
Beware to take the key of your main key (line begins with `pub`, not with `sub`).
- Add your key address to the `Import keys` section of the repo's `README.md`:
```
curl https://git.deuxfleurs.fr/<your_gitea_username>.gpg | gpg2 --import # <hexa_of_your_gpg_key>
```
- Also add your `<hexa_of_your_gpg_key>` to the `.gpg-id` file.
- In [your Gitea settings](https://git.deuxfleurs.fr/user/settings), ensure your User visibility is `Public`.
Now `git commit/pull/push`, and tell yo' friends that you're all set.
### Import/verify/sign every other sysadmin's key into your keychain
You now need to import and sign every other sysadmin's GPG key. For example, import Quentin's key to your keychain as follow:
```bash
gpg2 --import <(curl https://git.deuxfleurs.fr/quentin.gpg)
gpg2 --list-keys
# pub ed25519/0xE9602264D639FF68 2022-04-19 [SC] [expire : 2027-04-18]
# Empreinte de la clef = 8023 E27D F1BB D52C 559B 054C E960 2264 D639 FF68
# uid [ ultime ] Quentin Dufour <quentin@deuxfleurs.fr>
# sub cv25519/0xA40574404FF72851 2022-04-19 [E] [expire : 2027-04-18]
```
> How to read this snippet:- the key id: `E9602264D639FF68`
> - the key fingerprint: `8023 E27D F1BB D52C 559B 054C E960 2264 D639 FF68`
To perform the check, you need another communication channel (ideally physically, otherwise through the phone, Matrix if you already trusted the other person, or else). Compare the signature you read with the sysadmin's. If they match, you good.
Now that you have verified the key, sign it:
```bash
gpg --edit-key quentin@deuxfleurs.fr # by email
# or
gpg --edit-key E9602264D639FF68 # by key id
# gpg> lsign
# (say yes, maybe several times)
# gpg> save
```
Once you signed every sysadmin, ask an administrator to add your key to the secrets keystore. They will need to [Add a sysadmin](#add-a-sysadmin).
Once your fellow admin has finished their job, you are ready to install `pass`:
```bash
sudo apt-get install pass # Debian + Ubuntu
sudo yum install pass # Fedora + RHEL
sudo zypper in password-store # OpenSUSE
sudo emerge -av pass # Gentoo
sudo pacman -S pass # Arch Linux
brew install pass # macOS
pkg install password-store # FreeBSD
```
_Go to [passwordstore.org](https://ww.passwordstore.org) for more information about pass_.
Finally check that everything works:
```bash
pass deuxfleurs/nix_priv_key
```
If you see an output of the form `nix.web.deuxfleurs.fr:xxxxxx` then it worked! You are now able to decrypt all the secrets. You can do the following command to list them:
```bash
pass show deuxfleurs
```
The next step is to [setup SSH](@/operations/ssh.md) to be able to connect to computers of the clusters.
> With great power comes great responsibility.
---
---
## You are a sysadmin and want to operate the secrets repository
## Initialise the pass store
> These instructions are for _bootstrapping_ the pass store. **Don't do it on Deuxfleurs' secrets repository** (don't be like ADRN). You would override the existing sysadmins and generally have a bad time.
Generate a new password store named deuxfleurs for you:
```
pass init -p deuxfleurs you@example.com
```
Add a password in this store, it will be encrypted with your gpg key:
```bash
pass generate deuxfleurs/backup_nextcloud 20
# or
pass insert deuxfleurs/backup_nextcloud
```
## Add a sysadmin
Make sure that you trust the keys of your new sysadmin:
```
$ gpg --edit-key jane@example.com
gpg> lsign
gpg> y
gpg> save
```
Now re-encrypt the secrets and push your modifications:
```
pass init -p deuxfleurs $(cat ~/.password-store/deuxfleurs/.gpg-id)
cd ~/.password-store/deuxfleurs
git commit
git push
```
They will now be able to decrypt any password:
```
pass deuxfleurs/backup_nextcloud
```
## Sharing with git
To create the repo _on bootstrap exclusively_:
```bash
cd ~/.password-store/deuxfleurs
git init
git add .
git commit -m "Initial commit"
# Set up remote
git push
```
To retrieve the repo:
```bash
mkdir -p ~/.password-store
cd ~/.password-store
git clone https://git.example.com/org/repo.git deuxfleurs
```

View file

@ -0,0 +1,338 @@
---
title: "pg_basebackup"
description: "pg_basebackup"
weight: 15
extra:
parent: 'infrastructures/sauvegardes.md'
---
## Disclaimer
Do **NOT** use the following backup methods on the Stolon Cluster:
1. copying the data directory
2. `pg_dump`
3. `pg_dumpall`
The first one will lead to corrupted/inconsistent files.
The second and third ones put too much pressure on the cluster.
Basically, you will destroy it, in the following ways:
- Load will increase, requests will timeout
- RAM will increase, the daemon will be OOM (Out Of Memory) killed by Linux
- Potentially, the WAL log will grow a lot
## A binary backup with `pg_basebackup`
The only acceptable solution is `pg_basebackup` with **some throttling configured**.
Later, if you want a SQL dump, you can inject this binary backup on an ephemeral database you spawned solely for this purpose on a non-production machine.
First, start by fetching from Consul the identifiers of the replication account.
Do not use the root account setup in Stolon, it will not work.
First setup a SSH tunnel on your machine that bind postgresql, eg:
```bash
ssh -L 5432:psql-proxy.service.2.cluster.deuxfleurs.fr:5432 ...
```
*Later, we will use `/tmp/sql` as our working directory. Depending on your distribution, this
folder may be a `tmpfs` and thus mounted on RAM. If it is the case, choose another folder, that is not a `tmpfs`, otherwise you will fill your RAM
and fail your backup. I am using NixOS and the `/tmp` folder is a regular folder, persisted on disk, which explain why I am using it.*
Then export your password in `PGPASSWORD` and launch the backup:
```bash
export PGPASSWORD=xxx
mkdir -p /tmp/sql
cd /tmp/sql
pg_basebackup \
--host=127.0.0.1 \
--username=replicator \
--pgdata=/tmp/sql \
--format=tar \
--wal-method=stream \
--gzip \
--compress=6 \
--progress \
--max-rate=5M
```
*Something you should now: while it seems optional, fetching the WAL is mandatory. At first, I thought it was a way to have a "more recent backup".
But after some reading, it appears that the base backup is corrupted because it is not a snapshot at all, but a copy of the postgres folder with no specific state.
The whole point of the WAL is, in fact, to fix this corrupted archive...*
*Take a cup of coffe, it will take some times...*
The result I get (the important file is `base.tar.gz`, `41921.tar.gz` will probably be missing as it is a secondary tablespace I will deactivate soon):
```
[nix-shell:/tmp/sql]$ ls
41921.tar.gz backup_manifest base.tar.gz pg_wal.tar.gz
```
From now, disconnect from the production to continue your work.
You don't need it anymore and it will prevent some disaster if you fail a command.
## Importing the backup
> The backup taken with `pg_basebckup` is an exact copy of your data directory so, all you need to do to restore from that backup is to point postgres at that directory and start it up.
```bash
mkdir -p /tmp/sql/pg_data && cd /tmp/sql/pg_data
tar xzfv ../base.tar.gz
```
Now you should have something like that:
```
[nix-shell:/tmp/sql/pg_data]$ ls
backup_label base pg_commit_ts pg_hba.conf pg_logical pg_notify pg_serial pg_stat pg_subtrans pg_twophase pg_wal postgresql.conf tablespace_map
backup_label.old global pg_dynshmem pg_ident.conf pg_multixact pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION pg_xact stolon-temp-postgresql.conf
```
Now we will extract the WAL:
```bash
mkdir -p /tmp/sql/wal && cd /tmp/sql/wal
tar xzfv ../pg_wal.tar.gz
```
You should have something like that:
```
[nix-shell:/tmp/sql/wal]$ ls
00000003000014AF000000C9 00000003000014AF000000CA 00000003.history archive_status
```
Before restoring our backup, we want to check it:
```bash
cd /tmp/sql/pg_data
cp ../backup_manifest .
# On ne vérifie pas le WAL car il semblerait que ça marche pas trop
# Cf ma référence en bas capdata.fr
# pg_verifybackup -w ../wal .
pg_verifybackup -n .
```
Now, We must edit/read some files before launching our ephemeral server:
- Set `listen_addresses = '0.0.0.0'` in `postgresql.conf`
- Add `restore_command = 'cp /mnt/wal/%f %p' ` in `postgresql.conf`
- Check `port` in `postgresql.conf`, in our case it is `5433`.
- Create an empty file named `recovery.signal`
*Do not create a `recovery.conf` file, it might be written on the internet but this is a deprecated method and your postgres daemon will refuse to boot if it finds one.*
*Currently, we use port 5433 in oour postgresql configuration despite 5432 being the default port. Indeed, in production, clients access the cluster transparently through the Stolon Proxy that listens on port 5432 and redirect the requests to the correct PostgreSQL instance, listening secretly on port 5433! To export our binary backup in text, we will directly query our postgres instance without passing through the proxy, which is why you must note this port.*
Now we will start our postgres container on our machine.
At the time of writing the live version is `superboum/amd64_postgres:v9`.
We must start by getting `postgres` user id. Our container are run by default with this user, so you only need to run:
```bash
docker run --rm -it superboum/amd64_postgres:v9 id
```
And we get:
```
uid=999(postgres) gid=999(postgres) groups=999(postgres),101(ssl-cert)
```
Now `chown` your `pg_data`:
```bash
chown 999:999 -R /tmp/sql/{pg_data,wal}
chmod 700 -R /tmp/sql/{pg_data,wal}
```
And finally:
```
docker run \
--rm \
-it \
-p 5433:5433 \
-v /tmp/sql/:/mnt/ \
superboum/amd64_postgres:v9 \
postgres -D /mnt/pg_data
```
I have the following output:
```
2022-01-28 14:46:39.750 GMT [1] LOG: skipping missing configuration file "/mnt/pg_data/postgresql.auto.conf"
2022-01-28 14:46:39.763 UTC [1] LOG: starting PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2022-01-28 14:46:39.764 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5433
2022-01-28 14:46:39.767 UTC [1] LOG: listening on Unix socket "/tmp/.s.PGSQL.5433"
2022-01-28 14:46:39.773 UTC [7] LOG: database system was interrupted; last known up at 2022-01-28 14:33:13 UTC
cp: cannot stat '/mnt/wal/00000004.history': No such file or directory
2022-01-28 14:46:40.318 UTC [7] LOG: starting archive recovery
2022-01-28 14:46:40.321 UTC [7] LOG: restored log file "00000003.history" from archive
2022-01-28 14:46:40.336 UTC [7] LOG: restored log file "00000003000014AF000000C9" from archive
2022-01-28 14:46:41.426 UTC [7] LOG: could not open directory "pg_tblspc/41921/PG_13_202007201": No such file or directory
2022-01-28 14:46:41.445 UTC [7] LOG: could not open directory "pg_tblspc/41921/PG_13_202007201": No such file or directory
2022-01-28 14:46:41.457 UTC [7] LOG: redo starts at 14AF/C9000028
2022-01-28 14:46:41.500 UTC [7] LOG: restored log file "00000003000014AF000000CA" from archive
2022-01-28 14:46:42.461 UTC [7] LOG: consistent recovery state reached at 14AF/CA369AB0
2022-01-28 14:46:42.461 UTC [1] LOG: database system is ready to accept read only connections
cp: cannot stat '/mnt/wal/00000003000014AF000000CB': No such file or directory
2022-01-28 14:46:42.463 UTC [7] LOG: redo done at 14AF/CA369AB0
2022-01-28 14:46:42.463 UTC [7] LOG: last completed transaction was at log time 2022-01-28 14:35:04.698438+00
2022-01-28 14:46:42.480 UTC [7] LOG: could not open directory "pg_tblspc/41921/PG_13_202007201": No such file or directory
2022-01-28 14:46:42.493 UTC [7] LOG: restored log file "00000003000014AF000000CA" from archive
cp: cannot stat '/mnt/wal/00000004.history': No such file or directory
2022-01-28 14:46:43.462 UTC [7] LOG: selected new timeline ID: 4
2022-01-28 14:46:44.441 UTC [7] LOG: archive recovery complete
2022-01-28 14:46:44.444 UTC [7] LOG: restored log file "00000003.history" from archive
2022-01-28 14:46:45.614 UTC [1] LOG: database system is ready to accept connections
```
*Notes: the missing tablespace is a legacy tablesplace used in the past to debug Matrix. It will be removed soon, we can safely ignore it. Other errors on cp seems to be intended as postgres might want to know how far it can rewind with the WAL but I a not 100% sure.*
Your ephemeral instance should work:
```bash
export PGPASSWORD=xxx # your postgres (admin) account password
psql -h 127.0.0.1 -p 5433 -U postgres postgres
```
And your databases should appear:
```
[nix-shell:~/Documents/dev/infrastructure]$ psql -h 127.0.0.1 -p 5433 -U postgres postgres
psql (13.5, server 13.3 (Debian 13.3-1.pgdg100+1))
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
xxxxx | xxxxx | UTF8 | en_US.utf8 | en_US.utf8 |
xxxxx | xxxxx | UTF8 | en_US.utf8 | en_US.utf8 |
xxxxx | xxxxx | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
xxxx | xxxxx | UTF8 | en_US.utf8 | en_US.utf8 |
xxxx | xxxxx | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(8 rows)
```
## Dump your ephemeral database as SQL
Now we can do a SQL export of our ephemeral database.
We use zstd to automatically compress the outputed file.
We use multiple parameters:
- `-vv` gives use some idea on the progress
- `-9` is a quite high value and should compress efficiently. Decrease it if your machine is low powered
- `-T0` asks zstd to use all your cores. By default, zstd uses only one core.
```bash
pg_dumpall -h 127.0.0.1 -p 5433 -U postgres \
| zstd -vv -9 -T0 --format=zstd > dump-`date --rfc-3339=seconds | sed 's/ /T/'`.sql.zstd
```
I get the following result:
```
[nix-shell:/tmp/sql]$ ls -lah dump*
-rw-r--r-- 1 quentin users 749M janv. 28 16:07 dump-2022-01-28T16:06:29+01:00.sql.zstd
```
Now you can stop your ephemeral server.
## Restore your SQL file
First, start a blank server:
```bash
docker run \
--rm -it \
--name postgres \
-p 5433:5432 \
superboum/amd64_postgres:v9 \
bash -c '
set -ex
mkdir /tmp/psql
initdb -D /tmp/psql --no-locale --encoding=UTF8
echo "host all postgres 0.0.0.0/0 md5" >> /tmp/psql/pg_hba.conf
postgres -D /tmp/psql
'
```
Then set the same password as your prod for the `posgtgres` user (it will be required as part of the restore):
```bash
docker exec -ti postgres bash -c "echo \"ALTER USER postgres WITH PASSWORD '$PGPASSWORD';\" | psql"
echo '\l' | psql -h 127.0.0.1 -p 5433 -U postgres postgres
# the database should have no entry (except `posgtres`, `template0` and `template1`) otherwise ABORT EVERYTHING, YOU ARE ON THE WRONG DB
```
And finally, restore your SQL backup:
```bash
zstdcat -vv dump-* | \
grep -P -v '^(CREATE|DROP) ROLE postgres;' | \
psql -h 127.0.0.1 -p 5433 -U postgres --set ON_ERROR_STOP=on postgres
```
*Note: we must skip CREATE/DROP ROLE postgres during the restore as it aready exists and would generate an error.
Because we want to be extra careful, we specifically asked to crash on every error and do not want to change this behavior.
So, instead, we simply remove any entry that contains the specific regex stated in the previous command.*
Check that the backup has been correctly restored.
For example:
```bash
docker exec -ti postgres psql
#then type "\l", "\c db-name", "select ..."
```
## Finally, store it safely
```bash
rsync --progress -av /tmp/sql/{*.tar.gz,backup_manifest,dump-*} backup/target
```
## Garbage collect old backups
```
mc ilm import deuxfleurs/${BUCKET_NAME} <<EOF
{
"Rules": [
{
"Expiration": {
"Days": 62
},
"ID": "PurgeOldBackups",
"Status": "Enabled"
}
]
}
EOF
```
Check that it has been activated:
```
mc ilm ls deuxfleurs/${BUCKET_NAME}
```
## Références
- https://philipmcclarence.com/backing-up-and-restoring-postgres-using-pg_basebackup/
- https://www.cybertec-postgresql.com/en/pg_basebackup-creating-self-sufficient-backups/
- https://www.postgresql.org/docs/14/continuous-archiving.html
- https://www.postgresql.org/docs/14/backup-dump.html#BACKUP-DUMP-RESTORE
- https://dba.stackexchange.com/questions/75033/how-to-restore-everything-including-postgres-role-from-pg-dumpall-backup
- https://blog.capdata.fr/index.php/postgresql-13-les-nouveautes-interessantes/

View file

@ -0,0 +1,58 @@
---
title: "Prérequis pour un site"
description: "Prérequis pour un site"
date: 2024-05-30
dateCreated: 2024-05-30
weight: 10
extra:
parent: 'infrastructures/site.md'
---
# Qu'est-ce qu'un site géographique
Dans un *site géographique*, on installe une *grappe d'ordinateurs* au sein d'un *réseau local*, qu'on connecte au cluster de Deuxfleurs.
On peut distinguer deux types de sites :
* _Dans un centre de données_ : chaque ordinateur de la grappe appartient au même centre de données, dispose d'une adresse IP fixe qui le connecte directement à Internet.
Dans ce cas-ci, **l'installation et l'administration sont assez simples** (on a moins de concepts à avaler que chez un particulier).
Par contre, **nous ne sommes pas chez nous** : le propriétaire du centre de données peut accéder aux disques, et voit ce qui passe sur le réseau. **Chiffrement du disque vivement conseillé.**
* _Chez un particulier_ : la grappe est reliée à Internet par une *box*, qui filtre le trafic réseau selon des règles variables. La grappe se partage l'adresse IP de la box (qui peut changer régulièrement, être en IPv4 ou en IPv6).
Dans ce cas de figure, **l'installation comme l'administration demandent plus de connaissances** : pour caricaturer, on doit installer et administrer la grappe **malgré le Fournisseur d'Accès Internet** (FAI), qui considère *a priori* que son abonnement ne sert pas à héberger des services web.
On aura affaire à sa box (NAT, pare-feu...), au manque de garanties concernant notre adressabilité (IPv4 dynamique, IPv6 ? ...), ce qui va nous mener à devoir faire du routage. Le nœud du problème, c'est que chaque ordinateur de la grappe n'aura pas pignon sur rue (pas d'adresse IP publique et fixe par machine).
Néanmoins, **on est chez nous !** Votre disque dur - qui contient les données personnelles de vos usagers chéris - est sous vos yeux, bien au chaud. Le seul curieux qui voit passer votre trafic réseau est votre FAI : *rien de nouveau sous le soleil*.
# Pré-requis humains
- assurer une sécurité physique vis-à-vis des machines et des données qu'elles contiennent
- pouvoir intervenir physiquement dans un délai de quelques jours en cas de panne d'une machine ou du réseau
- être d'accord pour partager son réseau et son IP avec l'infrastructure de Deuxfleurs (ou alors disposer d'une seconde connexion à Internet)
# Pré-requis techniques de base
- disposer d'une connexion fibre / FTTH avec un débit montant d'au moins 100 Mbps
- disposer d'une IPv4 publique dédiée et non partagée (la plupart des FAI proposent cette option)
- avoir un FAI qui fournit de l'IPv6
- avoir un routeur ou une box qui supporte UPnP
- pouvoir configurer le firewall IPv6 sur le routeur ou la box pour autoriser le trafic IPv6 entrant vers les noeuds Deuxfleurs
- ne pas déjà héberger des serveurs chez soi qui auraient besoin des mêmes ports TCP/UDP que Deuxfleurs (80, 443, 25, ...)
# Pré-requis supplémentaires pour le mail
Héberger un service mail demande des pré-requis supplémentaires :
- pouvoir définir le reverse DNS associé à son IPv4 publique. Free le permet, ainsi que la plupart des FAI associatifs. Orange et SFR ne le permettent pas.
- s'assurer que le FAI ne bloque pas le port 25 en entrée. Certains FAI comme Free bloquent par défaut mais permettent de débloquer sur demande. Orange ne permet pas de débloquer le port 25.
# Fournisseurs d'accès Internet recommandés
Pour l'instant, les FAI suivants ont été testés et remplissent tous les pré-requis :
- Free
- Belgacom
- Rézine

View file

@ -0,0 +1,28 @@
---
title: "Prérequis pour un nœud"
description: "Prérequis pour un nœud"
date: 2024-05-30
dateCreated: 2021-12-28T14:33:59.088Z
weight: 10
extra:
parent: 'infrastructures/noeud.md'
---
Dans ce guide, nous allons expliquer comment installer une grappe de serveurs, en vue d'un hébergement pour Deuxfleurs.
## Choix des ordinateurs
Héberger des services web est une tâche à la portée de la plupart des ordinateurs des 10 dernières années. Néanmoins, essayer de faire tourner correctement des applications lourdes sur une toute petite machine n'est pas une partie de plaisir. Alors, quitte à installer une nouvelle grappe, la vie sera plus agréable si ses machines disposent d'au moins :
* 4 Go de RAM
* 1 To de disque (dur ou SSD)
## Choix d'un site géographique
Dans la plupart des cas, le nouveau noeud sera ajouté à un site géographique existant.
Si il est envisagé d'installer un nouveau site géographique, voir : [guide d'installation d'un nouveau site géographique](@/infrastructures/site.md)

View file

@ -1,9 +1,9 @@
---
title: "Production"
description: "Production"
weight: 40
weight: 10
extra:
parent: 'infrastructures/machines.md'
parent: 'infrastructures/grappes.md'
---
Les serveurs de productions sont ceux qui font tourner les services accédés par les usager·es (eg. Plume, Matrix, Cryptpad).

View file

@ -0,0 +1,78 @@
---
title: "rclone"
description: "rclone"
weight: 20
sort_by: "weight"
extra:
parent: 'infrastructures/sauvegardes.md'
---
Script de backup brut, on planifie une approche plus élégante à l'avenir :
```
#!/bin/bash
cd $(dirname $0)
if [ "$(hostname)" != "io" ]; then
echo "Please run this script on io"
exit 1
fi
if [ ! -d "buckets" ]; then
btrfs subvolume create $(pwd)/buckets
fi
AK=$1
SK=$2
function gctl {
docker exec garage /garage $@
}
gctl status
BUCKETS=$(gctl bucket list | tail -n +2 | cut -d " " -f 3 | cut -d "," -f 1)
for BUCKET in $BUCKETS; do
case $BUCKET in
*backup*)
echo "Skipping $BUCKET (not doing backup of backup)"
;;
*cache*)
echo "Skipping $BUCKET (not doing backup of cache)"
;;
*)
echo "Backing up $BUCKET"
if [ ! -d $(pwd)/buckets/$BUCKET ]; then
mkdir $(pwd)/buckets/$BUCKET
fi
gctl bucket allow --key $AK --read $BUCKET
rclone sync --s3-endpoint http://localhost:3900 \
--s3-access-key-id $AK \
--s3-secret-access-key $SK \
--s3-region garage \
--s3-force-path-style \
--transfers 32 \
--fast-list \
--stats-one-line \
--stats 10s \
--stats-log-level NOTICE \
:s3:$BUCKET $(pwd)/buckets/$BUCKET
;;
esac
done
# Remove duplicates
#duperemove -dAr $(pwd)/buckets
if [ ! -d "$(pwd)/snapshots" ]; then
mkdir snapshots
fi
SNAPSHOT=$(pwd)/snapshots/buckets-$(date +%F)
echo "Making snapshot: $SNAPSHOT"
btrfs subvolume snapshot $(pwd)/buckets $SNAPSHOT
```

View file

@ -3,9 +3,9 @@ title: "Réseau"
description: "Réseau"
date: 2021-11-09T12:55:03.277Z
dateCreated: 2021-11-09T12:55:01.156Z
weight: 30
weight: 200
extra:
parent: 'infrastructures/_index.md'
parent: 'infrastructures/operations.md'
---
Cette page regroupe un résumé de tous les problèmes que vous pourriez rencontrer en voulant faire de l'auto hébergement avec "votre connexion internet".

View file

@ -0,0 +1,179 @@
---
title: "restic"
description: "restic"
weight: 10
extra:
parent: 'infrastructures/sauvegardes.md'
---
Add the admin account as `deuxfleurs` to your `~/.mc/config` file
You need to choose some names/identifiers:
```bash
export ENDPOINT="https://s3.garage.tld"
export SERVICE_NAME="example"
export BUCKET_NAME="backups-${SERVICE_NAME}"
export NEW_ACCESS_KEY_ID="key-${SERVICE_NAME}"
export NEW_SECRET_ACCESS_KEY=$(openssl rand -base64 32)
export POLICY_NAME="policy-$BUCKET_NAME"
```
Create a new bucket:
```bash
mc mb deuxfleurs/$BUCKET_NAME
```
Create a new user:
```bash
mc admin user add deuxfleurs $NEW_ACCESS_KEY_ID $NEW_SECRET_ACCESS_KEY
```
Add this new user to your `~/.mc/config.json`, run this command before to generate the snippet to copy/paste:
```
cat > /dev/stdout <<EOF
"$NEW_ACCESS_KEY_ID": {
"url": "$ENDPOINT",
"accessKey": "$NEW_ACCESS_KEY_ID",
"secretKey": "$NEW_SECRET_ACCESS_KEY",
"api": "S3v4",
"path": "auto"
},
EOF
```
---
Create a policy for this bucket and save it as json:
```bash
cat > /tmp/policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::${BUCKET_NAME}"
]
},
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::${BUCKET_NAME}/*"
]
}
]
}
EOF
```
Register it:
```bash
mc admin policy add deuxfleurs $POLICY_NAME /tmp/policy.json
```
Set it to your user:
```bash
mc admin policy set deuxfleurs $POLICY_NAME user=${NEW_ACCESS_KEY_ID}
```
Now it should display *only* your new bucket when running:
```bash
mc ls $NEW_ACCESS_KEY_ID
```
---
Now we need to initialize the repository with restic.
```bash
export AWS_ACCESS_KEY_ID=$NEW_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$NEW_SECRET_ACCESS_KEY
export RESTIC_REPOSITORY="s3:$ENDPOINT/$BUCKET_NAME"
export RESTIC_PASSWORD=$(openssl rand -base64 32)
```
Then init the repo for restic from your machine:
```
restic init
```
*I am using restic version `restic 0.12.1 compiled with go1.16.9 on linux/amd64`*
See your snapshots with:
```
restic snapshots
```
Check also these useful commands:
```
restic ls
restic diff
restic help
```
---
Add the secrets to Consul, near your service secrets.
The idea is that the backuping service is a component of the global running service.
You must run in `app/<name>/secrets/<subpath>`:
```bash
echo "USER Backup AWS access key ID" > backup_aws_access_key_id
echo "USER Backup AWS secret access key" > backup_aws_secret_access_key
echo "USER Restic repository, eg. s3:https://s3.garage.tld" > backup_restic_repository
echo "USER Restic password to encrypt backups" > backup_restic_password
```
Then run secretmgr:
```bash
# Spawning a nix shell is an easy way to get all the dependencies you need
nix-shell
# Check that secretmgr works for you
python3 secretmgr.py check <name>
# Now interactively feed the secrets
python3 secretmgr.py gen <name>
```
---
Now we need a service that runs:
```
restic backup .
```
And also that garbage collect snapshots.
I propose:
```
restic forget --prune --keep-within 1m1d --keep-within-weekly 3m --keep-within-monthly 1y
```
Also try to restore a snapshot:
```
restic restore <snapshot id> --target /tmp/$SERVICE_NAME
```

View file

@ -0,0 +1,47 @@
---
title: "Sauvegardes"
description: "Sauvegardes"
weight: 50
sort_by: "weight"
extra:
parent: 'infrastructures/operations.md'
---
# Données sauvegardées
[restic](@/infrastructures/restic.md) - Nous utilisons restic pour sauvegarder les logiciels
qui utilisent le système de fichier (Cryptpad, Dovecot, et Plume) ainsi que Consul.
À terme, nous aimerions être en mesure de tout pouvoir stocker directement sur Garage
et rendre obsolète ce mode de sauvegarde.
[pg\_basebackup](@/infrastructures/pg_basebackup.md) - Nous utilisons cet outils pour sauvegarder l'ensemble
des tables gérées par notre base de données SQL sans impacter trop les performances.
Le tout est réalisé par un script python qui chiffre avec [age](https://github.com/FiloSottile/age) et envoie le backup via S3.
À terme, nous aimerions utiliser [wal-g](https://github.com/wal-g/wal-g) à la place.
[rclone](@/infrastructures/rclone.md) - Combiné avec btrfs, nous copions sur un système de fichier à plat
le contenu de notre cluster afin de faire face en cas de corruption.
À terme, nous aimerions remplacer cet outil par quelque chose de similaire à [s3s3mirror](https://github.com/cobbzilla/s3s3mirror).
# Localisation des sauvegardes
[Suresnes](@/infrastructures/support.md#suresnes-mercure) - À Suresnes, nous avons une instance Minio
dédiée aux sauvegardes de données. Elle reçoit les sauvegardes du système de fichier, de consul et de Postgres.
[Rennes 2](@/infrastructures/support.md#rennes-jupiter) - À Rennes, nous avons un simple serveur Debian
avec une partition en BTRFS. Il se charge de sauvegarder toutes les nuits le contenu de notre instance de production de Garage.
À terme il est possible qu'on décide de rationaliser nos sauvegardes et de choisir
de sauvegarder S3.
# Durée de rétention et fréquence
Les sauvegardes doivent être configurées avec les options suivantes :
**Fréquence** - 1 fois par jour (toutes les nuits)
**Durée de rétention** - 1 an
**Politique de conservation des instantanés** - 1 instantané par jour pendant 1 mois, 1 instantané par semaine pendant 3 mois, 1 instantané par mois pendant 1 an
**Exceptions**
Les sauvegardes de Postgres sont faites une fois par semaine seulement pour le moment
Le nombre d'instantané est de 1 par jour pendant 1 an pour Garage

View file

@ -0,0 +1,19 @@
---
title: "Gestion des secrets"
description: "Gestion des secrets pour les applications"
date: 2025-02-25
dateCreated: 2025-02-25
weight: 11
extra:
parent: 'infrastructures/deployer.md'
---
Cette page documente l'usage du script `secretmgr` dans le dépôt nixcfg.
- écrire un fichier `cluster/prod/app/<monapplication>/secrets.toml` qui décrit les secrets nécessaires à l'application
- TODO expliquer les différents types de secrets disponibles
- établir un tunnel SSH et lancer le script `tlsproxy` pour avoir accès à LDAP et Consul (voir `doc/onboarding.md` pour la conf SSH recommandée)
- utiliser `secretmgr` pour générer les secrets, les copier dans Consul, et créer un utilisateur de service dans LDAP
- TODO mot de passe admin LDAP
Attention, le script nécessite Nix (sinon, il faut installer les dépendances Python soi-même)

View file

@ -0,0 +1,94 @@
---
title: "Configuration réseau OpenWrt"
description: "Configuration réseau OpenWrt"
date: 2024-05-30
dateCreated: 2024-05-30
weight: 20
extra:
parent: 'infrastructures/site.md'
---
# Pourquoi OpenWrt
Pour installer un site géographique, il y a deux possibilités pour gérer le réseau :
- utiliser la box fournie par le FAI
- utiliser son propre routeur
Certaines box de FAI sont limitées : elles ne permettent parfois pas de configurer le pare-feu IPv6, ou bien elles ont un support d'UPnP pas assez fiable pour les besoins de Deuxfleurs.
Dans ce cas, utiliser son propre routeur et y installer [OpenWrt](https://openwrt.org/) est un choix naturel : c'est un projet en logiciel libre, avec une grande communauté et beaucoup de modèles matériel supportés.
Par ailleurs, OpenWrt est très modulaire, on peut installer des paquets additionnels pour rajouter des fonctionnalités comme UPnP.
Attention, installer et configurer OpenWrt demande d'être à l'aise avec SSH, vim, et d'avoir quelques connaissances en réseau.
# Choisir un matériel supporté par OpenWrt
Voir [le site d'OpenWrt](https://openwrt.org/supported_devices).
# Installer OpenWrt
Voir [la documentation OpenWrt](https://openwrt.org/docs/guide-quick-start/start) et un [guide générique](https://openwrt.org/docs/guide-user/installation/generic.flashing).
# Configurer OpenWrt pour un site géographique Deuxfleurs
## Configuration de base
- installer OpenWrt
- se connecter en SSH sur le routeur
- définir un mot de passe root avec `passwd`, le renseigner dans le [dépôt des secrets](@/operations/pass.md)
- désactiver les IPv6 ULA : dans `/etc/config/network`, supprimer le bloc qui ressemble à ça :
```
config globals 'globals'
option ula_prefix 'fda0:8093:6a4c::/48'
```
- autoriser le trafic IPv6 en entrée. Attention, la configuration ci-dessous autorise absolument tout le trafic IPv6 pour toutes les machines du réseau local. Vous pouvez être plus fin si nécessaire.
Dans `/etc/config/firewall`, rajouter le bloc suivant :
```
config forwarding
option src wan
option dest lan
option family ipv6
```
- définir un nom d'hôte pour le routeur, par exemple `gw-<nom du site>`. Ça se passe dans `/etc/config/system`
- rebooter le routeur pour être sûr d'appliquer tous les changements
## Configuration UPnP
C'est le plus gros morceau.
- installer le serveur UPnP (ici pour un OpenWrt récent qui utilise nftables et non iptables) :
```bash
opkg update
opkg install miniupnpd-nftables
```
- configurer le serveur UPnP, ça se passe dans `/etc/config/upnpd` :
- mettre `option enabled` à `1`
- mettre `option enable_natpmp` à `0` (pas besoin pour Deuxfleurs)
- mettre `option log_output` à `1` (pour faciliter le debug)
- dans le premier bloc `perm_rule`, mettre `ext_ports` et `int_ports` à `'0-65535'` (autoriser à mapper tous les ports)
- dans ce meme bloc, mettre la plage d'adresse IP des machines Deuxfleurs dans `int_addr`, par exemple `192.168.5.0/24` (pour éviter que d'autres machines n'utilisent UPnP)
- redémarrer le service UPnP : `/etc/init.d/miniupnpd restart`
Il est également nécessaire de changer le port utilisé par LuCI (l'interface web d'OpenWrt), sinon cela empechera de mapper les ports 80 et 443 vers Tricot.
Il faut veiller à choisir un port qui n'est utilisé par aucun service de Deuxfleurs. Ici, on choisit 65080 en HTTP et 65443 en HTTPS.
- ouvrir `/etc/config/uhttpd`
- sur les lignes `listen_http`, changer `80` par `65080`
- sur les lignes `listen_https`, changer `443` par `65443`
- redémarrer le service : `/etc/init.d/uhttpd restart`
Une fois cette configuration effectuée, pour accéder à l'interface web du routeur, il faut aller sur `http://192.168.X.Y:65080`.
## Debug UPnP
Pour cela, il faut d'abord avoir un diplonat lancé par Nomad sur une machine du site.
Pour voir si le serveur UPnP reçoit bien les requetes de diplonat, afficher les logs OpenWrt avec `logread -f`.

View file

@ -0,0 +1,17 @@
---
title: "Installer un site"
description: "Déployer un nouveau site géographique pour l'infrastructure Deuxfleurs"
date: 2024-05-30
dateCreated: 2024-05-30
weight: 19
extra:
parent: 'infrastructures/operations.md'
---
Dans un *site géographique*, on installe une *grappe d'ordinateurs* au sein d'un *réseau local*, qu'on connecte au cluster de Deuxfleurs.
Rajouter un nouveau site pour l'infrastructure Deuxfleurs est une opération qui demande de nombreuses étapes et peut avoir un fort impact sur la production.
Avant de se lancer, il faut en parler aux autres admins et [s'assurer qu'on remplit les prérequis](@/infrastructures/prerequis-site.md).
Pour le réseau, nous avons un [guide de configuration de routeur sous OpenWrt](@/infrastructures/site-openwrt.md).

View file

@ -0,0 +1,74 @@
---
title: "SSH"
description: "SSH"
weight: 100
extra:
parent: "infrastructures/acces_operateurice.md"
---
SSH permet de se connecter aux machines du cluster à administrer (`staging` ou `prod`).
# Ajout d'une nouvelle clé SSH au cluster
Dans le dépot [nixcfg](https://git.deuxfleurs.fr/deuxfleurs/nixcfg), éditer le
fichier `cluster/CLUSTER/cluster.nix`, où `CLUSTER` est à remplacer par `prod`
ou `staging`.
La variable qui nous intéresse est `deuxfleurs.adminAccounts`. On trouve une
définition de la forme suivante :
```nix
deuxfleurs.adminAccounts = {
lx = [
"ssh-ed25519 ...."
];
quentin = [
"ssh-rsa ...."
"ssh-rsa ...."
];
...
};
```
Ici, `lx` et `quentin` correspondent à des noms d'utilisateur linux sur les
machines du cluster, et les `"ssh-ed25519 ..` ou `"ssh-rsa ..."` sont les clefs
SSH publiques qui permettent de se connecter à ces utilisateurs.
Ajouter un attribut à `deuxfleurs.adminAccounts` avec le nom d'utilisateur et sa
clef ssh publique choisie. Par exemple, pour ajouter une nouvelle utilisatrice
`alice` :
```nix
deuxfleurs.adminAccounts = {
lx = [
"ssh-ed25519 ...."
];
quentin = [
"ssh-rsa ...."
"ssh-rsa ...."
];
...
alice = [
"clef SSH publique d'alice"
];
```
Commiter et pousser ces modifications (`git commit/push`).
Un autre administrateur doit ensuite déployer ces modifications sur les machines
du cluster en utilisant le script `./deploy_nixos` du dépot `nixcfg`.
*TODO*: dire ce qu'il faut mettre dans le `.ssh/config`.
Vous pouvez ensuite tester de vous connecter à une machine du cluster :
```bash
ssh caribou # staging
# ou
ssh pasteque # prod
```
Pour terminer la création d'un nouveau compte utilisateur linux sur le cluster,
la dernière étape est de lui [assigner un mot de
passe](@/infrastructures/user_passwd.md).

View file

@ -0,0 +1,53 @@
---
title: "Installer NixOS en SSH"
description: "Installer NixOS en SSH sans écran ni clavier"
date: 2022-08-24
dateCreated: 2021-08-24
weight: 12
extra:
parent: 'infrastructures/noeud.md'
---
_Quick tip_ avant d'oublier pour installer une de nos machines ThinkCentre via SSH sous NixOS ; c'est la seule solution quand on a pas d'écran ni de clavier sous la main.
Pré-requis : une clé USB, un ordi sous NixOS.
On va créer une image d'installation nous même qui démarre le SSH et configure root avec notre clé. On créer un fichier `iso.nix` :
```nix
{config, pkgs, ...}:
{
imports = [
<nixpkgs/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix>
# Provide an initial copy of the NixOS channel so that the user
# doesn't need to run "nix-channel --update" first.
<nixpkgs/nixos/modules/installer/cd-dvd/channel.nix>
];
systemd.services.sshd.wantedBy = pkgs.lib.mkForce [ "multi-user.target" ];
users.users.root.openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT1+H08FdUSvdPpPKdcafq4+JRHvFVjfvG5Id97LAoROmFRUb/ZOMTLdNuD7FqvW0Da5CPxIMr8ZxfrFLtpGyuG7qdI030iIRZPlKpBh37epZHaV+l9F4ZwJQMIBO9cuyLPXgsyvM/s7tDtrdK1k7JTf2EVvoirrjSzBaMhAnhi7//to8zvujDtgDZzy6aby75bAaDetlYPBq2brWehtrf9yDDG9WAMYJqp//scje/WmhbRR6eSdim1HaUcWk5+4ZPt8sQJcy8iWxQ4jtgjqTvMOe5v8ZPkxJNBine/ZKoJsv7FzKem00xEH7opzktaGukyEqH0VwOwKhmBiqsX2yN quentin@dufour.io"
];
}
```
On construit l'image à partir de ce fichier de conf :
```bash
nix-build '<nixpkgs/nixos>' -A config.system.build.isoImage -I nixos-config=iso.nix
```
On le copie sur la clé USB :
```
dd if=result/iso/*.iso of=/dev/??? status=progress
sync
```
On branche la clé sur le serveur, on branche le serveur sur le réseau, on démarre le serveur et on surveille le routeur pour connaitre son IP (nom de domaine `nixos`).
Ensuite on se connecte dessus :
```
ssh root@192.168.1.X
```

View file

@ -0,0 +1,121 @@
---
title: "Déployer stolon"
description: "Comment déployer Stolon"
date: 2025-02-25
dateCreated: 2022-12-22
weight: 15
extra:
parent: 'infrastructures/deployer.md'
---
## Le besoin
Stolon est utilisé pour gérer un cluster PostgreSQL, afin de stocker une copie des données sur chaque site géographique de Deuxfleurs.
Cette documentation explique comment Stolon a été déployé initialement, et comment mettre à jour sa configuration.
## Comment ça marche
Ca a l'air un peu compliqué...
Stolon va récupérer sa configuration dans Consul. C'est un fichier JSON.
Le champ `pgHBA` est utilisé par Stolon pour aller configurer le fichier
`pg_hba.conf` de PostgreSQL. Ici, on explique donc à PostgreSQL qu'il
doit utiliser le LDAP de Deuxfleurs pour authentifier les connexions
postgresql.
## Déploiement initial
Spawn container:
```bash
docker run \
-ti --rm \
--name stolon-config \
--user root \
-v /var/lib/consul/pki/:/certs \
superboum/amd64_postgres:v11
```
Init with:
```
stolonctl \
--cluster-name chelidoine \
--store-backend=consul \
--store-endpoints https://consul.service.prod.consul:8501 \
--store-ca-file /certs/consul-ca.crt \
--store-cert-file /certs/consul2022-client.crt \
--store-key /certs/consul2022-client.key \
init \
'{ "initMode": "new",
"usePgrewind" : true,
"proxyTimeout" : "120s",
"pgHBA": [
"host all postgres all md5",
"host replication replicator all md5",
"host all all all ldap ldapserver=bottin.service.prod.consul ldapbasedn=\"ou=users,dc=deuxfleurs, dc=fr\" ldapbinddn=\"<bind_dn>\" ldapbindpasswd=\"<bind_pwd>\" ldapsearchattribute=\"cn\""
]
}'
```
Then set appropriate permission on host:
```
mkdir -p /mnt/{ssd,storage}/postgres/
chown -R 999:999 /mnt/{ssd,storage}/postgres/
```
(102 is the id of the postgres user used in Docker)
It might be improved by staying with root, then chmoding in an entrypoint and finally switching to user 102 before executing user's command.
Moreover it would enable the usage of the user namespace that shift the UIDs.
## Stolonctl alias
```
alias stolonctl='stolonctl --cluster-name chelidoine --store-backend consul --store-endpoints https://consul.service.prod.consul:8501 --store-ca-file /certs/consul-ca.crt --store-cert-file /certs/consul-client.crt --store-key /certs/consul-client.key'
```
## Mise à jour du cluster
To retrieve the current stolon config:
```
stolonctl spec --cluster-name chelidoine --store-backend consul --store-ca-file ... --store-cert-file ... --store-endpoints https://consul.service.prod.consul:8501
```
The important part for the LDAP:
```
{
"pgHBA": [
"host all postgres all md5",
"host replication replicator all md5",
"host all all all ldap ldapserver=bottin.service.2.cluster.deuxfleurs.fr ldapbasedn=\"ou=users,dc=deuxfleurs,dc=fr\" ldapbinddn=\"cn=admin,dc=deuxfleurs,dc=fr\" ldapbindpasswd=\"<REDACTED>\" ldapsearchattribute=\"cn\""
]
}
```
Once a patch is writen:
```
stolonctl --cluster-name pissenlit --store-backend consul --store-endpoints http://consul.service.2.cluster.deuxfleurs.fr:8500 update --patch -f /tmp/patch.json
```
## Log
- 2020-12-18 Activate pg\_rewind in stolon
```
stolonctl --cluster-name pissenlit --store-backend consul --store-endpoints http://consul.service.2.cluster.deuxfleurs.fr:8500 update --patch '{ "usePgrewind" : true }'
```
- 2021-03-14 Increase proxy timeout to cope with consul latency spikes
```
stolonctl --cluster-name pissenlit --store-backend consul --store-endpoints http://consul.service.2.cluster.deuxfleurs.fr:8500 update --patch '{ "proxyTimeout" : "120s" }'
```

View file

@ -0,0 +1,54 @@
---
title: "Supervision"
description: "Supervision"
weight: 59
sort_by: "weight"
extra:
parent: 'infrastructures/operations.md'
---
# Journaux
Les journaux ne sont pas centralisés aujourd'hui.
Vous pouvez les consulter avec `docker logs`, `nomad` et `journalctl`.
# Métriques
Grafana est accessible à l'adresse suivante : https://grafana.deuxfleurs.fr
La connexion est possible avec ses identifiants Guichet (via LDAP).
Pour les admins, il est aussi possible d'utiliser le mot de passe admin en allant le chercher dans Consul KV.
Les dashboards ne sont pour l'instant pas stockés dans un dépot git, ils sont édités manuellement dans l'interface de Grafana.
Il y a également une instance Grafana de staging, sans intégration LDAP/Guichet : https://grafana.staging.deuxfleurs.org
# Supervision et alerting externe
Nous avons un système de supervision externe, accessible à l'adresse <https://status.deuxfleurs.fr>.
Il s'agit d'une instance de [Uptime Kuma](https://github.com/louislam/uptime-kuma), hébergée gracieusement par [RésiLien](https://resilien.fr/).
Son but est de vérifier le bon fonctionnement des services exposés publiquement par Deuxfleurs : sites web statiques, services web (cryptpad, jitsi, plume), email, ainsi que l'API S3 de Garage.
Pour rajouter des services à surveiller ou configurer des envois d'alertes, les identifiants de connexion sont dans le [dépôt des secrets](@/infrastructures/pass.md).
Un bot envoie les alertes sur le canal Matrix `deuxfleurs::alertes`. Ce bot est un compte Matrix chez Grésille, pour pouvoir envoyer des alertes même si l'infrastructure Matrix de Deuxfleurs est en panne. Les identifiants de ce compte sont dans le [dépôt des secrets](@/infrastructures/pass.md) (entrée `prod/botmonitoringdeuxfleurs`).
# Alerting interne
Nous ne disposons actuellement pas de supervision interne complète avec envoi d'alertes.
Une telle supervision interne serait complémentaire à la supervision externe : elle permettrait de détecter des problèmes en amont qui ne sont pas forcément encore visibles sur les services.
Par exemple, Garage tolère la panne d'une zone sans impacter le service, il est donc facile de ne pas se rendre compte de la panne ... jusqu'à ce qu'une deuxième panne arrive !
Les éléments suivants seraient pertinents à surveiller :
- système : espace disque, état SMART des disques, charge I/O
- connectivité : connectivité interne Wireguard, IPv6
- état du cluster Garage (perte d'une zone ou d'un noeud)
- état du cluster Nomad
- état du cluster Consul
- état du cluster Stolon
- état des backups
- crash dans le catalog consul / les allocs nomad

View file

@ -1,9 +1,9 @@
---
title: "Support"
description: "Serveurs en support"
weight: 40
weight: 30
extra:
parent: 'infrastructures/machines.md'
parent: 'infrastructures/grappes.md'
---
Les serveurs de support servent pour les sauvegardes et la supervision des serveurs de production (eg. Grafana, Minio).

View file

@ -1,18 +1,29 @@
---
title: "Tricot"
description: ""
description: "Tricot : proxy inverse HTTP"
date: 2022-01-24T16:33:16.731Z
dateCreated: 2022-01-24T16:32:53.056Z
weight: 50
weight: 20
extra:
parent: 'infrastructures/logiciels.md'
parent: 'infrastructures/creations.md'
---
# Tricot
<img src="/img/tricot-logo.png" alt="Logo officieux de Tricot : des mailles tricotées" width="200px">
Tricot est un reverse-proxy HTTP et HTTPS qui s'auto-configure à partir de [Consul](https://www.consul.io), comme le faisait Traefik, qui posait de multiples problèmes et que nous avons décidé de remplacer. Tricot s'occupe automatiquement de récupérer des certificats au près de Let's Encrypt pour rendre tous les sites accessibles en TLS. Ceux-ci sont stockés dans Consul.
- [Forge logicielle](https://git.deuxfleurs.fr/Deuxfleurs/tricot/)
- [Canal de discussion](https://matrix.to/#/%23tricot:deuxfleurs.fr)
Tricot est un proxy inverse (ou _reverse proxy_) [HTTP](https://fr.wikipedia.org/wiki/HTTP) et HTTPS.
Son rôle est de recevoir les requêtes web de l'extérieur, et de les acheminer vers le service demandé.
Tricot s'auto-configure à partir de [Consul](https://www.consul.io),
Il s'occupe automatiquement de récupérer des certificats auprès de Let's Encrypt pour rendre tous les sites accessibles en TLS.
Les certificats sont stockés dans Consul.
Tricot est une invention maison succédant à Traefik, qui posait de multiples problèmes et que nous avons décidé de remplacer.
## Statut du développement
Tricot est actuellement utilisé en production pour Deuxfleurs. Il est cependant toujours en développement actif.
Le code de Tricot se trouve ici : <https://git.deuxfleurs.fr/Deuxfleurs/tricot>
Tricot est actuellement utilisé en production par Deuxfleurs. Il est cependant toujours en développement actif.\
Le code est ici : <https://git.deuxfleurs.fr/Deuxfleurs/tricot>

View file

@ -0,0 +1,31 @@
---
title: "Mot de passe unix"
description: "Mot de passe unix"
weight: 200
extra:
parent: "infrastructures/acces_operateurice.md"
---
The last step of adding an administrator is to select a user password for
yourself on the cluster you are now in charge of (`prod` or `staging`).
In the [nixcfg](https://git.deuxfleurs.fr/deuxfleurs/nixcfg) repository,
use the passwd utility to set your shell password:
```
./passwd
> Usage: ./passwd <cluster name> <username>
> The cluster name must be the name of a subdirectory of cluster/
```
This commited changes to Deuxfleurs' password store, do verify your modifications before pushing them:
```
cd ~/.password-store/deuxfleurs
git diff
git push
```
These changes must be deployed to the machines to take effect. Ask another
administrator to deploy them. They will need to use the script
`./deploy_passwords` from the `nixcfg` repository after pulling your changes.

View file

@ -1,9 +1,9 @@
---
title: "Expérimentation"
description: "Expérimentation"
weight: 40
weight: 20
extra:
parent: 'infrastructures/machines.md'
parent: 'infrastructures/grappes.md'
---
Les serveurs d'expérimentation servent à tester les nouvelles configurations, les nouveaux logiciels,

View file

@ -0,0 +1,11 @@
---
title: "Motivations"
description: "Motivations"
weight: 20
sort_by: "weight"
extra:
parent: 'motivations/_index.md'
---
Tout doux (en anglais : to do)

View file

@ -5,6 +5,7 @@ weight: 100
sort_by: "weight"
extra:
parent: 'operations/_index.md'
hide_from_menu: true
---
Ce manuel recense notre savoir-faire technique, il a pour but d'accompagner nos opérateur·ices dans la réalisation de leurs tâches.

View file

@ -1,10 +1,11 @@
---
title: "Prise en main"
description: "Prise en main"
weight: 10
weight: 20
sort_by: "weight"
extra:
parent: 'prise_en_main/_index.md'
hide_from_menu: true
---
Ce manuel vous accompagne dans la découverte de nos outils.

View file

@ -0,0 +1,84 @@
---
title: "CNAME à l'apex"
description: "Les CNAME à l'apex d'une zone DNS"
date: 2023-04-19
weight: 3
extra:
parent: "services/mettre-place-DNS.md"
---
# Le problème
Dans le protocole DNS, il n'est pas possible de mettre un champ CNAME à l'apex d'une zone.
Concrètement, qu'est-ce que ça veut dire ? Si vous gérez la zone `example.com` et que vous
aimeriez faire pointer ce nom vers `garage.deuxfleurs.fr` pour que Deuxfleurs héberge votre
site web, la solution naturelle serait de configurer un CNAME. Dans un fichier de zone,
cela ressemblerait à :
@ 10800 IN CNAME garage.deuxfleurs.fr.
Hors, cela est interdit par le protocole DNS. Pourquoi donc ? Parce qu'un CNAME s'applique
à tous les types d'enregistrements, pas simplement les `A` (adresse IPv4) et `AAAA` (adresse IPv6).
Ainsi, la redirection du CNAME s'appliquerait également aux enregistrements comme `NS` et `MX`, ce qui
rentrerait en conflit avec ces enregistrements déjà existants dans votre zone.
[Une explication technique plus détaillée est disponible sur le site de l'ISC](https://www.isc.org/blogs/cname-at-the-apex-of-a-zone/).
# Solutions possibles
## Implémentations non-standard : ALIAS et CNAME flattening
Certains hébergeurs et logiciels DNS proposent une solution non-standard à ce problème.
Gandi permet de configurer un champ `ALIAS` à l'apex d'une zone qui pointe vers un autre
nom comme `garage.deuxfleurs.fr`. Cet enregistrement `ALIAS` ne sera jamais renvoyé directement
aux clients DNS : à la place, ce sont les serveurs DNS de Gandi qui vont dynamiquement consulter
les enregistrements `A` et `AAAA` de `garage.deuxfleurs.fr`, puis les renvoyer dans la requête
initiale pour `example.com`.
De manière confuse, [Cloudflare permet de mettre un enregistrement CNAME à l'apex d'une zone](https://blog.cloudflare.com/introducing-cname-flattening-rfc-compliant-cnames-at-a-domains-root/).
Comment font-ils, puisque c'est interdit ? En fait, ils utilisent exactement la même technique que Gandi, mais
ils ont choisi de réutiliser le terme `CNAME` là où Gandi appelle cela un `ALIAS`. C'est un choix de nom
très discutable puisqu'il ne s'agit pas vraiment d'un CNAME.
Très peu d'implémentations logicielles libre de serveur DNS faisant autorité proposent cette fonctionnalité.
Les logiciels classiques Bind, NSD et Knot ne l'implémentent pas. Parmi les autres logiciels couramment utilisés,
seuls [PowerDNS Authoritative Nameserver](https://doc.powerdns.com/authoritative/index.html) et [CoreDNS](https://coredns.io/) l'implémentent :
[PowerDNS avec la syntaxe ALIAS comme chez Gandi](https://doc.powerdns.com/authoritative/guides/alias.html), et
[CoreDNS avec la syntaxe CNAME abusive comme chez Cloudflare](https://coredns.io/explugins/alias/).
Il faut noter que c'est une technique plutôt complexe à implémenter correctement, puisqu'elle nécessite que le serveur DNS
faisant autorité joue un rôle de récurseur, ce qui n'est pas nécessaire en temps normal.
Au final, c'est une solution ad-hoc qui est très spécifique à certains fournisseurs
et logiciels, avec même plusieurs syntaxes possibles. Elle présente donc un risque fort
d'enfermement auprès de ces fournisseurs ou logiciels.
## En cours de standardisation : SVCB et HTTPS
Deux nouveaux types d'enregistrements DNS sont [en cours de standardisation : SVCB et HTTPS](https://datatracker.ietf.org/doc/draft-ietf-dnsop-svcb-https/).
Ce travail en cours couvre un spectre plus large, mais il résout en particulier
ce problème de CNAME à l'apex.
En mars 2023, ce document de travail en est à sa 12ème révision et n'a pas encore été publié
officiellement comme un standard (RFC). Cependant, il semblerait que [certains navigateurs web et certains logiciels
serveurs DNS aient déjà commencé à implémenter cette spécification depuis 2021 environ](https://serverfault.com/a/1075524).
## Solutions recommandées chez Deuxfleurs
Vous êtes responsable de votre nom de domaine, donc n'hésitez pas à expérimenter si
vous le souhaitez ! Si vous avez des retours sur l'utilisation de SVCB/HTTPS, nous sommes intéressés.
Cependant, Deuxfleurs recommande pour l'instant les solutions suivantes :
- utiliser un sous-domaine lorsque cela est possible
- sinon, utiliser l'implémentation non-standard de Gandi ou Cloudflare
En effet, la solution SVCB/HTTPS est encore en cours de standardisation en 2023
et va mettre de nombreuses années avant d'être déployée sur tous les terminaux.
Compter uniquement sur cette solution, c'est écarter de fait tous les clients un
peu anciens (vieux téléphones Android, anciennes versions de Windows ou d'Ubuntu
pas mises à jour), alors que Deuxfleurs cherche à éviter l'obsolescence et faire
en sorte que ces appareils restent utilisables le plus longtemps possible.

105
content/services/_index.md Normal file
View file

@ -0,0 +1,105 @@
---
title: "Services"
description: "Nos services"
weight: 10
sort_by: "weight"
extra:
parent: 'services/_index.md'
---
Cette section du Guide présente les services proposés par [Deuxfleurs](https://deuxfleurs.fr). Nous essayons de fournir des services qu'on juge _essentiels_ et _sobres_. Vous y trouverez une page de manuel pour chacun d'entre eux.
Notez que certains services sont _en accès libre_, tandis que d'autres sont _sur inscription_, auquel cas il faut au moins être usager⋅e ou membre de Deuxfleurs pour y accéder. Voir la page [Nous Rejoindre](@/vie_associative/nous_rejoindre.md).
# Communication
Internet, c'est d'abord la communication entre personnes.
Nous proposons un service de messagerie instantanée, des boîtes e-mail personnelles, et de la visioconférence.
Venez discuter avec nous (ou avec qui vous voudrez) !
<!-- Nous proposons un certain nombre d'outils de communication entre utilisateurices, vous trouverez donc les équivalents libres de vos outils de communication habituels. -->
- [***Discussion instantanée***](@/services/jitsi.md) sur inscription :\
Pour l'échange de messages dans le style des **SMS**, de **Whatsapp**, **Messenger** ou équivalent nous proposons ***Matrix***.
Ce protocole fédéré doté d'applications sympathiques permet de discuter de façon agréable et sécurisée (les messages personnels sont chiffrés de boût en boût, et les salons peuvent l'être aussi).
Matrix fonctionne sur tout périphérique, et est accessible *via* une application ou sur navigateur web directement.
\
\
[↣ Apprendre à utiliser Matrix](@/services/matrix.md)\
[↣ Accéder au service Matrix](<https://im.deuxfleurs.fr>)
- [***E-mails personnels***](@/services/email.md) sur inscription :\
Pilier fondamental de la communication en ligne, nous utilisons tous les jours ce service d'e-mails pour nos usages personnels et associatifs.
\
\
[↣ Apprendre à utiliser notre service d'e-mails](@/services/email.md)\
[↣ Accéder au service de mails (interface SoGo)](<https://sogo.deuxfleurs.fr>)\
[↣ Accéder au service de mails (interface légère Alps)](<https://alps.deuxfleurs.fr>)
- [***Visioconférence***](@/services/jitsi.md) en accès libre :\
Pour la visioconférence dans le style de **Skype**, **Zoom** ou autre, nous proposons ***Jitsi***.
Ce service est utilisable sur tout périphérique, permet d'inviter jusqu'à 30 personnes, dactiver/désactiver caméra et micro, ou encore de partager son écran.
\
\
[↣ Apprendre à utiliser Jitsi](@/services/jitsi.md)\
[↣ Accéder au service Jitsi](https://jitsi.deuxfleurs.fr)
# Édition collaborative
Bien niaise est la personne qui croit construire seule une cathédrale. Les œuvres humaines majeures sont toujours le fruit d'un effort collectif. Internet nous fournit justement des outils pour travailler à plusieurs, sur des documents ou du logiciel.
- [***Édition collaborative de documents***](@/services/cryptpad.md) en accès libre :\
Dans l'idée de **Google Doc**, de la prise de notes de réunion aux tableurs et formulaires (**Framadate**), nous vous proposons l'outil ***Cryptpad***.
Il permet d'éditer à plusieurs tout type de document (texte, tableur, présentation, sondage), et même d'organiser des dossiers partagés en groupe.
\
\
[↣ Apprendre à utiliser le formulaire Cryptpad](@/services/cryptpad.md)\
[↣ Accéder au service Cryptpad](https://pad.deuxfleurs.fr)
- [***Forge logicielle***](@/services/git.md) en accès libre :\
Pour héberger notre code (et le vôtre), nous utilisons le serveur _git_ ***ForgeJo***.
\
\
[↣ Apprendre à utiliser ForgeJo](@/services/git.md)\
[↣ Accéder au service ForgeJo](https://git.deuxfleurs.fr)
# Publication
Vous êtes prêt⋅e à dévoiler au monde vos travaux ? Pour ce faire, nous vous proposons fièrement d'héberger vos sites web _statiques_, ou de vous créer un blog fédéré avec Plume.
Pour du partage de contenu nous avons plusieurs outils à disposition, que ce soit des documents partagés, des formulaires, des postes de blogs ou des sites web !
- [**Sites Web Statiques**](@/services/web.md) sur inscription :\
Nous avons développé [Garage](https://garagehq.deuxfleurs.fr) pour héberger des sites web de façon sobre et résiliente sur les serveurs de branchés chez nos membres.
« Statique » signifie qu'on ne peut pas héberger de Wordpress, Kirby, etc. — plus d'infos [ici](@/services/statique-comment-ça.md).
\
\
[↣ Apprendre à créer un site web](@/services/web.md)\
[↣ Accéder à la plateforme d'hébergement de sites web](https://garagehq.deuxfleurs.fr)
- [***Blogs***](@/services/plume.md) sur inscription :\
Pour l'écriture d'un blog avec un système d'abonnements et de notifications de nouveau contenu, nous vous proposons ***Plume***.
Ce logiciel appartient à la Fediverse, ce qui fait qu'il sera particulièrement facile de republier vos pensées sur Mastodon ou autre service fédéré par ActivityPub.
Notez que Plume est un logiciel libre en mal d'amour, et qu'il est de ce fait assez taquin à utiliser. Néanmoins il fonctionne !
\
\
[↣ Apprendre à utiliser Plume](@/services/plume.md)\
[↣ Accéder à la plateforme Plume](https://plume.deuxfleurs.fr)
# Adresse des services
- [**Discussion instantanée**](<https://im.deuxfleurs.fr>) : <https://im.deuxfleurs.fr> — client web Element
- [**E-mails**](<https://sogo.deuxfleurs.fr>) : <https://sogo.deuxfleurs.fr> — client e-mail web SOGo
- [**E-mails**](https://alps.deuxfleurs.fr) : <https://alps.deuxfleurs.fr> — client e-mail web Alps (plus léger)
- [**Visioconférence**](https://jitsi.deuxfleurs.fr) : <https://jitsi.deuxfleurs.fr> — client web Jitsi
- [**Édition collaborative de documents**](https://pad.deuxfleurs.fr): <https://pad.deuxfleurs.fr> — suite web CryptPad
- [**Forge logicielle**](https://git.deuxfleurs.fr) : <https://git.deuxfleurs.fr> — serveur _git_ ForgeJo
- [**Sites Web**](https://garagehq.deuxfleurs.fr) : <https://garagehq.deuxfleurs.fr> — plateforme d'hébergement de sites web statiques
- [**Blogs**](https://plume.deuxfleurs.fr) : <https://plume.deuxfleurs.fr> — plateforme de blog fédérée Plume

View file

@ -0,0 +1,74 @@
---
title: Avec un générateur
description: Créer du contenu avec un générateur
sort_by: weight
weight: 2
draft: false
date: 2025-03-29
extra:
parent: services/creer-du-contenu.md
---
Si vous souhaitez vous créer un blog, vous allez probablement avoir un site web avec de nombreuses pages : au moins une par billet que vous allez composer ! À la longue, on peut sans problème arriver à des dizaines de pages... Si on les écrit à la main, il va falloir copier/coller une bonne partie du code HTML, mais pas tout. Pour éviter ce travail rébarbatif, il existe ce qu'on appelle des générateurs de sites statiques. Ils vous permettent d'écrire dans une syntaxe très simple (Markdown) vos contenus, sans vous soucier du HTML ou du CSS, car ils emballeront eux-mêmes vos écrits dans des modèles prévus à cet effet. [Le guide que vous êtes en train de lire en ce moment même utilise un tel outil !](https://git.deuxfleurs.fr/Deuxfleurs/guide.deuxfleurs.fr)
### Choisir un générateur et un thème
On peut séparer **deux types de générateurs de site web statique** :
- Ceux qui demandent une bonne expertise en informatique (en **ligne de commande**) : [Hugo](https://gohugo.io/), [Jekyll](https://jekyllrb.com/), [Zola](https://www.getzola.org/), et bien d'autres... En général, ils se ressemblent beaucoup. À titre indicatif, pour ce guide, nous utilisons Zola. Nous baserons nos exemples sur lui. Si votre système d'exploitation est Linux, cherchez dans votre gestionnaire de paquet si vous trouvez l'un d'entre eux. Zola est ainsi facilement installable sur Arch, Ubuntu, et Fedora.
- Ceux qui sont accessibles aux non-spécialistes (avec une **interface graphique**) : [Publii](https://getpublii.com/), [Scribouilli](https://scribouilli.org/), [Zim](https://zim-wiki.org/)... Il s'agit alors d'installer un logiciel (le générateur) sur son ordinateur, qui va nous permettre de fabriquer notre site. Ledit générateur peut ensuite publier notre site et ses modifications sur Internet -- ou alors il faut le faire à la main.
**Et le thème ?**
Chaque générateur de site statique propose des thèmes graphiques, pour donner à votre site une apparence unique.
Par exemple; pour Zola, il faut aller [sur leur galerie](https://www.getzola.org/themes/). Si vous cliquez sur l'un d'entre eux, vous aurez des instructions sur comment l'installer. Il s'agit souvent de télécharger le thème dans le dossier correspondant à votre site, et de modifier le fichier `config.toml`, nécessaire pour Zola, afin de sélectionner le thème.
## Fonctionnement des générateurs en ligne de commande
On détaille l'utilisation d'un générateur en ligne de commande, en prenant l'exemple de Zola.
### Rédiger du contenu avec le langage Markdown
Les éditeurs en ligne de commande vous proposent généralement d'écrire les pages et billets de blogs de votre site dans un langage plus simple que HTML. C'est souvent Markdown.
Rassurez-vous, il a été pensé pour être très simple et peut-être appris en quelques minutes. Voici un exemple :
```
# Ceci est le titre principal
## Ceci est un sous-titre
Ceci est du texte tout à fait normal. *Cette partie-ci du texte sera en italique*. **Cette partie-là sera en gras**.
## Ceci est encore un sous-titre
### Ceci est un sous-sous-titre
Voici du texte pour introduire la liste à puce qui va suivre :
* première élément de la liste
* second élément de la liste
* troisième élément de la liste
```
Quand on écrit du texte sans mettre quoi que ce soit autour ou avant, cela deviendra du texte tout à fait normal. On peut mettre un ou plusieurs dièses au début de la ligne pour en faire un titre. On peut mettre du texte en italique ou en gras avec des astérisques. Un astérisque en début de ligne provoque une liste à puces. Bref, cette syntaxe n'est pas compliquée, et vous pouvez facilement trouver plein de tutoriels en ligne pour la connaître. [Framasoft, par exemple, propose un bon guide](https://docs.framasoft.org/fr/grav/markdown.html).
Une fois votre fichier écrit, enregistrez-le avec l'extension `.md`, par exemple sous le nom `recette-tarte-au-citron.md`. L'idée est qu'à chaque page de votre site correspond un fichier `.md`, et ceux-ci seront regroupés dans un dossier. Vous trouverez [dans notre forge](https://git.deuxfleurs.fr/Deuxfleurs/guide.deuxfleurs.fr/src/branch/main/content) les fichiers Markdown écrits pour faire ce guide.
Cependant, il reste juste une petite chose à faire lorsque vous avez fini votre texte : écrire l'en-tête au dessus du markdown, qui donnera au générateur des informations importantes sur ce contenu. On encadre cet en-tête avec trois signes plus. Voici un exemple basé sur cette page :
```
---
title: "Avec un générateur"
description: "Créer du contenu avec un générateur"
date: 2022-09-01
---
# Titre
Texte de la page...
```
Comme vous l'avez peut-être compris, il s'agit de donner le titre de cette page, sa description, et sa date d'écriture. D'autres informations peuvent être rajoutées, cela dépend du générateur et du thème sélectionnés.
### Générer les pages
Vous avez donc des fichiers `.md` renfermant vos contenus, et un thème qui vous plaît. Avec un terminal, positionnez-vous dans le dossier racine de votre site projet. Si vous utilisez Zola, celui-ci devrait contenir un fichier `config.toml`, vous pouvez alors faire `zola build`. Cela va générer l'intégralité de votre site dans le dossier `public/`. Vous constaterez donc qu'il sera rempli de fichiers `.html` et `.css`, [vous êtes alors prêt(e) à passer à la publication](@/prise_en_main/publier-le-contenu.md) !

View file

@ -0,0 +1,55 @@
---
title: "aws-cli"
description: "Publier avec aws-cli"
date: 2025-03-29
weight: 20
extra:
parent: "services/publier-le-contenu.md"
---
Nous allons désormais verser votre site sur Garage, ce dernier le servira à toutes les personnes qui voudront le voir. Vous aurez besoin de l'identifiant de votre clé d'accès et de la clé d'accès secrète, obtenus dans la partie «[Initialiser votre accès](@/services/initialiser-votre-accès.md)».
### Paramétrer votre accès localement
Pour verser votre site sur Garage, nous allons utiliser l'outil de base pour faire des commandes S3 : [aws-cli](https://github.com/aws/aws-cli) et son binaire, `aws`.
Vous pouvez installer `aws` :
- soit via les paquets fournis par votre distribution (par ex. [Ubuntu](https://snapcraft.io/aws-cli) ou [Fedora](https://packages.fedoraproject.org/pkgs/awscli2/awscli2/))
- soit en suivant les instructions sur [le site officiel d'Amazon](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).
Une fois `aws` installé sur votre machine, vous pouvez suivre les instructions de connexion indiquées sur [le guichet](https://guichet.deuxfleurs.fr/website). Sélectionnez votre site à gauche, puis cliquez sur l'onglet "S3" et consultez la partie "awscli (tout générateur de site statique)".
### Configurer la page par défaut et celle pour les erreurs
Puisqu'on est sur la configuration S3, profitons-en pour paramétrer une page d'accueil et une page d'erreur.
En effet, les URL qu'on utilise pour naviguer sur votre site correspondront à la hiérarchie de fichiers présents sur Garage. Si on visite `https://votre-site.fr/blog/recette-de-gateau.html`, Garage va simplement servir le fichier `blog/recette-de-gateau.html`, en partant de la racine du bucket. Mais que ce passe-t-il si on demande à voir `https://votre-site.fr/blog/` ? Garage ne peut pas retourner un dossier; et de toute façon cela ne fonctionnerait pas, puisqu'un dossier n'a pas de données propre à lui-même, il ne fait que contenir des fichiers distincts en son sein. On voit pourtant souvent ce genre d'URL en ligne. En fait, les serveurs web sont configurés pour que si aucun fichier du dossier n'est spécifié, alors on va utiliser celui avec un nom paramétré à l'avance. C'est de ça dont on parle.
De même, lorsque quelqu'un demande une page qui n'existe pas, que peut faire Garage ? Dans la même logique, on va lui donner un nom de fichier à servir par défaut si jamais cela arrive.
Après avoir fait votre `source ~/.awsrc`, faites :
```
aws s3 website exemple-un.fr --index-document index.html --error-document erreur.html
```
si votre `aws` est en version 2.x, ou
```
aws s3api put-bucket-website --bucket exemple-un.fr --website-configuration '
{
"ErrorDocument": {
"Key": "/errors/4xx.html"
},
"IndexDocument": {
"Suffix": "index.html"
}
}
'
```
s'il est en version 1.x . Pensez à remplacer `exemple-un.fr` par votre nom de domaine à vous !
### Publier
On y est ! Avec un terminal, positionnez-vous dans le répertoire qui reflète ce que vous voulez mettre en ligne. Celui-ci devrait contenir des fichiers en `.html`, `.css`, ou `.js`, mais pas de `.md`. Si vous ne l'avez pas fait, faites `source ~/.awsrc`, et lancez ensuite :
```
aws s3 sync --delete . s3://exemple-un.fr
```
Cette commande suppose que vous avez `aws` en version 2. N'oubliez pas de mettre votre nom de domaine à la place d'`exemple-un.fr`.
L'option `--delete` supprime les fichiers distants qui ne sont pas présents localement, ce qui est généralement une bonne idée pour éviter de laisser traîner des vieux fichiers sur les serveurs de Deuxfleurs. Mais attention à ne pas supprimer par mégarde des morceaux de votre site web.
Vos fichiers devraient être téléversés. Une fois le processus fini, vous devriez pouvoir ouvrir un navigateur web tel que Firefox par exemple, taper votre nom de domaine dans la barre URL, et naviguer sur votre site web. En cas de pépin, essayez d'actualiser la page en faisant `ctrl`+`shift`+`r` avec votre clavier, ça vous garantira que votre navigateur récupère le vrai contenu en ligne au lieu de piocher dans le cache local sur votre ordinateur.

View file

@ -0,0 +1,32 @@
---
title: "Configurer l'apex chez Gandi"
description: "Paramétrer l'entrée DNS directement sur le nom de domaine de base"
date: 2023-12-04
weight: 1
extra:
parent: "services/mettre-place-DNS.md"
---
Supposons que vous avez loué `camille-michu.fr` chez Gandi.
D'abord, rendez-vous dans votre espace utilisateur Gandi, puis de là cliquez dans le menu à gauche sur «Nom de domaine» :
![dns1.png](/img/apex_gandi_1.png)
Une fois sur la page «Nom de domaines», votre nom de domaine devrait apparaître dans la liste, ici «camille-michu.fr». Cliquez dessus :
![dns2.png](/img/apex_gandi_2.png)
Dans le menu du haut, sélectionnez «Enregistrements DNS» :
![dns3.png](/img/apex_gandi_3.png)
Ensuite cliquez sur le bouton «Ajouter un enregistrement» :
![dns4.png](/img/apex_gandi_4.png)
Choisissez alors «ALIAS» comme type, et `garage.deuxfleurs.fr` comme nom d'hôte.
![dns5.png](/img/apex_gandi_5.png)
Maintenant que votre configuration DNS est réglée, vous pouvez [préparer votre contenu](@/prise_en_main/creer-du-contenu.md) !

View file

@ -0,0 +1,37 @@
---
title: "Configurer l'apex chez Scaleway"
description: "Paramétrer l'entrée DNS directement sur le nom de domaine de base"
date: 2023-12-04
weight: 2
extra:
parent: "services/mettre-place-DNS.md"
---
Supposons que vous avez loué `camille-michu.fr` chez Scaleway.
D'abord, rendez-vous dans votre espace utilisateur Scaleway. Sur la liste à gauche de l'écran, cliquez sur «Domains and DNS» dans la section «Network». Vous devriez arriver sur l'écran suivant. Cliquez sur votre nom de domaine :
![dns1.png](/img/apex_scaleway_1.png)
Une fois ici, cliquez sur l'onglet «Zones DNS» :
![dns2.png](/img/apex_scaleway_2.png)
Dans l'écran suivant, cliquez sur «Zone racine» :
![dns3.png](/img/apex_scaleway_3.png)
Ensuite, cliquez sur le bouton «Ajouter des records» :
![dns4.png](/img/apex_scaleway_4.png)
Une fenêtre va apparaître au centre de l'écran. Remplissez là exactement comme suit. Attention, dans le champ «Nom de l'hôte», `garage.deuxfleurs.fr` doit être suivi d'un point, sans espace, comme illustré, ne l'oubliez pas ! Vous pouvez après cliquer sur le bouton «Modifier le record».
![dns5.png](/img/apex_scaleway_5.png)
Vous devez alors vous retrouver face à un écran similaire au suivant :
![dns5.png](/img/apex_scaleway_6.png)
Félicitation, vous avez réussi ! Maintenant que votre configuration DNS est réglée, vous pouvez [préparer votre contenu](@/prise_en_main/creer-du-contenu.md) !

View file

@ -0,0 +1,61 @@
---
title: "Contacts & Calendriers"
description: "Contacts & Calendriers"
weight: 21
extra:
parent: 'services/email.md'
---
Vous pouvez utiliser Deuxfleurs pour synchroniser vos contacts et vos calendriers ! Par exemple, pour retrouver sur votre téléphone les adresses et rendez-vous que vous avez prévus sur le client web de votre ordinateur.
# Dans un navigateur web
Notre client mail [https://sogo.deuxfleurs.fr/](https://sogo.deuxfleurs.fr/) contient aussi vos informations de calendrier et de contacts.
# Sur téléphone
Pour que votre téléphone discute avec notre infrastructure, on recommande d'installer l'application libre [DAVx5](https://www.davx5.com/).
- [📥 Application Android (F-Droid)](https://f-droid.org/packages/at.bitfire.davdroid/)
- [📥 Application Android (Google Play Store)](https://play.google.com/store/apps/details?id=at.bitfire.davdroid&hl=en-US&pli=1)
- [📥 Application iOS](https://www.davx5.com/tested-with/icloud)
Une fois l'application installée, il faut ajouter un compte, choisir l'option `Connexion avec une URL et un nom d'utilisateur`, et rentrer :
* `Url de base` : `https://sogo.deuxfleurs.fr/SOGo/dav/`
* `Nom d'utilisateur` : votre adresse e-mail
* `Mot de passe` : votre mot de passe Deuxfleurs
Validez en cliquant sur `Se connecter`. Vous devriez voir apparaître un encart avec votre adresse Deuxfleurs. En cliquant dessus, vous aurez accès à plusieurs onglets, notamment Calendriers et Contacts, dans lesquels vous devriez voir une ou plusieurs lignes. Cochez les lignes que vous voulez synchroniser avec votre téléphone.
L'application `DAVx5` va rendre disponible vos informations de contacts et de calendrier sur votre téléphone. Vous allez ensuite pouvoir les utiliser dans vos application dédiées.
## Contacts
Dans votre application de contacts, vous pouvez sélectionner diverses listes de contact à afficher.
Vous devriez avoir une nouvelle liste de contacts Deuxfleurs dans laquelle vous pouvez accéder aux contacts ainsi qu'y inscrire vos nouveaux contacts.
## Calendrier
Similairement, c'est dans votre application d'agenda que vous allez pouvoir afficher le calendrier Deuxfleurs et y ajouter des événements.
# Sur ordinateur
Sur ordinateur le client e-mail [Mozilla Thunderbird](https://www.thunderbird.net) permet d'accéder en lecture & écriture à votre agenda ainsi qu'à vos contacts. Suivez ces étapes.
* Vous rendre dans l'onglet Agenda, cliquer sur « Nouvel agenda », et sélectionner « Sur le réseau ». On demande alors deux informations.
* `Nom d'utilisateur` : renseignez votre adresse e-mail complète.
* `Adresse` : vous l'obtiendrez en vous connectant à [SoGO](https://sogo.deuxfleurs.fr), onglet « Agenda », cliquez sur les 3 points verticaux à droite de votre agenda dans le menu de gauche, puis « Liens vers cet agenda »
Prenez le premier lien : « Accès aux utilisateurs authentifiés > Accès en CalDAV ».
Chez moi, cela donne (remplacez bien `MON_PSEUDO` par votre nom d'utilisateur !) :
http://sogo.deuxfleurs.fr/SOGo/dav/MON_PSEUDO/Calendar/personal/
* De retour dans Thunderbird, on peut cliquer sur « Rechercher des agendas ».
* On vous demande alors votre mot de passe (celui de votre compte Deuxfleurs).
* Vous devriez alors voir votre agenda apparaître. Il ne reste qu'à cliquer sur « S'abonner » !

View file

@ -0,0 +1,13 @@
---
title: Créer du contenu
description: Comment créer du contenu pour votre site web
sort_by: weight
weight: 40
date: 2025-03-29
extra:
parent: services/web.md
---
Votre site est désormais complètement configuré. Avant de publier du contenu, il faut écrire celui-ci !
Vous pouvez, au choix, [l'écrire à la main](@/services/à-la-main.md), ou vous [faire assister par un générateur](@/services/avec-un-générateur.md).

View file

@ -0,0 +1,33 @@
---
title: "Édition collaborative"
description: "La bureautique collégiale avec Cryptpad"
weight: 20
extra:
parent: 'services/_index.md'
---
# Accès à Cryptpad
- [🌐 Accéder via le navigateur](https://pad.deuxfleurs.fr)
# Les différentes utilisation de Cryptpad
## Traitement de texte
Pour du traitement de texte, dans le style de Word, Google Docs ou LibreOffice, il y a l'outil "Texte".
L'outil permet de taper du texte mais aussi de partager le document avec d'autre utilisateurices afin de taper en simultané.
Pour du traitement de texte Markdown utilisez plutot l'outil "Code".
## Formulaires
Pour des sondages, des enquêtes ou toute forme de fomulaire, dans le style de Google Forms, nous vous conseillons l'outil "Formulaire" de Cryptpad.
## Gestion de projet / Listes de tâches
Pour de la gestion de projet, de l'organisation de tâche et planification, Cryptpad propose un [Kaban Board](https://en.wikipedia.org/wiki/Kanban_board) via l'outil Kanban.
## Autre
Il existe d'autre mode d'utilisation de Cryptpad que nous ne recommandons pas, soit car nous ne les utilisons pas, soit car ils sont connus pour leurs problèmes de fonctionnement comme le tableur.
Utilisez les à vos risques et périls !

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,46 @@
---
title: "Hugo"
description: "Publier un site web sur Deuxfleurs avec Hugo"
date: 2025-03-29
weight: 10
extra:
parent: 'services/publier-le-contenu.md'
---
Configurez le fichier `~/.aws/credentials` de la manière suivante avec votre
identifiant de clef (`GKxxxx`) et votre clef secrète (`xxxxxx`), que vous
pouvez récupérer depuis [le
guichet](https://guichet.deuxfleurs.fr/website/configure#):
```ini
[default]
aws_access_key_id = GKxxxxxx
aws_secret_access_key = xxxxxxxx
```
Ensuite, ajoutez les lignes suivantes dans le fichier `config.toml` du dossier
de votre site web utilisé par Hugo:
```toml
[deployment]
order = [".jpg$", ".gif$", ".png$"]
[[deployment.targets]]
name = "deuxfleurs"
URL = "s3://votresiteweb.fr&endpoint=garage.deuxfleurs.fr&region=garage&s3ForcePathStyle=true"
```
Dans la ligne `URL`, remplacez `votresiteweb.fr` par le nom de domaine que vous souhaitez utiliser.
Une fois la configuration faite, vous pouvez publier votre site web en
exécutant simplement la commande suivante:
```
hugo deploy
```
Pour en savoir plus, consultez la documentation officielle à l'adresse:
* <https://gohugo.io/hosting-and-deployment/hugo-deploy/>

45
content/services/email.md Normal file
View file

@ -0,0 +1,45 @@
---
title: "E-mails"
description: "Faire héberger ses e-mails par Deuxfleurs"
weight: 11
extra:
parent: 'services/_index.md'
---
# Accéder à vos emails
<ul>
<li><a href='https://sogo.deuxfleurs.fr'>🌐 Accéder via le navigateur (SoGo)</a></li>
<li><a href='https://alps.deuxfleurs.fr'>🌐 Accéder via le navigateur (alps, version allégée)</a></li>
<li><a href='https://www.thunderbird.net/fr/'>📥 Thunderbird (PC/Mac)</a></li>
<li><a href='https://k9mail.app/'>📥 K9 (Android)</a></li>
</ul>
# Configurer ses emails dans une application
| Protocole | Rôle | Hôte | Port | Chiffrement | Authentification | Certificat |
| -- | -- | -- | -- | -- | -- | -- |
| IMAP | Réception des emails | `imap.deuxfleurs.fr` | `993` | SSL/TLS | email+mdp | valide |
| SMTP | Envoi des emails | `smtp.deuxfleurs.fr` | `465` | SSL/TLS | email+mdp | valide |
| Exchange ActiveSync | Tous | `https://sogo.deuxfleurs.fr` | `443` | SSL/TLS | email+mdp | valide |
# Utiliser un nom de domaine personnalisé (autre que @deuxfleurs.fr)
L'hébergement d'e-mails avec des noms de domaines différents, comme `jesuis@toutepuissante.net`, est possible. Vous êtes responsable de la location du nom de domaine mais l'hébergement et la distribution peut être faite sur nos serveurs !
Pour la location du nom de domaine nous vous invitons a regarder [la page du guide associée](@/services/mettre-place-DNS.md).
[↣ Comment louer un nom de domaine](@/services/mettre-place-DNS.md)
Nous détaillons comment mettre en place l'hébergement de vos mails sur les serveurs deuxfleurs sur la [page suivante](@/services/hebergement_mail_perso.md)
[↣ Comment heberger mes mails sur Deuxfleurs](@/services/hebergement_mail_perso.md)
# Calendrier et Contacts
Vous pouvez utiliser Deuxfleurs pour synchroniser vos contacts et vos calendriers ! Par exemple, pour retrouver sur votre téléphone les adresses et rendez-vous que vous avez prévus sur le client web de votre ordinateur.
[↣ Comment utiliser Deuxfleurs pour les contacts et le calendrier](@/services/contacts_calendriers.md)

View file

@ -0,0 +1,23 @@
---
title: "FileZilla"
description: "Publier avec FileZilla"
date: 2025-03-29
weight: 50
extra:
parent: "services/publier-le-contenu.md"
---
Pour servir votre site sur Garage via SFTP, vous aurez besoin de votre nom d'utilisateur ainsi que du mot de passe utilisé pour se connecter au [guichet Deuxfleurs](https://guichet.deuxfleurs.fr).
Les dispositions qui suivent peuvent potentiellement fonctionner avec n'importe quel client SFTP. Si vous n'en connaissez pas, nous vous recommandons d'utiliser [FileZilla](https://filezilla-project.org/download.php?type=client).
Après avoir installé FileZilla Client (à ne pas confondre avec FileZilla Server), vous pouvez paramétrer les accès à Garage comme suit :
* ouvrez le Gestionnaire de sites (via le premier bouton à gauche de la barre d'outils, ou le menu Fichier, ou le raccourci `Ctrl+S`)
* choisissez le protocole "*SFTP - SSH File Transfer Protocol*"
* renseignez l'hôte `bagage.deuxfleurs.fr` et le port *2222*
* choisissez le type d'authentification "*Demander le mot de passe*"
* renseignez le même nom d'utilisateur que celui que vous utilisez sur le guichet Deuxfleurs
En cliquant sur "Connexion", une pop-up apparaîtra pour vous demander un mot de passe. Renseignez le même mot de passe que celui que vous utilisez sur le guichet Deuxfleurs. Vous pouvez désormais vous connecter à votre site.
Lorsque vous serez connecté, vous verrez affichés vos différents sites dans la moitié droite de la fenêtre de FileZilla, et les fichiers de votre ordinateur dans la moitié gauche. Vous pourrez ainsi verser ou télécharger les fichiers de votre ordinateur vers vos sites sur Garage et vice-versa.

9
content/services/git.md Normal file
View file

@ -0,0 +1,9 @@
---
title: "Forge logicielle"
description: "Le logiciel libre avec ForgeJo"
weight: 21
extra:
parent: 'services/_index.md'
---
TODO : désolé ami⋅es devs, mais on vous fait confiance pour vous documenter par vous-mêmes pour apprendre à utiliser notre forge ! Du moins jusqu'à ce qu'on trouve le temps d'écrire cette page du Guide.

View file

@ -0,0 +1,17 @@
---
title: "Guide d'installation Matrix"
description: "Guide de l'installation, la création de compte et la prise en main de Matrix"
date: 2024-08-19
weight: 3
extra:
parent: "services/matrix.md"
---
# Inscription
L'inscription au service matrix est comprise dans la création de compte deuxfleurs.
Si vous n'avez pas encore de compte Deuxfleurs et souhaitez nous rejoindre regardez [ici](@/vie_associative/nous_rejoindre.md).
# Utilisation
<!-- TODO -->

View file

@ -0,0 +1,76 @@
---
title: "Transférer une boite existante"
description: "Transférer une boite existante"
weight: 10
extra:
parent: 'services/email.md'
---
Deuxfleurs peut héberger vos e-mails, même s'ils ne finissent pas en `@deuxfleurs.fr` !
> Vous voulez louer votre propre nom de domaine ? [Cette page vous l'expliquera.](@/prise_en_main/mettre-place-DNS.md)
Dans ce guide, on crée chez Deuxfleurs une boîte mail avec un nom de domaine vous appartenant, en incluant la récupération (optionnelle) des e-mails existants chez votre ancien fournisseur vers les serveurs de Deuxfleurs.
1. Si vous souhaitez rapatrier vos anciens e-mails de l'ancien fournisseur vers Deuxfleurs, faites une sauvegarde de vos e-mails sur votre machine :
> Nous présentons une méthode fiable ([cf. ce guide](https://github.com/joeyates/imap-backup/blob/main/docs/migrate-server-keep-address.md)), mais qui demande de bonnes connaissances en informatique. Vous pourriez avoir besoin de l'aide d'un⋅e administrateur⋅ice de Deuxfleurs.
>
> Si vous lui déléguez complètement l'opération, iel aura besoin de vos mots de passe chez votre ancien opérateur mail, chez Deuxfleurs, et manipulera votre sauvegarde d'e-mails. On vous recommande dans ce cas de changer vos mots de passe avant et après l'opération, et de vous armer de confiance.
* Faites de la place ! Chez votre fournisseur actuel, supprimez votre corbeille, vos vieux e-mails volumineux et inutiles, etc.
* Téléchargez l'outil [`imap-backup`](https://github.com/joeyates/imap-backup/).
* Utilisez `imap-backup setup` pour renseigner vos identifiants ainsi que le serveur IMAP de votre fournisseur mail actuel.
* Lancez `imap-backup backup --accounts=<votre_adresse_mail>`, ce qui va télécharger tous vos e-mails sur votre ordinateur (c'est long).
1. Communiquez votre nom de domaine à un⋅e administrateur⋅ice de Deuxfleurs pour qu'iel l'ajoute à :
* la liste des [domaines gérés par Deuxfleurs dans le LDAP](https://guichet.deuxfleurs.fr/admin/ldap/ou=domains,ou=groups,dc=deuxfleurs,dc=fr),
* et dans la [table de signature DKIM](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/cluster/prod/app/email/config/dkim/signingtable).
1. Communiquez-lui l'adresse e-mail que vous souhaitez utiliser. Vous pouvez ajouter autant d'alias que vous souhaitez, il seront reçus sur la même boîte mail.
L'admin devra les ajouter ligne à ligne dans l'entrée `mail` dans votre profil utilisateur (en laissant votre adresse `@deuxfleurs.fr` en premier).
1. Vous devez ensuite rajouter les entrées pour votre nom de domaine en éditant votre zone DNS (si vous n'y comprenez rien, faites-vous aider de l'admin) :
```
# L'entrée MX pour recevoir les e-mails
@ MX 10 smtp.deuxfleurs.fr.
# L'entrée SPF pour autoriser notre IP à délivrer des e-mails en votre nom
@ TXT "v=spf1 include:deuxfleurs.fr -all"
# L'entrée DKIM pour autoriser notre postfix+opendkim à délivrer des e-mails en votre nom
smtp._domainkey CNAME smtp._domainkey.deuxfleurs.fr.
# L'entrée DMARC pour indiquer le comportement à adopter si les contraintes précédentes ne sont pas satisfaites
_dmarc CNAME _dmarc.deuxfleurs.fr.
```
1. À partir de ce point, vous pouvez envoyer et recevoir vos e-mails via notre infrastructure. [Suivez le Guide !](@/prise_en_main/email.md)
Il faudra par contre attendre 24/48h pour que les changements DNS se propagent dans le monde entier. Vous pourriez encore recevoir quelques e-mails chez votre ancien fournisseur dans l'intervalle. Passé ce délai, vérifiez dans l'interface e-mail de votre ancien fournisseur.
1. Si vous avez sauvegardé vos e-mails sur votre machine, il est finalement temps de les envoyer sur les serveurs de Deuxfleurs (toujours avec l'aide optionnelle de l'admin, si vous êtes bloqué⋅e) :
* Assurez-vous d'avoir terminé la sauvegarde en étape 1.
* Trouvez sur votre machine le dossier contenant la configuration d'`imap-backup` et votre sauvegarde d'e-mails (`~/.imap-backup/` sur Linux).
* Modifiez manuellement le fichier de configuration d'`imap-backup` et le nom du dossier de votre sauvegarde comme expliqué dans [le guide sus-cité](https://github.com/joeyates/imap-backup/blob/main/docs/migrate-server-keep-address.md). Imaginons que votre adresse mail est `moi@chezmoi.fr` :
* Remplacez à la ligne `username` votre e-mail par `moi-avant@chezmoi.fr` dans le fichier de configuration `config.json` d'`imap-backup`.
* Dans le même fichier, à la ligne `local_path`, remplacez le nom du dossier `moi_chezmoi.fr` par `moi-avant_chezmoi.fr`.
* Renommez le dossier `moi_chezmoi.fr` en `moi-avant_chezmoi.fr` dans le dossier d'`imap-backup`.
* Utilisez `imap-backup setup` pour renseigner vos identifiants Deuxfleurs (toujours le même e-mail, et votre mot de passe chez nous), ainsi que le serveur IMAP de Deuxfleurs (`imap.deuxfleurs.fr`).
* C'est le grand moment de la migration. Toujours en imaginant que votre adresse mail est `moi@chezmoi.fr`, lancez la commande suivante :
```imap-backup migrate moi-avant@chezmoi.fr moi@chezmoi.fr --destination-delimiter "."```
La commande devrait produire peu de lignes, et vous devriez voir (par exemple sur [sogo.deuxfleurs.fr](https://sogo.deuxfleurs.fr)) vos anciens e-mails apparaître. Si ce n'est pas le cas, appelez à l'aide.
Une fois cette longue commande terminée, c'est terminé. Bienvenu⋅e chez nous :)

View file

@ -0,0 +1,46 @@
---
title: Initialiser votre accès
description: Comment initialiser votre accès pour l'hébergement
sort_by: weight
weight: 20
extra:
parent: services/web.md
---
De par l'utilisation de son logiciel Garage, Deuxfleurs conserve et sert les sites web en recourant au stockage objet. Pour chaque site, on a un bucket (seau en français), partageant le même nom que lui. On peut voir un bucket comme un récipient dans lequel on va mettre tout nos fichiers à publier. Créer un bucket ne prend que quelques clics depuis votre compte DeuxFleurs.
# Créer un bucket pour héberger son site web
* En bas de l'[interface de votre compte](https://guichet.deuxfleurs.fr), cliquez sur "Mes sites Web".
* Cliquez sur "Nouveau site web".
* Spécifiez le nom de domaine pour votre site (l'identifiant du site qu'on tape dans la barre URL d'un navigateur pour y accéder) :
* Si vous n'avez pas votre propre nom de domaine, votre site peut être rendu accessible dans un sous-domaine de `web.deuxfleurs.fr`. Dans l'onglet "Je n'ai pas de nom de domaine", entrez le sous domaine de votre choix.
* Si vous avez votre propre nom de domaine, entrez-le dans l'onglet "Utiliser mon propre nom de domaine". Il faudra alors [configurer votre serveur DNS pour pointer sur l'adresse d'hébergement chez DeuxFleurs](@/services/mettre-place-DNS.md).
* Cliquez sur "Créer un nouveau site web" pour confirmer la création du bucket dans Garage.
Pour copier les fichiers du site web dans le bucket et [publier le site web](@/services/publier-le-contenu.md), vous aurez besoin des clefs d'accès et des propriétés du bucket accessibles en cliquant sur "Mes identifiants".
Les clefs d'accès permettent d'assurer que vous seul·e·s (ou celleux à qui vous partagez les clefs) peuvent modifier le contenu du site.
- L'identifiant de votre clé d'accès ressemble par exemple à `cSGcEQoInTVgkxPIzzF6IyU7C7`. Même s'il vaut mieux ne pas le crier sur tous les toits, il n'y a pas de risque de sécurité si vous le dévoilez à des gens.
- La clé d'accès secrète qui ressemble à `rCE6vzSVkll54FNd0Jvx7uoRsNqAXexxX1b3rm2BofquQKln6bdnDLRRli1dZbSS`, elle, comme son nom l'indique, doit absolument rester secrète. Si elle est dévoilée par accident, contactez un·e administrateur·rice immédiatement !
# Du point de vue des administrateur·ice·s
Pour les administrateur·ice·s, le bucket correspondant au site web apparaît comme :
```
$ sudo docker exec -ti 78e6b7e53241 /garage bucket list|grep -P 'exemple-un.fr|exemple-deux.eu'
4bdce6:exemple-un.fr 56a0f10929f0d63d0177415a22a0b636cf1efe92845f2b00e04b91298656e78e
exemple-deux.eu 941956ebfffa8fd564ad6b40e4bb5ac2f2b93bdbba1d1bf88fe6daff2cf4df6c
```
Si `exemple-un.fr` n'est pas à gauche dans la même colonne que `exemple-deux.eu`, c'est parce qu'il n'est pas réglé en global. L'administrateur·rice va corriger ça en faisant la commande suivante :
```
garage bucket alias 56a0f10929f0d63d0177415a22a0b636cf1efe92845f2b00e04b91298656e78e exemple-un.fr
```
On obtient le résultat suivant :
```
exemple-un.fr 4bdce6:exemple-un.fr 56a0f10929f0d63d0177415a22a0b636cf1efe92845f2b00e04b91298656e78e
exemple-deux.eu 941956ebfffa8fd564ad6b40e4bb5ac2f2b93bdbba1d1bf88fe6daff2cf4df6c
```

60
content/services/jitsi.md Normal file
View file

@ -0,0 +1,60 @@
---
title: "Visioconférence"
description: "La visio avec Jitsi"
weight: 12
extra:
parent: 'services/_index.md'
---
Jitsi est un logiciel de **visioconférence**, que Deuxfleurs fournit **en accès libre**.
# Accéder à Jitsi
- [🌐 Accéder via le navigateur](https://jitsi.deuxfleurs.fr)
- [📥 Application Android (F-Droid)](https://f-droid.org/en/packages/org.jitsi.meet/)
- [📥 Application Android (Google Play Store)](https://play.google.com/store/apps/details?id=org.jitsi.meet&hl=fr)
- [📥 Application iOS](https://apps.apple.com/fr/app/jitsi-meet/id1165103905)
# Conseils d'utilisation
La visioconférence est un service particulièrement tatillon à proposer bénévolement, surtout depuis des connexions domestiques.
Voilà quelques conseils pour vous assurer une bonne expérience :
## Préparer une réunion à l'avance
Le service étant en accès libre, vous n'avez qu'à décider d'une adresse web pour votre salon, par exemple `https://jitsi.deuxfleurs.fr/MONSUPERSALON`, et la diffuser à vos invité⋅es.
La première personne qui se connectera à ce salon en sera l'administrateur⋅ice. Prévoyez donc de vous y connecter en avance si c'est important pour vous.
## Quand ça rame (vidéo intermittente, son dégradé...)
### Diminuer la bande passante
<!-- ![Impression d'écran du menu « Paramètres de performance »](/img/jitsi_parametres_de_performance.png) -->
- Vous et vos correspondant⋅es pouvez ajuster vos « Paramètres de performance » pour échanger un flux vidéo plus léger. Vous trouverez ce menu dans les trois petits points « … Plus d'actions ».
- Vous n'avez peut-être pas besoin de la vidéo de tout le monde. Désactivez la vidéo ou gardez-la seulement pour certains participant⋅es.
- Si vous ne parlez pas, vous pouvez également couper votre microphone. Il est possible de passer en mode _talkie-walkie_ sur ordinateur avec la touche espace. Vous maintenez la touche espace, votre micro est activé. Vous arrêtez d'appuyer sur la touche espace, votre micro est coupé.
### Améliorer la connexion
- Connectez de préférence votre ordinateur en filaire (cable ethernet) à votre *box* (routeur internet).
- Si vous utilisez la communication sans fil (Wi-Fi), rapprochez-vous si possible de votre *box*.
- Le type de connexion internet influencera également la qualité de votre visioconférence : la fibre est idéale, l'ADSL ou les réseaux mobiles (4G, 5G etc.) sont plus incertains.
## Bien se faire entendre
- L'idéal est d'avoir un casque avec microphone ou des écouteurs avec microphone pour capter le son au plus près de votre bouche et _empêcher l'écho_ (que votre microphone capte ce qui sort sur les hauts-parleurs).
- Les micros intégrés aux ordinateurs portables récents captent généralement mieux le son que ceux des anciens.
- Si vous êtes plusieurs sur un seul ordinateur, tenez compte du fait que les microphones sont directionnels : la personne qui parle doit être en face de l'ordinateur.
## Mes correspondant⋅es sont connecté⋅es, mais je ne vois ni n'entends rien
Essayez de :
- Changer de navigateur web : [Firefox](https://www.mozilla.org/fr/firefox/new/), [Chromium](https://chromium.woolyss.com/download/)...
- Changer de connexion : connexion Internet d'un _smartphone_, Wi-Fi...
- Changer de pérhipérique.
Si rien de cela ne résoud le problème, il est temps de trouver une autre adresse pour votre visio d'aujourd'hui. Navré. <span aria-hidden="true">¯\\\_(ツ)\_/¯</span>

View file

@ -0,0 +1,37 @@
---
title: "Discussion instantanée"
description: "Messagerie instantanée avec Matrix"
date: "2024-08-19T15:10:33"
dateCreated: "2021-11-09T12:13:36.265Z"
weight: 10
extra:
parent: 'services/_index.md'
---
Matrix est un réseau de communication instantanée que vous pouvez utiliser pour rester en contact
avec votre famille, avec vos amis ou avec votre collectif ou association.
# Accéder à Matrix
- [🌐 Accéder via le navigateur](https://riot.deuxfleurs.fr)
- [📥 Application Android (F-Droid)](https://f-droid.org/fr/packages/im.vector.app)
- [📥 Application Android (Google Play Store)](https://play.google.com/store/apps/details?id=im.vector.app&hl=fr)
- [📥 Application iOS](https://apps.apple.com/fr/app/riot-im/id1083446067)
# Inscription & utilisation
Pour s'inscrire sur notre service Matrix, il faut un compte Deuxfleurs : [rejoignez-nous !](@/vie_associative/nous_rejoindre.md). Ensuite, [suivez le guide](@/services/guide_installation.md) pour la connexion au service et l'utilisation.
# Nos salons Deuxfleurs
Deuxfleurs a une pléthore de salons sur Matrix. C'est vraiment à cet endroit qu'on discute le plus entre nous. Le mieux pour les découvrir, c'est de rejoindre notre « espace » (un annuaire de salons et de personnes) qui s'appelle [#la-cabane:deuxfleurs.fr](https://matrix.to/#/#la-cabane:deuxfleurs.fr) et qui ressemble à ça :
![espace_matrix_3salons.png](/img/matrix.png)
À l'intérieur de cet espace, on vous recommande notamment les salons suivants :
* [deuxfleurs::asso](https://matrix.to/#/#deuxfleurs:deuxfleurs.fr) où l'on parle de l'association.
* [deuxfleurs::forum](https://matrix.to/#/#forum:deuxfleurs.fr) où l'on discute beaucoup des questions de numérique et société mais pas que.
* [deuxfleurs::infra](https://matrix.to/#/#tech:deuxfleurs.fr) où l'on parle « techniques » (informatique, notamment).
* [deuxfleurs::usages](https://matrix.to/#/#usages:deuxfleurs.fr) où l'on parle « usages » des services fournis par DeuxFleurs: bugs, problèmes, questions, remarques, souhaits, idées.

View file

@ -0,0 +1,25 @@
---
title: "Votre nom de domaine"
description: "Mise en place du nom de domaine"
date: 2022-09-01
weight: 30
extra:
parent: "services/web.md"
---
# Louer son nom de domaine
Les noms de domaine sont gérés et loués par les _registraires de nom de domaine_. Ce sont eux qui proposent aux clients finaux de réserver des noms. On peut citer [Gandi](https://www.gandi.net/fr), [OVHcloud](https://www.ovhcloud.com/fr/), ou [Scaleway](https://www.scaleway.com/fr/) par exemple. Lorsqu'on veut s'offrir `exemple-un.fr` notamment, c'est chez eux que ça se passe; ensuite, à leur tour, ils vont enregistrer notre demande auprès de l'organisme correspondant à l'extension choisie : l'association française [AFNIC](https://www.afnic.fr/) pour `.fr`, l'association états-unienne [Public Internet Registry ](https://thenew.org/) pour `.org`, l'association européenne (belge en particulier) [EURid](https://eurid.eu/fr/) pour `.eu`... Nous recommandons de privilégier l'une de ces trois extensions parmis la myriade qui existe, car ces entités ont pour historique de ne pas augmenter arbitrairement les prix tout en garantissant la disponibilité de votre nom de domaine.
Pour référence, la location d'un nom de domaine en `.fr` est d'environ 12 euros par an. Certaines offres vous fournissent «des extras» en plus comme une boîte courriel, sans que ça n'influe grandement sur les prix. En ce qui nous concerne, Gandi est un des registraires que nous recommandons.
## Utiliser directement le nom de domaine ou un sous-domaine ?
Une question importante est de choisir si on veut utiliser directement son nom de domaine (`example.com`) ou alors un sous-domaine, par exemple `blog.example.com`.
Utiliser un sous-domaine comme `www.example.com` ou `blog.example.com` fonctionnera chez tous les hébergeurs DNS et avec tous les logiciels DNS standards.
À l'inverse, utiliser le nom de domaine directement (c'est-à-dire l'apex, ici `example.com`) impose certaines contraintes techniques. Celles-ci sont détaillées dans la page [CNAME à l'apex](@/services/DNS-CNAME-apex.md).
Tous les registraires de nom de domaine ne proposent pas de champs `ALIAS` comme expliqué. C'est cependant le cas de Gandi et de Scaleway.
Pour configurer l'hébergement de votre site derrière le nom de domaine simple, ou apex :
- [C'est par ici si vous êtes chez Gandi](@/services/configurer_apex_Gandi.md)
- [C'est par ici si vous êtes chez Scaleway](@/services/configurer_apex_Scaleway.md)

19
content/services/plume.md Normal file
View file

@ -0,0 +1,19 @@
---
title: Blogs
description: Plume
weight: 31
extra:
parent: 'services/_index.md'
---
<!-- TODO -->
# Accéder à Plume
- [🌐 Accéder via le navigateur](https://plume.deuxfleurs.fr)
<!-- # Le Fédiverse -->
<!-- # S'abonner -->
<!-- # Créer du contenu -->

View file

@ -0,0 +1,56 @@
---
title: Publier du contenu
description: Comment publier votre contenu en ligne
sort_by: weight
date: 2025-03-29
weight: 50
extra:
parent: services/web.md
---
Nous allons désormais verser votre site sur Garage, et ce dernier le servira à toutes les personnes qui voudront le voir. Vous aurez besoin de l'identifiant de votre clé d'accès et de la clé d'accès secrète, obtenus dans la partie « [Initialiser votre accès](@/services/initialiser-votre-accès.md) ».
Si vous utilisez Hugo, vous pouvez le configurer pour envoyer directement le site sur les serveurs de Deuxfleurs:
* [Publier un site web sur Deuxfleurs avec Hugo](@/services/deploiement_hugo.md)
Dans les autres cas, vous avez le choix entre trois méthodes :
* [Faire ça en ligne de commande avec `aws-cli`](@/services/aws-cli.md). C'est la méthode la plus habituelle et la plus éprouvée, cependant il faut utiliser le terminal, et être sur linux est grandement conseillé pour celle-ci.
* [Faire ça avec l'utilitaire graphique `rclone`](@/services/rclone.md). Cette méthode vous paraîtra peut-être moins intimidante grâce à l'interface graphique du logiciel rclone. Celui-ci tourne sur Linux, Windows, et macOS.
* [Faire ça avec l'utilitaire graphique `winscp`](@/services/winscp.md). Cette méthode propose également une interface graphique, mais ne fonctionne que sur Windows.
Il existe aussi d'autres méthodes plus proches de celles habituellement utilisées pour verser des pages web en ligne :
* [En SFTP avec FileZilla](@/services/filezilla.md). Ce logiciel bien connu fonctionne sur Linux, Windows et macOS.
* [En WebDAV avec votre navigateur de fichiers](@/services/webdav.md). Avec cette méthode, vous pourrez manipuler les fichiers de votre site comme s'ils étaient sur votre ordinateur. Pour l'instant, seuls les gestionnaires de fichier Linux sont évoqués ici.
### Bravo !
Une fois l'un de ces trois guides suivi, vous aurez désormais votre propre site web accessible publiquement en ligne !
Vous pouvez rajouter dessus le badge attestant fièrement son hébergement sur Garage:
[![Badge indiquant qu'un site est hébergé sur Garage en français](/img/garage_fr.png)](https://garagehq.deuxfleurs.fr/)
[![Badge indiquant qu'un site est hébergé sur Garage en anglais](/img/garage_en.png)](https://garagehq.deuxfleurs.fr/)
Rajoutez l'image dans votre stockage, et mentionnez-la dans votre contenu.
En HTML, si vous avez écrit votre site à la main :
```
<a href="https://garagehq.deuxfleurs.fr/"><img src="garage_fr.png" alt="Badge indiquant que ce site est propulsé par le logiciel Garage" title="Site propulsé par Garage"></a>
```
En Markdown, si vous utilisez un générateur :
```
[![Badge indiquant qu'un site est hébergé sur Garage](/img/garage_fr.png)](https://garagehq.deuxfleurs.fr/)
```
Vous pouvez aussi revendiquer votre hébergement par Deuxfleurs avec les badges suivants :
[![Badge indiquant qu'un site est hébergé chez Deuxfleurs en français](/img/deuxfleurs_fr.png)](https://deuxfleurs.fr/)
[![Badge indiquant qu'un site est hébergé chez Deuxfleurs en anglais](/img/deuxfleurs_en.png)](https://deuxfleurs.fr/)
Avec les mentions suivantes, en HTML :
```
<a href="https://deuxfleurs.fr/"><img src="deuxfleurs_fr.png" alt="Badge indiquant que ce site est hébergé par l'association Deuxfleurs" title="Site hébergé par Deuxfleurs"></a>
```
Ou en Markdown :
```
[![Badge indiquant qu'un site est hébergé par l'association Deuxfleurs](/img/deuxfleurs_fr.png)](https://deuxfleurs.fr/)
```

103
content/services/rclone.md Normal file
View file

@ -0,0 +1,103 @@
---
title: "Rclone Browser"
description: "Publier avec Rclone Browser"
weight: 30
date: 2025-03-29
extra:
parent: "services/publier-le-contenu.md"
---
Rclone browser est un outil simple qui vous permet d'accéder directement à Garage.
# Installation
Si vous êtes sous macOS ou Windows, vous pouvez télécharger la dernière version depuis la page [github de rclone-browser](https://github.com/kapitainsky/RcloneBrowser/releases) (descendez un peu pour voir les liens).
Sous Ubuntu (lubuntu, kubuntu, etc.), Debian et Linux Mint, cherchez et installez "Rclone Browser" dans la logithèque ("App Store") ou lancez directement depuis un terminal :
```bash
sudo apt-get install -y rclone-browser
```
---
Le paquet existe aussi pour d'autres distributions :
```bash
sudo dnf install -y rclone-browser # fedora
sudo yay -S rclone-browser # arch linux
sudo nix-env -iA nixos.rclone-browser # nix os
```
# Premier lancement
Avant de lancer Rclone Browser, ouvrez un éditeur de texte.
Moi j'utilise "Éditeur de texte" sous Gnome aussi connu sous le nom de `gedit`. Sous Windows on peut utiliser Bloc-Note Windows (ou `notepad.exe`).
![gedit.png](/img/rclone_gedit.png)
Entrez le texte suivant dedans, tout en remplaçant bien les lignes 5 et 6 par vos identifiants communiqués précédemment :
```toml
[garage]
type = s3
provider = Other
env_auth = false
access_key_id = <REMPLACEZ PAR VOTRE IDENTIFIANT DE CLE D'ACCESS>
secret_access_key = <REMPLACEZ PAR VOTRE CLE D'ACCES SECRETE>
region = garage
endpoint = garage.deuxfleurs.fr
bucket_acl = private
force_path_style = true
no_check_bucket = true
```
Maintenant enregistrez le à un endroit où vous ne le perdrez pas. Dans mon cas, j'ai choisi de le mettre dans Mon Dossier Personnel > Documents > Configuration et je l'ai appelé `rclone.conf`.
![rclone-conf.png](/img/rclone_conf.png)
Maintenant lancez "Rclone Browser" en cherchant l'application dans votre menu d'application
![capture_décran_de_2021-11-25_14-43-03.png](/img/rclone_menu.png)
L'application devrait se lancer :
![rclone_init.png](/img/rclone_init.png)
Cliquez sur "File" (Fichiers) en haut à gauche, puis sur "Preferences...". La fenêtre suivante s'ouvre :
![rclone-conf2.png](/img/rclone_conf2.png)
Repérez la deuxième ligne intitulée `rclone.conf location:`. Tout au bout de la ligne, cliquez sur le bouton avec les trois points `[...]`. Vous aurez alors la possibilité d'indiquer à Rclone Browser où se trouve le fichier de configuration créé juste avant (pour ma part, je rappelle, "Dossier personnel > Documents > Configuration > rclone.conf", on voit que le chemin complet vers le fichier apparaît maintenant dans le champs texte.
Appuyez sur OK, et la fenêtre principale devrait maintenant ressembler à ça :
![rclone-s3.png](/img/rclone_s3.png)
Cliquez sur "S3 garage" puis cliquez sur "Open". Si vous voyez des dossiers apparaître, c'est gagné !
![rclone-conn.png](/img/rclone_conn.png)
Vous pouvez maintenant naviguer dans vos dossiers, envoyer des fichiers sur Garage ou en récupérer. Attention, vous ne pouvez pas créer de "nouveaux dossiers" à la racine, mais vous pouvez créer des sous-dossiers dans les dossiers existants préalablement créés pour vous.
# Utiliser comme un drive
Ce n'est pas forcément très pratique de devoir passer par cette interface pour envoyer ou récupérer des fichiers. Ce qui serait génial, c'est que ces dossiers apparaissent sur votre ordinateur comme des dossiers normaux.
Pour cela, sélectionnez un dossier racine, moi j'ai choisi `quentin.bibliotheque` puis cliquez sur le bouton "Mount".
![rclone-mount.png](/img/rclone_mount.png)
Un sélecteur de fichier s'ouvre alors. Je vais dans "Dossier Personnel > Documents", je créer un nouveau dossier que j'appelle "Distant". Je vais dedans et clique sur "Choisir" (ou Ok).
Maintenant, quand je vais dans un explorateur de fichier, je vois les fichiers sur Garage comme si ils étaient sur mon ordinateur.
![nautilus-distant.png](/img/rclone_nautilus.png)
Je peux aussi accéder à ces documents depuis mon logiciel préféré, comme ici "LibreOffice Calc" :
![capture_décran_de_2021-11-25_15-01-42.png](/img/rclone_calc.png)

View file

@ -0,0 +1,22 @@
---
title: Statique, comment ça?
description: Nous hébergeons des sites statiques
sort_by: weight
weight: 10
extra:
parent: services/web.md
---
Depuis le commencement du web, au début des années 90, existent les sites web _statiques_ : quand un client demande un fichier ou une page, il spécifie le chemin _via_ une [URL](https://fr.wikipedia.org/wiki/Uniform_Resource_Locator), et le serveur répond tout le temps la même chose.
Dès le milieu des années 90 sont apparu les pages dynamiques, avec [CGI](https://fr.wikipedia.org/wiki/Common_Gateway_Interface) et [PHP](https://fr.wikipedia.org/wiki/PHP).
Pour une même page, le serveur peut répondre un contenu différent, variant selon des paramètres rajoutés en fin de chemin URL, selon des données dans la mémoire du serveur, ou selon n'importe quel facteur qui passe par la tête du développeur.
Avec [JavaScript](https://fr.wikipedia.org/wiki/JavaScript), qui date de la même époque, une confusion se pose souvent : beaucoup de contenus statiques passent pour du dynamique aux yeux de l'internaute. Il faut alors rappeler une distinction importante : le code Javascript livré avec un site s'exécute côté client, c'est-à-dire sur l'ordinateur ou le téléphone de l'internaute. A contrario, le CGI ou PHP s'exécute côté serveur, c'est-à-dire sur la machine administrée par le propriétaire du site.
Selon ce qu'on veut faire, il faut choisir l'un ou l'autre.
Quelques exemples pour comprendre cette dichotomie : je gère une boutique en ligne, et je veux que le stock de mes produits s'affiche quand un client consulte mon site ? Il faut faire ça côté serveur, car seul lui connaît les stocks. Je veux mettre en place des décors interactifs avec la souris ? Il faut faire ça côté client, car seul lui connaît la position du curseur. Des fois c'est ambivalent:afficher l'heure sur une page, par exemple, peut être fait soit avec du contenu dynamique (insertion de l'heure côté serveur), soit avec du contenu statique (insertion de l'heure avec du code Javascript statique qui tourne chez le client).
En proposant un site statique on réduit fortement le besoin d'infrastructure du côté serveur en déplacant le calcul sur des terminaux déjà existant : votre téléphone ou ordinateur. De ce fait on réduit le besoin de nouveaux matériel qui est très couteux d'un point de vue environnemental (voir par exemple la vidéo de [François Jarrige / Fanny Lopez | La Manufacture d'idées 2022](https://www.youtube.com/watch?v=wwFFWPK-CF8) à ce sujet).
En conclusion, une page statique peut proposer des interactions et des effets quelconques, et même se comporter comme une application, car l'interactivité est gérée uniquement par votre ordinateur. Dans ce modèle, par contre, le serveur web se contente simplement de vous envoyer les données que vous lui demandez, sans exécuter de logique complexe, réduisant ainsi l'impact environnemental du site.

40
content/services/web.md Normal file
View file

@ -0,0 +1,40 @@
---
title: Sites web
description: Héberger vos sites internet
sort_by: weight
weight: 30
extra:
parent: services/_index.md
---
<!-- TODO -->
Vous souhaitez avoir un site web ?
Pour publier ce qui vous intéresse personnellement de manière indépendante ?
Ou pour exposer votre association sur la carte du net ?
Deuxfleurs peut vous aider en vous fournissant l'hébergement.
Suivez le guide !
1. [Statique ? Comment ça ?](@/services/statique-comment-ça.md)
2. [Initialiser votre accès](@/services/initialiser-votre-accès.md)
3. [Votre nom de domaine](@/services/mettre-place-DNS.md)
4. [Créer du contenu](@/services/creer-du-contenu.md)
5. [Publier le contenu](@/services/publier-le-contenu.md)
# Ils nous font confiance pour leur site web
- [declic-lelivre.com](https://declic-lelivre.com) - _Exploitation des données privées, surveillance généralisée, addiction au smartphone, disparition de pans entiers de l'économie... Les critiques du monde du numérique ne cessent de s'amplifier ; difficile d'ignorer les conséquences de l'utilisation d'Amazon, Facebook, Google, Instagram ou Netflix. Et s'il existait un autre Internet, respectueux de nos libertés ?_
- [envieappartagee.fr](https://www.envieappartagee.fr) - _Association Envie Appart'Agée, projet de coloc Alzheimer pour habiter et être accompagné autrement en Vendée._
- [wanderearth.fr](https://wanderearth.fr/) - _Blog voyage à vélo low-tech._
- [www.osuny.org](https://www.osuny.org/) - _Osuny est une solution technique spécialement conçue pour les universités, laboratoires de recherches et écoles supérieures permettant de créer des sites Web entièrement personnalisés, les plus sobres, les plus accessibles et les plus sécurisés possibles_.
- [www.giraud.eu](https://www.giraud.eu) - _Site d'un ingénieur en informatique_
- [anneprudhomoz.fr](https://anneprudhomoz.fr) - _De la terre, du fer, de l'eau, beaucoup de feu, un peu d'huile, encore du béton et du plâtre ! ... sans oublier le crayon à papier et les carnets._
- [courderec.re](https://courderec.re) - _Groupe de musique. De la pop synthé qui décoiffe._
- [colineaubert.com](https://colineaubert.com) - _D'un côté graphiste, illustratrice et conceptrice d'outils pédagogiques, je mets en images et en mots différents sujets scientifiques et culturels._
- [estherbouquet.com](https://estherbouquet.com) - _Esther Bouquet questions how narratives—both historical and literary—are being built by creating tangible experiences ranging from the size of the sheet of paper to the volume of a space; somewhere between writing, archiving, drawing, designing, and programming._
- [quentin.dufour.io](https://quentin.dufour.io) - _Portfolio et blog d'un ingénieur en informatique_
- [erwan.dufour.io](https://erwan.dufour.io) - _Portfolio et blog d'un passionné d'électronique_
- [luxeylab.net](https://luxeylab.net) - _Site d'un prof en informatique_
- [eric.dufour.io](https://eric.dufour.io) _- Appui au montage de projets de bioéconomie circulaire._
- [www.clairebernstein.photo](https://www.clairebernstein.photo/) - _Portfolio photographique._
- et de nombreux autres!

View file

@ -0,0 +1,21 @@
---
title: "WebDAV"
description: "Publier via un gestionnaire de fichiers avec WebDAV"
date: 2025-03-29
weight: 60
extra:
parent: "services/publier-le-contenu.md"
---
Comme avec [le SFTP](@/services/filezilla.md), vous aurez besoin pour utiliser le WebDAV de votre nom d'utilisateur ainsi que du mot de passe utilisé pour se connecter au [guichet Deuxfleurs](https://guichet.deuxfleurs.fr).
**Attention cependant : si vous venez de créer un site via le guichet Deuxfleurs, celui-ci ne pourra être modifié via WebDAV tant que vous n'avez pas ajouté un fichier dessus via [les autres méthodes décrites dans ce guide](@/prise_en_main/publier-le-contenu.md).**
### Paramétrer l'accès WebDAV avec le gestionnaire de fichiers GNOME (Nautilus)
Si vous utilisez Ubuntu ou Fedora, votre gestionnaire de fichiers par défaut est probablement celui de GNOME, également appelé Nautilus. Voici comment accéder à vos sites en WebDAV :
* dans la barre latérale de Nautilus, cliquez sur "Autres emplacements" (tout en bas)
* dans le champ "Connexion à un serveur", saisissez `davs://bagage.deuxfleurs.fr/webdav` et cliquez sur "Se connecter"
* renseignez les mêmes nom d'utilisateur et mot de passe que deux que vous utilisez sur le guichet Deuxfleurs
Un nouveau dossier "bagage.deuxfleurs.fr" apparaîtra dans la barre latérale de Nautilus : c'est lui qui affiche le contenu de votre espace sur Garage. Vous pouvez interagir avec de la même façon qu'avec les fichiers sur votre ordinateur.

View file

@ -0,0 +1,63 @@
---
title: "WinSCP"
description: "Publier avec WinSCP"
date: 2025-03-29
weight: 40
extra:
parent: 'services/publier-le-contenu.md'
---
# Installation
Commencez par télécharger l'outil [WinSCP](https://winscp.net/eng/download.php).
![winscp_dl.png](/img/winscp_dl.png)
Installez le logiciel.
# Configuration
Lancez-le. La fenêtre de connexion suivante devrait apparaître :
![](/img/winscp_login.png)
Vous devez :
1. Vérifier que c'est bien "Nouveau site" qui est sélectionné
2. Dans *protocole de fichier*, vous devez choisir *Amazon S3*
3. Dans *nom d'hôte*, vous devez mettre `garage.deuxfleurs.fr`
4. Dans *numéro de port*, vous devez mettre (ou plutôt laisser) `443`
5. Dans *id de clé d'accès*, vous devez mettre l'identifiant de votre clé d'accès, exemple : `GK...`
6. Dans *clé d'accès secrète*, vous devez mettre votre clé d'accès secrète.
7. Maintenant, cliquez sur le bouton *Avancé*. (Cliquez bien sur le mot "Avancé" et non sur la flèche à droite). Une fenêtre s'ouvre :
![](/img/winscp_avance.png)
1. Dans le menu de gauche, cliquez sur *S3*
2. Dans la partie de droite, pour *Région par défaut*, inscrivez au clavier *garage*
3. Toujours à droite, dans *Style URL*, choisissez *Chemin*
4. Cliquez sur OK
Vous voilà de retour sur la fenêtre de connexion :
![](/img/winscp_sauvegarder.png)
1. Cliquez sur *Sauver* (cliquez bien sur le texte et non sur la flèche noire à droite)
La fenêtre suivante apparaît :
![](/img/winscp_session.png)
1. Dans *Enregistrer la sessions sous :*, donnez un nom qui identifie bien votre site web, c'est ce qui vous permettra de l'identifier dans la liste de connexion.
2. Pour la case *Enregistrer le mot de passe*, nous vous conseillons de la cocher sauf si vous êtes sur un ordinateur public (bibliothèque, cybercafé, etc.) ou au travail.
3. Pour la case *Créer un raccourci sur le bureau*, nous vous conseillons de la cocher, vous pourrez alors mettre votre site en ligne en un seul clic (ou presque) depuis votre bureau.
4. Cliquez sur OK
Vous pouvez maintenant cliquer sur "Connexion".
# Envoyer votre site web
À gauche, naviguez jusqu'au dossier de votre site web.
Faites en un glisser déposer à droite à l'intérieur du dossier qui contient le nom de votre site web.
![commander.png](/img/winscp_commander.png)

View file

@ -0,0 +1,41 @@
---
title: "À la main"
description: "Créer du contenu à la main"
sort_by: "weight"
date: 2025-03-29
weight: 1
extra:
parent: "services/creer-du-contenu.md"
---
Garage, comme tout serveur web, va se contenter ici de servir des fichiers `.html`. Ces fichiers sont tout à fait lisibles et écrivables par un humain. Ainsi, si vous n'avez pas prévu d'avoir un site avec beaucoup de pages, il est souvent intéressant de façonner chacune d'entre elles à la main.
### Décrire le contenu
Pour écrire un page web, il faut écrire un fichier `.html` en suivant, justement, la syntaxe et les règles HTML. À titre indicatif, voici un exemple simple :
```
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Mon site</title>
</head>
<body>
<p>Bonjour; bienvenue sur mon site !</p>
</body>
</html>
```
Vous pourrez facilement trouver moult ressources en ligne pour maîtriser le HTML. [La documentation de Mozilla sur le sujet](https://developer.mozilla.org/fr/docs/Web/HTML) est un bon départ. Enfin, il faut savoir que le HTML est un langage pour décrire le contenu de la page seulement, pas l'allure ou l'esthétique ! La conséquence directe est qu'une page reposant uniquement sur HTML sera sobre : texte noir sur fond blanc, avec alignement à gauche. Si cela vous suffit, vous pouvez d'ores et déjà vous arrêter sur ça.
### Décrire l'apparence
Si vous souhaitez ajouter des couleurs, modifier la disposition, ou l'arrangement par exemple, il faut rajouter, au-dessus du HTML, une description CSS qui contient vos règles esthétiques. Vous pouvez par exemple créer un fichier `style.css` à la racine du dossier représentant votre site. Ensuite, dans vos pages HTML que vous souhaitez styliser, il faut rajouter, dans la section `<head>`, la formule suivante : `<link rel="stylesheet" type="text/css" href="style.css">` (attention le chemin de `style.css` est relatif, par exemple si vous voulez styliser une page dans un dossier, il faudrait alors marquer `../style.css` à la place). Une fois ceci fait, lorsque quelqu'un va visiter une page HTML, il va automatiquement récupérer le fichier CSS associé, et l'appliquer. Voici encore une fois, à titre indicatif, un contenu exemple pour `style.css` :
```
body
{
margin: 0 auto;
max-width: 1000px;
padding: 10px 10px 10px 10px;
}
```
Encore une fois, plein de ressources sont disponibles en ligne, et Mozilla propose encore une fois [une bonne base](https://developer.mozilla.org/fr/docs/Web/CSS).
Une fois que vous avez tous vos fichiers `.html` et `.css` réunis, [vous pouvez passer à la publication](@/prise_en_main/publier-le-contenu.md) !

View file

@ -1,7 +1,7 @@
---
title: "Vie associative"
description: "Vie associative"
weight: 50
weight: 30
sort_by: "weight"
extra:
parent: 'vie_associative/_index.md'

View file

@ -112,3 +112,11 @@
margin: auto;
float: none!important;
}
/* Me soulent ces listes qui sont un coup serrées, un coup non. */
/* Mais flemme de coder défensif... */
/* By ADRN 25 */
/* .content li > p { */
/* margin-top: 0; */
/* margin-bottom: 0; */
/* } */

View file

@ -72,11 +72,25 @@ header ul li {
color: var(--primary-text-color);
&:hover {
color: #fff;
text-decoration: underline;
}
}
header .nav-item {
padding: 8px 6px;
margin: 0 10px;
color: var(--primary-text-color);
&:hover, &:active, &:focus {
text-decoration: none;
border-bottom: white solid 1px;
}
&.active {
text-decoration: none;
border-bottom: white solid 3px;
}
}
.hero {
display: flex;
align-items: center;
@ -293,9 +307,9 @@ footer {
padding: 10px 0px;
}
main .toc-homepage .toc-sticky {
display: block;
}
/* main .toc-homepage .toc-sticky { */
/* display: block; */
/* } */
.menu-button-container {
display: block;

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 257 KiB

BIN
static/img/bottin-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="30mm" height="30mm" viewBox="0 0 30 30" version="1.1" id="svg5" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<defs id="defs2"/>
<g id="layer1" transform="translate(-47.531142,-150.58196)">
<g id="g2446" transform="matrix(0.26458333,0,0,0.26458333,27.649536,132.01223)">
<g id="g6567" transform="matrix(0.92473907,0,0,0.92473907,11.032718,11.165159)">
<g id="g7383" transform="matrix(1.0300991,0,0,1.0300991,3.770254,-1.2763086)">
<path id="path6" d="m 136.06214,99.13643 c -0.8681,0.09646 -1.83266,0 -2.70078,-0.289369 L 99.794436,89.780144 c -0.868109,-0.28937 -1.736218,-0.675196 -2.507872,-1.157479 z" style="stroke-width:0.964566"/>
<path id="path8" class="st0" d="m 85.036565,156.14226 c 1.919127,0.0226 3.842264,-0.048 5.758577,0.0407 1.109916,0.0647 2.081695,0.96893 2.125517,2.09821 0.05763,2.83895 0.0096,5.68171 0.02535,8.52216 0.0387,0.72125 -1.165534,0.55433 -1.656924,0.86227 -2.84639,0.78316 -5.867198,1.08468 -8.793555,0.62567 -2.484003,-0.4206 -4.607002,-2.18507 -5.651194,-4.45399 -1.332604,-2.83308 -1.546544,-6.07759 -1.21852,-9.15366 0.293175,-2.57048 1.448442,-5.0874 3.473195,-6.74732 2.184175,-1.91934 5.23662,-2.62252 8.078891,-2.19703 2.061965,0.25939 4.063024,1.01333 5.768107,2.20419 -0.194486,1.20116 -0.887464,2.34273 -1.929135,2.99015 -1.865545,-1.36891 -4.253598,-2.12198 -6.568068,-1.87184 -2.02236,0.3166 -3.762605,1.87404 -4.283558,3.85841 -0.666251,2.35645 -0.668458,4.88015 -0.252316,7.28143 0.337055,1.92315 1.48217,3.89047 3.44592,4.49149 1.860151,0.60901 3.846702,0.22762 5.72889,-0.0627 0.02323,-1.64043 -0.05713,-3.28547 0.06461,-4.92211 0.04478,-0.38456 -0.694745,-0.10524 -1.004029,-0.19009 -1.009365,-0.0553 -2.115945,0.1939 -3.015314,-0.38583 -0.860219,-0.80391 -0.327291,-2.03804 -0.09646,-2.99015 z" style="stroke-width:0.964566"/>
<path id="path10" class="st0" d="m 109.82594,166.17374 c -0.0965,0.38583 -0.28937,0.77165 -0.57875,1.15748 -0.19291,0.38583 -0.48228,0.6752 -0.77164,0.86811 -1.25394,-0.0965 -2.31497,-0.77165 -2.99017,-1.92913 -1.15748,1.25393 -2.89369,2.02559 -4.62991,2.02559 -1.639774,0 -2.893709,-0.48229 -3.76182,-1.44685 -0.771653,-0.96457 -1.253937,-2.12205 -1.253937,-3.37598 0,-1.83268 0.57874,-3.18307 1.736221,-4.05118 1.350393,-0.96456 2.893706,-1.44685 4.533456,-1.35039 0.96458,0 1.92914,0 2.79726,0.0965 v -0.96457 c 0,-1.73622 -0.77166,-2.50787 -2.41143,-2.50787 -1.15747,0 -2.797241,0.38583 -4.919286,1.15748 -0.675197,-0.77165 -1.061024,-1.83268 -1.061024,-2.8937 2.218503,-0.96456 4.53347,-1.44685 6.94488,-1.44685 1.44686,-0.0965 2.79725,0.38583 3.95473,1.3504 0.96457,0.86811 1.5433,2.2185 1.5433,4.05117 v 6.55905 c -0.0965,1.44685 0.19291,2.2185 0.86812,2.70078 z m -8.10237,-0.77165 c 1.25394,-0.0965 2.41142,-0.57874 3.18308,-1.54331 v -2.79724 c -0.77166,-0.0965 -1.63977,-0.0965 -2.41143,-0.0965 -0.77165,-0.0965 -1.44684,0.19291 -2.02558,0.67519 -0.482291,0.48229 -0.675204,1.06103 -0.675204,1.73622 0,0.57874 0.192913,1.15748 0.578744,1.63976 0.38583,0.19292 0.86811,0.38583 1.35039,0.38583 z" style="stroke-width:0.964566"/>
<path id="path12" class="st0" d="m 112.43026,153.92376 c 0.0965,-0.38583 0.28937,-0.77165 0.57874,-1.15748 0.19292,-0.38583 0.48229,-0.6752 0.77165,-0.86811 1.63976,0.19291 2.8937,1.35039 3.37599,2.8937 0.86811,-1.92913 2.2185,-2.8937 4.14764,-2.8937 0.57874,0 1.25392,0.0965 1.83267,0.19291 0,1.3504 -0.28937,2.60433 -0.96456,3.76181 -0.48229,-0.0965 -0.96457,-0.19291 -1.44685,-0.19291 -1.3504,0 -2.31496,0.67519 -3.18308,2.12204 v 10.2244 c -0.67519,0.0965 -1.35039,0.19291 -1.92914,0.19291 -0.67518,0 -1.35038,-0.0965 -2.02558,-0.19291 v -10.80314 c 0,-1.5433 -0.38582,-2.60433 -1.15748,-3.27952 z" style="stroke-width:0.964566"/>
<path id="path14" class="st0" d="m 138.08774,166.17374 c -0.0965,0.38583 -0.28937,0.77165 -0.57874,1.15748 -0.19291,0.38583 -0.48228,0.6752 -0.77165,0.86811 -1.25394,-0.0965 -2.31496,-0.77165 -2.99017,-1.92913 -1.15747,1.25393 -2.89369,2.02559 -4.62992,2.02559 -1.63975,0 -2.8937,-0.48229 -3.7618,-1.44685 -0.77166,-0.96457 -1.25394,-2.12205 -1.25394,-3.37598 0,-1.83268 0.57874,-3.18307 1.73622,-4.05118 1.25393,-0.96456 2.8937,-1.44685 4.43701,-1.35039 0.96456,0 1.92914,0 2.79724,0.0965 v -0.96457 c 0,-1.73622 -0.77164,-2.50787 -2.41142,-2.50787 -1.15748,0 -2.79724,0.38583 -4.91929,1.15748 -0.6752,-0.77165 -1.06102,-1.83268 -1.06102,-2.8937 2.2185,-0.96456 4.53346,-1.44685 6.94488,-1.44685 1.44685,-0.0965 2.79725,0.38583 3.95473,1.3504 0.96456,0.86811 1.5433,2.2185 1.5433,4.05117 v 6.55905 c 0,1.44685 0.38583,2.2185 0.96457,2.70078 z m -8.10236,-0.77165 c 1.25393,-0.0965 2.41142,-0.57874 3.18307,-1.54331 v -2.79724 c -0.77165,-0.0965 -1.63977,-0.0965 -2.41142,-0.0965 -0.77165,-0.0965 -1.44686,0.19291 -2.02559,0.67519 -0.48228,0.48229 -0.67519,1.06103 -0.67519,1.73622 0,0.57874 0.19291,1.15748 0.57874,1.63976 0.38582,0.19292 0.8681,0.38583 1.35039,0.38583 z" style="stroke-width:0.964566"/>
<path id="path16" class="st0" d="m 142.04247,166.07729 c -0.96457,-1.44685 -1.44686,-3.47244 -1.44686,-6.07677 0,-2.60433 0.57875,-4.62991 1.83268,-6.07676 1.06103,-1.35039 2.70079,-2.2185 4.43701,-2.2185 1.63977,0 3.18307,0.57874 4.34055,1.63976 0.57874,-0.77165 1.54332,-1.25394 2.50787,-1.35039 0.38583,0.19291 0.6752,0.57874 0.86812,0.86811 0.19291,0.38582 0.38583,0.67519 0.57874,1.15747 -0.57874,0.48229 -0.86812,1.44685 -0.86812,2.79725 v 9.06691 c 0,3.37598 -0.57874,5.7874 -1.63975,7.23424 -1.06103,1.44685 -2.99017,2.12205 -5.49804,2.12205 -1.92914,0 -3.95472,-0.38583 -5.7874,-1.06102 0,-1.06103 0.28937,-2.12205 0.96457,-2.8937 1.35039,0.6752 2.79724,0.96457 4.34054,0.96457 1.44686,0 2.41143,-0.38583 2.89371,-1.06103 0.57874,-0.86811 0.86811,-1.92913 0.77165,-2.99015 v -1.25394 c -1.15748,0.96457 -2.50787,1.54331 -4.05118,1.54331 -1.73622,-0.0965 -3.37599,-0.96457 -4.24409,-2.41141 z m 8.19882,-2.60433 v -7.42716 c -0.6752,-0.77165 -1.73622,-1.25393 -2.79725,-1.35039 -0.86811,0 -1.73621,0.57874 -2.12205,1.35039 -0.57874,1.25394 -0.86811,2.60433 -0.77165,3.95472 0,1.73622 0.19291,2.99016 0.67519,3.76181 0.28938,0.67519 1.06103,1.15748 1.83268,1.25393 1.3504,0 2.50788,-0.57874 3.18308,-1.5433 z" style="stroke-width:0.964566"/>
<path id="path26" class="st3" d="m 136.73735,113.02618 18.42323,-7.42716 c 0.38583,-0.19291 0.57874,-0.57874 0.48228,-1.06102 -0.0965,-0.19292 -0.19291,-0.38583 -0.48228,-0.48229 -2.12204,-0.8681 -4.82284,-1.92913 -7.42716,-2.99015 -0.4823,-0.19291 -5.01576,3.08661 -5.40158,3.37598 l -7.90945,6.36613 c -1.83268,1.73622 -0.19291,3.27953 2.31496,2.21851 z" style="stroke-width:0.964566"/>
<ellipse id="circle28" class="st3" cx="123.42634" cy="120.26041" rx="9.645668" ry="9.6456566" style="stroke-width:0.964566"/>
<path id="path6-0" d="m 136.06214,99.13643 c -0.8681,0.09646 -1.83266,0 -2.70078,-0.289369 L 99.794436,89.780144 c -0.868109,-0.28937 -1.736218,-0.675196 -2.507872,-1.157479 z" style="stroke-width:0.964566"/>
<path id="path18-7" class="st0" d="m 170.6901,161.35091 h -8.97047 c 0,1.06103 0.28937,2.02559 0.86811,2.8937 0.48228,0.6752 1.35039,1.06102 2.60432,1.06102 1.44686,-0.0965 2.89371,-0.48228 4.2441,-1.15748 0.6752,0.6752 1.06102,1.54331 1.15748,2.41142 -1.83267,1.25393 -3.95472,1.92913 -6.17323,1.83267 -2.41141,0 -4.14764,-0.77165 -5.20865,-2.31495 -1.06104,-1.54331 -1.54331,-3.5689 -1.54331,-6.07677 0,-2.50787 0.57873,-4.53346 1.73622,-6.07676 1.15747,-1.54331 2.99015,-2.41142 4.91928,-2.31496 2.12206,0 3.76182,0.6752 4.9193,1.92913 1.15748,1.35039 1.83267,3.08661 1.73622,4.91929 0,0.96456 -0.0965,1.92913 -0.28937,2.89369 z m -6.17323,-6.84841 c -1.73622,0 -2.70079,1.35039 -2.79724,3.95472 h 5.59448 v -0.38583 c 0,-0.86811 -0.19292,-1.83267 -0.67519,-2.60433 -0.48228,-0.67519 -1.3504,-0.96456 -2.12205,-0.96456 z" style="stroke-width:0.964566"/>
<path id="path24-3-6-9" class="st4" d="m 123.0405,70.199461 c -1.44685,0 -2.89371,0.28937 -4.14765,0.868109 L 76.259006,89.973057 c -0.771652,0.289369 -1.157479,1.253935 -0.868109,2.025588 0,0 0,0 0,0 0,0.09646 0,0.09646 0.09646,0.192913 l 6.848424,13.503922 h 5.980314 l -0.86811,-4.72638 c -0.09646,-0.38582 -0.675197,-3.086605 -1.253937,-5.015736 l 19.966532,6.269676 c 0.28937,1.25394 0.57874,2.41141 1.06103,3.47244 h 32.31298 c 0.38582,-1.06103 0.67519,-2.2185 0.86811,-3.47244 l 19.87007,-6.17322 c -0.57873,1.929131 -1.15747,4.62992 -1.25393,5.01574 l -0.86812,4.72637 h 5.98032 l 6.75197,-13.407459 0.0965,-0.09646 0.0965,-0.192913 c 0,0 0,0 0,0 0.0965,-0.192913 0.0965,-0.28937 0.0965,-0.482283 0,-0.675196 -0.38583,-1.253935 -0.96457,-1.543305 l -42.6339,-18.905486 c -1.54332,-0.675196 -2.99017,-1.061022 -4.53347,-0.964566 z" style="stroke-width:0.964566"/>
<path id="path24-3-2" class="st0" d="m 123.0405,79.073465 c -1.44685,0 -2.89371,0.28937 -4.14765,0.868109 L 76.259006,98.847061 c -0.771652,0.289369 -1.157479,1.253939 -0.868109,2.025589 0,0 0,0 0,0 0,0.0965 0,0.0965 0.09646,0.19291 l 3.665353,7.3307 h 7.909449 c -0.289371,-1.06102 -0.578742,-2.31496 -0.964568,-3.56889 l 11.285433,3.56889 h 51.507866 l 11.28542,-3.56889 c -0.38581,1.15748 -0.67518,2.50787 -0.96455,3.56889 h 7.90943 l 3.66536,-7.23424 0.0965,-0.0965 0.0965,-0.19291 c 0,0 0,0 0,0 0.0965,-0.19291 0.0965,-0.28937 0.0965,-0.48228 0,-0.6752 -0.38582,-1.25394 -0.96457,-1.543309 L 127.47751,79.941574 c -1.44686,-0.578739 -2.89371,-0.868109 -4.43701,-0.868109 z" style="stroke-width:0.964566"/>
<path id="path24-0" class="st4" d="m 171.07592,109.45728 c 0,0.19292 0,0.28937 -0.0965,0.48229 0,0 0,0 0,0 l -0.0965,0.19291 v 0 l -0.0965,0.0965 -10.32087,20.44879 c -1.44684,2.79724 -4.05116,2.70078 -3.66533,-0.0965 l 2.12203,-11.57479 c 0.0965,-0.38582 0.6752,-3.08661 1.25394,-5.01574 l -19.87014,6.17322 c -3.08661,20.35234 -29.90156,20.64171 -34.24212,0 L 86.0974,113.89428 c 0.578741,1.92914 1.157481,4.62992 1.253938,5.01575 l 2.122046,11.57478 c 0.482284,2.8937 -2.218503,2.99016 -3.665353,0.0965 L 75.390897,110.03602 c 0,-0.0964 -0.09646,-0.0964 -0.09646,-0.19291 -0.385827,-0.77165 0,-1.73622 0.771653,-2.02559 0,0 0,0 0,0 l 42.63386,-18.905486 c 2.70078,-1.157478 5.88385,-1.157478 8.58464,0 l 42.63385,18.905486 c 0.77166,0.38583 1.15748,0.96457 1.15748,1.63976 z" style="stroke-width:0.964566"/>
<path id="path26-2" class="st0" d="m 136.73735,113.02618 18.42323,-7.42716 c 0.38583,-0.19291 0.57874,-0.57874 0.48228,-1.06102 -0.0965,-0.19292 -0.19291,-0.38583 -0.48228,-0.48229 -2.12204,-0.8681 -4.82284,-1.92913 -7.42716,-2.99015 -0.4823,-0.19291 -5.01576,3.08661 -5.40158,3.37598 l -7.90945,6.36613 c -1.83268,1.73622 -0.19291,3.27953 2.31496,2.21851 z" style="stroke-width:0.964566"/>
<ellipse id="circle28-3" class="st0" cx="123.42634" cy="120.26041" rx="9.645668" ry="9.6456566" style="stroke-width:0.964566"/>
</g>
</g>
</g>
</g>
<style type="text/css" id="style2346">
.st0{fill:#4E4E4E;}
.st1{fill:#FFD952;}
.st2{fill:#49C8FA;}
.st3{fill:#45C8FF;}
.st4{fill:#FF9329;}
.st5{fill:#3B2100;}
.st6{fill:#C3C3C3;}
</style>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
static/img/tricot-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1,23 +1,32 @@
{% macro render_header() %}
{% set section = get_section(path="_index.md") %}
{% set root_section = get_section(path="_index.md") %}
{% set active_section = "" %}
{% if page and page.components %}
{% set active_section = page.components[0] %}
{% elif section and section.components %}
{% set active_section = section.components[0] %}
{% endif %}
<a href="{{ section.permalink }}">
<a href="{{ root_section.permalink }}">
<div class="logo">
<img src="{{ get_url(path=config.extra.juice_logo_path) }}" alt="logo">
{{ config.extra.juice_logo_name }}
</div>
</a>
<nav>
<ul>
{% for subpath in section.subsections %}
{% for subpath in root_section.subsections %}
{% set sub = get_section(path=subpath) %}
<li><a class="nav-item text" href="{{ sub.permalink }}">{{ sub.title }}</a></li>
{% set is_active = sub.components[0] == active_section %}
{% if not 'hide_from_menu' in sub.extra or not sub.extra.hide_from_menu %}
<li>
<a class="nav-item text{% if is_active %} active{% endif %}" href="{{ sub.permalink }}">{{ sub.title }}</a>
</li>
{% endif %}
{% endfor %}
{% if config.extra.juice_extra_menu %}
{% for menu in config.extra.juice_extra_menu %}
<li><a class="nav-item text" href="{{ menu.link }}">{{ menu.title }}</a></li>
<li><a class="nav-item text" href="{{ menu.link }}">{{ menu.title }}</a></li>
{% endfor %}
{% endif %}
</ul>

View file

@ -17,14 +17,16 @@
{{ nav::hamburger(root=root) }}
{# Section title #}
{#
<div class="toc-item toc-section">
<a class="subtext" href="{{root.permalink | safe}}">{{ root.title }}</a>
</div>
<a class="subtext" href="{{root.permalink | safe}}">{{ root.title }}</a>
</div>
#}
{# Choose between "tree" (has extra.parent) and "list" (default) collections #}
{% set root_tree = root.pages | group_by(attribute="extra.parent") %}
{% if root.relative_path in root_tree %}
{% set tree_breadcrumb = nav::breadcrumb(corpus=root.pages, root=root.relative_path, target=current)|split(pat=":")|slice(start=1) %}
{% set tree_breadcrumb = nav::breadcrumb(corpus=root.pages, root=root.relative_path, target=current)|trim|split(pat=":")|slice(start=1) %}
{{ nav::tree(
tree=root_tree,
cursor=root.relative_path,
@ -40,20 +42,25 @@
<input id="menu-toggle" type="checkbox" />
<label class='menu-button-container' for="menu-toggle">
<div class="menu-button"></div>
<div class="toc-item toc-menu-title subtext">{{ root.title }}</div>
<div class="toc-item toc-menu-title subtext">Sommaire</div>
</label>
{% endmacro %}
{# (Private) Build a breadcrumb for the page #}
{# It's ugly because this is the hacky part of the project #}
{% macro breadcrumb(corpus, root, target) %}{% if 'parent' in target.extra and target.extra.parent != root %}{% set new_target = get_page(path=target.extra.parent) %}{{ nav::breadcrumb(corpus=corpus, root=root, target=new_target) }}:{{ new_target.relative_path }}{% endif %}{% endmacro %}
{% macro breadcrumb(corpus, root, target) %}
{% if 'parent' in target.extra and target.extra.parent != root %}
{% set new_target = get_page(path=target.extra.parent) %}
{{ nav::breadcrumb(corpus=corpus, root=root, target=new_target) | trim }}:{{ new_target.relative_path }}
{% endif %}
{% endmacro %}
{# (Private) Render a list menu (this is the simple fallback when extra.parent is not defined #}
{% macro list(list, selected) %}
{% for page in list %}
{% set is_selected = page.relative_path == selected.relative_path %}
<div class="toc-item">
{{ nav::link(page=page, is_selected=is_selected, is_parent=false) }}
{{ nav::link(page=page, is_selected=is_selected, is_parent=false, is_developed=false) }}
</div>
{% endfor %}
{% endmacro %}
@ -63,15 +70,25 @@
{% macro tree(tree, cursor, selected, crumb) %}
{% for page in tree | get(key=cursor) %}
{% set is_selected = page.relative_path == selected.relative_path %}
{# {% set is_parent = (page.relative_path == selected.extra.parent) or page.relative_path in crumb %} #}
{% set is_parent = page.relative_path in crumb %}
<div class="toc-item">
{# DEBUG #}
<!-- crumb: {% for p in crumb %} '{{ p }}' {% endfor %} -->
<!-- relative_path: {{ page.relative_path }} -->
<!-- parent: {{ page.extra.parent }} -->
<!-- ancestors: {{ page.ancestors }} -->
<!-- is_selected: {{ is_selected }} -->
<!-- is_parent: {{ is_parent }} -->
<!-- {{ page.relative_path in crumb }} -->
{# Link with a (possible) subsection #}
{% if page.relative_path in tree %}
{# Display link as a section #}
{{ nav::link(page=page, is_selected=is_selected, is_parent=true) }}
{{ nav::link(page=page, is_selected=is_selected, is_parent=true, is_developed=is_selected or is_parent) }}
{# Should we unroll this part of the tree? #}
{% if page.relative_path in crumb or is_selected %}
{% if is_selected or is_parent %}
<div class="nav-subsection">
{# do the recursive call #}
{{ nav::tree(tree=tree, cursor=page.relative_path, selected=selected, crumb=crumb) }}
@ -80,17 +97,18 @@
{# Simple link, ie. a leaf of the tree #}
{% else %}
{{ nav::link(page=page, is_selected=is_selected, is_parent=false) }}
{{ nav::link(page=page, is_selected=is_selected, is_parent=false, is_developed=false) }}
{% endif %}
</div>
{% endfor %}
{% endmacro %}
{# (Private) Render a single link #}
{% macro link(page, is_selected, is_parent) %}
{% macro link(page, is_selected, is_parent, is_developed) %}
<a class="subtext" href="{{page.permalink | safe}}">
{% if is_selected %}<b>{% endif %}
{% if is_parent %}‣ {% endif %}
{% if is_parent and not is_developed %}▸ {% endif %}
{% if is_parent and is_developed %}▾ {% endif %}
{{ page.title }}
{% if is_selected %}</b>{% endif %}
</a>

View file

@ -39,8 +39,7 @@
<div class="content text">
{% block content %}
<div id="features" class="heading-text">{{ section.title }} </div>
{{ section.content | safe }}
{{ section.content | safe }}
{% endblock content %}
</div>
@ -56,7 +55,7 @@
thème dérivé de <a href="https://github.com/huhu/juice">Juice</a>,
servi par <a href="https://garagehq.deuxfleurs.fr/">Garage</a>.
</small>
<small class="subtext">Dernière mise à jour le {{ now() | date(format="%A %-d %B %Y", locale="fr_FR") }}.</small>
<small class="subtext">Dernière mise à jour du site le {{ now() | date(format="%A %-d %B %Y", locale="fr_FR") }}.</small>
</footer>
{% endblock footer %}
</body>

View file

@ -3,11 +3,6 @@
{% block title %}{{ page.title }} | {{ super() }} {% endblock title %}
{% block header %}
<header class="box-shadow">
{{ macros::render_header() }}
</header>
{% endblock header %}
{% block content %}
<div class="heading-text">{{ page.description }}</div>

View file

@ -1 +1,10 @@
{% import "_macros.html" as macros %}
{% extends "index.html" %}
{% block title %}{{ section.title }} | {{ super() }} {% endblock title %}
{% block content %}
<div class="heading-text">{{ section.description }}</div>
{{ section.content | safe }}
{% endblock content %}