Compare commits

..

1 commit

Author SHA1 Message Date
100af7b34f
Ajout partenaires + modele eco + chapo 2022-08-04 12:22:00 +02:00
75 changed files with 2415 additions and 3507 deletions

73
.drone.yml Normal file
View file

@ -0,0 +1,73 @@
---
# see https://docs.drone.io/pipeline/configuration/
kind: pipeline
type: docker
name: build
steps:
- name: restore-cache
image: meltwater/drone-cache:v1.1.0
environment:
AWS_ACCESS_KEY_ID:
from_secret: cache_aws_access_key_id
AWS_SECRET_ACCESS_KEY:
from_secret: cache_aws_secret_access_key
pull: true
settings:
restore: true
bucket: drone-cache
region: garage
mount:
- 'node_modules'
path_style: true
endpoint: https://garage.deuxfleurs.fr
- name: build
# cf https://hub.docker.com/_/node?tab=description&page=1&ordering=last_updated
image: node:14-buster
commands:
- npm install
- node render.js
- name: upload
image: plugins/s3
settings:
bucket: deuxfleurs.fr
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
source: static/**/*
strip_prefix: static/
target: /
path_style: true
endpoint: https://garage.deuxfleurs.fr
region: garage
when:
branch:
- main
event:
exclude:
- pull_request
- name: rebuild-cache
image: meltwater/drone-cache:v1.1.0
environment:
AWS_ACCESS_KEY_ID:
from_secret: cache_aws_access_key_id
AWS_SECRET_ACCESS_KEY:
from_secret: cache_aws_secret_access_key
pull: true
settings:
rebuild: true
bucket: drone-cache
region: garage
mount:
- 'node_modules'
path_style: true
endpoint: https://garage.deuxfleurs.fr
---
kind: signature
hmac: f1fcc439a2180d4e98224dec1cd2dc10691b58161bfee7739ae700e84f04c905
...

2
.gitignore vendored
View file

@ -1,4 +1,4 @@
public/ static/
node_modules/ node_modules/
*.swp *.swp
.awsclirc .awsclirc

18
DEPLOY.md Normal file
View file

@ -0,0 +1,18 @@
## À réaliser au premier clonage du dépôt
Commencer par créer un fichier `.awsclirc` avec cette structure :
```
export AWS_ACCESS_KEY_ID='xxxx'
export AWS_SECRET_ACCESS_KEY='xxxx'
export AWS_DEFAULT_REGION='garage'
alias awsdf="aws --endpoint-url https://garage.deuxfleurs.fr"
```
Installer [l'outil en ligne de commande de AWS version 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) qui fournit la commande `aws`.
Enfin, déployer en exécutant :
```
./deploy
```

View file

@ -1,47 +1,64 @@
# deuxfleurs.fr - site web # site
Le site web en ASCII Art de Deuxfleurs [![Build Status](https://drone.deuxfleurs.fr/api/badges/Deuxfleurs/site/status.svg?ref=refs/heads/main)](https://drone.deuxfleurs.fr/Deuxfleurs/site)
Ce dépôt git contient les sources pour le site [deuxfleurs.fr](https://deuxfleurs.fr/).
C'est ici que vous pourrez apporter des modifications au site.
## Comment ajouter du contenu ?
Prérequis :
- Un compte sur cette instance gitea.
- Le logiciel git d'installé. [téléchager](https://git-scm.com/downloads).
Pour commencer, assurez-vous d'être connecté.
Ensuite cliquez sur le bouton "Bifurcation" en haut à droite (*fork* en anglais).
Finalement, vous pourrez cloner votre dépôt en local :
``` ```
'\ ; /' git clone https://git.deuxfleurs.fr/<votre nom d'utilisateur>/site.git
·`.;.;.`· ```
·— · · —·
·`';.;'`·
'/ ; \'
.-.
.( ; ;
.-. (_.():')
_( ' ; /(' ; .)
( `(·)` ; ``-'
',_' `·,'
`-`\| +---------------------+
. /) | B i e n v e n u e |
(\|/ +---------------------+
| | |
.,.,\/,}\|//,,, ;/,,\/ | , \,,,;/. ;.;, |,,,,;,;..
Fabriquons un internet convivial ⤵ Pour ajouter du contenu, vous pouvez tout simplement ajouter un fichier dans le dossier `src`.
``` Par exemple, le fichier `src/Association/Statuts.md` se retrouve à l'adresse `https://deuxfleurs.fr/Association/Statuts.html`.
## Structure Deux formats de fichiers différents sont supportés pour l'instant :
- `static` - Ce qui doit être envoyé sur le bucket - `.md` pour Markdown. [documentation](https://fr.wikipedia.org/wiki/Markdown). Rapide à apprendre, il est très pratique pour rajouter du contenu sans se poser la question de l'apparence.
- `r` - Pour faire un système de redirection minimaliste. Exemple: `deuxfleurs.fr/r/rdv23` - `.pug` pour Pug. [documentation](https://pugjs.org). PugJS est une syntaxe différente pour représenter du HTML. Elle offre donc toute la souplesse de ce dernier et s'adapte plus à des mises en page complexe.
- `.well-known` - Utilisé par Matrix, Thunderbird, chatons.org et d'autres pour la configuration automatique de pas mal de services
- `img` le dossier qui contient les images
- `res` - Ce qui peut être utile pour modifier le site web
- `calendar.txt` - Tous les calendriers ASCII jusqu'à Décembre 2024
## Générateur de site statique ? Si vous ne savez pas par où commencer, choisissez markdown !
N'hésitez pas à vous inspirer des fichiers existants.
Pas maintenant. Une fois vos modifications terminées, vous pouvez commit et push :
## Déployer
⚠️ NE FAITES PAS `--delete` car il est fort probable que des trucs qui doivent rester dans le bucket
ne sont pas copiés ici
``` ```
aws s3 sync static/ s3://deuxfleurs.fr git add src/Association/MonFichier.md
git commit -a
git push
``` ```
Ensuite, vous pouvez créer une demande d'ajout (*pull request* ou *merge request* en anglais) depuis cette adresse (ou en cliquant sur l'onglet éponyme) : https://git.deuxfleurs.fr/Deuxfleurs/site/pulls
## Comment prévisualiser mes modifications ?
Prérequis :
- nodejs et npm d'installé. [télécharger](https://nodejs.org/en/download/)
Vous pourriez vouloir vérifier que vos modifications rendent bien avant de faire votre demande d'ajout.
Pour cela, nous utilisons un script de notre cru nommé `render.js`. Il convertit le dossier `src/` vers un site web contenu dans le dossier `static/` et peut, optionnellement, servir de serveur web.
La façon la plus simple de prévisualiser vos modifications est donc de :
```bash
npm install # installer les dépendances
LISTEN=3000 node render.js # effectuer le rendu puis démarrer un serveur web sur le port 3000
```
Votre aperçu est alors disponible à cette URL : http://127.0.0.1:3000
À chaque modification, vous pouvez arrêter la dernière commande (CTRL+C) et la relancer pour forcer le rendu.
## Comment le site est mis à jour depuis ce dépôt ?
*Nous sommes actuellement dans une phase de transition sur ce point. Veuillez contacter un·e des maintainers. Si vous êtes maintainer ou curieux·se, vous pouvez vous réferrer au fichier DEPLOY.md*

7
deploy Executable file
View file

@ -0,0 +1,7 @@
#!/bin/bash
shopt -s expand_aliases
source .awsclirc
npm install
node render.js
awsdf s3 sync --size-only static s3://deuxfleurs.fr

909
package-lock.json generated Normal file
View file

@ -0,0 +1,909 @@
{
"name": "site",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "site",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"clean-css": "^5.1.2",
"jstransformer-markdown-it": "^2.1.0",
"marked": "^0.8.2",
"pug": "^3.0.2",
"source-map": "^0.7.3",
"uglify-js": "^3.13.3"
},
"devDependencies": {}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
},
"node_modules/@babel/parser": {
"version": "7.13.15",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz",
"integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==",
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/types": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz",
"integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==",
"dependencies": {
"@babel/helper-validator-identifier": "^7.12.11",
"lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
"node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
"node_modules/assert-never": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
"integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
},
"node_modules/babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
"integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
"dependencies": {
"@babel/types": "^7.9.6"
},
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/character-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
"integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
"dependencies": {
"is-regex": "^1.0.3"
}
},
"node_modules/clean-css": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.2.tgz",
"integrity": "sha512-QcaGg9OuMo+0Ds933yLOY+gHPWbxhxqF0HDexmToPf8pczvmvZGYzd+QqWp9/mkucAOKViI+dSFOqoZIvXbeBw==",
"dependencies": {
"source-map": "~0.6.0"
},
"engines": {
"node": ">= 10.0"
}
},
"node_modules/clean-css/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/constantinople": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
"integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
"dependencies": {
"@babel/parser": "^7.6.0",
"@babel/types": "^7.6.1"
}
},
"node_modules/doctypes": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
"integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
},
"node_modules/entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-core-module": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
"integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-expression": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
"integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
"dependencies": {
"acorn": "^7.1.1",
"object-assign": "^4.1.1"
}
},
"node_modules/is-promise": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"node_modules/is-regex": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
"integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
"dependencies": {
"call-bind": "^1.0.2",
"has-symbols": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/js-stringify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
"integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
},
"node_modules/jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
"integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
"dependencies": {
"is-promise": "^2.0.0",
"promise": "^7.0.1"
}
},
"node_modules/jstransformer-markdown-it": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.1.0.tgz",
"integrity": "sha1-aewwzkUYvtWZezjwJ2SOjChekvc=",
"dependencies": {
"markdown-it": "^8.0.0"
},
"engines": {
"node": ">=7"
}
},
"node_modules/linkify-it": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
"integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
"dependencies": {
"uc.micro": "^1.0.1"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/markdown-it": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"dependencies": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"bin": {
"markdown-it": "bin/markdown-it.js"
}
},
"node_modules/marked": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz",
"integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==",
"bin": {
"marked": "bin/marked"
},
"engines": {
"node": ">= 8.16.2"
}
},
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
},
"node_modules/promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"dependencies": {
"asap": "~2.0.3"
}
},
"node_modules/pug": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz",
"integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==",
"dependencies": {
"pug-code-gen": "^3.0.2",
"pug-filters": "^4.0.0",
"pug-lexer": "^5.0.1",
"pug-linker": "^4.0.0",
"pug-load": "^3.0.0",
"pug-parser": "^6.0.0",
"pug-runtime": "^3.0.1",
"pug-strip-comments": "^2.0.0"
}
},
"node_modules/pug-attrs": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
"integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
"dependencies": {
"constantinople": "^4.0.1",
"js-stringify": "^1.0.2",
"pug-runtime": "^3.0.0"
}
},
"node_modules/pug-code-gen": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz",
"integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==",
"dependencies": {
"constantinople": "^4.0.1",
"doctypes": "^1.1.0",
"js-stringify": "^1.0.2",
"pug-attrs": "^3.0.0",
"pug-error": "^2.0.0",
"pug-runtime": "^3.0.0",
"void-elements": "^3.1.0",
"with": "^7.0.0"
}
},
"node_modules/pug-error": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
"integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ=="
},
"node_modules/pug-filters": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
"integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
"dependencies": {
"constantinople": "^4.0.1",
"jstransformer": "1.0.0",
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0",
"resolve": "^1.15.1"
}
},
"node_modules/pug-lexer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
"integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
"dependencies": {
"character-parser": "^2.2.0",
"is-expression": "^4.0.0",
"pug-error": "^2.0.0"
}
},
"node_modules/pug-linker": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
"integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
"dependencies": {
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0"
}
},
"node_modules/pug-load": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
"integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
"dependencies": {
"object-assign": "^4.1.1",
"pug-walk": "^2.0.0"
}
},
"node_modules/pug-parser": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
"integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
"dependencies": {
"pug-error": "^2.0.0",
"token-stream": "1.0.0"
}
},
"node_modules/pug-runtime": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
"integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="
},
"node_modules/pug-strip-comments": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
"integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
"dependencies": {
"pug-error": "^2.0.0"
}
},
"node_modules/pug-walk": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
"integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
},
"node_modules/resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dependencies": {
"is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"engines": {
"node": ">= 8"
}
},
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"engines": {
"node": ">=4"
}
},
"node_modules/token-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
"integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ="
},
"node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"node_modules/uglify-js": {
"version": "3.13.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.3.tgz",
"integrity": "sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig==",
"bin": {
"uglifyjs": "bin/uglifyjs"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/with": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
"integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
"dependencies": {
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"assert-never": "^1.2.1",
"babel-walk": "3.0.0-canary-5"
},
"engines": {
"node": ">= 10.0.0"
}
}
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
},
"@babel/parser": {
"version": "7.13.15",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz",
"integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ=="
},
"@babel/types": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz",
"integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==",
"requires": {
"@babel/helper-validator-identifier": "^7.12.11",
"lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"requires": {
"sprintf-js": "~1.0.2"
}
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
"assert-never": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
"integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
},
"babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
"integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
"requires": {
"@babel/types": "^7.9.6"
}
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"character-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
"integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
"requires": {
"is-regex": "^1.0.3"
}
},
"clean-css": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.2.tgz",
"integrity": "sha512-QcaGg9OuMo+0Ds933yLOY+gHPWbxhxqF0HDexmToPf8pczvmvZGYzd+QqWp9/mkucAOKViI+dSFOqoZIvXbeBw==",
"requires": {
"source-map": "~0.6.0"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}
}
},
"constantinople": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
"integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
"requires": {
"@babel/parser": "^7.6.0",
"@babel/types": "^7.6.1"
}
},
"doctypes": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
"integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
},
"entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
},
"is-core-module": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
"integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
"requires": {
"has": "^1.0.3"
}
},
"is-expression": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
"integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
"requires": {
"acorn": "^7.1.1",
"object-assign": "^4.1.1"
}
},
"is-promise": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"is-regex": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
"integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
"requires": {
"call-bind": "^1.0.2",
"has-symbols": "^1.0.1"
}
},
"js-stringify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
"integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
},
"jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
"integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
"requires": {
"is-promise": "^2.0.0",
"promise": "^7.0.1"
}
},
"jstransformer-markdown-it": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.1.0.tgz",
"integrity": "sha1-aewwzkUYvtWZezjwJ2SOjChekvc=",
"requires": {
"markdown-it": "^8.0.0"
}
},
"linkify-it": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
"integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
"requires": {
"uc.micro": "^1.0.1"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"markdown-it": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
},
"marked": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz",
"integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw=="
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "~2.0.3"
}
},
"pug": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz",
"integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==",
"requires": {
"pug-code-gen": "^3.0.2",
"pug-filters": "^4.0.0",
"pug-lexer": "^5.0.1",
"pug-linker": "^4.0.0",
"pug-load": "^3.0.0",
"pug-parser": "^6.0.0",
"pug-runtime": "^3.0.1",
"pug-strip-comments": "^2.0.0"
}
},
"pug-attrs": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
"integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
"requires": {
"constantinople": "^4.0.1",
"js-stringify": "^1.0.2",
"pug-runtime": "^3.0.0"
}
},
"pug-code-gen": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz",
"integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==",
"requires": {
"constantinople": "^4.0.1",
"doctypes": "^1.1.0",
"js-stringify": "^1.0.2",
"pug-attrs": "^3.0.0",
"pug-error": "^2.0.0",
"pug-runtime": "^3.0.0",
"void-elements": "^3.1.0",
"with": "^7.0.0"
}
},
"pug-error": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
"integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ=="
},
"pug-filters": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
"integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
"requires": {
"constantinople": "^4.0.1",
"jstransformer": "1.0.0",
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0",
"resolve": "^1.15.1"
}
},
"pug-lexer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
"integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
"requires": {
"character-parser": "^2.2.0",
"is-expression": "^4.0.0",
"pug-error": "^2.0.0"
}
},
"pug-linker": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
"integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
"requires": {
"pug-error": "^2.0.0",
"pug-walk": "^2.0.0"
}
},
"pug-load": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
"integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
"requires": {
"object-assign": "^4.1.1",
"pug-walk": "^2.0.0"
}
},
"pug-parser": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
"integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
"requires": {
"pug-error": "^2.0.0",
"token-stream": "1.0.0"
}
},
"pug-runtime": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
"integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="
},
"pug-strip-comments": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
"integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
"requires": {
"pug-error": "^2.0.0"
}
},
"pug-walk": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
"integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
},
"resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"requires": {
"is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
}
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
},
"token-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
"integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ="
},
"uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"uglify-js": {
"version": "3.13.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.3.tgz",
"integrity": "sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig=="
},
"void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk="
},
"with": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
"integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
"requires": {
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"assert-never": "^1.2.1",
"babel-walk": "3.0.0-canary-5"
}
}
}
}

