Réorganisation Opérations & incorporation de pages de Opérations dedans Infrastructures

This commit is contained in:
ADRN 2025-04-13 21:16:41 +02:00
parent 1f6d305a07
commit 4cf3bf17e2
29 changed files with 7053 additions and 122 deletions

View file

@ -23,6 +23,11 @@ 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 :

View file

@ -7,10 +7,29 @@ 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.
> 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 !
* 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,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,21 @@
---
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
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/).
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/).
## 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

@ -1,12 +1,12 @@
---
title: Nos créations
description: Les logiciels que l'on développe
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/services.md
parent: infrastructures/logitheque.md
---
Cette section recense les logiciels développés par Deuxfleurs pour les besoins spécifiques de son infrastructure : [Garage](@infrastructures/garage.md), [Bottin](@infrastructures/bottin.md), [Guichet](@infrastructures/guichet.md), [Tricot](@infrastructures/tricot.md), [Diplonat](@infrastructures/diplonat.md)...\

View file

@ -0,0 +1,18 @@
---
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'
---
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

@ -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,16 @@
---
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
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: 10
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

@ -5,7 +5,7 @@ date: 2021-11-09T12:54:33.129Z
dateCreated: 2021-11-09T12:54:30.985Z
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 pour les masses"
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,22 @@ 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.
## 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 accédés par les usager·es (sites web, e-mails, 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,18 @@
---
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
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), que l'on développe aussi.
## 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

@ -1,18 +1,20 @@
---
title: "Les logiciels"
description: "Annuaire des logiciels utilisés par Deuxfleurs"
weight: 20
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 applications qui assurent le fonctionnement de Deuxfleurs, et leurs rôles respectifs (production, support...).
On détaille les logiciels que l'on développe nous-même à [la page suivante](@/infrastructures/logiciels.md).
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 obsolète, n'étant pas mise à jour à chaque modification de nos infrastructures.\
> 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.
C'est parti pour la liste à la Prévert :
## La liste à la Prévert
| Service | Rôle | Site | Description |
| -- | -- | -- | -- |
@ -33,7 +35,7 @@ C'est parti pour la liste à la Prévert :
| 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 |
@ -45,12 +47,9 @@ C'est parti pour la liste à la Prévert :
| [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,16 +1,16 @@
---
title: "Nos serveurs"
description: "La salle des machines"
title: "Les machines"
description: "Salle des machines"
weight: 10
sort_by: "weight"
extra:
parent: 'infrastructures/_index.md'
---
Ce coin du Guide présente les ordinateurs qui constituent notre infrastructure et leurs différents 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...
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ées à bas prix au [domaine](https://encheres-domaine.gouv.fr/hermes/biens-mobiliers/high-tech)).
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.
@ -19,50 +19,3 @@ Toutes les machines présentées ici sont donc branchées 24/7 dans l'attente qu
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.
# Différents clusters
Parmi les machines directement géréees par Deuxfleurs, se trouvent deux principaux rôles ou _clusters_ :
<!-- 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 productions sont ceux qui font tourner les services accédés par les usager·es (eg. Plume, Matrix, Cryptpad).
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. C'est donc le rôle le plus critique.
- [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.
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.
- [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.
# 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)

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.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

@ -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

@ -5,7 +5,7 @@ date: 2021-11-09T12:55:03.277Z
dateCreated: 2021-11-09T12:55:01.156Z
weight: 50
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,74 @@
---
title: "SSH"
description: "SSH"
weight: 100
extra:
parent: "infrastructures/acces.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

@ -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,20 @@
---
title: "Tricot"
description: ""
description: "Tricot : le majordome 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
Tricot est un reverse-proxy HTTP et HTTPS qui s'auto-configure à partir de [Consul](https://www.consul.io),
Tricot 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 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.
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.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,

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 257 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