Compare commits
7 commits
c3004c5610
...
e24324b948
Author | SHA1 | Date | |
---|---|---|---|
e24324b948 | |||
95025de301 | |||
156ceebfcd | |||
4bdd716db0 | |||
b1fb997146 | |||
d728faf95c | |||
8508499174 |
10 changed files with 123 additions and 80 deletions
content/infrastructures
sass
templates
|
@ -2,10 +2,15 @@
|
||||||
title: "Infrastructures"
|
title: "Infrastructures"
|
||||||
description: "Infrastructures"
|
description: "Infrastructures"
|
||||||
weight: 40
|
weight: 40
|
||||||
|
sort_by: weight
|
||||||
extra:
|
extra:
|
||||||
parent: 'infrastructures/_index.md'
|
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.
|
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.
|
||||||
|
|
||||||
|
> 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 !
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ title: "Énergie"
|
||||||
description: "Consommation électrique"
|
description: "Consommation électrique"
|
||||||
date: 2021-11-09T12:54:33.129Z
|
date: 2021-11-09T12:54:33.129Z
|
||||||
dateCreated: 2021-11-09T12:54:30.985Z
|
dateCreated: 2021-11-09T12:54:30.985Z
|
||||||
weight: 20
|
weight: 40
|
||||||
extra:
|
extra:
|
||||||
parent: 'infrastructures/_index.md'
|
parent: 'infrastructures/_index.md'
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,19 +1,25 @@
|
||||||
---
|
---
|
||||||
title: Développement logiciel
|
title: Nos créations
|
||||||
description: Logiciels
|
description: Les logiciels que l'on développe
|
||||||
weight: 90
|
weight: 30
|
||||||
sort_by: weight
|
sort_by: weight
|
||||||
draft: false
|
draft: false
|
||||||
date: 2024-01-24
|
date: 2024-01-24
|
||||||
extra:
|
extra:
|
||||||
parent: infrastructures/_index.md
|
parent: infrastructures/services.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), [Bottin](@infrastructures/bottin.md), [Guichet](@infrastructures/guichet.md), [Tricot](@infrastructures/tricot.md), [Diplonat](@infrastructures/diplonat.md)...\
|
||||||
|
Cette page en particulier présente nos choix de conception.
|
||||||
|
|
||||||
|
|
||||||
# Principes 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 – 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
|
## Vie privée
|
||||||
|
|
||||||
|
@ -23,48 +29,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 :
|
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 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 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 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 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 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 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 (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 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 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 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
|
#### Synchronisation et collaboration sur des fichiers
|
||||||
- Je ne veux pas que le contenu de mes fichiers soit accessible
|
- 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 mon fichier soient accessibles (eg. nom du fichier, dossier, format, taille, hash, etc.)
|
- 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 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.)
|
- 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 (_e.g._ utilise ses accès privilégiés pour accéder volontairement ou non à du contenu privé)
|
||||||
- Administrateur Système (eg. 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 (eg. ajout d'une porte dérobée au moment de l'écriture du code)
|
- 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 (eg. ajout d'une porte dérobée au moment de déployer l'app sur les serveurs ou le terminal de l'utilisateur)
|
- 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 (eg. Orange)
|
- Opérateur Internet (_e.g._ Orange), voit passer une partie de notre trafic
|
||||||
- Regroupement d'opérateurs internet (cf "Tor netflow")
|
- Regroupement d'opérateurs Internet (cf "Tor netflow")
|
||||||
- Personne externe via internet (eg. hacker)
|
- Personne externe via Internet (_e.g._ hacker)
|
||||||
- Personne externe physique (eg. voleur)
|
- Personne externe physique (_e.g._ voleur)
|
||||||
- Regroupement d'acteurs (eg. opérateurs internet, externe physique ET internet)
|
- Regroupement d'acteurs (_e.g._ opérateurs internet, externe physique ET internet)
|
||||||
- Utilisateurs (eg. pas de chiffrement sur son téléphone)
|
- 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
|
## 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 :
|
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é, pas chiffré (Messenger)
|
||||||
- centralisé, chiffé de bout en bout (avec toute une gamme d'implems, la meilleure étant peut-être Signal)
|
- 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, XMPP sans omemo, Matrix sans E2EE)
|
- 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)
|
- fédéré, chiffré (XMPP + Omemo, Matrix + E2EE)
|
||||||
- distribué, chiffré (Tox, Retroshare)
|
- 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.
|
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 +102,5 @@ Concernant la seconde approche, celle-ci semble beaucoup plus à notre portée :
|
||||||
|
|
||||||
## Ressources
|
## Ressources
|
||||||
|
|
||||||
- https://about.psyc.eu/Federation et https://about.psyc.eu/PSYC2
|
- [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
|
- Définition d'un mixnet : [https://www.youtube.com/watch?v=dQtk0NcTseg](https://www.youtube.com/watch?v=dQtk0NcTseg)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Nos serveurs"
|
title: "Nos serveurs"
|
||||||
description: "La salle des machines"
|
description: "La salle des machines"
|
||||||
weight: 40
|
weight: 10
|
||||||
sort_by: "weight"
|
sort_by: "weight"
|
||||||
extra:
|
extra:
|
||||||
parent: 'infrastructures/_index.md'
|
parent: 'infrastructures/_index.md'
|
||||||
|
@ -9,31 +9,41 @@ extra:
|
||||||
|
|
||||||
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 qui constituent notre infrastructure et leurs différents rôles.
|
||||||
|
|
||||||
|
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)).
|
||||||
|
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) !
|
||||||
|
|
||||||
|
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
|
# Différents clusters
|
||||||
|
|
||||||
Nous avons mis en réseau une dizaine de machines, des ordinateurs de bureau, réunies en deux principaux rôles ou _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_ : -->
|
||||||
|
|
||||||
Nous avons identifié 4 rôles pour nos serveurs, en fonction de la criticité des charges de travail
|
- [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).
|
||||||
et des données qu'ils auront à gérer.
|
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.
|
||||||
|
|
||||||
[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).
|
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 :
|
||||||
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
|
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.
|
||||||
personnelles des usager·es. C'est donc le rôle le plus critique.
|
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).
|
- [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 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
|
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.
|
||||||
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.
|
||||||
|
|
||||||
[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
|
# Zones
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ title: "Réseau"
|
||||||
description: "Réseau"
|
description: "Réseau"
|
||||||
date: 2021-11-09T12:55:03.277Z
|
date: 2021-11-09T12:55:03.277Z
|
||||||
dateCreated: 2021-11-09T12:55:01.156Z
|
dateCreated: 2021-11-09T12:55:01.156Z
|
||||||
weight: 30
|
weight: 50
|
||||||
extra:
|
extra:
|
||||||
parent: 'infrastructures/_index.md'
|
parent: 'infrastructures/_index.md'
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
---
|
---
|
||||||
title: "Services"
|
title: "Les logiciels"
|
||||||
description: "Annuaire des services hébergés chez Deuxfleurs"
|
description: "Annuaire des logiciels utilisés par Deuxfleurs"
|
||||||
weight: 10
|
weight: 20
|
||||||
extra:
|
extra:
|
||||||
parent: 'infrastructures/_index.md'
|
parent: 'infrastructures/_index.md'
|
||||||
---
|
---
|
||||||
|
|
||||||
Cette page tente de recenser de façon exhaustive l'ensemble des services qui
|
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...).
|
||||||
fonctionnent actuellement sur les machines de Deuxfleurs, dans les différents
|
On détaille les logiciels que l'on développe nous-même à [la page suivante](@/infrastructures/logiciels.md).
|
||||||
rôles identifiés : production, développement, expérimentation, etc.
|
|
||||||
|
> On répète que cette liste est condamnée à être 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) – qui décrit formellement l'état de toutes nos machines.
|
||||||
|
|
||||||
|
C'est parti pour la liste à la Prévert :
|
||||||
|
|
||||||
| Service | Rôle | Site | Description |
|
| Service | Rôle | Site | Description |
|
||||||
| -- | -- | -- | -- |
|
| -- | -- | -- | -- |
|
||||||
|
|
|
@ -77,12 +77,17 @@ header ul li {
|
||||||
}
|
}
|
||||||
|
|
||||||
header .nav-item {
|
header .nav-item {
|
||||||
padding: 4px 2px;
|
padding: 8px 6px;
|
||||||
|
margin: 0 10px;
|
||||||
color: var(--primary-text-color);
|
color: var(--primary-text-color);
|
||||||
|
|
||||||
&:hover, &:active, &:focus {
|
&:hover, &:active, &:focus {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
border-bottom: white solid 2px;
|
border-bottom: white solid 1px;
|
||||||
|
}
|
||||||
|
&.active {
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: white solid 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,25 +1,32 @@
|
||||||
{% macro render_header() %}
|
{% 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="{{ root_section.permalink }}">
|
||||||
<a href="{{ section.permalink }}">
|
|
||||||
<div class="logo">
|
<div class="logo">
|
||||||
<img src="{{ get_url(path=config.extra.juice_logo_path) }}" alt="logo">
|
<img src="{{ get_url(path=config.extra.juice_logo_path) }}" alt="logo">
|
||||||
{{ config.extra.juice_logo_name }}
|
{{ config.extra.juice_logo_name }}
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<ul>
|
<ul>
|
||||||
{% for subpath in section.subsections %}
|
{% for subpath in root_section.subsections %}
|
||||||
{% set sub = get_section(path=subpath) %}
|
{% set sub = get_section(path=subpath) %}
|
||||||
|
{% set is_active = sub.components[0] == active_section %}
|
||||||
{% if not 'hide_from_menu' in sub.extra or not sub.extra.hide_from_menu %}
|
{% if not 'hide_from_menu' in sub.extra or not sub.extra.hide_from_menu %}
|
||||||
<li><a class="nav-item text" href="{{ sub.permalink }}">{{ sub.title }}</a></li>
|
<li>
|
||||||
|
<a class="nav-item text{% if is_active %} active{% endif %}" href="{{ sub.permalink }}">{{ sub.title }}</a>
|
||||||
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if config.extra.juice_extra_menu %}
|
{% if config.extra.juice_extra_menu %}
|
||||||
{% for menu in 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 %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
{{ nav::hamburger(root=root) }}
|
{{ nav::hamburger(root=root) }}
|
||||||
|
|
||||||
{# Section title #}
|
{# Section title #}
|
||||||
<!-- <div class="toc-item toc-section"> -->
|
{#
|
||||||
<!-- <a class="subtext" href="{{root.permalink | safe}}">{{ root.title }}</a> -->
|
<div class="toc-item toc-section">
|
||||||
<!-- </div> -->
|
<a class="subtext" href="{{root.permalink | safe}}">{{ root.title }}</a>
|
||||||
|
</div>
|
||||||
|
#}
|
||||||
|
|
||||||
{# Choose between "tree" (has extra.parent) and "list" (default) collections #}
|
{# Choose between "tree" (has extra.parent) and "list" (default) collections #}
|
||||||
{% set root_tree = root.pages | group_by(attribute="extra.parent") %}
|
{% set root_tree = root.pages | group_by(attribute="extra.parent") %}
|
||||||
|
@ -46,7 +48,12 @@
|
||||||
|
|
||||||
{# (Private) Build a breadcrumb for the page #}
|
{# (Private) Build a breadcrumb for the page #}
|
||||||
{# It's ugly because this is the hacky part of the project #}
|
{# 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) }}:{{ new_target.relative_path }}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
{# (Private) Render a list menu (this is the simple fallback when extra.parent is not defined #}
|
{# (Private) Render a list menu (this is the simple fallback when extra.parent is not defined #}
|
||||||
{% macro list(list, selected) %}
|
{% macro list(list, selected) %}
|
||||||
|
|
|
@ -3,11 +3,6 @@
|
||||||
|
|
||||||
{% block title %}{{ page.title }} | {{ super() }} {% endblock title %}
|
{% block title %}{{ page.title }} | {{ super() }} {% endblock title %}
|
||||||
|
|
||||||
{% block header %}
|
|
||||||
<header class="box-shadow">
|
|
||||||
{{ macros::render_header() }}
|
|
||||||
</header>
|
|
||||||
{% endblock header %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="heading-text">{{ page.description }}</div>
|
<div class="heading-text">{{ page.description }}</div>
|
||||||
|
|
Loading…
Reference in a new issue