23
package.json Normal file
View file

@ -0,0 +1,23 @@
{
"name": "site",
"version": "1.0.0",
"description": "deuxfleurs.fr",
"main": "render.js",
"dependencies": {
"clean-css": "^5.1.2",
"jstransformer-markdown-it": "^2.1.0",
"marked": "^0.8.2",
"pug": "^3.0.2",
"source-map": "^0.7.3",
"uglify-js": "^3.13.3"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git@git.deuxfleurs.fr:Deuxfleurs/site.git"
},
"author": "",
"license": "ISC"
}

264
render.js Normal file
View file

@ -0,0 +1,264 @@
'use strict'
const pug = require('pug')
const marked = require('marked')
const fs = require('fs').promises
const http = require('http')
const unit = (...args) => null
const log = process.env.VERBOSE ? console.log : unit
const walk = async (path, filename) => {
log('[walk]', path)
const type = await fs.lstat(path)
if (type.isFile()) return {type: 'file', path: path, name: filename || path, tags:[]}
if (!type.isDirectory()) return null
const files = await fs.readdir(path)
return {
type: 'folder',
path: path,
name: filename || path,
tags: [],
children: await Promise.all(files.map(file => walk(`${path}/${file}`, file)))
}
}
const ext_static = ['.css', '.js', '.otf', '.png', '.svg', '.txt', '.png', '.jpg', '.webp', 'client', 'server', '.pdf', '.ttf', '.xml', '.properties']
const ext_md = ['.md', '.markdown']
const ext_pug = ['.pug', '.jade']
const suffix = file => ext => file.substring(file.length - ext.length) == ext ? ext : null
const suffixl = (...l) => file => l.find(suffix(file))
const is_static = suffixl(...ext_static)
const is_md = suffixl(...ext_md)
const is_pug = suffixl(...ext_pug)
const is_templated = f => is_md(f) /* || is_rst(f) */
const is_document = f => is_templated(f) || is_pug(f)
const prefix = file => ext => file.substring(0, ext.length) == ext ? ext : null
const prefixl = (...l) => file => l.find(prefix(file))
const rm_prefix = (...l) => file => file.substring(prefixl(...l)(file).length)
const rm_suffix = (...l) => file => file.substring(0, file.length - suffixl(...l)(file).length)
const propagate_md_layout = (tree, markdown_template) => {
if (tree.type == 'file' && is_templated(tree.name)) {
tree.template = markdown_template
log('[propagate_md_layout]', tree ? tree.path : null, markdown_template ? markdown_template.path : null)
} else if (tree.type == 'folder') {
const find_md_tpl = tree.children.filter(c => c.type == 'file' && c.name == '_markdown.pug')
const new_md_tpl = find_md_tpl.length > 0 ? find_md_tpl[0] : markdown_template
tree.children.forEach(c => propagate_md_layout(c, new_md_tpl))
}
return tree
}
const elagate = tree => {
if (tree.type != 'folder') return tree
const lh = e => log('[elagate]', e.path) && false
tree.children = tree.children.filter(e => !(e.name[0] == '_') || lh(e))
tree.children.forEach(elagate)
return tree
}
const tag_document = tree => {
if (tree.type == 'file' && is_document(tree.name) && tree.name[0] != '@') {
tree.tags.push('document_leaf', 'document')
log('[tag_document]', tree.path, 'document_leaf')
} else if (tree.type == 'folder') {
tree.children.forEach(tag_document)
if(tree.children.some(c => c.tags.includes('document'))) {
tree.tags.push('document_branch', 'document')
log('[tag_document]', tree.path, 'document_branch')
}
}
return tree
}
const reference_index = indexes => tree => {
if (tree.type != 'folder') return tree;
const index = tree.children.find(e => indexes.includes(e.name))
if (index) {
tree.index = index
tree.tags.push('has_index')
log('[reference_index]', tree.path, index.name)
index.tags.push('is_index')
}
tree.children.forEach(reference_index(indexes))
return tree;
}
const propagate_nice_name = prefix => tree => {
const without_prefix = tree.path.substring(prefix.length)
const splitted = without_prefix.split('/').filter(v => v.length > 0)
if (splitted.length > 0) {
tree.nice_path = splitted.slice(0, -1)
tree.nice_name = splitted[splitted.length - 1].split('.')[0]
tree.url = tree.type == 'folder' ? without_prefix + '/' : without_prefix
log('[propagate_nice_name]', [...tree.nice_path, tree.nice_name].join('|'))
}
if (tree.type == 'folder') tree.children.forEach(propagate_nice_name(prefix))
return tree
}
const prepare_copy = (old_prefix, new_prefix, exts) => tree => {
if (tree.type == 'file' && is_static(tree.name)) {
tree.generate = {
cmd: 'copy',
src: tree.path,
out: new_prefix + rm_prefix(old_prefix)(tree.path)
}
log('[prepare_copy]',tree.generate.src,'->',tree.generate.out)
} else if (tree.type == 'folder') {
tree.children.forEach(prepare_copy(old_prefix, new_prefix, exts))
}
return tree
}
const prepare_pug = (old_prefix, new_prefix) => tree => {
if (tree.type == 'file' && is_pug(tree.name)) {
tree.old_url = tree.url
tree.url = rm_prefix(old_prefix)(rm_suffix(...ext_pug)(tree.path)) + '.html'
tree.generate = {
cmd: 'pug',
src: tree.path,
out: new_prefix + tree.url
}
log('[prepare_pug]',tree.generate.src,'->',tree.generate.out)
}
else if (tree.type == 'folder') {
tree.children.forEach(prepare_pug(old_prefix, new_prefix))
}
return tree
}
const prepare_md = (old_prefix, new_prefix) => tree => {
if (tree.type == 'file' && is_md(tree.name)) {
tree.old_url = tree.url
tree.url = rm_prefix(old_prefix)(rm_suffix(...ext_md)(tree.path)) + '.html'
tree.generate = {
cmd: 'pug',
src: tree.template.path,
markdown: tree.path,
out: new_prefix + tree.url
}
log('[prepare_md]',tree.generate.markdown,'+',tree.generate.src,'->',tree.generate.out)
}
else if (tree.type == 'folder') {
tree.children.forEach(prepare_md(old_prefix, new_prefix))
}
return tree
}
const prepare_folder = (old_prefix, new_prefix) => tree => {
if (tree.type == 'folder') {
tree.generate = {
cmd: 'mkdir',
out: new_prefix + rm_prefix(old_prefix)(tree.path)
}
log('[prepare_folder]',tree.generate.out)
tree.children.forEach(prepare_folder(old_prefix, new_prefix))
}
return tree
}
const do_folder = async tree => {
if (!tree.generate || tree.generate.cmd != 'mkdir') return tree
await fs.mkdir(tree.generate.out, { recursive: true })
log('[do_folder]',tree.generate.out)
await Promise.all(tree.children.map(do_folder))
return tree
}
const do_copy = async tree => {
if (tree.generate && tree.generate.cmd == 'copy') {
await fs.copyFile(tree.generate.src, tree.generate.out)
log('[do_copy]',tree.generate.out)
} else if (tree.type == 'folder')
await Promise.all(tree.children.map(do_copy))
return tree
}
const do_pug = (prt, root) => async tree => {
prt = prt || tree
root = root || tree
if (tree.generate && tree.generate.cmd == 'pug') {
const html = pug.renderFile(tree.generate.src, {
markdown: tree.generate.markdown ? marked(await fs.readFile(tree.generate.markdown, 'utf-8')) : null,
root: root,
prt: prt,
element: tree
})
await fs.writeFile(tree.generate.out, html)
log('[do_pug]',tree.generate.out)
} else if (tree.type == 'folder')
await Promise.all(tree.children.map(do_pug(tree,root)))
return tree
}
const rm_tree = t => {
if (t == null) return
if (t.type == 'file') {
log('[do_clean] file', t.path)
return fs.unlink(t.path)
}
return Promise
.all(t.children.map(rm_tree))
.then(_ => {
log('[do_clean] path', t.path)
return fs.rmdir(t.path)
})
}
const do_clean = path => tree =>
walk(path)
.catch(_ => null)
.then(rm_tree)
.then(_ => tree)
const listen = async t =>
process.env.LISTEN &&
http.createServer(async (req,res) => {
const file = fs.readFile(__dirname + '/static/' + decodeURI(req.url))
.catch(_ => fs.readFile(__dirname + '/static/' + decodeURI(req.url) + '/index.html'))
try {
const f = await file
res.writeHead(200)
res.end(f)
} catch (e) {
console.error(e)
res.writeHead(404)
res.end("404 not found")
}
}).listen(process.env.LISTEN);
const conf = { src: './src', dest: './static'}
walk(conf.src)
.then(propagate_md_layout)
.then(elagate)
.then(tag_document)
.then(reference_index(['index.md', 'index.pug']))
.then(propagate_nice_name(conf.src))
.then(prepare_copy(conf.src, conf.dest))
.then(prepare_pug(conf.src, conf.dest))
.then(prepare_md(conf.src, conf.dest))
.then(prepare_folder(conf.src, conf.dest))
//.then(v => {log(v) ; return v})
.then(do_clean(conf.dest))
.then(do_folder)
.then(do_copy)
.then(do_pug())
.then(listen)
.catch(console.error)

View file

@ -1,417 +0,0 @@
.——————————————————————————————————————.
| CALENDRIER OCTOBRE 2022 |
|——————————————————————————————————————|
| ———— ———— |
| | 01 | 02 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 31 | |
| ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER NOVEMBRE 2022 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 07 | 08 | 09 | 10 | 11 | 12 | 13 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 21 | 22 | 23 | 24 | 25 | 26 | 27 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 28 | 29 | 30 | |
| ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER DÉCEMBRE 2022 |
|——————————————————————————————————————|
| ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 26 | 27 | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER JANVIER 2023 |
|——————————————————————————————————————|
| ———— |
| | 01 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 30 | 31 | |
| ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER FÉVRIER 2023 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 27 | 28 | |
| ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER MARS 2023 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 27 | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER AVRIL 2023 |
|——————————————————————————————————————|
| ———— ———— |
| | 01 | 02 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER MAI 2023 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 29 | 30 | 31 | |
| ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER JUIN 2023 |
|——————————————————————————————————————|
| ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER JUILLET 2023 |
|——————————————————————————————————————|
| ———— ———— |
| | 01 | 02 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 31 | |
| ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER AOÛT 2023 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 07 | 08 | 09 | 10 | 11 | 12 | 13 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 21 | 22 | 23 | 24 | 25 | 26 | 27 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER SEPTEMBRE 2023 |
|——————————————————————————————————————|
| ———— ———— ———— |
| | 01 | 02 | 03 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 25 | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER OCTOBRE 2023 |
|——————————————————————————————————————|
| ———— |
| | 01 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 30 | 31 | |
| ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER NOVEMBRE 2023 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER DÉCEMBRE 2023 |
|——————————————————————————————————————|
| ———— ———— ———— |
| | 01 | 02 | 03 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER JANVIER 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 29 | 30 | 31 | |
| ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER FÉVRIER 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 26 | 27 | 28 | 29 | |
| ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER MARS 2024 |
|——————————————————————————————————————|
| ———— ———— ———— |
| | 01 | 02 | 03 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER AVRIL 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 29 | 30 | |
| ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER MAI 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 27 | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER JUIN 2024 |
|——————————————————————————————————————|
| ———— ———— |
| | 01 | 02 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 03 | 04 | 05 | 06 | 07 | 08 | 09 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER JUILLET 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | 07 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 29 | 30 | 31 | |
| ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER AOÛT 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 26 | 27 | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER SEPTEMBRE 2024 |
|——————————————————————————————————————|
| ———— |
| | 01 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 30 | |
| ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER OCTOBRE 2024 |
|——————————————————————————————————————|
| ———— ———— ———— ———— ———— ———— |
| | 01 | 02 | 03 | 04 | 05 | 06 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 07 | 08 | 09 | 10 | 11 | 12 | 13 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 21 | 22 | 23 | 24 | 25 | 26 | 27 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 28 | 29 | 30 | 31 | |
| ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER NOVEMBRE 2024 |
|——————————————————————————————————————|
| ———— ———— ———— |
| | 01 | 02 | 03 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 04 | 05 | 06 | 07 | 08 | 09 | 10 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 25 | 26 | 27 | 28 | 29 | 30 | |
| ———— ———— ———— ———— ———— ———— |
|______________________________________|
.——————————————————————————————————————.
| CALENDRIER DÉCEMBRE 2024 |
|——————————————————————————————————————|
| ———— |
| | 01 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 09 | 10 | 11 | 12 | 13 | 14 | 15 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 16 | 17 | 18 | 19 | 20 | 21 | 22 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
| ———— ———— ———— ———— ———— ———— ———— |
| | 30 | 31 | |
| ———— ———— |
|______________________________________|

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -2,9 +2,6 @@
"m.homeserver": { "m.homeserver": {
"base_url": "https://im.deuxfleurs.fr" "base_url": "https://im.deuxfleurs.fr"
}, },
"org.matrix.msc3575.proxy": {
"url": "https://im-syncv3.deuxfleurs.fr"
},
"m.identity_server": { "m.identity_server": {
"base_url": "https://vector.im" "base_url": "https://vector.im"
}, },

View file

@ -0,0 +1 @@
{ "m.server": "deuxfleurs.fr:443" }

13
src/@404.pug Normal file
View file

@ -0,0 +1,13 @@
extends _layout.pug
prepend root
- title = "deuxfleurs"
block content
section
h1 404 - Page non trouvée
p La page que vous cherchez n'existe pas sur ce site web.
p Si vous pensez que c'est une erreur, les informations pour nous contacter sont disponibles sur notre page d'accueil.

144
src/CGU.pug Normal file
View file

