diff --git a/assets/production/css/style.css b/assets/production/css/style.css index 441c877..97f0d3d 100644 --- a/assets/production/css/style.css +++ b/assets/production/css/style.css @@ -95,7 +95,8 @@ abbr { margin-bottom: 1em; } -.Button { +.button { + margin: 0 1em 0 1em; padding: 8px 24px; background: #373d3f; color: #fff; @@ -108,6 +109,10 @@ abbr { display: inline-block; } +.violet { + background: blueviolet; +} + .tac { text-align: center; } @@ -179,6 +184,12 @@ nav section ul li { font-size: 1.5em; } +.services { + border: lightblue 4px solid; + padding: 0.6em; + +} + .services-title { position: relative; padding-left: 64px; @@ -244,6 +255,33 @@ nav section ul li { background: #b9daf6 url(/images/uicons/key.svg) center center no-repeat; } +.services-software { + margin-top: 2em; +} + +.services-software div { + display: flex; + justify-content: space-evenly; + padding-top: 1em; + padding-bottom: 1em; +} + +.services-link a { + align-self: center; +} + +.services-link img { + height: 2em; +} + +.services-link p { + align-self: center; + font-size: small; + font-weight: bold; + padding-left: 0.8em; + width: 4em; +} + .frame { border: 1px black solid; overflow: hidden; @@ -331,7 +369,7 @@ nav section ul li { grid-template-columns: repeat(2, 1fr); grid-template-rows: 1fr; grid-column-gap: 64px; - grid-row-gap: 0; + grid-row-gap: 64px; } .Two-cols-Two-rows { diff --git a/assets/production/images/uicons/copyright.svg b/assets/production/images/uicons/copyright.svg new file mode 100644 index 0000000..66bae66 --- /dev/null +++ b/assets/production/images/uicons/copyright.svg @@ -0,0 +1,2 @@ + + diff --git a/assets/production/images/uicons/files.svg b/assets/production/images/uicons/files.svg new file mode 100644 index 0000000..a20516e --- /dev/null +++ b/assets/production/images/uicons/files.svg @@ -0,0 +1 @@ + diff --git a/assets/production/images/uicons/home.svg b/assets/production/images/uicons/home.svg new file mode 100644 index 0000000..c656741 --- /dev/null +++ b/assets/production/images/uicons/home.svg @@ -0,0 +1,2 @@ + + diff --git a/content/index.html b/content/index.html index cae7ad6..6db321c 100644 --- a/content/index.html +++ b/content/index.html @@ -28,7 +28,7 @@ title: L'hébergeur associatif, transparent et solidaire

N'hésitez pas à découvrir les autres membres ; tous proposent une palette particulière de services avec un coût et des garanties différentes. L'un d'eux pourrait être davantage adapté que Ti Nuage à vos besoins.

- Découvrir l'association + Découvrir l'association
@@ -53,6 +53,6 @@ title: L'hébergeur associatif, transparent et solidaire
- Voir tous les services + Voir tous les services
diff --git a/content/services.md b/content/services.md index 6ee3e3a..e791d2b 100644 --- a/content/services.md +++ b/content/services.md @@ -6,65 +6,3 @@ Les serveurs fournissant les services ci-dessous sont sous le seul contrôle de l'équipe technique de l'association. Nous sommes une petite structure et nous nous efforçons de donner le meilleur de nous même avec les moyens que nous avons à notre disposition. Malgré des sauvegardes quotidiennes et un suivi régulier de l'infrastructure, nous ne sommes pas à l'abris d'un incident. Nous ne garantissons donc pas une continuité de service permanente et nous ne nous assignons aucune obligation de résultat. - -
-

Services réservés aux adhérents

-
-
-

Hébergement web

-

Nous ne le créons pas pour vous, mais nous pouvons vous apporter des conseils et nous hébergeons votre site internet. Vous pouvez utiliser votre propre noms de domaine où utiliser gratuitement un sous-domaine ti-nuage.fr

-
-
-

Drive

-

Partagez et collaborez sur des documents, gérez vos tâches et votre calendrier, synchronisez les contacts de votre téléphone, et bien plus encore.

-

Logiciel NextCloud.

-
-
-

Adresse e-mail

-

Une adresse email @ti-nuage.fr consultable par webmail ou avec votre client de messagerie habituel.

-
-
-

Liste de diffusion

-

Une liste de diffusion nom@listes.ti-nuage.fr pour échanger avec les membres de votre groupe de travail et collaborateurs.

-

Addministration des listes avec le logiciel Sympa. -

-
-

Coffre-fort numérique

-

Un espace pour stocker vos notes et mots de passe de façon sécurisée et pouvoir y accéder depuis tous vos terminaux numériques.

-

Logiciel Bitwarden.

-
-
-

Forge logicielle

-

Un environnement de développement Git pour héberger et partager vos projets.

-

Logiciel Gitea.

-
-
-

Discussion instantanée

-

Une adresse sur le réseau de discussion fédéré XMPP.

-

Logiciel Converse sur votre navigateur, mais aussi Conversations, Dino, Gajim ...

-
-
-
- -
-

Services en libre accès, sans adhésion

-
-
-

Édition collaborative

-

Des outils pour organiser un document et le rédiger en groupe, avec la possibilité d'identifier les apports de chacun et de revenir en arrière.

-

Logiciel Etherpad, pour l'édition d'un texte.

-

Logiciel Ethercalc, pour la création d'une feuille de calcul.

-
-
-

Sondages

-

Pour organiser des rendez-vous ou choisir parmi plusieurs options, au sein d'un groupe ou d'une association.

-

Logiciel OpenSondage

-
-
-

Partage de fichiers

-

Pour partager des documents trop lourds pour un envoi par courriel, une gallerie de photos, ou même de simple extraits de texte ou de code, de manière sécurisée et temporaire.

-

Logiciel PrivateBin, pour le partage d'extraits de textes.

-

Logiciel Send, pour l'envoi de fichiers.

-
-
-
diff --git a/layouts/front.njk b/layouts/front.njk index 4db917f..37a0f6f 100644 --- a/layouts/front.njk +++ b/layouts/front.njk @@ -14,7 +14,7 @@ {% else %} {% endfor %}
- Voir les archives + Voir les archives
diff --git a/scripts/metalsmith-tinuage-services.js b/scripts/metalsmith-tinuage-services.js new file mode 100644 index 0000000..395391a --- /dev/null +++ b/scripts/metalsmith-tinuage-services.js @@ -0,0 +1,176 @@ +const { Buffer } = require('node:buffer') +const debug = require('debug')('metalsmith-tinuage-services') +const config = require('./config.js') +const fs = require('node:fs') +const path = require('path') + +module.exports = plugin + +/** + * Un plugin pour Metalsmith qui lit une collection de fichiers JSON décrivant + * les services de l'association pour composer la page services.html du site. + * + * @return {Function} + */ +function plugin () { + const Sections = Object.freeze({ + OPEN: Symbol('open'), + MEMBERS: Symbol('members') + }) + + const PageFiller = { + setup: function (page, services) { + this.page = page + this.registry = services.reduce((registry, service) => { + registry[service.section].push(service) + return registry + }, { + [Sections.OPEN]: [], + [Sections.MEMBERS]: [] + }) + + return this + }, + + fill: function () { + let html = '' + + html += this.createSection('Services réservés aux adhérents', Sections.MEMBERS) + html += this.createSection('Services en libre accès, sans adhésion', Sections.OPEN) + + this.page.contents = Buffer.concat([ + this.page.contents, + Buffer.from(html) + ]) + }, + + createSection: function (title, section) { + let html = '
\n' + + '

' + title + '

\n' + + '
\n' + + this.registry[section].forEach((service) => { html += service.html }) + html += '
' + + return html + } + } + + const Parser = { + /** + * Traduit la description JSON du service donné en paramètre en un extrait + * HTML. + */ + parseService: function (service) { + let html = '
\n' + + '

' + service.title + '

\n' + + '

' + service.description + '

\n' + + if (service.buttons !== undefined) { + html += '

\n' + service.buttons.forEach((b) => { html += this.createButton(b) }) + html += '

' + } + + if (service.softwares !== undefined) { + html += '
\n' + service.softwares.forEach((s) => { html += this.createSoftwareDescription(s) }) + html += '
\n' + } + + if (service.links !== undefined) { + html += '

Autres liens :

\n
\n' + } + html += '
' + + debug('Parsed ' + service.title + '(' + service.order + ')') + service.html = html + service.section = service.open ? Sections.OPEN : Sections.MEMBERS + + return service + }, + + createButton: function (button) { + const cls = button.class || '' + return '' + button.label + '\n' + }, + + createListLink: function (link) { + return '
  • ' + link.label + '
  • \n' + }, + + createSoftwareDescription: function (soft) { + let html = '

    ' + soft.description + '

    \n' + + '
    ' + + if (soft.url !== undefined) { + html += this.createSoftwareLink('home.svg', 'Page Web', soft.url) + } + if (soft.sources !== undefined) { + html += this.createSoftwareLink('files.svg', 'Sources du logiciel', soft.sources) + } + soft.licenses.forEach((l) => { html += this.createSoftwareLink('copyright.svg', 'Licence', l.url, l.name) }) + + html += '
    \n' + + return html + }, + + createSoftwareLink: function (icon, alt, url, title) { + let element = '' + + return element + } + } + + /** + * Lit de manière asynchrone l'ensemble des fichiers JSON décrivant les services. + * + * Seuls les fichiers ayant .json comme extension sont chargés depuis le répertoire fourni. + */ + function loadServices (root, filenames) { + const promises = filenames + .filter(f => { return f.indexOf('.json') !== -1 }) + .map(function (f) { + debug('Loading ' + f) + return fs.promises + .readFile(path.join(root, f), 'utf8') + .then((data) => { return JSON.parse(data) }) + }) + + return Promise.all(promises) + } + + return function (files, metalsmith, done) { + const root = path.join(config.paths.projectRoot, 'services') + + debug('Looking for services in ' + root) + fs.readdir(root, (err, filenames) => { + if (err) { + console.error('%s: %s', root, err) + } else { + loadServices(root, filenames) + .then(function (services) { + const p = Object.create(Parser) + const parsed = services + .sort((a, b) => { return a.order - b.order }) + .map((s) => p.parseService(s)) + Object.create(PageFiller).setup(files['services.html'], parsed).fill() + done() + }) + .catch(function (err) { + console.log(err) + }) + } + }) + } +} diff --git a/scripts/metalsmith.js b/scripts/metalsmith.js index 96c78cd..1a78291 100644 --- a/scripts/metalsmith.js +++ b/scripts/metalsmith.js @@ -12,6 +12,7 @@ const marked = require('marked') const moment = require('moment') const permalinks = require('@metalsmith/permalinks') const rename = require('metalsmith-rename') +const services = require('./metalsmith-tinuage-services') const sitemap = require('metalsmith-sitemap') const slug = require('slug') const statistics = require('./metalsmith-statistics-plugin') @@ -64,6 +65,7 @@ module.exports = new Metalsmith(config.paths.projectRoot) smartypants: true, xhtml: true })) + .use(services()) .use(excerpts()) .use(permalinks({ pattern: 'blog/:date/:title', diff --git a/services/calc.json b/services/calc.json new file mode 100644 index 0000000..1870d04 --- /dev/null +++ b/services/calc.json @@ -0,0 +1,26 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://calc.ti-nuage.fr"} + ], + "description": "Un tableur collaboratif éditable en temps réel qui dispose des fonctionnalités de base : mise en forme, fonctions mathématiques, graphiques, ajout de commentaires, historique des versions, export en HTML ou en CSV. L'historique complet du document est conservé et les modifications de chacun sont identifiées.", + "icon": "edit", + "links": [ + {"label": "Documentation et autres instances", "url": "https://wiki.chatons.org/doku.php/services/bureautique_en_ligne/ethercalc"} + ], + "open": true, + "order": 2, + "softwares": [ + { + "description": "Ce service est fournit par le logiciel EtherCalc.", + "licenses": [ + { + "name": "Licences multiples", + "url": "https://github.com/audreyt/ethercalc/blob/master/LICENSE.txt" + } + ], + "sources": "https://github.com/audreyt/ethercalc", + "url": "https://ethercalc.net/" + } + ], + "title": "Tableur collaboratif" +} diff --git a/services/code.json b/services/code.json new file mode 100644 index 0000000..b55d43c --- /dev/null +++ b/services/code.json @@ -0,0 +1,27 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://apps.ti-nuage.fr/gitea"} + ], + "description": "Un environnement de développement Git pour héberger et partager vos projets.", + "icon": "gear", + "links" : [ + {"label": "Documentation du logiciel", "url": "https://docs.gitea.io/fr-fr/"}, + {"label": "Le livre Pro Git", "url": "https://git-scm.com/book/fr/v2"} + ], + "open": false, + "order": 6, + "softwares": [ + { + "description": "Gitea est une forge logicielle légère mais complète, avec une gestion des sources basée sur git, une interface pour les demandes de fusion, un suivi de tickets, ou un module Wiki.", + "licenses": [ + { + "name": "Licence MIT", + "url": "https://mit-license.org" + } + ], + "sources": "https://github.com/go-gitea/gitea", + "url": "https://gitea.io" + } + ], + "title": "Forge logicielle" +} diff --git a/services/email.json b/services/email.json new file mode 100644 index 0000000..46c2ff3 --- /dev/null +++ b/services/email.json @@ -0,0 +1,11 @@ +{ + "buttons": [ + {"label": "Consulter", "url": "https://webmail.ti-nuage.fr"}, + {"label": "Documentation", "class": "violet", "url": "https://wiki.ti-nuage.fr/fr/Services/Communication/Courriel"} + ], + "description": "Une adresse de courrier électronique avec le domaine ti-nuage.fr utilisable en ligne ou avec votre client de messagerie habituel.", + "icon": "email", + "open": false, + "order": 2, + "title": "Adresse de courriel" +} diff --git a/services/im.json b/services/im.json new file mode 100644 index 0000000..1241c91 --- /dev/null +++ b/services/im.json @@ -0,0 +1,44 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://apps.ti-nuage.fr/converse"}, + {"label": "Documentation", "class": "violet", "url": "https://wiki.ti-nuage.fr/fr/Services/Communication/DiscussionInstantan%C3%A9e"} + ], + "description": "Une adresse sur le réseau de discussion fédéré XMPP. Ce protocole standardisé permet à chacun d'utiliser le logiciel qui lui plaît sur l'appareil de son choix. Par exemple, Conversations, Dino, ou Gajim. D'autres encore sont proposés sur cette page.", + "icon": "messages", + "links": [ + {"label": "Détails et autres instances", "url": "https://wiki.chatons.org/doku.php/services/messagerie_instantanee/xmpp"}, + {"label": "Le standard XMPP, ses actualités", "url": "https://xmpp.org"} + + ], + "open": false, + "order": 7, + "softwares": [ + { + "description": "Ce service est actuellement servi par le serveur Metronome.", + "licenses": [ + { + "name": "License MIT", + "url": "https://mit-license.org" + }, + { + "name": "License ISC", + "url": "https://www.isc.org/licenses/" + } + ], + "sources": "https://github.com/maranda/metronome", + "url": "https://metronome.im" + }, + { + "description": "Le portail des utilisateurs propose l'interface en ligne Converse.", + "licenses": [ + { + "name": "License publique Mozilla", + "url": "https://www.mozilla.org/en-US/MPL/" + } + ], + "sources": "https://github.com/conversejs/converse.js", + "url": "https://conversejs.org/" + } + ], + "title": "Messagerie instantanée" +} diff --git a/services/ml.json b/services/ml.json new file mode 100644 index 0000000..6657d88 --- /dev/null +++ b/services/ml.json @@ -0,0 +1,24 @@ +{ + "buttons": [ + {"label": "Consulter", "url": "https://webmail.ti-nuage.fr"}, + {"label": "Documentation", "class": "violet", "url": "https://wiki.ti-nuage.fr/fr/Services/Communication/Courriel"} + ], + "description": "Une liste de diffusion nom@listes.ti-nuage.fr pour échanger avec les membres de votre groupe de travail et collaborateurs.", + "icon": "ml", + "open": false, + "order": 4, + "softwares": [ + { + "description": "La gestion des listes est réalisée à l'aide du logiciel Sympa. Son interface Web permet une configuration fine des paramètres de chaque liste de diffusion et la gestion de ses membres.", + "licenses": [ + { + "name": "Licence GPLv2", + "url": "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" + } + ], + "sources": "https://github.com/sympa-community/sympa", + "url": "https://sympa.org" + } + ], + "title": "Listes de diffusion" +} diff --git a/services/nextcloud.json b/services/nextcloud.json new file mode 100644 index 0000000..e95c698 --- /dev/null +++ b/services/nextcloud.json @@ -0,0 +1,27 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://cloud.ti-nuage.fr"}, + {"label": "Documentation", "class": "violet", "url": "https://wiki.ti-nuage.fr/fr/Services/TravailCollaboratif/NextCloud"} + ], + "description": "Stockez vos fichiers, mais aussi vos contacts, vos images ou vos pistes de musique. Synchronisez-les avec votre ordinateur de bureau ou votre mobile. Partagez-les et travaillez en collaboration", + "icon": "cloud", + "links": [ + {"label": "Autres instances et documentation externe", "url": "https://wiki.chatons.org/doku.php/services/nextcloud"} + ], + "open": false, + "order": 3, + "softwares": [ + { + "description": "Ce service est basé sur le logiciel NextCloud, une plateforme de collaboration utilisée par des entreprises ou associations de toutes tailles dans le monde entier.", + "licenses": [ + { + "name": "Licence AGPLv3", + "url": "https://www.gnu.org/licenses/agpl-3.0.html" + } + ], + "sources": "https://github.com/nextcloud", + "url": "https://nextcloud.com" + } + ], + "title": "Stockage de fichiers" +} diff --git a/services/pads.json b/services/pads.json new file mode 100644 index 0000000..f44c2ae --- /dev/null +++ b/services/pads.json @@ -0,0 +1,36 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://apps.ti-nuage.fr/pad"} + ], + "description": "Un outil pour organiser et rédiger un document en groupe avec un canal de discussion écrite. L'édition conserve l'historique complet du document et les modifications de chacun sont identifiées.", + "icon": "edit", + "links": [ + {"label": "Documentation et autres instances", "url": "https://wiki.chatons.org/doku.php/services/bureautique_en_ligne/etherpad"} + ], + "open": true, + "order": 1, + "softwares": [ + { + "description": "Ce service est fournit par le logiciel Etherpad.", + "licenses": [ + { + "name": "Licence Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" + } + ], + "sources": "https://github.com/ether/etherpad-lite", + "url": "https://etherpad.org/" + }, + { + "description": "Le portail avec la connexion des utilisateurs et la gestion des pads est offerte par MyPads un plugin financé sur Ulule et porté par l’association Framasoft.", + "licenses": [ + { + "name": "Licence Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" + } + ], + "sources": "https://framagit.org/framasoft/Etherpad/ep_mypads" + } + ], + "title": "Rédaction collaborative" +} diff --git a/services/polls.json b/services/polls.json new file mode 100644 index 0000000..a3b8cae --- /dev/null +++ b/services/polls.json @@ -0,0 +1,26 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://apps.ti-nuage.fr/date"} + ], + "description": "Pour organiser des rendez-vous ou choisir parmi plusieurs options, au sein d'un groupe ou d'une association.", + "icon": "list", + "links": [ + {"label": "Autres instances et documentation externe", "url": "https://wiki.chatons.org/doku.php/services/sondage/framadate"} + ], + "open": true, + "order": 3, + "softwares": [ + { + "description": "Ce service est fournit par le logiciel Framadate.", + "licenses": [ + { + "name": "Licence CeCILL-B", + "url": "https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html" + } + ], + "sources": "https://framagit.org/framasoft/framadate/framadate", + "url": "https://framadate.org/abc/fr/" + } + ], + "title": "Sondages" +} diff --git a/services/share_bin.json b/services/share_bin.json new file mode 100644 index 0000000..e8deccd --- /dev/null +++ b/services/share_bin.json @@ -0,0 +1,26 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://apps.ti-nuage.fr/privatebin"} + ], + "description": "Pour partager de simple extraits de texte ou de code, de manière sécurisée et temporaire.", + "icon": "share", + "links": [ + {"label": "Documentation et autres instances", "url": "https://wiki.chatons.org/doku.php/services/partage_chiffre/privatebin"} + ], + "open": true, + "order": 5, + "softwares": [ + { + "description": "Cet outil se base sur PrivateBin.", + "licenses": [ + { + "name": "Licence Zlib/libpng", + "url": "https://opensource.org/licenses/zlib-license.php" + } + ], + "sources": "https://github.com/PrivateBin/PrivateBin", + "url": "https//privatebin.info/" + } + ], + "title": "Partage d'extraits de texte" +} diff --git a/services/share_file.json b/services/share_file.json new file mode 100644 index 0000000..7497b5b --- /dev/null +++ b/services/share_file.json @@ -0,0 +1,22 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://send.ti-nuage.fr"} + ], + "description": "Pour partager des documents trop lourds pour un envoi par courriel, une gallerie de photos, de manière sécurisée et temporaire.", + "icon": "share", + "open": true, + "order": 4, + "softwares": [ + { + "description": "Ce service est servi par une version dérivée de Firefox Send.", + "licenses": [ + { + "name": "Licence MPL", + "url": "https://www.mozilla.org/en-US/MPL/2.0" + } + ], + "sources": "https://gitlab.com/timvisee/send" + } + ], + "title": "Partage de fichiers" +} diff --git a/services/vault.json b/services/vault.json new file mode 100644 index 0000000..3356006 --- /dev/null +++ b/services/vault.json @@ -0,0 +1,28 @@ +{ + "buttons": [ + {"label": "Utiliser", "url": "https://vault.ti-nuage.fr"}, + {"label": "Documentation", "class": "violet", "url": "https://wiki.ti-nuage.fr/fr/Services/Outils/CoffreFortNum%C3%A9rique"} + ], + "description": "Un espace pour stocker vos notes et mots de passe de façon sécurisée et pouvoir y accéder depuis tous vos terminaux numériques.", + "icon": "key", + "open": false, + "order": 5, + "softwares": [ + { + "description": "Bitwarden est un gestionnaire de mot de passe en ligne. Il permet de générer facilement mot ou phrases de passe et de partager notes et secrets ", + "licenses": [ + { + "name": "Licence AGPLv3", + "url": "https://www.gnu.org/licenses/agpl-3.0.html" + }, + { + "name": "Licence Bitwarden", + "url": "https://github.com/bitwarden/server/blob/master/LICENSE_BITWARDEN.txt" + } + ], + "sources": "https://github.com/bitwarden", + "url": "https://bitwarden.com/open-source" + } + ], + "title": "Coffre-fort numérique" +} diff --git a/services/web.json b/services/web.json new file mode 100644 index 0000000..05d990f --- /dev/null +++ b/services/web.json @@ -0,0 +1,10 @@ +{ + "buttons": [ + {"label": "Nous contacter", "url": "https://ti-nuage.fr/mentions_legales.html"} + ], + "description": "Nous ne le créons pas pour vous, mais nous pouvons vous apporter des conseils et nous hébergeons votre site internet. Vous pouvez utiliser votre propre noms de domaine où utiliser gratuitement un sous-domaine ti-nuage.fr", + "icon": "web", + "open": false, + "order": 1, + "title": "Hébergement Web" +}