arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou

Log | Files | Refs |

index.sh (5727B)


      1 #! page
      2 title: Faire un site one page avec un pad
      3 author: Arthur Pons
      4 description: Voyons ce que cela coûte de générer un très simple site depuis un pad
      5 publication: 2025-07-15
      6 
      7 section: main
      8 
      9 Article pas relu
     10 
     11 ## Le besoin
     12 
     13 Imaginons un festival artistico-militanto-écolo du nord de l'Alsace. Il a pour
     14 habitude de communiquer sur facebook et instagram (bouuuh). Il a tout de même
     15 un linktree avec le programme et quelques infos (mieuux). A la fin du festival
     16 une personne fait la remarque que ce serait tout de même chouette d'avoir un
     17 vrai site avec les infos de bases. Sauf que c'est un peu ennuyant à faire,
     18 difficile à éditer etc.
     19 
     20 De manière générale les personnes sont à l'aise avec l'édition d'un pad. Je le
     21 reconnais c'est un bel outil dont il n'existe pas d'alternative identique dans
     22 le monde termino-unixien. En terme d'appli web y'a vraiment pire d'etherpad.
     23 
     24 Et si l'on faisait tenir tout le site sur une page, générée depuis le markdown
     25 d'un pad édité par tout le monde ?
     26 
     27 Pour faire des tests j'ai hébergé le site ici : http://ire.bebou.netlib.re  
     28 Et le pad ici : http://pad.unistra.fr/p/ire  
     29 Ca peut casser n'importe quand. SVP spammer pas les modifs.
     30 
     31 ## La proposition
     32 
     33 ### Récupérer le contenu et en faire de l'HTML
     34 
     35 On peut récupérer le contenu d'un pad en le réquêtant avec `/export/txt` ajouté
     36 à la fin :
     37 
     38 	$ curl -Ls https://pad.unistra.fr/p/ire/export/txt
     39     ## Blablabla
     40 
     41     machin
     42 
     43 On peut mettre ça dans du `lowdown` pour générer de l'html :
     44 
     45 	$ curl -Ls https://pad.unistra.fr/p/ire/export/txt | lowdown
     46     <h2 id="blablabla">Blablabla</h2>
     47 
     48     <p>machin</p>
     49 
     50 Si on met ça dans une petite boucle while on peut vérifier s'il s'est passé
     51 quelque chose toutes les N secondes :
     52 
     53     while :;do
     54         curl -Ls https://pad.unistra.fr/p/ire/export/txt | lowdown > index.html
     55         sleep N
     56     done
     57 
     58 ### Ne pas spammer le pauvre pad de l'unistra
     59 
     60 Sauf que c'est bof de spammer pour rien le pad donc imaginons autre chose. En se
     61 basant sur le système de [qcm](/qcm/) on peut ajouter un lien dans le pad qui,
     62 lorsque l'on clique dessus, déclenchera la mise à jour du site via la détection
     63 du chemin dans les logs du serveur web. Il faudra mettre en place le nécessaire
     64 pour filtrer les logs et le lien dans le pad :
     65 
     66     [ -p "notif" ] || mkfifo "notif"
     67     tail -Fn0 "/var/log/nginx/access.log" |
     68         grep --line-buffered -E "/mise-a-jour" > "notif" &
     69     notifpid=$!
     70 
     71     cat "notif" | while read maj; do
     72         curl -Ls https://pad.unistra.fr/p/ire/export/txt |
     73             grep -v 'http://ire.bebou.netlib.re/mise-a-jour' |
     74             lowdown > index.html
     75     done
     76 
     77 Pour éviter de refaire des calculs s'il n'y a pas eu de modif on peut
     78 enregistrer le markdown et tester s'il est identique à l'ancien avec un `diff` :
     79 
     80     cat "notif" | while read maj; do
     81         curl -Ls https://pad.unistra.fr/p/ire/export/txt |
     82             grep -v 'http://ire.bebou.netlib.re/mise-a-jour' > index-new.md
     83         if ! diff index.md index-new.md 2> /dev/null;then
     84                 lowdown > index.html
     85         fi
     86     done
     87 
     88 ### Le versionnage automatique
     89 
     90 Finalement pour éviter de perdre quoi que ce soit on pourra gitter le tout :
     91 
     92     cat "notif" | while read maj; do
     93         if ! diff index.md index-new.md 2> /dev/null;then
     94             curl -Ls https://pad.unistra.fr/p/ire/export/txt |
     95                 grep -v 'http://ire.bebou.netlib.re/mise-a-jour' |
     96                 lowdown > index.html
     97         fi
     98         git add index.html
     99         git commit -m "Modification"
    100         git push
    101     done
    102 
    103 Évidemment on pourra mettre une quantité arbitraire de code dans le while pour
    104 avoir un squelette html décent, un `nav` dynamique ou autre.
    105 
    106 ### La version minimale finale
    107 
    108 Au final la version "minimale" du concept pour un serveur `nginx` pourrait être
    109 :
    110 
    111     [ -p "notif" ] || mkfifo "notif"
    112     tail -Fn0 "/var/log/nginx/access.log" |
    113         grep --line-buffered -E "/mise-a-jour" > "notif" &
    114     notifpid=$!
    115 
    116     cat "notif" | while read maj; do
    117         if ! diff index.md index-new.md 2> /dev/null;then
    118             curl -Ls https://pad.unistra.fr/p/ire/export/txt |
    119                 grep -v 'http://ire.bebou.netlib.re/mise-a-jour' |
    120                 lowdown > index.html
    121         fi
    122         git add index.html
    123         git commit -m "Modification"
    124         git push
    125     done
    126 
    127     kill $notifpid
    128 
    129 ## Les limites
    130 
    131 A priori ça fonctionne pas mal pour une page mais ça devient compliqué pour
    132 plus. C'est possible d'avoir un séparateur dans le pad qui délimite plusieurs
    133 pages différentes puis de les séparer côté serveur mais ça risque de devenir
    134 assez rapidement fastidieux à éditer.
    135 
    136 On peut intégrer des images déjà en ligne avec `![]()` mais comment fait-on pour
    137 uploader des images, des pdf etc ?
    138 
    139 Il n'est pas possible d'éditer le css et l'html depuis le pad, que le contenu.
    140 Ça peut éventuellement être un avantage selon le contexte.  Avec plus de code
    141 côté serveur c'est possible mais possiblement trop compliqué pour ce que l'on
    142 voulait faire.
    143 
    144 Si le pad est public il faut bien le cacher sinon n'importe qui pourra faire des
    145 modifications. Au pire des cas git devrait pouvoir nous permettre de revenir à
    146 un état antérieur.
    147 
    148 Il n'est, je crois, pas possible d'utiliser ce système via un éditeur de texte
    149 classique + git. Dans tous les cas à la prochaine modif du pad le contenu du
    150 site sera écrasé. On a donc pas une accessibilité chouette à la fois pour les
    151 personnes voulant y accéder via un navigateur web *et* des cli 😔.
    152 
    153 Le script ne redirige pas les erreurs potentielles du script à un endroit où les
    154 personnes peuvent les lire et les communiquer à l'admin. Ça devrait pouvoir se
    155 modifier assez facilement.