@ -0,0 +1,144 @@
extends _layout.pug
prepend root
- title = "CGU"
block content
section
h1 Conditions Générales d'Utilisation
p 10/03/2022
p En utilisant les services de Deuxfleurs, vous acceptez dêtre lié par les conditions suivantes.
h2 Évolution des conditions générales d'utilisation
p Deuxfleurs se réserve le droit de mettre à jour et modifier ces conditions. Dans ce cas, Deuxfleurs informe les personnes concernées par mail si elle le peut ou par un affichage sur le site.
h2 Accès aux services
p
| Certains services sont en accès libre, d'autre requièrent un compte. Vous pouvez obtenir un compte par cooptation d'un membre existant ou en faisant une demande directement par email à l'association.
| Certains services sont soumis à l'approbation préalable de Deuxfleurs selon les ressources disponibles. La liste des services et leurs conditions d'accès peut-être obtenue en contactant l'association.
h2 Fonctionnement
h3 Délais de mise en service
p Deuxfleurs propose ses services grâce à des bénévoles, de ce fait Deuxfleurs ne sengage sur aucun délai de mise en service. Nous essayons toutefois de faire de notre mieux pour les fournir dans les 7 jours.
h3 Transmission sécurisée didentifiants
p
| Deuxfleurs ne vous demandera jamais de communiquer vos mots ou phrases de passe.
| Lorsque Deuxfleurs doit vous transmettre un identifiant, Deuxfleurs le fera via email ou en physique.
h3 Intervention en cas de panne
p En cas de panne constatée et si aucun message natteste sur la page de statut que Deuxfleurs est en train de corriger le dysfonctionnement, vous devez faire un signalement via Matrix.
p Deuxfleurs propose lensemble de ses services grâce à des bénévoles qui feront ce quils et elles peuvent pour résoudre les problèmes techniques qui pourraient subvenir.
h3 Intégrité des données
p Deuxfleurs réalise des sauvegardes quotidiennes afin déviter des pertes de données. Les sauvegardes sont conservées selon cette politique suivante: 1/jour jusquà 1 mois, 1/semaine jusquà 3 mois, 1/mois jusquà 1 an. Les sauvegardes sont stockées de manière chiffrée avec un mot de passe par l'association à Suresnes.
p Deuxfleurs ne peut être tenu responsable de lintégrité des données et des conséquences liées à une perte de données.
p Deuxfleurs recommande aux usager·es davoir une sauvegarde locale afin dassurer lintégrité de leurs données.
h3 Responsabilité de Deuxfleurs
p Deuxfleurs est assujetti à une obligation de moyens. En cas de défaillance, Deuxfleurs ne peut être tenu pour responsable des dommages indirects tels que pertes dexploitation, préjudices commerciaux, perte de Clientèle, de chiffre daffaires, de bénéfices ou déconomies prévus, ou de tout autre préjudice indirect.
h3 Mésusage des services
p Vous devez respecter les lois et réglementations en vigueur lors de lusage des services proposés que ce soit en matière de respect de la vie privée, denvoi de mails en grande quantité, de propriété intellectuelle, de propos discriminatoires, dappel à la haine, de harcèlement, datteinte aux libertés fondamentales de personnes, etc.
p En cas dusage prohibé, Deuxfleurs peut se trouver dans lobligation de déclencher la suspension totale ou partielle du service, le retrait de contenu, ou toute autre mesure que les lois et réglementations lui imposent. Vous devez respecter les autres utilisateurs en faisant preuve de civisme et de politesse. Deuxfleurs se réserve le droit de supprimer tout contenu paraissant non pertinent ou contrevenant à ces principes, selon son seul jugement.
p Par ailleurs, si un ou une utilisatrice abuse du service, par exemple en monopolisant des ressources machines partagées, son contenu ou son accès pourra être supprimé, si nécessaire sans avertissement ni négociation. Deuxfleurs reste seul juge de cette notion «dabus» dans le but de fournir le meilleur service possible à lensemble des usagers et usagères.
h3 Devenir des services
p Deuxfleurs peut par ailleurs choisir (de résilier des abonnements ou) darrêter des services si Deuxfleurs estime ne plus être en mesure de fournir lesdits services. Si Deuxfleurs en a la possibilité, elle fera de son mieux pour laisser un délai suffisant pour permettre à tout le monde de migrer sereinement.
h3 Support et conseil
p Vous pouvez nous signaler des souhaits sur la création de futur service, mais sachez que nous ne pourrons pas créer de nouveaux services en moins de 6 mois. Deuxfleurs pourra toutefois vous rediriger vers des chatons à même de répondre à vos demandes.
p En dehors de dysfonctionnement technique, Deuxfleurs propose également de vous aider dans la réalisation de votre projet avec les services de Deuxfleurs selon l'envie et le temps disponible de ses membres. Deuxfleurs se réserve le droit de facturer le temps de support et de conseil pour des projets importants après avoir prévenu les utilisateurs en amont.
h3 Résiliation dun compte
p Si vous souhaitez résilier un compte, vous devez le signaler à Deuxfleurs.
h2 Nos engagements
p
| Deuxfleurs nexploitera vos données personnelles que dans le cadre de ces 5 finalités:
ul
li fournir le service pour lesquels vous avez transmis vos données
li produire déventuelles statistiques anonymisées et agrégées
li vous prévenir dun changement important sur le service (panne, notification dintrusion et de vol de données, changement dinterface, date darrêt du service...)
li obtenir votre avis sur les services et laction de lassociation
li vous inviter à participer à un évènement de Deuxfleurs
p Deuxfleurs ne transmettra ni ne revendra vos données personnelles (votre vie privée nous tient - vraiment - à cœur). Votre contenu vous appartient tout autant, toutefois, nous vous encourageons à le publier sous licence libre si cest pertinent.
p
| Une modification du paragraphe précédent, contrairement au reste de la présente charte, ne peut se faire simplement par une simple notification. Si une telle modification devait survenir, elle :
ul
li Ne serait pas rétroactive
li Demandera un accord explicite de votre part pour continuer à utiliser les services fournis par Deuxfleurs
li Provoquera une révocation préalable à la modification auprès de tous les soutiens de Deuxfleurs ayant à cœur les problématiques de respect de la vie privée.
h3 Charte CHATONS
p Deuxfleurs sengage à respecter la charte du Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires dans le cadre de son activité dhébergeur et de fourniture de services en ligne
p Deuxfleurs est candidat à lintégration au sein de ce collectif.
p Plus dinformation sur la charte C.H.A.T.O.N.S. :
a(href="https://chatons.org/fr/charte") chatons.org/fr/charte
h3 Localisation des données
p
| Vos données sont localisées en France et en Belgique, sur les serveurs de nos membres. Un détail complet de l'infrastructure et de l'emplacement des données par service est disponible sur notre page&nbsp;
a(href="https://wiki.deuxfleurs.fr/Technique/Infra") Infrastructure
| .
h3 Devenir des données
p Une fois le compte clôturé, Deuxfleurs peut procéder à la suppression des données.
p Certains services en libre accès permettent de configurer la péremption des données, dautres les conservent de façon permanentes, mais vous pouvez demander leur retrait si vous pouvez prouver que vous en êtes lauteur⋅ice.
h3 Exercice de vos droits
p
| Conformément à larticle 34 de la loi « Informatique et Libertés », vous pouvez exercer les droits suivant en envoyant un mail à ca
img.simple(height="15", src="img/arobase.png")
| deuxfleurs.fr :
ul
li droits daccès, de rectification, deffacement et dopposition
li droit à la limitation du traitement
li droit à la portabilité des données
li droit de ne pas faire lobjet dune décision individuelle automatisée
h3 RGPD
p Vous et Deuxfleurs sengagent à respecter la réglementation en vigueur applicable au traitement de données à caractère personnel et, en particulier, le règlement (UE) 2016/679 du Parlement européen et du Conseil du 27 avril 2016 applicable à compter du 25 mai 2018, dite RGPD.
h2 Litige et juridiction compétente
p Le droit applicable aux présentes est le droit français. En cas de différent, les parties recherchent une solution amiable. Si la démarche échoue, le litige sera tranché par le Tribunal de Grande Instance de Rennes.
p Le fait que lusager ou Deuxfleurs ne se prévale pas à un moment donné de lune des présentes conditions générales et/ou tolère un manquement par lautre partie ne peut être interprété comme valant renonciation par lusager ou Deuxfleurs à se prévaloir ultérieurement de ces conditions.
p La nullité dune des clauses de ces conditions en application dune loi, dune réglementation ou dune décision de justice nimplique pas la nullité de lensemble des autres clauses. Par ailleurs lesprit général de la clause sera à conserver en accord avec le droit applicable.

130
src/Gestion des risques.pug Normal file
View file

@ -0,0 +1,130 @@
extends _layout.pug
prepend root
- title = "Gestion des risques"
block content
section
h1 Gestion des risques
p
| Un risque se définit par la combinaison d'un danger, c'est à dire un évènement redouté, et sa probabilité d'occurence.
| La gestion des risques consiste à minimiser les risques en les évaluant et en mettant en place des solutions pour réduire leur impact.
h2 🧰 Risques matériels
h3 Panne de composants informatiques
p
b Définition du risque
| : Un serveur est composé d'un ensemble de pièces avec une durée de vie limitée. La panne d'une de ces pièces cause une interruption de service et possiblement une perte de données (comme dans le cas d'un disque dur par exemple). La probabilité de ces pannes est importante car certains composants ont une durée de vie limité, comme les disques durs, et de plus nous utilisons du matériel reconditionné qui a donc déjà été utilisé.
p
b Mesure mise en place
| : Nous avons à disposition des pièces de rechange pour pouvoir réparer rapidement nos serveurs. De plus, nous avons en permanence plusieurs machines en production de sorte que lorsque l'une d'elle tombe en panne, les services qu'elle gérait sont automatiquement basculés sur les autres machines fonctionnelles. Les données sont répliquées sur 3 disques durs différents, de sorte que si un disque dur tombe en panne, cette dernière est toujours disponible sur 2 autres disques.
h3 Bug logiciel
p
b Définition du risque
| : Un bug logiciel peut rendre un service indisponible voire impliquer une perte de données. Cette indisponibilité et cette perte de donnée, contrairement à une panne matériel, peut se propager à l'ensemble de nos serveurs.
p
b Mesure mise en place
| : Les données, en plus d'être répliquées automatiquement, sont périodiquement sauvegardées via un logiciel indépendant sur une période d'au moins 2 mois sur un site distant (Suresnes), de sorte que le logiciel qui fournisse le service n'ait pas accès aux données de sauvegardes et ne puisse donc pas les effacer. Les services quant à eux sont définis déclarativement, dans chaque modification est archivée, de sorte qu'il est possible de revenir sur une version antérieure du service qui soit stable.
h3 Panne du réseau électrique ou internet
p
b Définition du risque
| : Nous faisons appel à des prestataires externe pour l'électricité (eg. EDF) et la connexion Internet (eg. Free). Lors de travaux dans la rue, de tension sur le réseau (eg. froid ou confinement), ou simplement d'erreur de gestion, ces réseaux peuvent être coupés localement ou au niveau national. En résulte une indisponibilité des services pendant la coupure.
p
b Mesure mise en place
| : Notre infrastructure est répartie sur des zones éloignées géographiquement (aujourd'hui Rennes et Orsay), de sorte qu'une panne locale ne nécessitera que de migrer les services d'une zone à l'autre. Pour le cas d'une panne au niveau national, nous acceptons ce risque : il est très faible et, la plupart du temps, le service est rétabli en quelques heures.
h3 Panne des autres prestataires et tiers-parties
p
b Définition du risque
| : Deuxfleurs fait appel à un certains nombre de prestataires et tiers parties pour fournir ses services : bureau d'enregistrement DNS (Gandi), Hébergeur DNS (Gandi), certificats X.509 (Let's Encrypt), système d'exploitation (NixOS, Debian), logiciels (Docker Hub, Github, etc.). La panne ou le blocage par une de ces tiers-parties impacteraient les services de Deuxfleurs.
p
b Mesure mise en place
| : Nous essayons de limiter le nombre de prestataires que nous utilisons et évitons de verrouiller fortement nos choix technologiques vis à vis d'un fournisseur particulier.
| En dehors de ces points, nous acceptons ces risques.
h2 😵 Risques humains
h3 Erreur d'administration
p
b Définition du risque
| : Une erreur d'administration des services peut aboutir à une interruption de services et à une perte de données sur l'ensemble de nos serveurs. Elle peut également générer beaucoup de stress pour la personne en charge de l'administration.
p
b Mesure mise en place
| : Les données, en plus d'être répliquées automatiquement, sont périodiquement sauvegardées via un logiciel indépendant sur une période d'au moins 2 mois sur un site distant (Suresnes), de sorte que le logiciel qui fournisse le service n'ait pas accès aux données de sauvegardes et ne puisse donc pas les effacer. Les services quant à eux sont définis déclarativement, dans chaque modification est archivée, de sorte qu'il est possible de revenir sur une version antérieure du service qui soit stable. En cas d'erreur, la personne en charge de l'administration doit demander un accompagnement ou un relai pour limiter les risques d'aggravement de la situation et ne pas avoir à supporter cette situation stressante seule.
h3 Absence d'astreinte
p
b Définition du risque
| : Que ce soit dans les datacenters au niveau matériel, ou dans les services informatiques, au niveau logiciel, de nombreuses organisations mettent en place des astreintes.
| Autrement dit, une ou plusieurs personnes identifiées doivent se rendre disponible sur des périodes données pour pouvoir intervenenir rapidement sur les serveurs.
| Dans le cas de Deuxfleurs, une astreinte empêcherait une personne de quitter son domicile pour des vacances ou même rendre visite à sa famille !
p
b Mesure mise en place
| : Nous faisons en sorte d'avoir des serveurs chez des membres différents et d'avoir plusieurs personnes en mesure de réaliser une même opération de maintenance.
| Si un problème devait arriver pendant l'absence de la personne concernée, un autre membre devrait pouvoir prendre le relai dans les heures ou les jours qui viennent, par exemple en migrant les services chez lui ou en le réparant à distance.
h3 Perte d'expertise
p
b Définition du risque
| : L'infrastructure que nous avons déployée demande des connaissances avancées en informatique détenues par une fraction des membres de l'association. Si cette fraction venait à quitter l'association, la maintenance de ses services pourrait ne plus être réalisée par les membres restants, mettant en péril sa pérennité.
p
b Mesure mise en place
| : Nous essayons d'avoir toujours au moins deux personnes en mesure de réaliser une tâche. Nous essayons de documenter et standardiser notre infrastructure.
h3 Risques juridiques
p
b Définition du risque
| : Deuxfleurs pourrait enfreindre la loi et voir sa pérennité engagée en cas de procès.
p
b Mesure mise en place
| : Nous faisons une veille juridique concernant les hébergeurs. Nous mitigeons aussi ce risque via la co-optation qui permet de contrôler notre croissance et les personnes qui nous rejoignent.
h2 👿 Malveillance
h3 Attaque informatique
p
b Définition du risque
| : Une attaque informatique, venant d'un·e administrateur·ice ou d'une personne extérieure, peut aboutir à l'indisponibilité de nos services, à une perte de données, mais aussi à la fuite de ces dernières.
p
b Mesure mise en place
| : Pour se protéger d'un·e administrateur·ice malveillant·e, le groupe d'administrateur·ices existant ne recrute que de nouvelles personnes sur cooptation et après avoir jugé cette personne de confiance. Nous prévoyions également de chiffrer de plus en plus de données côté client, de sorte qu'une personne en charge de l'administration ne soit pas en mesure de lire le contenu stocké sur les serveurs. Pour se protéger d'une personne extérieure, nous maintenons notre système à jour et avons entamé une démarche de défense en profondeur.
h3 Vol du matériel
p
b Définition du risque
| : Une personne entrant par effraction chez un de nos membres pourrait voler les ordinateurs. Cet évènement peut impacter la disponibilité de nos services, l'intégrité de nos données, mais aussi la confidentialité de ces dernières.
p
b Mesure mise en place
| : Nous acceptons ce risque pour le moment. Le chiffrement côté client, pour les services le supportant, permet de protéger la confidentialité des données. Nous prévoyions à terme de chiffrer les disques durs à froid en plus.
h3 Abus des services
p
b Définition du risque
| : Une personne ayant des accès au service, où se les aillant fait voler, peut opérer un déni de service sur notre infrastructure, ou alors nuire à la réputation de notre service sur un réseau fédéré (eg. spam via email). Cela entraine une indisponibilité des services et/ou une dégradation plus ou moins durable de la qualité de ces derniers.
p
b Mesure mise en place
| : Nous mitigeons actuellement ce risque via la cooptation, où nous faisons confiance aux nouveaux membres et les invitons à bien gérer leurs identifiants.

96
src/Mentions légales.pug Normal file
View file

@ -0,0 +1,96 @@
extends _layout.pug
prepend root
- title = "Mentions légales"
block content
section
h1 Mentions légales
h2 Éditeur et hébergeur
p
b Deuxfleurs
br
| Deuxfleurs est l'éditeur et l'hébergeur de l'ensemble de ses services et contenus à l'exception de sa
a(href="https://git.deuxfleurs.fr") &nbspforge git
br
| Association loi 1901 déclarée en préfecture d'Ille-et-Vilaine le 29 janvier 2020.
p
| Numéro RNA : W353020804
br
| Numéro SIRET : 89961256800019
p
| Siège social : Association Deuxfleurs
br
| 10A Allée de Lanvaux
br
| 35700 RENNES
br
| FRANCE
p
b OVH
br
| OVH est uniquement en charge de l'hébergement de la
a(href="https://git.deuxfleurs.fr") &nbspforge git.
br
| SASU Société par actions simplifiée à associé unique.
p Numéro SIRET : 42476141900045
p
| Siège social : OVH
br
| 2 RUE KELLERMANN
br
| 59100 ROUBAIX
br
| FRANCE
h3 Direction de la publication
p
| Quentin Dufour
br
| Adrien Luxey
h2 Informatique et libertés
h3 Informations personnelles collectées
p En France, les données personnelles sont notamment protégées par la loi n°78-17 du 6janvier 1978, la loi n°2004-801 du 6août 2004, larticle L.226-13 du Code pénal et la Directive Européenne du 24 octobre 1995.
p En tout état de cause Deuxfleurs ne collecte des informations personnelles relatives à lutilisateur (nom, adresse électronique, coordonnées téléphoniques) que pour le besoin des services proposés par les sites du réseau Deuxfleurs. Lutilisateur fournit ces informations en toute connaissance de cause, notamment lorsquil procède par lui-même à leur saisie. Il est alors précisé à lutilisateur des sites du réseau Deuxfleurs le caractère obligatoire ou non des informations quil serait amené à fournir.
h3 Rectification des informations nominatives collectées
p
| Conformément aux dispositions de larticle34 de la loi n°48-87 du 6 janvier 1978, lutilisateur dispose dun droit de modification des données nominatives collectées le concernant. Pour ce faire, lutilisateur envoie à Deuxfleurs:
ul
li un courrier électronique à ca (arobase) deuxfleurs.fr
li un courrier à ladresse du siège de lassociation (indiquée ci-dessus) en indiquant son nom ou sa raison sociale, ses coordonnées physiques et/ou électroniques, ainsi que le cas échéant la référence dont il disposerait en tant quutilisateur du site Deuxfleurs.
p La modification interviendra dans des délais raisonnables à compter de la réception de la demande de lutilisateur.
h2 Limitation de responsabilité
p Ce site comporte des informations mises à disposition par des communautés ou sociétés externes ou des liens hypertextes vers dautres sites qui nont pas été développés par Deuxfleurs. Le contenu mis à disposition sur le site est fourni à titre informatif. Lexistence dun lien de ce site vers un autre site ne constitue pas une validation de ce site ou de son contenu. Il appartient à linternaute dutiliser ces informations avec discernement et esprit critique. La responsabilité de Deuxfleurs ne saurait être engagée du fait des informations, opinions et recommandations formulées par des tiers.
p Deuxfleurs ne pourra être tenue responsable des dommages directs et indirects causés au matériel de lutilisateur, lors de laccès au site, et résultant soit de lutilisation dun matériel ne répondant pas aux spécifications techniques requises, soit de lapparition dun bug ou dune incompatibilité.
p Deuxfleurs ne pourra également être tenue responsable des dommages indirects (tels par exemple quune perte de marché ou perte dune chance) consécutifs à lutilisation du site.
p Des espaces interactifs (comme la solution de messagerie instantanée Matrix) sont à la disposition des utilisateurs sur le site Deuxfleurs. Deuxfleurs se réserve le droit de supprimer, sans mise en demeure préalable, tout contenu déposé dans cet espace qui contreviendrait à la législation applicable en France, en particulier aux dispositions relatives à la protection des données. Le cas échéant, Deuxfleurs se réserve également la possibilité de mettre en cause la responsabilité civile et/ou pénale de lutilisateur, notamment en cas de message à caractère raciste, injurieux, diffamant, ou pornographique, quel que soit le support utilisé (texte, photographie…).
h2 Limitations contractuelles sur les données techniques
p Deuxfleurs ne pourra être tenue responsable de dommages matériels liés à lutilisation du site.
h2 Propriété intellectuelle
p Les contenus sont publiés sous la responsabilité des utilisateurs.

41
src/Sources.pug Normal file
View file

@ -0,0 +1,41 @@
extends _layout.pug
prepend root
- title = "Sources"
block content
section
h1 Accéder aux sources des logiciels utilisés
p Deuxfleurs utilise exclusivement des logiciels libres dans le cadre de son activité. Vous pouvez retrouver ici la liste des sources des logiciels utilisés.
:markdown-it
- [Debian](https://packages.debian.org/)
- [NixOS](https://github.com/NixOS)
- [Nomad](https://github.com/hashicorp/nomad)
- [Consul](https://github.com/hashicorp/consul/)
- [Garage](https://git.deuxfleurs.fr/Deuxfleurs/garage)
- [Tricot](https://git.deuxfleurs.fr/Deuxfleurs/tricot)
- [Bottin](https://git.deuxfleurs.fr/Deuxfleurs/bottin/)
- [Guichet](https://git.deuxfleurs.fr/Deuxfleurs/guichet/)
- [Diplonat](https://git.deuxfleurs.fr/Deuxfleurs/diplonat/)
- [Stolon](https://github.com/sorintlab/stolon)
- [Docker](https://github.com/moby/moby)
- [Ansible](https://github.com/ansible/ansible)
- [Drone](https://github.com/harness/drone)
- [Restic](https://github.com/restic/restic)
- [Cryptpad](https://github.com/xwiki-labs/cryptpad)
- [Sogo](https://github.com/inverse-inc/sogo)
- [alps](git.deuxfleurs.fr/Deuxfleurs/alps)
- [Synapse](https://github.com/matrix-org/synapse)
- [Element](https://github.com/vector-im/element-web)
- [Jitsi](https://github.com/jitsi)
- [Plume](https://github.com/Plume-org/Plume)
- [age](https://github.com/FiloSottile/age)
- [Minio](https://github.com/minio/minio)
- [Proxmox](https://git.proxmox.com/)
- [Grafana](https://github.com/grafana/grafana)
- [Prometheus](https://github.com/prometheus/prometheus)
- [Infra (legacy)](https://git.deuxfleurs.fr/Deuxfleurs/infrastructure)
- [Infra (next)](git.deuxfleurs.fr/Deuxfleurs/nixcfg)

48
src/_layout.pug Normal file
View file

@ -0,0 +1,48 @@
include _mixin/menu.pug
block root
doctype html
html(lang="fr")
head
meta(charset='utf-8')
title 💮💮 deuxfleurs - #{title}
link(rel="stylesheet", href="/css/main.css")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
body
aside
header
a#menu(href="#").mobile_inline
svg(viewBox="0 0 100 80", width="40", height="40")
rect(width="100", height="20")
rect(y="30" width="100" height="20")
rect(y="60" width="100" height="20")
h1
a(href="/") deuxfleurs
nav.computer_block
section.center
img(alt="emoji fleur", src="/img/flower.svg", width="40")
|
img(alt="emoji fleur", src="/img/flower.svg", width="40")
ul
li
a(href="https://plume.deuxfleurs.fr/timeline/1") Actualités
li
a(href="https://man.deuxfleurs.fr") Wiki
li
a(href="https://guichet.deuxfleurs.fr") Mon compte
hr
+menu(root, element)
main
block content
script.
(_ => {
const hamburger = document.getElementById('menu')
hamburger.onclick = _ => {
const nav = document.querySelector('body > aside > header > nav')
console.log(nav.style.display)
nav.style.display = nav.style.display != 'block' ? 'block' : 'none'
}
})()

10
src/_markdown.pug Normal file
View file

@ -0,0 +1,10 @@
extends ./_layout.pug
prepend root
- if (element.tags.includes('is_index'))
- title = element.nice_path[element.nice_path.length - 1]
- else
- title = element.nice_name
block content
!= markdown

14
src/_mixin/menu.pug Normal file
View file

@ -0,0 +1,14 @@
mixin menu(o, element)
ul
each val in o.children
- if (val.type == 'folder' && val.tags.includes('document'))
li
- if (val.tags.includes('has_index'))
a(href=val.url, class=val.index.url == element.url ? 'selected' : null)= val.nice_name
- else
span= val.nice_name
- if (element.url.includes(val.url))
+menu(val, element)
- else if (val.type == 'file' && val.tags.includes('document') && !val.tags.includes('is_index'))
li
a(href=val.url, class=val.url == element.url ? 'selected' : null)= val.nice_name

82
src/_next/css/main.css Normal file
View file

@ -0,0 +1,82 @@
/* some reset */
html, body {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
height: 100%;
font-size: 24px;
}
/* fonts */
@font-face {
font-family: 'IM Fell English';
font-style: italic;
font-weight: 400;
font-display: swap;
src: url(../fonts/IMFellEnglish-Italic.ttf) format('truetype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'IM Fell English';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(../fonts/IMFellEnglish-Regular.ttf) format('truetype');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
html {
background-color: #fbfcf8;
}
body {
max-width: 900px;
padding: 1em;
margin: auto;
font-family: 'IM Fell English', Times, Serif;
color: #5c544a;
}
.hero {
background-image: url("../img/illus.jpg");
transform: rotate(-2deg);
height: 530px;
background-size: cover;
background-position: 50% 0%;
border-radius: 10px;
margin: -1.8em -1em 3em -1em;
}
.hero img {
position: absolute;
top: -14px;
left: 25px;
height: 100px;
}
header {
padding: 1em 0em 2em 0em;
}
article {
background-color: #f4eccd;
padding: 1em;
border-radius: 10px;
}
.brand {
font-size: 2em;
float: left;
}
nav {
float: right;
}
nav li {
padding: 0.5em;
display: inline;
}

Binary file not shown.

Binary file not shown.

BIN
src/_next/img/illus.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

39
src/_next/index.pug Normal file
View file

@ -0,0 +1,39 @@
doctype html
html
head
meta(charset="utf-8")
title df #{title}
link(rel="stylesheet", href="css/main.css")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
body
header
.brand Deuxfleurs
nav
ul
li L'association
li Nos services
li Documentation
li
a(href="https://guichet.deuxfleurs.fr") Mon compte
br(style="clear:both")
main
article
.hero
img(src="img/paper-clip.png")
h1 Cher·e internaute, un autre internet est possible
p
| Arrêtez-vous cinq minutes. Prenez le temps de l'imaginer avec moi.
| Imaginez pouvoir accéder à l'information sans avoir à se demander si c'est une publicité ou non ?
| Imaginez que vos communications avec vos proches ne soient pas espionnées pour prédire votre prochain malus d'assurance ?
| Imaginez un lieux où vos amis verrez le contenu que vous publiez et non un obscure contenu viral ?
// Peut être rajouter des petits dessins genre gribouillage carnet.
h2 Des cabanes pour se protéger du sombre nuage
p Blabla
h2 Rejoignez-nous
footer
p Un footer

323
src/css/main.css Normal file
View file

@ -0,0 +1,323 @@
/*
* FONTS
*/
@font-face {
font-family: "Heroes";
src: url('../fonts/texgyreheros-regular.otf') format('truetype');
}
/*
* RESET CSS
*/
* {
font-family: Heroes;
font-size: 1em;
/* We use browser's default */
margin: 0;
padding: 0;
}
html {
height: 100%
}
body {
display: flex;
max-width: 1200px;
flex-direction: row;
margin: auto;
}
/*
* RESPONSIVE
*/
.mobile_block,
.mobile_inline {
display: none
}
@media screen and (max-width: 800px) {
body {
flex-direction: column
}
.computer_block {
display: none
}
.mobile_block {
display: block
}
.mobile_inline {
display: inline
}
}
/*
* CORE TEMPLATE
*/
/* Header + Menu */
body>aside>header {
color: white;
background: rgb(12, 144, 110);
background: linear-gradient(0deg, rgb(21, 65, 73) 0%, rgb(55, 141, 100) 50%, rgb(12, 144, 110) 100%);
padding: 1.5rem;
margin: 0.8rem;
border-radius: 0.5rem;
box-shadow: 0px 0px 30px rgba(31, 38, 103, 0.2);
}
body>aside>header>a>svg {
fill: white;
display: inline;
vertical-align: sub;
margin-right: 1em;
}
body>aside>header>h1 {
display: inline
}
body>aside>header a {
color: white;
text-decoration: none;
}
body>aside>header>nav ul {
list-style-type: none;
padding-left: 1em;
}
body>aside>header>nav>ul {
padding-left: 0px
}
body>aside>header>nav a:hover {
text-decoration: underline
}
body>aside>header>nav .selected {
font-weight: bold
}
body>aside>header>nav .selected::before {
content: "» "
}
body>main {
padding: 1.5rem;
max-width: 1200px;
}
/*
* TEXT CORE (think markdown)
*/
h1 {
font-size: 2.5rem
}
h2 {
font-size: 2.0rem
}
h3 {
font-size: 1.75rem
}
h4 {
font-size: 1.50rem
}
h5 {
font-size: 1.25rem
}
h6 {
font-size: 1.10rem
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin-bottom: 1rem
}
section,
p,
ul,
ol,
table,
pre {
margin-bottom: 1rem
}
ul,
ol {
padding-left: 1.5em
}
a {
color: #08634c;
}
table {
border-collapse: collapse
}
th {
background-color: #fafafa
}
td,
th {
border: 1px solid #ddd;
padding: 0.3rem 0.5rem;
}
pre {
background-color: #1e1e1e;
padding: 1rem;
overflow-x: auto;
}
code {
font-family: Monospace;
background-color: #1e1e1e;
color: #fff;
padding: 0.25rem 0.4rem;
}
img {
border-radius: 0.5rem;
box-shadow: 0px 0px 30px rgba(31, 38, 103, 0.2);
margin: 0.5rem;
}
img.simple {
border-radius: 0px;
box-shadow: none;
margin: 0px;
}
strong {
background-color: rgb(12, 144, 110);
color: #fff;
padding: 0.20rem 0.4rem;
}
/*
* UTILS
*/
/* float */
.left {
float: left
}
.right {
float: right
}
section::after,
p::after {
clear: both;
display: block;
content: "";
}
/* center */
.center {
margin-left: auto;
margin-right: auto;
text-align: center;
}
/*
* ELEMENTS
*/
input {
border: 0.1em black solid;
width: 50%;
min-width: 300px;
font-size: 1.6em;
border: 0.1em black solid;
padding: 0.3em;
}
.button {
padding: 0.3em;
background-color: #519c60;
font-size: 1.6em;
border: 0.1em solid #519c60;
color: white;
margin: 0em 0em 0em 1em;
text-decoration: none;
}
/* service button */
.service-box {
color: #000;
text-decoration: none;
border: 1px solid #ddd;
border-radius: 0.5rem;
width: 250px;
text-align: center;
margin: 1em 1em 0em 0em;
display: block;
}
.service-box:hover {
background-color: #000;
color: #fff;
}
.callout {
font-size: 1.2rem;
text-align: center;
position: relative;
margin: 2rem 0;
padding: 1rem;
border: 1px solid rgba(10, 10, 10, 0.25);
border-radius: .2rem;
background-color: #cbf0e6;
}
.frame {
border-left: 1rem solid #ddd;
padding-left: 1rem;
}
img.hero {
width: 100%;
margin:-0.5rem;
}
h1.slogan {
text-align:center;
font-size:2rem;
padding: 2rem 0rem;
}
.icon {
font-size: 80px;
height: 120px;
}
section.list {
padding-left:1.5rem;
}
p.fill {
margin: 2rem 0rem;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
src/img/arobase.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/img/brico.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
src/img/brico.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/img/chatons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
src/img/flower.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

1
src/img/flower.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill-opacity="0.0" fill="#FFF" d="M15.632 34.661c-.799-.597-1.498-1.484-2.035-2.592l-.228-.47-.46.249c-.975.528-1.913.858-2.744.969l-.202-3.756-3.636.968c-.157-.854-.125-1.887.096-3.022l.103-.525-.532-.066c-1.242-.154-2.306-.525-3.104-1.08l1.521-2.917-2.988-1.523c.319-.944.948-1.882 1.834-2.735l.377-.363-.379-.36c-.803-.764-1.408-1.554-1.77-2.311l3.51-1.353-2.045-3.159c.74-.402 1.693-.686 2.789-.832l.519-.068-.091-.514c-.215-1.211-.172-2.338.124-3.288l3.308.523.524-3.308c.988.013 2.08.326 3.164.907l.462.248.226-.473c.479-1.003 1.044-1.824 1.653-2.404L18 4.326l2.372-2.92c.609.58 1.175 1.401 1.653 2.404l.226.473.462-.247c1.085-.581 2.178-.894 3.164-.906l.523 3.308 3.31-.525c.296.951.34 2.078.124 3.288l-.092.515.518.069c1.095.145 2.048.43 2.788.832l-2.046 3.156 3.511 1.355c-.361.757-.966 1.547-1.77 2.311l-.379.36.377.363c.888.854 1.516 1.793 1.835 2.736l-2.984 1.52 1.521 2.984c-.812.574-1.871.964-3.094 1.134l-.518.072.096.514c.201 1.089.226 2.083.073 2.909l-3.634-.97-.204 3.757c-.83-.11-1.768-.44-2.742-.968l-.459-.249-.228.47c-.539 1.107-1.237 1.994-2.036 2.591L18 32.293l-2.368 2.368z"/><path d="M7.092 10.678c-.53-1.489-.698-2.97-.432-4.2l2.368.375.987.156.157-.988.375-2.368c1.261.127 2.613.743 3.862 1.706.118-.337.244-.663.382-.967-1.551-1.135-3.223-1.763-4.73-1.763-.123 0-.245.004-.366.013l-.511 3.223-3.224-.511c-.6 1.487-.565 3.415.085 5.393.335-.037.684-.061 1.047-.069zm14.501-5.319c1.248-.962 2.6-1.578 3.86-1.705l.376 2.368.156.988.987-.157 2.369-.376c.266 1.23.098 2.71-.432 4.2.361.009.711.032 1.046.07.651-1.978.685-3.906.085-5.394l-3.225.512-.511-3.224c-.12-.008-.242-.012-.365-.012-1.507 0-3.179.628-4.73 1.762.14.306.266.631.384.968zM7.368 27h.035c.067 0 .157-.604.26-.947-.098.004-.197.046-.294.046-1.496 0-2.826-.303-3.83-.89l1.089-2.128.454-.887-.891-.452-2.136-1.088c.508-1.151 1.515-2.25 2.818-3.143-.287-.219-.561-.441-.81-.669-1.687 1.217-2.846 2.755-3.235 4.31l2.908 1.483-1.482 2.843C3.475 26.501 5.303 27 7.368 27zm27.806-5.846c-.39-1.555-1.548-3.093-3.234-4.311-.25.228-.523.451-.81.669 1.304.893 2.31 1.992 2.817 3.145l-2.136 1.088-.891.453.454.892 1.089 2.137c-1.004.587-2.332.904-3.828.904-.099 0-.199-.01-.299-.013.103.344.192.683.26 1.011l.039.002c2.066 0 3.892-.563 5.112-1.587l-1.482-2.908 2.909-1.482zm-12.653 9.182c-.447 1.517-1.181 2.812-2.119 3.651l-1.695-1.694-.707-.707-.707.707-1.695 1.694c-.938-.839-1.673-2.136-2.12-3.652-.296.206-.593.397-.886.563.636 1.98 1.741 3.559 3.1 4.409L18 33l2.308 2.308c1.358-.851 2.464-2.428 3.101-4.408-.295-.168-.591-.359-.888-.564z" fill="#FFF"/><path fill="#FFF" d="M20.118 5.683c.426 1.146.748 2.596.841 4.284l.2 3.683 3.564-.946c1.32-.351 2.655-.536 3.86-.536.16 0 .318.003.474.01l-1.827 2.819 3.139 1.211c-.958.759-2.237 1.514-3.814 2.123l-3.441 1.328 2.001 3.099c.918 1.42 1.509 2.782 1.838 3.96l-3.244-.865-.182 3.357c-1.019-.677-2.132-1.66-3.198-2.973L18 23.374l-2.328 2.862c-1.066 1.312-2.179 2.295-3.198 2.972l-.18-3.354-3.248.864c.329-1.178.921-2.54 1.839-3.961l2.004-3.099-3.442-1.328c-1.577-.609-2.856-1.363-3.814-2.122L8.768 15l-1.827-2.823c.155-.006.313-.01.473-.01 1.206 0 2.541.185 3.861.536l3.564.947.202-3.683c.092-1.688.415-3.138.84-4.284L18 8.292l2.118-2.609m.19-4.991L18 3.533 15.692.692c-1.989 1.532-3.421 4.992-3.646 9.112-1.617-.43-3.192-.637-4.632-.637-2.11 0-3.929.445-5.161 1.289l1.989 3.073-3.415 1.316c.842 2.366 3.69 4.797 7.54 6.283-2.241 3.465-3.116 7.106-2.407 9.516l3.537-.941.196 3.654c2.512-.07 5.703-2.027 8.307-5.228 2.603 3.201 5.796 5.158 8.306 5.228l.198-3.655 3.535.943c.71-2.411-.165-6.05-2.404-9.517 3.849-1.485 6.696-3.918 7.538-6.283l-3.415-1.318 1.99-3.07c-1.233-.844-3.053-1.29-5.164-1.29-1.438 0-3.013.207-4.63.636-.225-4.119-1.657-7.579-3.646-9.111z"/></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

1
src/img/infra.drawio Normal file

File diff suppressed because one or more lines are too long

BIN
src/img/ngi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/img/servers.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

124
src/index.pug Normal file
View file

@ -0,0 +1,124 @@
extends _layout.pug
prepend root
- title = "deuxfleurs"
block content
section
img.hero(alt="Photo d'illustration d'un parterre de fleurs en noir et blanc avec un effet tramage.", src="/img/flower.png")
section
h1.slogan fabriquons un internet convivial
p(style="font-style: italic") L'objectif de Deuxfleurs est de faire vivre un internet amateur, associatif, solidaire, collectif, coopératif, militant, en lutte, indépendant, savant, sobre, progressiste, inclusif, émancipateur, épanouissant, bref, convivial. Pour cela, nous mettons à disposition des outils numériques pour les individus et collectifs qui font vivre cet écosystème. Quand les outils manquent, nous prenons également en charge leur développement. Enfin, nous menons des missions de sensibilisation et d'accompagnement.
section
h2 avec des outils sobres
section
a.service-box.left(href='https://man.deuxfleurs.fr/prise_en_main/matrix/')
.icon 💬
h5 discussion
a.service-box.left(href='https://man.deuxfleurs.fr/prise_en_main/jitsi/')
.icon 📞
h5 visioconférence
a.service-box.left(href='https://man.deuxfleurs.fr/prise_en_main/web/')
.icon 🌐
h5 sites web
a.service-box.left(href='https://man.deuxfleurs.fr/prise_en_main/emails/')
.icon 📨
h5 emails (beta)
a.service-box.left(href='https://man.deuxfleurs.fr/prise_en_main/cryptpad/')
.icon 📄
h5 collaboration
a.service-box.left(href='https://man.deuxfleurs.fr/prise_en_main/plume/')
.icon ✍️
h5 blog
p ⚠️ Pour la plupart des outils, vous devez avoir un compte.&nbsp; Faisons connaissance d'abord 👇
section
h2 avec notre propre infrastructure résiliente
p.fill
img.hero(alt="Une photo en noir et blanc de nos différents serveurs hébergés à domicile.", src="/img/servers.jpg")
p
| Pour fournir nos outils, nous récupérons <b>d'anciens ordinateurs</b> que nous reconditionnons pour servir de serveurs et que nous installons à nos domiciles.
| Actuellement nous avons des machines à <b>Rennes</b> en Bretagne et à <b>Orsay</b> en Ile de France pour la fourniture des services. Nous avons également des machines à <b>Suresnes</b> en Ile de France pour les sauvegarde. Certains de nos outils techniques sont (temporairement) hébergés en datacenter chez OVH.
| <a href="https://man.deuxfleurs.fr/infrastructures/">En savoir plus</a>.
p
| Cette infrastructure atypique nous mène à développer de nouveaux logiciels libres.
| Si vous êtes dans la technique, vous pourriez être intéressé·e par <a href="https://garagehq.deuxfleurs.fr/">Garage</a>, <a href="https://bottin.eu">Bottin</a>, <a href="https://git.deuxfleurs.fr/lx/tricot">Tricot</a>, <a href="https://git.deuxfleurs.fr/Deuxfleurs/diplonat">Diplonat</a> et nos <a href="https://git.deuxfleurs.fr/Deuxfleurs">autres projets</a>.
section
h2 avec des valeurs fortes
section.list
div ⇨ <b>la coopération</b> - eg. promouvoir l'intéropérabilité, les communs, le libre, et les formats de données ouverts
div ⇨ <b>l'autonomie</b> - eg. gérer nos propres moyens de communications, prendre nos propres décisions
div ⇨ <b>la solidarité</b> - eg. partager le savoir, partager les ressources informatiques, s'entraider pour la gestion des services
div ⇨ <b>la liberté</b> - eg. permettre à toutes et tous de s'exprimer, respecter la vie privée
p
a(href="https://plume.deuxfleurs.fr/timeline/1") Suivez notre actualité, réflexions et analyses sur notre blog Plume</a>
section
h2 avec un modèle économique transparent
p Notre modèle économique est basé sur 4 piliers :
section.list
div
| ⇨
b l'échange
| - les membres ayant des besoins spécifiques ou voulant aider peuvent contribuer du matériel et du temps à l'infrastructure Deuxfleurs. En échange, ils et elles bénéficient alors de la résilience de l'infrastructure pour leurs données.
div
| ⇨
b l'adhésion
| - nous demandons à chaque membre une adhésion de 10 euros par an pour couvrir les frais basiques de l'association, comme les frais de tenu de compte en banque.
div
| ⇨
b la contribution libre
| - pour nos projets internes, comme la réalisation d'illustrations ou des opérations techniques importantes, nous pouvons lancer un appel à contribution libre : les membres contribuent en fonction de leurs moyens et de leur envie.
div
| ⇨
b les subventions
| - pour nos projets qui dépassent le cadre de l'association et qui peuvent bénéficier à tout le monde, comme les logiciels libres que nous développons, nous sommes également amené à faire des demandes de subvention.
section
h2 ouvert sur le monde
div(style="display: flex; justify-content: space-around; flex-wrap: wrap;")
div(style="width: 250px")
div(style="display: flex; justify-content: center; align-items: center; height: 200px;")
img.simple(width=200, src="img/chatons.png")
p(style="text-align: center") En juin 2022, nous avons intégré le collectif d'hébergeur <a href="https://www.chatons.org/">CHATONS</a>. Ses ~100 membres se retrouvent autour d'une <a href="https://www.chatons.org/charte">charte commune</a> et militent ensemble pour un internet alternatif.
div(style="width: 250px")
div(style="display: flex; justify-content: center; align-items: center; height: 200px;")
img.simple(style="width: 200px;", src="img/ngi.png")
p(style="text-align: center") En 2022, Deuxfleurs a rémunéré à plein temps 3 salarié·es grâce à une subvention de <a href="https://ngi.eu">NGI</a>. Nous avons pu considérablement accélérer le développement de notre logiciel <a href="https://garagehq.deuxfleurs.fr/">Garage</a>.
div(style="width: 250px")
div(style="display: flex; justify-content: center; align-items: center; height: 200px;")
img.simple(width=200, src="img/brico.png")
p(style="text-align: center") <a href="https://bricologis.com">Bricologis</a> est un atelier participatif à Vaux-en-Velin, proche de Lyon. À partir de septembre 2022, il accueillera une permanence mensuelle de Deuxfleurs ainsi que quelques un de ses serveurs.
section
h2 rejoignez-nous !
p.spacing L'accès à nos services est à <b>prix libre</b>, se fait <b>sur demande</b> directement à un membre ou par email et est conditionné par <b>les ressources disponibles</b>, à la fois matérielles et humaines.
p.spacing Nous encourageons nos usager·es ainsi que toute personne souhaitant collaborer à <b>rejoindre l'association</b> afin de participer à sa gestion. L'admission se fait par <b>cooptation</b>, soit directement si vous connaissez déjà un membre, soit en échangeant d'abord avec nous par email ou sur Matrix. L'objectif de la cooptation est de s'assurer que nos futurs membres partageront bien les valeurs de notre association. L'adhésion est de <b>10 euros par an</b>.
p.spacing
| Si vous connaissez un membre de l'association, contactez votre connaissance directement !
br
| Sinon, vous pouvez nous écrire à <b>coucou</b><img class="simple" alt="arobase" src="img/arobase.png" height="15"/><b>deuxfleurs.fr</b> ou nous rejoindre sur notre salon Matrix #deuxfleurs:deuxfleurs.fr pour un premier contact.

View file

@ -1 +0,0 @@
{ "m.server": "im.deuxfleurs.fr:443" }

View file

@ -1,8 +0,0 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><title>💮💮 deuxfleurs - deuxfleurs</title><link rel="stylesheet" href="/css/main.css"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><aside><header><a class="mobile_inline" id="menu" href="#"><svg viewBox="0 0 100 80" width="40" height="40"><rect width="100" height="20"></rect><rect y="30" width="100" height="20"></rect><rect y="60" width="100" height="20"></rect></svg></a><h1><a href="/">deuxfleurs</a></h1><nav class="computer_block"><section class="center"><img alt="emoji fleur" src="/img/flower.svg" width="40"> <img alt="emoji fleur" src="/img/flower.svg" width="40"></section><ul><li><a href="https://plume.deuxfleurs.fr/timeline/1">Actualités</a></li><li><a href="https://man.deuxfleurs.fr">Wiki</a></li><li><a href="https://guichet.deuxfleurs.fr">Mon compte</a></li></ul><hr><ul><li><a href="/CGU.html">CGU</a></li><li><a href="/Gestion des risques.html">Gestion des risques</a></li><li><a href="/Mentions légales.html">Mentions légales</a></li><li><a href="/Sources.html">Sources</a></li></ul></nav></header></aside><main><section><h1>404 - Page non trouvée</h1><p>La page que vous cherchez n'existe pas sur ce site web.</p><p>Si vous pensez que c'est une erreur, les informations pour nous contacter sont disponibles sur notre page d'accueil.</p></section></main><script>(_ => {
const hamburger = document.getElementById('menu')
hamburger.onclick = _ => {
const nav = document.querySelector('body > aside > header > nav')
console.log(nav.style.display)
nav.style.display = nav.style.display != 'block' ? 'block' : 'none'
}
})()</script></body></html>

View file

@ -1,8 +0,0 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><title>💮💮 deuxfleurs - Visioconférence</title><link rel="stylesheet" href="/css/main.css"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><aside><header><a class="mobile_inline" id="menu" href="#"><svg viewBox="0 0 100 80" width="40" height="40"><rect width="100" height="20"></rect><rect y="30" width="100" height="20"></rect><rect y="60" width="100" height="20"></rect></svg></a><h1><a href="/">deuxfleurs</a></h1><nav class="computer_block"><section class="center"><img alt="emoji fleur" src="/img/flower.svg" width="40"> <img alt="emoji fleur" src="/img/flower.svg" width="40"></section><ul><li><a href="https://plume.deuxfleurs.fr/timeline/1">Actualités</a></li><li><a href="https://wiki.deuxfleurs.fr">Wiki</a></li><li><a href="https://guichet.deuxfleurs.fr">Mon compte</a></li></ul><hr><ul><li><a href="/CGU.html">CGU</a></li><li><a href="/Gestion des risques.html">Gestion des risques</a></li><li><a href="/Mentions légales.html">Mentions légales</a></li></ul></nav></header></aside><main><h4 class="spacing"> Cette page a changé d'adresse : <a href="/Guide/Visioconférence.html">cliquez ici pour être redirigé</a></h4></main><script>(_ => {
const hamburger = document.getElementById('menu')
hamburger.onclick = _ => {
const nav = document.querySelector('body > aside > header > nav')
console.log(nav.style.display)
nav.style.display = nav.style.display != 'block' ? 'block' : 'none'
}
})()</script></body></html>

View file

@ -1,13 +0,0 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><title>💮💮 deuxfleurs - Gestion des risques</title><link rel="stylesheet" href="/css/main.css"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><aside><header><a class="mobile_inline" id="menu" href="#"><svg viewBox="0 0 100 80" width="40" height="40"><rect width="100" height="20"></rect><rect y="30" width="100" height="20"></rect><rect y="60" width="100" height="20"></rect></svg></a><h1><a href="/">deuxfleurs</a></h1><nav class="computer_block"><section class="center"><img alt="emoji fleur" src="/img/flower.svg" width="40"> <img alt="emoji fleur" src="/img/flower.svg" width="40"></section><ul><li><a href="https://plume.deuxfleurs.fr/timeline/1">Actualités</a></li><li><a href="https://man.deuxfleurs.fr">Wiki</a></li><li><a href="https://guichet.deuxfleurs.fr">Mon compte</a></li></ul><hr><ul><li><a href="/CGU.html">CGU</a></li><li><a class="selected" href="/Gestion des risques.html">Gestion des risques</a></li><li><a href="/Mentions légales.html">Mentions légales</a></li><li><a href="/Sources.html">Sources</a></li></ul></nav></header></aside><main><section><h1>Gestion des risques</h1><p>Un risque se définit par la combinaison d'un danger, c'est à dire un évènement redouté, et sa probabilité d'occurence.
La gestion des risques consiste à minimiser les risques en les évaluant et en mettant en place des solutions pour réduire leur impact.</p><h2>🧰 Risques matériels</h2><h3>Panne de composants informatiques</h3><p><b>Définition du risque</b>: Un serveur est composé d'un ensemble de pièces avec une durée de vie limitée. La panne d'une de ces pièces cause une interruption de service et possiblement une perte de données (comme dans le cas d'un disque dur par exemple). La probabilité de ces pannes est importante car certains composants ont une durée de vie limité, comme les disques durs, et de plus nous utilisons du matériel reconditionné qui a donc déjà été utilisé.</p><p><b>Mesure mise en place</b>: Nous avons à disposition des pièces de rechange pour pouvoir réparer rapidement nos serveurs. De plus, nous avons en permanence plusieurs machines en production de sorte que lorsque l'une d'elle tombe en panne, les services qu'elle gérait sont automatiquement basculés sur les autres machines fonctionnelles. Les données sont répliquées sur 3 disques durs différents, de sorte que si un disque dur tombe en panne, cette dernière est toujours disponible sur 2 autres disques.</p><h3>Bug logiciel</h3><p><b>Définition du risque</b>: Un bug logiciel peut rendre un service indisponible voire impliquer une perte de données. Cette indisponibilité et cette perte de donnée, contrairement à une panne matériel, peut se propager à l'ensemble de nos serveurs.</p><p><b>Mesure mise en place</b>: Les données, en plus d'être répliquées automatiquement, sont périodiquement sauvegardées via un logiciel indépendant sur une période d'au moins 2 mois sur un site distant (Suresnes), de sorte que le logiciel qui fournisse le service n'ait pas accès aux données de sauvegardes et ne puisse donc pas les effacer. Les services quant à eux sont définis déclarativement, dans chaque modification est archivée, de sorte qu'il est possible de revenir sur une version antérieure du service qui soit stable.</p><h3>Panne du réseau électrique ou internet</h3><p><b>Définition du risque</b>: Nous faisons appel à des prestataires externe pour l'électricité (eg. EDF) et la connexion Internet (eg. Free). Lors de travaux dans la rue, de tension sur le réseau (eg. froid ou confinement), ou simplement d'erreur de gestion, ces réseaux peuvent être coupés localement ou au niveau national. En résulte une indisponibilité des services pendant la coupure.</p><p><b>Mesure mise en place</b>: Notre infrastructure est répartie sur des zones éloignées géographiquement (aujourd'hui Rennes et Orsay), de sorte qu'une panne locale ne nécessitera que de migrer les services d'une zone à l'autre. Pour le cas d'une panne au niveau national, nous acceptons ce risque : il est très faible et, la plupart du temps, le service est rétabli en quelques heures.</p><h3>Panne des autres prestataires et tiers-parties</h3><p> <b>Définition du risque</b>: Deuxfleurs fait appel à un certains nombre de prestataires et tiers parties pour fournir ses services : bureau d'enregistrement DNS (Gandi), Hébergeur DNS (Gandi), certificats X.509 (Let's Encrypt), système d'exploitation (NixOS, Debian), logiciels (Docker Hub, Github, etc.). La panne ou le blocage par une de ces tiers-parties impacteraient les services de Deuxfleurs.</p><p><b>Mesure mise en place</b>: Nous essayons de limiter le nombre de prestataires que nous utilisons et évitons de verrouiller fortement nos choix technologiques vis à vis d'un fournisseur particulier.
En dehors de ces points, nous acceptons ces risques.</p><h2>😵 Risques humains</h2><h3>Erreur d'administration</h3><p><b>Définition du risque</b>: Une erreur d'administration des services peut aboutir à une interruption de services et à une perte de données sur l'ensemble de nos serveurs. Elle peut également générer beaucoup de stress pour la personne en charge de l'administration.</p><p><b>Mesure mise en place</b>: Les données, en plus d'être répliquées automatiquement, sont périodiquement sauvegardées via un logiciel indépendant sur une période d'au moins 2 mois sur un site distant (Suresnes), de sorte que le logiciel qui fournisse le service n'ait pas accès aux données de sauvegardes et ne puisse donc pas les effacer. Les services quant à eux sont définis déclarativement, dans chaque modification est archivée, de sorte qu'il est possible de revenir sur une version antérieure du service qui soit stable. En cas d'erreur, la personne en charge de l'administration doit demander un accompagnement ou un relai pour limiter les risques d'aggravement de la situation et ne pas avoir à supporter cette situation stressante seule.</p><h3>Absence d'astreinte</h3><p><b>Définition du risque</b>: Que ce soit dans les datacenters au niveau matériel, ou dans les services informatiques, au niveau logiciel, de nombreuses organisations mettent en place des astreintes.
Autrement dit, une ou plusieurs personnes identifiées doivent se rendre disponible sur des périodes données pour pouvoir intervenenir rapidement sur les serveurs.
Dans le cas de Deuxfleurs, une astreinte empêcherait une personne de quitter son domicile pour des vacances ou même rendre visite à sa famille !</p><p><b>Mesure mise en place</b>: Nous faisons en sorte d'avoir des serveurs chez des membres différents et d'avoir plusieurs personnes en mesure de réaliser une même opération de maintenance.
Si un problème devait arriver pendant l'absence de la personne concernée, un autre membre devrait pouvoir prendre le relai dans les heures ou les jours qui viennent, par exemple en migrant les services chez lui ou en le réparant à distance.</p><h3>Perte d'expertise</h3><p><b>Définition du risque</b>: L'infrastructure que nous avons déployée demande des connaissances avancées en informatique détenues par une fraction des membres de l'association. Si cette fraction venait à quitter l'association, la maintenance de ses services pourrait ne plus être réalisée par les membres restants, mettant en péril sa pérennité.</p><p><b>Mesure mise en place</b>: Nous essayons d'avoir toujours au moins deux personnes en mesure de réaliser une tâche. Nous essayons de documenter et standardiser notre infrastructure.</p><h3>Risques juridiques</h3><p><b>Définition du risque</b>: Deuxfleurs pourrait enfreindre la loi et voir sa pérennité engagée en cas de procès.</p><p><b>Mesure mise en place</b>: Nous faisons une veille juridique concernant les hébergeurs. Nous mitigeons aussi ce risque via la co-optation qui permet de contrôler notre croissance et les personnes qui nous rejoignent.</p><h2>👿 Malveillance</h2><h3>Attaque informatique</h3><p><b>Définition du risque</b>: Une attaque informatique, venant d'un·e administrateur·ice ou d'une personne extérieure, peut aboutir à l'indisponibilité de nos services, à une perte de données, mais aussi à la fuite de ces dernières.</p><p><b>Mesure mise en place</b>: Pour se protéger d'un·e administrateur·ice malveillant·e, le groupe d'administrateur·ices existant ne recrute que de nouvelles personnes sur cooptation et après avoir jugé cette personne de confiance. Nous prévoyions également de chiffrer de plus en plus de données côté client, de sorte qu'une personne en charge de l'administration ne soit pas en mesure de lire le contenu stocké sur les serveurs. Pour se protéger d'une personne extérieure, nous maintenons notre système à jour et avons entamé une démarche de défense en profondeur.</p><h3>Vol du matériel</h3><p><b>Définition du risque</b>: Une personne entrant par effraction chez un de nos membres pourrait voler les ordinateurs. Cet évènement peut impacter la disponibilité de nos services, l'intégrité de nos données, mais aussi la confidentialité de ces dernières.</p><p><b>Mesure mise en place</b>: Nous acceptons ce risque pour le moment. Le chiffrement côté client, pour les services le supportant, permet de protéger la confidentialité des données. Nous prévoyions à terme de chiffrer les disques durs à froid en plus.</p><h3>Abus des services</h3><p><b>Définition du risque</b>: Une personne ayant des accès au service, où se les aillant fait voler, peut opérer un déni de service sur notre infrastructure, ou alors nuire à la réputation de notre service sur un réseau fédéré (eg. spam via email). Cela entraine une indisponibilité des services et/ou une dégradation plus ou moins durable de la qualité de ces derniers.</p><p><b>Mesure mise en place</b>: Nous mitigeons actuellement ce risque via la cooptation, où nous faisons confiance aux nouveaux membres et les invitons à bien gérer leurs identifiants. </p></section></main><script>(_ => {
const hamburger = document.getElementById('menu')
hamburger.onclick = _ => {
const nav = document.querySelector('body > aside > header > nav')
console.log(nav.style.display)
nav.style.display = nav.style.display != 'block' ? 'block' : 'none'
}
})()</script></body></html>

File diff suppressed because one or more lines are too long

View file

@ -1,38 +0,0 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><title>💮💮 deuxfleurs - Sources</title><link rel="stylesheet" href="/css/main.css"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><aside><header><a class="mobile_inline" id="menu" href="#"><svg viewBox="0 0 100 80" width="40" height="40"><rect width="100" height="20"></rect><rect y="30" width="100" height="20"></rect><rect y="60" width="100" height="20"></rect></svg></a><h1><a href="/">deuxfleurs</a></h1><nav class="computer_block"><section class="center"><img alt="emoji fleur" src="/img/flower.svg" width="40"> <img alt="emoji fleur" src="/img/flower.svg" width="40"></section><ul><li><a href="https://plume.deuxfleurs.fr/timeline/1">Actualités</a></li><li><a href="https://man.deuxfleurs.fr">Wiki</a></li><li><a href="https://guichet.deuxfleurs.fr">Mon compte</a></li></ul><hr><ul><li><a href="/CGU.html">CGU</a></li><li><a href="/Gestion des risques.html">Gestion des risques</a></li><li><a href="/Mentions légales.html">Mentions légales</a></li><li><a class="selected" href="/Sources.html">Sources</a></li></ul></nav></header></aside><main><section><h1>Accéder aux sources des logiciels utilisés</h1><p>Deuxfleurs utilise exclusivement des logiciels libres dans le cadre de son activité. Vous pouvez retrouver ici la liste des sources des logiciels utilisés.</p><ul>
<li><a href="https://packages.debian.org/">Debian</a></li>
<li><a href="https://github.com/NixOS">NixOS</a></li>
<li><a href="https://github.com/hashicorp/nomad">Nomad</a></li>
<li><a href="https://github.com/hashicorp/consul/">Consul</a></li>
<li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage">Garage</a></li>
<li><a href="https://git.deuxfleurs.fr/Deuxfleurs/tricot">Tricot</a></li>
<li><a href="https://git.deuxfleurs.fr/Deuxfleurs/bottin/">Bottin</a></li>
<li><a href="https://git.deuxfleurs.fr/Deuxfleurs/guichet/">Guichet</a></li>
<li><a href="https://git.deuxfleurs.fr/Deuxfleurs/diplonat/">Diplonat</a></li>
<li><a href="https://github.com/sorintlab/stolon">Stolon</a></li>
<li><a href="https://github.com/moby/moby">Docker</a></li>
<li><a href="https://github.com/ansible/ansible">Ansible</a></li>
<li><a href="https://github.com/harness/drone">Drone</a></li>
<li><a href="https://github.com/restic/restic">Restic</a></li>
<li><a href="https://github.com/xwiki-labs/cryptpad">Cryptpad</a></li>
<li><a href="https://github.com/inverse-inc/sogo">Sogo</a></li>
<li><a href="git.deuxfleurs.fr/Deuxfleurs/alps">alps</a></li>
<li><a href="https://github.com/matrix-org/synapse">Synapse</a></li>
<li><a href="https://github.com/vector-im/element-web">Element</a></li>
<li><a href="https://github.com/jitsi">Jitsi</a></li>
<li><a href="https://github.com/Plume-org/Plume">Plume</a></li>
<li><a href="https://github.com/FiloSottile/age">age</a></li>
<li><a href="https://github.com/minio/minio">Minio</a></li>
<li><a href="https://git.proxmox.com/">Proxmox</a></li>
<li><a href="https://github.com/grafana/grafana">Grafana</a></li>
<li><a href="https://github.com/prometheus/prometheus">Prometheus</a></li>
<li><a href="https://git.deuxfleurs.fr/Deuxfleurs/infrastructure">Infra (legacy)</a></li>
<li><a href="git.deuxfleurs.fr/Deuxfleurs/nixcfg">Infra (next)</a></li>
</ul>
</section></main><script>(_ => {
const hamburger = document.getElementById('menu')
hamburger.onclick = _ => {
const nav = document.querySelector('body > aside > header > nav')
console.log(nav.style.display)
nav.style.display = nav.style.display != 'block' ? 'block' : 'none'
}
})()</script></body></html>

File diff suppressed because one or more lines are too long

View file

@ -1,576 +0,0 @@
/*GESTION DE LA GRILLE DE LA PAGE PRINCIPALE */
main {
grid-area: main-row-debut / main-col-start / main-row-fin / main-col-sep 12;
display: grid;
grid-template-columns: [col-start] repeat(12, calc(100% / 12) [col-sep]);
grid-template-rows:
[row-start] auto [jardin-end]
repeat(3,
var(--big_margin)
[title-start] auto [title-end]
var(--med_margin)
[illu-start] auto [illu-end] auto [illu-extended-end]
var(--med_margin)
[txt-start] auto [txt-end])
var(--big_margin)
[title-start-contact] auto [title-end-contact]
var(--med_margin)
[txt-start-contact] auto [txt-end-contact] auto [cal-end-contact] /* au lieu de mettre auto on pourrait mettre 100px ici pour avoir les 2 cadres de la même taille*/
;
}
div#jardin{
background-color: var(--jardin);
grid-area: row-start / col-start / jardin-end / col-sep 12;
display: flex;
flex-direction: column;
justify-content: center;
height: 100vh;
}
div#jardin p{
display: flex;
justify-content:center;
}
h2#infras{
background-color: var(--infras);
grid-area: title-start 1 / col-sep 1 / title-end 1 / col-sep 12;
}
div#rennes{
background-color: var(--rennes);
grid-area: illu-start 1 / col-sep 1 / illu-end 1 / col-sep 6;
overflow: hidden;
/*height: 450px;*/
}
div#orsay{
background-color: var(--orsay);
grid-area: illu-start 1 / col-sep 6 / illu-end 1 / col-sep 11;
overflow: hidden;
/*height:450px;*/
}
p#txt_infras{
background-color: var(--txt_infras);
grid-area: txt-start 1 / col-sep 1 / txt-end 1 / col-sep 7;
}
h2#outils{
background-color: var(--outils);
grid-area: title-start 2 / col-sep 1 / title-end 2 / col-sep 12;
}
section#liste_outils{
background-color: var(--liste_outils);
grid-area: illu-start 2 / col-sep 7 / illu-end 2 / col-sep 11;
}
section#liste_outils > a > div > p{
text-align: center;
}
section#liste_outils > a{
/*display: contents;*/
color: black;
text-decoration: none;
}
section#liste_outils > a:hover{
color: darkgreen;
}
div#txt_outils{
background-color: var(--txt_outils);
grid-area: txt-start 2 / col-sep 1 / txt-end 2 / col-sep 7;
}
h2#valeurs{
background-color: var(--valeurs);
grid-area: title-start 3 / col-sep 1 / title-end 3 / col-sep 12;
}
div#ronce{
background-color: var(--ronce);
grid-area: illu-start 3 / col-sep 2 / illu-end 3 / col-sep 10;
padding: 0.5rem;
filter: grayscale(100%);
border: 1px dashed black;
transition: filter 0.15s ease 0s;
}
div#ronce:hover{
filter: none;
}
section#liste_valeurs{
background-color: var(--liste_valeurs);
grid-area: txt-start 3 / col-sep 2 / txt-end 3 / col-sep 10;
}
h2#connaissance{
background-color: var(--connaissance);
grid-area: title-start-contact / col-sep 1 / title-end-contact / col-sep 12;
}
div#txt_connaissance{
background-color: var(--txt_connaissance);
grid-area: txt-start-contact / col-sep 1 / txt-end-contact / col-sep 6;
}
div#calendrier{
background-color: var(--calendrier);
grid-area: txt-start-contact / col-sep 7 / txt-end-contact / col-sep 10;
overflow: hidden;
}
.mois_actuel, .mois_suivant{
overflow: hidden;
}
/*GESTION DE LA GRILLE LISTE DE NOS VALEURS*/
section#liste_valeurs{
/*on ne peut pas faire plusieurs opérations en même temps dans calc, il faut un calc par opération*/
--demie-goutiere: calc(var(--small_margin) / 2);
--valeurs_width: calc(50% - var(--demie-goutiere));
display: grid;
grid-template-columns:
[col2-start] var(--valeurs_width) [col2-mid-left] /*bloc de gauche*/
var(--small_margin) /*goutière*/
[col2-mid-right] var(--valeurs_width) [col2-end]; /*bloc de droite*/
grid-template-rows:
[line1-start] auto [line1-end]
var(--small_margin)
[line2-start] auto [line2-end]
var(--small_margin)
[suivre-start] auto [suivre-end];
}
p#coop{
background-color: var(--lightgrey);
grid-area: line1-start / col2-start / line1-end / col2-mid-left;
text-align: center;
}
p#autonomie{
background-color: var(--lightgrey);
grid-area: line1-start / col2-mid-right / line1-end / col2-end;
}
p#solidarite{
background-color: var(--lightgrey);
grid-area: line2-start / col2-start / line2-end / col2-mid-left;
}
p#liberte{
background-color: var(--lightgrey);
grid-area: line2-start / col2-mid-right / line2-end / col2-end;
}
p#suivre {
background-color: var(--lightgrey);
grid-area: suivre-start / col2-start / suivre-end / col2-end;
text-align: center;
}
#coop, #autonomie, #solidarite, #liberte{
padding: 2rem;
border: 1px dashed black;
text-align: center;
}
section#liste_outils {
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 1rem;
row-gap: 1rem;
}
section#liste_outils > a > div {
overflow: hidden;
}
div#ordinateur {
background-color: var(--lightgrey);
grid-area: illu-start 2 / col-start / illu-end 2 / col-sep 7;
}
div#discussion {
background-color: var(--lightgrey);
grid-area: line1-start / col-start / line1-end / col-mid-left;
}
div#visio {
background-color: var(--lightgrey);
grid-area: line2-start / col-start / line2-end / col-mid-left;
}
div#sites-web {
background-color: var(--lightgrey);
grid-area: line3-start / col-start / line3-end / col-mid-left;
}
div#emails {
background-color: var(--lightgrey);
grid-area: line1-start / col-mid-right / line1-end / col-end;
}
div#collaboration {
background-color: var(--lightgrey);
grid-area: line2-start / col-mid-right / line2-end / col-end;
}
div#blog {
background-color: var(--lightgrey);
grid-area: line3-start / col-mid-right / line3-end / col-end;
}
/*GESTION DES MEDIA QUERIES*/
/*Tablettes et petits ordinateurs*/
@media (max-width: 1500px) and (min-width: 801px){
h2#infras{
grid-area: title-start 1 / col-sep 1 / title-end 1 / col-sep 12;
}
h2#outils{
grid-area: title-start 2 / col-sep 1 / title-end 2 / col-sep 12;
}
h2#valeurs{
grid-area: title-start 3 / col-sep 1 / title-end 3 / col-sep 12;
}
h2#connaissance{
grid-area: title-start-contact / col-sep 1 / title-end-contact / col-sep 12;
}
div#rennes{
grid-area: illu-start 1 / col-sep 2 / illu-end 1 / col-sep 6;
margin-right: 0.5rem;
}
div#orsay{
grid-area: illu-start 1 / col-sep 6 / illu-end 1 / col-sep 10;
margin-left: 0.5rem;
}
div#rennes, div#orsay{
border: 1px solid black;
border-radius: 5px;
}
div#rennes pre.center, div#orsay pre.center{
margin-top: -5px;
margin-bottom: -5px
}
div#orsay pre.center{
justify-content: center;
}
p#txt_infras{
background-color: var(--txt_infras);
grid-area: txt-start 1 / col-sep 2 / txt-end 1 / col-sep 10;
}
div#txt_outils{
background-color: var(--txt_outils);
grid-area: txt-start 2 / col-sep 2 / txt-end 2 / col-sep 10;
}
div#txt_connaissance{
grid-area: txt-start-contact / col-sep 2 / txt-end-contact / col-sep 10;
}
div#txt_connaissance ul{
padding-left: 0px;
list-style-position: inside;
}
div#ordinateur {
grid-area: illu-start 2 / col-sep 1 / illu-end 2 / col-sep 11;
overflow: hidden;
}
section#liste_outils{
background-color: var(--liste_outils);
grid-area: illu-end 2 / col-sep 1 / illu-extended-end 2 / col-sep 11;
margin-top: var(--med_margin);
}
section#liste_outils{
display: grid;
grid-template-columns: 1fr 1fr 1fr;
row-gap: 1rem;
column-gap: 1rem;
}
div#discussion {
background-color: var(--lightgrey);
grid-area: line1-start / col-tiers1-start / line1-end / col-tiers1-end;
overflow: hidden;
}
div#emails {
background-color: var(--lightgrey);
grid-area: line1-start / col-tiers2-start / line1-end / col-tiers2-start;
}
div#visio {
background-color: var(--lightgrey);
grid-area: line1-start / col-tiers3-start / line1-end / col-tiers3-end;
overflow: hidden;
}
div#sites-web {
background-color: var(--lightgrey);
grid-area: line2-start / col-tiers1-start / line2-end / col-tiers1-end;
overflow: hidden;
}
div#collaboration {
background-color: var(--lightgrey);
grid-area: line2-start / col-tiers2-start / line2-end / col-tiers2-end;
}
div#blog {
background-color: var(--lightgrey);
grid-area: line2-start / col-tiers3-start / line2-end / col-tiers3-end;
}
div#ronce{
grid-area: illu-start 3 / col-sep 1 / illu-end 3 / col-sep 11;
}
div#calendrier{
margin-top: var(--med_margin);
grid-area: txt-end-contact / col-sep 1 / cal-end-contact / col-sep 11;
display: flex;
justify-content: center;
}
#mois_actuel, #mois_suivant{
overflow: hidden;
}
#mois_actuel{
margin-bottom: 0px;
margin-right: 2rem;
}
}
/*Smartphones*/
@media (max-width: 800px){
h2#infras{
grid-area: title-start 1 / col-start / title-end 1 / col-sep 12;
}
h2#outils{
grid-area: title-start 2 / col-start / title-end 2 / col-sep 12;
}
h2#valeurs{
grid-area: title-start 3 / col-start / title-end 3 / col-sep 12;
}
h2#connaissance{
grid-area: title-start-contact / col-start / title-end-contact / col-sep 12;
}
div#jardin{
grid-area: row-start / col-sep 1 / jardin-end / col-sep 11;
}
nav#menu{
position: fixed;
width: 100%;
right: 0px;
bottom: 0px;
padding-bottom: 1rem;
background-color: --day-background;
z-index: 1;
border-top: black 1px dashed;
}
nav#menu ul{
list-style: none;
flex-direction: row;
display: flex;
justify-content: space-evenly;
padding: 0px;
margin: 0px;
width: 100%;
}
div#txt_connaissance ul{
padding-left: 0px;
list-style-position: inside;
margin-bottom: var(--med_margin);
}
.icone > pre{
font-size: 0.8rem;
}
#illustration-accueil > pre.center{
font-size: 0.85rem;
}
div#orsay{
display: none;
}
div#rennes{
grid-area: illu-start 1 / col-sep 1 / illu-end 1 / col-sep 11;
border: 1px solid black;
border-radius: 5px;
}
div#rennes pre{
margin-top: -5px;
margin-bottom: -5px;
}
pre{
font-size: 0.95rem;
}
#txt_infras, #txt_outils, #txt_connaissance{
text-align: left;
hyphens: none;
margin-top: 0;
hyphens: none;
word-spacing: -2px;
-ms-hyphens: none;
-webkit-hyphens: none;
-moz-hyphens: none;
margin-top: 0;
}
p#txt_infras{
background-color: var(--txt_infras);
grid-area: txt-start 1 / col-sep 1 / txt-end 1 / col-sep 11;
}
div#txt_outils{
background-color: var(--txt_outils);
grid-area: txt-start 2 / col-sep 1 / txt-end 2 / col-sep 11;
}
div#txt_connaissance{
grid-area: txt-start-contact / col-sep 1 / txt-end-contact / col-sep 11;
}
div#ordinateur {
display: none;
}
section#liste_outils {
display: block;
}
section#liste_outils{
grid-area: illu-start 2 / col-start / illu-end 2 / col-sep 12;
font-size: 1rem;
}
section#liste_outils pre{
font-size: 1rem;
}
section#liste_outils > a > div{
margin-bottom: 1rem;
}
div#ronce{
grid-area: illu-start 3 / col-sep 1 / illu-end 3 / col-sep 11;
border: none;
padding: 0px;
}
#coop, #autonomie, #solidarite, #liberte{
padding: 1rem;
margin: 0px;
}
#suivre{
margin-top: 2rem;
}
section#liste_valeurs{
grid-area: txt-start 3 / col-sep 1 / txt-end 3 / col-sep 11;
}
section#liste_valeurs .description{
display: none;
}
div#calendrier{
grid-area: txt-end-contact / col-sep 1 / cal-end-contact / col-sep 11;
display: none;
}
div#calendrier > pre.center {
justify-content: center;
}
footer pre.center{
font-size: 0.85rem;
}
#liens{
text-align: center;
margin-bottom: 12rem;
}
}
/* En vrac */
div#calendrier > pre.center{
justify-content: right;
}
#calendrier #mois_actuel{
margin-bottom: 1rem;
}
#mois_actuel, #mois_suivant{
text-align: center;
}
.highlight{
color: var(--day-highlight-color);
background-color: var(--day-highlight-bg);
}
#txt_connaissance li{
margin-bottom: 1rem;
}
#txt_connaissance p{
margin-top: 0px;
}
#txt_infras, #txt_outils, #txt_connaissance{
line-height: 1.3rem;
text-align: justify;
text-justify: inter-character;
hyphens: auto;
word-spacing: -2px;
-ms-hyphens: auto;
-webkit-hyphens: auto;
-moz-hyphens: auto;
margin-top: 0;
}

View file

@ -1,263 +0,0 @@
/*PARAMETRES GENERAUX*/
:root{
--big_margin:100px;
--med_margin:50px;
--small_margin:10px;
--day-background: #fdfff9;
--day-highlight-color: white;
--day-highlight-bg: darkgreen;
--night-highlight-color: #ebebed;
--night-highlight-bg: #565a4d;
--night-background: #242526;/*#3c3c39;*/
--txt-night: #ebebed;/*#c7c4d4;*/
color-scheme: light dark;
/*
--menu: pink;
--jardin: darkseagreen;
--infras: gold;
--rennes: orange;
--orsay: chartreuse;
--txt_infras: bisque;
--outils: coral;
--liste_outils: aliceblue;
--txt_outils: aquamarine;
--valeurs: grey;
--ronce: cornflowerblue;
--liste_valeurs: brown;
--connaissance: chocolate;
--txt_connaissance: crimson;
--calendrier: darkkhaki;
--footer: deeppink;
--lightgrey: lightgrey;*/
}
/* PAR DEFAUT */
html, body, main{
margin:0;
padding: 0;
font-size: 13px;
}
body{
font-family: monospace;
color: black;
background-color: var(--day-background);
}
pre{
padding: 0;
margin: 0;
font-size: 1rem;
}
p{
font-size: 1rem;
}
a{
color: darkgreen;
}
nav ul{
list-style: none;
padding: 0px;
margin: 0px;
}
h1:after, h2:after{
content:'\A___________________________________\A"""""""""""""""""""""""""""""""""""';
}
h2, h1{
font-size: 1rem;
font-weight: normal;
margin: 0px;
padding: 0px;
text-align: left;
}
h2, h1{
text-transform: uppercase;
white-space:pre;
overflow: hidden;
}
img{
width: 100%;
}
.noscroll{
overflow: hidden;
}
/*GESTION DE LA GRILLE DU DOCUMENT*/
div#container{
display: grid;
grid-template-columns: [main-col-start] repeat(12, calc(100% / 12) [main-col-sep]);
grid-template-rows:
[main-row-debut] var(--med_margin) [header-start] auto [header-end] var(--big_margin) [core-start] auto [main-row-fin]
var(--big_margin)
[footer-start] auto [footer-end]
;
}
/* EN-TETE */
header {
grid-area: header-start / main-col-sep 1 / header-end / main-col-sep 12;
}
/* PIED DE PAGE */
footer {
background-color: var(--footer);
grid-area: footer-start / main-col-start / footer-end / main-col-sep 12;
}
#liens{
text-align: center;
margin-bottom: var(--med_margin)
}
/* MENU */
nav#menu{
background-color: var(--day-background);
display: flex;
justify-content: flex-end;
flex-direction: column;
position: fixed;
bottom: 1rem;
right: 1rem;
}
.icone > pre{
padding-top: 1rem;
color: black;
}
.icone{
position : relative;
display: inline-block;
text-decoration: none;
}
.icone .img_top{
display: none;
position: absolute;
top: 0;
left: 0;
z-index: 99;
background-color: var(--day-background);
color: darkgreen;
}
.icone:hover .img_top{
display: inline;
}
.icone a{
text-decoration: none;
color:black;
}
nav#menu > a{
display: block;
color: black;
text-decoration: none;
}
nav#menu > a:hover{
color: darkgreen;
text-decoration: none;
}
/* ILLUSTRATIONS ASCII (Y COMPRIS FOOTER) */
pre.center{
font-size: 1rem;
display: flex;
justify-content: center;
}
pre.hide {
display: none;
}
pre.center > a{
font-size: 1rem;
display: contents;
text-decoration: 1px black solid;
}
/* RESPONSIVE */
/* Tablettes */
@media (max-width: 1500px) and (min-width: 801px) {
h2, h1{
font-size: 1rem;
font-weight: normal;
margin: 0px;
padding: 0px;
text-transform: uppercase;
white-space:pre;
overflow: hidden;
}
}
/* Smartphones */
@media (max-width: 800px) {
:root{
--big_margin:50px;
--med_margin:25px;
--small_margin:5px;
}
h1:before, h1:after{
content: '';
}
h2:before{
content: '______________________________________________________________________\A""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\A* ';
}
h2:after{
content: ' *\A______________________________________________________________________\A""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""';
}
h2, h1{
font-size: 1rem;
text-align: center;
}
h2, h1{
text-transform: uppercase;
white-space: pre;
overflow: hidden;
}
}
/* THEME SOMBRE */
@media (prefers-color-scheme: dark) {
div#container, nav#menu, body{
background-color: var(--night-background);
}
p, pre, ul, li, a, a:hover, h1, h2, footer{
color: var(--txt-night);
}
.highlight{
color: var(--night-highlight-color);
background-color: var(--night-highlight-bg);
}
.icone > pre{
color: var(--txt-night);
}
.icone .img_top{
background-color: var(--night-background);
color: var(--txt-night);
}
.icone a{
color: var(--txt-night);
}
div#ronce, #coop, #autonomie, #solidarite, #liberte, nav#menu, div#rennes, div#orsay{
border-color: var(--txt-night);
}
}

View file

@ -1,20 +0,0 @@
/*GESTION DE LA GRILLE D'UNE PAGE DE TEXTE LEGAL/INFO/BORRING */
main {
grid-area: core-start / main-col-sep 3 / main-row-fin / main-col-sep 9;
}
/* Tablettes */
@media (max-width: 1500px) and (min-width: 801px) {
main {
grid-area: core-start / main-col-sep 1 / main-row-fin / main-col-sep 11;
}
}
/* Smartphones */
@media (max-width: 800px) {
main {
grid-area: core-start / main-col-start / main-row-fin / main-col-sep 12;
}
}

View file

@ -1,65 +0,0 @@
<!-- Liste des evenements passés -->
<!-- SEPTEMBRE -->
<!--<li role="none"><a href="https://freedomnotfear.org/">Freedom not Fear</a> au Mundo B (Bruxelles), <span class="highlight">du 2 au 5 septembre.</span><br>Conférence pour défendre les libertés fondamentales dans le numérique : échanges sur le cadre légal au niveau européen, rencontre avec des députés.</li>
<li role="none"><a href="https://www.laquadrature.net/agenda/">Quadr'apéro</a> à La Quadrature du Net (Paris), <span class="highlight">le 15 septembre à 19h.</span><br>Rencontre mensuelle avec la Quadrature, échange sur les libertés fondamentales et point sur les actions de LQDN.</li>
<li role="none"><a href="https://www.agendadulibre.org/events/25967">Cafés du libre</a> au Café Citoyen (Lille), <span class="highlight">le 27 septembre à 20h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée par Chtinux le dernier mardi de chaque mois. Vous pourrez y rencontrer Adrien.</li>
-->
<!-- OCTOBRE -->
<!--<li role="none"><a href="https://agiralyon.fr/">Festival Agir à Lyon</a> à la Maison pour tous des Rancy (Lyon), <span class="highlight">le 9 octobre.</span><br>Festival organisé par Anciela pour agir pour la transition écologique et solidaire. Quentin présentera notre vision de la sobriété numérique avec Commown et Telecoop.</li>
<li role="none"><a href="https://www.agendadulibre.org/events/26101">Permanence associative autour du libre</a> au Café Citoyen (Lille), <span class="highlight">le 25 octobre à 20h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée par <a href="https://raoull.org/">Raoull</a> et Deuxfleurs le dernier mardi de chaque mois. Vous pourrez y rencontrer Adrien.</li>
<li role="none"><a href="https://pad.deuxfleurs.fr/form/#/2/form/view/mAscGaMNHcBlHs1H30bP-tqOsGrP-kLkGvFipK+EuvE/embed/">Permanence Deuxfleurs</a> à Bricologis, Vaulx en Velin (proche Lyon), <span class="highlight">le 29 octobre de 14h à 16h.</span><br>Deuxfleurs organise sa première permanence avec Bricologis pour vous aider à transitionner vers un Internet éthique ! L'inscription est requise en cliquant sur le lien ci-dessus.</li>
-->
<!-- NOVEMBRE -->
<!--
<li role="none"><a href="https://capitoledulibre.org/">Capitole du Libre</a> à l'ENSEEIHT (Toulouse), <span class="highlight">le 19 et 20 novembre.</span><br>Conférence annuelle dédiée au logiciel libre, ouverte à tout public et ceci gratuitement. Vincent y présentera le logiciel Garage et ses impacts sur l'hébergement de services.</li>
<li role="none"><a href="https://www.agendadulibre.org/events/26185">Permanence associative autour du libre</a> au Café Citoyen (Lille), <span class="highlight">le 29 novembre à 20h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée par Raoull et Deuxfleurs le dernier mardi de chaque mois. Vous pourrez y rencontrer Adrien.</li>
-->
<!-- JANVIER -->
<!--<li role="none"><a href="https://flechedor.org/agenda/2023-01-14-technopolice-jo-securitaires-l-etau-se-resserre">Soirée Technopolice</a> à la Flèche d'Or (Paris), <span class="highlight">le 14 janvier à 18h.</span><br>Soirée de présentation, débats, et ateliers dans le cadre de l'initiative Technopolice créée par la Quadrature du Net, particulièrement centrée sur l'organisation des Jeux Olympiques de 2024. Vous pourrez y rencontrer Vincent.</li>
<li role="none"><a href="https://formation.emancipasso.net/Programme">Formation Émancip'asso</a> à la Fondation FPH (Paris), <span class="highlight">du 16 au 20 janvier.</span><br>Constatant que les hébergeurs éthiques sont peu nombreux à proposer des solutions prenant en compte les besoins des associations, et notamment laccompagnement nécessaire pour mener à bien une démarche de transition vers des outils numériques libres, le projet EmancipAsso souhaite accompagner la montée en compétence des hébergeurs de services alternatifs en leur proposant une formation. La formation est privée mais vous pouvez rencontrer Quentin en soirée ou nous écrire pour partager les besoins numérique de votre association.</li>
<li role="none"><a href="https://tmci.fr/wp-content/uploads/2022/12/programme-llpt-21-01-2023.pdf">Logiciel libre pour Tout</a> au Centre Municipal de Loisirs (Tarare), <span class="highlight">le 21 janvier de 10h à 17h.</span><br>TARARE MICRO Club Informatique organise une journée informatique libre, grand public et pour les associations. Au programme : ateliers, conférences, projection de film. Deuxfleurs y proposera des ateliers et vous pourrez rencontrer Quentin.
</li>-->
<!-- FEVRIER -->
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/AG_DF_2023">Assemblée générale ordinaire</a> en ligne, <span class="highlight">le 12 février à 15h.</span><br>Comme chaque année, l'association Deuxfleurs organise son assemblée générale. Divers sujets seront abordés, avec notamment l'élection du nouveau bureau pour un an. Vous pourrez y voir tous les membres ou presque.
</li>
<li role="none"><a href="http://www.salonprimevere.org/">Salon Primevère</a> à Eurexpo (Lyon), <span class="highlight">du 17 au 19 février.</span><br> Organisé par une association et réalisé par 300 bénévoles, le salon Primevère a pour ambition de réunir les acteurs de lécologie pour présenter des alternatives militantes cohérentes et éthiques à la société actuelle, dans une ambiance conviviale. Vous pourrez y rencontrer Quentin au stand de Hadoly dans l'espace numérique.
</li>-->
<!-- MARS -->
<!--<li role="none"><a href="#">Atelier Brico #1</a> à Bricologis (Vaulx-en-Velin), <span class="highlight">le 18 mars.</span><br> Deuxfleurs organise un atelier à Bricologis à Vaulx-en-Velin pour découvrir le concept de système d'exploitation (OS), pourquoi ça impacte notre rapport à l'informatique, et comprendre ce que les alternatives comme Ubuntu peuvent nous apporter. Inscription possible prochainement.
</li>
<li role="none"><a href="https://www.lirelasociete.com/evenement-journee-du-livre-politique">32ème journée du livre politique</a> à l'Assemblée Nationale (Paris), <span class="highlight">le 25 mars.</span><br> Journée de tables rondes en présence d'élus ou ex-élus, sur le sujet «Réseaux sociaux : alliés ou ennemis de la démocratie ?». Vous pourrez y trouver Vincent.</li>
<li role="none"><a href="http://perso.ens-lyon.fr/laurent.lefevre/greendayslyon2023/">Green Days</a> à l'ENS (Lyon), <span class="highlight">le 27 et 28 mars.</span> (Inscription obligatoire, évènement académique). En 2023, la problématique d'un numérique plus éco-responsable recouvre différentes facettes et de nombreux scientifiques adressent ces sujets dans leurs communautés respectives. Il est temps de se rencontrer et de mettre en commun nos forces de recherche pour amplifier les impacts des travaux et réduire les impacts énergétiques et environnementaux du numérique.
<li role="none"><a href="https://www.agendadulibre.org/events/26938">Permanence du libre</a> au Café Citoyen (Lille), <span class="highlight">le 28 mars de 20h à 23h.</span><br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois par les associations Chtinux, Raoull & Deuxfleurs, avec l'amicale participation de Mycélium, CLX et Cliss XXI.</li>-->
<!-- Avril -->
<!--<li role="none"><a href="https://www.jdll.org/">Journées Du Logiciel Libre</a> à La Maison Pour Tous (Lyon), <span class="highlight">le 1er et 2 avril.</span><br> Deuxfleurs présentera une conférence intitulée "Entre-hébergement : envisagez l'auto-hébergement collectivement !" et sera présente sur l'évènement le week-end, entre autre sur le stand Hadoly. Vous pourriez y rencontrer Esther ou Quentin.</li>
<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 4 avril à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne pas trop formalisé pour discuter de ce qui se passe. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
<li role="none"><a href="https://www.bricologis.com/">Atelier Brico #2</a> à Bricologis (Vaulx-en-Velin), <span class="highlight">le 15 avril.</span><br> Deuxfleurs organise un atelier à Bricologis à Vaulx-en-Velin pour découvrir comment démonter un ordinateur, ses composants, et que faire pour le faire durer plus longtemps. Contactez Bricologis directement pour vous inscrire en amont.</li>-->
<!-- Mai -->
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 2 mai à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
<li role="none"><a href="https://lerize.villeurbanne.fr/agenda/tisser-la-toile-du-web-avec-des-chatons_040523/">Tisser la toile du web avec des CHATONS</a> au Rize (Villeurbane), <span class="highlight">le 4 mai de 18h30 à 20h30</span>.<br> Et si plutôt que de dépendre des quelques silos des géants du numérique nous revenions à un réseau internet décentralisé et résilient ? Si nous imaginions une AMAP du numérique, humaine, locale, libre et éthique ? Cest possible grâce aux CHATONS, un collectif dhébergeurs propulsé par lassociation Framasoft depuis 2016 !</li>
<li role="none"><a href="https://www.agendadulibre.org/events/27478">Permanence associative autour du Libre</a> à Lille, <span class="highlight">le 31 mai à 20h</span>.<br>
La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois par les associations Chtinux, Raoull & Deuxfleurs, avec l'amicale participation de Mycélium, CLX et Cliss XXI. Rejoignez-nous au Café Citoyen !-->
<!-- Juin -->
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 6 juin à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
<li role="none"><a href="https://programme.passageenseine.fr/">Pas Sage En Seine</a> à la Médiathèque Aragon (Choisy-le-Roi), <span class="highlight">du 15 au 17 juin</span>.<br> Le festival Pas Sage En seine est un rendez-vous annuel de la région parisienne. Lieu incontournable du milieu hacker à ses débuts, il a toujours eu pour vocation damener les citoyens de tous horizons à se réapproprier la société en bidouillant le système. Vincent y présentera comment "Surmonter les difficultés de lauto-hébergement ensemble avec Garage".</li>
<li role="none"><a href="https://www.maison-environnement.fr/desconnexions-une-journee-pour-aborder-en-famille-ou-entre-ami-es-les-enjeux-du-numerique-a-la-maison-de-lenvironnement-le-samedi-17-juin/">De(s)connexions</a> à la Maison de l'Environnement (Lyon), <span class="highlight">le 17 juin de 10h à 18h</span>.<br> Une journée pour aborder les enjeux et impacts, positifs et négatifs, du numérique ! Quentin y proposera une animation "technocritique".</li>
<li role="none"><a href="#">Barcamp Interne</a> en Auvergne, <span class="highlight">le 24 et 25 juin</span>.<br> Les membres de Deuxfleurs prennent le temps de se retrouver et de discuter de l'association.</li>-->
<!-- Septembre -->
<!--<li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 5 septembre à 19h</span>.<br> Un fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li>
<li role="none"><a href="https://www.agendamilitant.org/Affaire-du-8-decembre-antiterrorisme-et-criminalisation-du-chiffrement.html">Soirée affaire du «8 décembre» </a> à la bourse du travail à Paris, <span class="highlight"> le 25 septembre à 19h00</span>.<br>Soirée de discussion autour de la criminalisation du chiffrement à lœuvre dans laffaire du «8 décembre», en présence de la Quadrature du Net, N0thing2Hide, le SNJ, et les avocat·es concernés. Vous pourrez y trouver Vincent.</li>
<li role="none"><a href="https://www.agendadulibre.org/events/28118">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 26 septembre à 20h00</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois par les associations Chtinux, Raoull et Deuxfleurs, avec l'amicale participation de Mycélium, CLX et Cliss XXI. Vous pourrez y croiser Adrien.</li>
<li role="none"><a href="https://www.agendadulibre.org/events/28178">Quadrapéro</a> au Garage de la Quadrature de Net, <span class="highlight">le 29 septembre à 19h00</span>.<br>Apéritif convivial pour discuter des divers enjeux en cours autour des droits et libertés numériques, en présence de membres de la Quadrature du Net et de bien autres intéressés. Vous y verrez Vincent.</li>
<li role="none"><a href="https://venissieux.fr/blog/agenda/le-grand-rendez-vous/">Grand RDV</a> Salle Irène Joliot-Curie à Vénissieux, <span class="highlight">le 30 septembre à 9h00</span>.<br>Nous y tiendrons un stand Deuxfleurs sur le "numérique durable" où nous parlerons d'obsolescence dans le numérique et des solutions qu'on explore. Vous y verrez Quentin et Léa.</li>-->
<!-- Octobre -->
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle "au coin du feu"</a> en ligne, <span class="highlight">le 3 octobre à 19h00</span>.<br> Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li> -->
<!-- <li role="none"><a href="https://forum.chatons.org/t/assemblee-constituante-du-14-10-23-a-paris-vincennes-objet-gouvernance-moderation-continuite/5163">Assemblée pour les CHATONS</a> à Paris VIII, <span class="highlight">le 14 octobre à 9h</span>.<br> (Réservé en priorité aux CHATONS) Nous serons à Paris pour discuter de l'avenir du collectif le temps d'une journée.</li> -->
<!-- <li role="none"><a href="https://www.agendadulibre.org/events/28119">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 31 octobre à 20h00</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li> -->
<!-- Novembre -->
<!-- <li role="none"><a href="https://www.agendadulibre.org/events/28442">Quadrapéro</a> au Garage de la Quadrature de Net, <span class="highlight">le 3 novembre à 19h00</span>. <br>Apéritif convivial pour discuter des divers enjeux en cours autour des droits et libertés numériques, en présence de membres de la Quadrature du Net et de bien autres intéressés. Vous y verrez Vincent.</li> -->
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/r%C3%A9union_mensuelle_deuxfleurs">Réunion mensuelle «au coin du feu»</a> en ligne, <span class="highlight">le 7 novembre à 19h00</span>. <br>Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.</li> -->
<!-- <li role="none"><a href="https://capitoledulibre.org/">Capitole du Libre</a> à l'ENSEEIHT (Toulouse), <span class="highlight">le 18 et 19 novembre</span>. <br>Conférence annuelle dédiée au logiciel libre et à sa communauté, ouverte à tout public, et ceci gratuitement. N'hésitez pas à venir discuter avec Vincent.</li> -->
<!-- <li role="none"><a href="https://jitsi.deuxfleurs.fr/infra">Réunion mensuelle d'infrastructure</a> en ligne, <span class="highlight">le 22 novembre à 19h00</span>. <br>Point mensuel en visioconférence où l'on aborde toutes les questions techniques qui méritent notre attention, concernant notre infrastructure ou nos services.</li> -->
<!-- <li role="none"><a href="https://www.agendadulibre.org/events/28120">Permanence associative autour du Libre</a> au Café Citoyen à Lille, <span class="highlight">le 28 novembre à 20h00</span>.<br>La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.</li> -->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load diff

View file

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Redirection automatique en HTML</title>
<meta http-equiv="refresh" content="0; URL=https://guide.deuxfleurs.fr/formations/rdv-2023/">
</head>
<body>
<p>Cette page est une redirection vers : <a href="https://guide.deuxfleurs.fr/formations/rdv-2023/">Vénissieux Grand RDV 2023</a></p>
</body>
</html>

View file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 KiB

View file

@ -1,44 +0,0 @@
// dictionary to keep track of frame count for each animation
let frameCounts = {};
function animate(id, delay) {
// get the container and frames for the amination
const container = document.getElementById(id);
const frames = container.children;
// set up the frame counter
frameCounts[id] = 0;
// hide all frames except for the first
frames[0].style.display = "flex";
for (let i = 1; i < frames.length; i++) {
frames[i].style.display = "none";
}
// start the animation
const interval = setInterval(updateAnimation, delay, id, frames, frames.length);
}
function updateAnimation(id, frames, totalFrames) {
// increment the frame counter for the given id
frameCounts[id] = (frameCounts[id] + 1) % totalFrames;
// show the next frame
frames[frameCounts[id]].style.display = "flex";
// hide the previous frame
if (frameCounts[id] == 0) {
frames[totalFrames - 1].style.display = "none";
} else {
frames[frameCounts[id] - 1].style.display = "none";
}
}
animate("illustration-accueil", 500);
animate("rennes", 1000);
animate("orsay", 2000);
animate("parterre", 1500);