Programme d’achat local de Loretteville.ca. Ce dépôt est la seule source du site, du workflow n8n, de la structure de la base (data tables de n8n), des tests, du procédurier et de l’EFVP.
docs/MISE_EN_PLACE.md (guide pas à pas).procedurier/Procedurier_La_boucle_locale.docx.Image_Fond, logo, promotions, adresse du commerce) et une légende par commerce pour Facebook et Instagram, et un billet de blogue (Google Docs, commerces en ordre aléatoire), dans le dossier Drive « Publications La boucle ». Rien n’est publié automatiquement. Les promotions 18 ans et plus n’y figurent jamais.n8n/La_boucle_images.json, à lancer une fois après l’installation)..github/workflows/deployer.yml) publie alors automatiquement :
site/ sur boucle.loretteville.ca, par GitHub Pages, directement depuis ce dépôt ;sheet/MIGRATIONS.md décrit les colonnes à ajouter à la main dans n8n avant de fusionner.Dans ce dépôt : Settings → Pages → Source : GitHub Actions (domaine boucle.loretteville.ca), puis Settings → Secrets and variables → Actions → New repository secret :
| Secret | Valeur |
|---|---|
N8N_URL |
https://n8n.srv747998.hstgr.cloud |
N8N_API_KEY |
Dans n8n : Settings → n8n API → Create an API key. GitHub n’a aucun accès à votre serveur : il envoie seulement le nouveau workflow à cette API de n8n, avec cette clé. Elle donne le contrôle des workflows : ne la mettez nulle part ailleurs, et remplacez-la si vous la croyez compromise. (L’API doit être active : variable N8N_PUBLIC_API_DISABLED absente ou false.) |
N8N_WORKFLOW_ID |
Identifiant du workflow, dans son adresse : …/workflow/<identifiant> (après le premier import manuel). |
Le premier import du workflow se fait à la main (étape 3 ci-dessous) ; les mises à jour suivantes sont automatiques. Pour redéployer sans changement : onglet Actions → Déployer → Run workflow.
La synchronisation va du dépôt vers n8n. Pour qu’une modification faite à la main dans n8n ne soit jamais écrasée :
n8n-modifs-manuelles-… et une issue « Workflow n8n modifié à la main » vous avise (avec la liste des nœuds touchés) ;surveiller_n8n.yml), la même vérification signale une modification dans les 24 heures, même sans déploiement.Ensuite, demandez à Claude de reporter les modifications de cette branche dans les sources ; fusionnez sa pull request et fermez l’issue. Pour au contraire annuler les modifications faites dans n8n : Actions → Déployer → Run workflow en cochant forcer.
Modifiez site/etat.json (sur GitHub : crayon ✏️ → Commit changes, sur une branche puis fusion, ou directement sur main) :
{ "maintenance": { "debut": "2026-11-12 21:00", "fin": "2026-11-12 23:00", "avis_jours": 7, "message": "Mise à jour du système." } }
Heures du Québec. Un bandeau avertit les clients et les commerçants pendant avis_jours ; pendant la période, un écran de maintenance remplace les pages et aucun appel n’est fait à n8n ; tout revient seul à l’heure de fin. Pour annuler : vider debut.
site/ : le site publié sur GitHub Pages (img/signature-loretteville.png : logo de la signature des courriels)
index.html (carte du quartier à l’accueil, inscription, connexion et profil), carte.html (la carte seule, /carte), carte.js et carte.css (la carte), commerce.html (espace commerçant), confidentialite.html (politique de confidentialité), concours.html (règlement du concours) ;etat.json et maintenance.js : avis et mode maintenance ;CNAME (boucle.loretteville.ca) ;lib/ : bibliothèques et polices hébergées sur le site, sans aucun appel à unpkg, jsDelivr, cdnjs ou Google Fonts (lib/leaflet/ : Leaflet et markercluster ; lib/polices/ttf/ : IBM Plex Sans pour les visuels).n8n/La_boucle_locale_v2.json : le workflow à importer (22 webhooks, dont carte-donnees pour la carte publique, et 11 tâches planifiées : bascule, publications du mois, anonymisation, tirage du concours, rappels aux commerces, commentaires du vendredi, sauvegarde de nuit, surveillance du trafic, rapport hebdomadaire, et vos 2 flux de statistiques Google et CSV, conservés tels quels). Généré par n8n/build_workflow.py : ne pas le modifier à la main.n8n/La_boucle_alerte_erreurs.json : petit workflow qui vous envoie un courriel dès qu’une exécution échoue.n8n/La_boucle_images.json : workflow à lancer une fois après l’installation ; copie les images de l’ancienne carte dans Google Drive (« Images La boucle »).n8n/visuels/visuel_promo.py : le script Python des visuels du mois (Pillow), lancé sur le serveur par le nœud SSH « Publications – générer le visuel » (identifiant « SSH Password account ») ; n8n/lieux_initiaux.json : les 70 points de l’ancienne carte, copiés dans la table Lieux à l’installation.n8n/tables.py (10 tables : Clients, Commerçants, Historique, Demandes, Journal, Infolettre, Participations, Concours, Lieux, Publications, toutes les colonnes en texte). Un commerce est identifié par son ID_Commerce permanent (COM-001…), attribué à l’installation ou à sa première connexion : son nom peut changer sans briser son historique. n8n/La_boucle_installation.json crée les tables et y copie le Google Sheet N8N_La_boucle_locale_v2, créé à partir du fichier Excel de migration (une seule fois ; l’ancien Sheet n’est pas utilisé). sheet/build_xlsx.py ne sert qu’à cette migration ; le fichier Excel produit contient des données et n’est jamais déposé ici.docs/MISE_EN_PLACE.md : le guide de mise en service.docs/EFVP.md : l’évaluation des facteurs relatifs à la vie privée (version officielle ; à imprimer pour la signature).procedurier/Procedurier_La_boucle_locale.docx : le procédurier complet (fonctionnement, procédures, maintenance planifiée, dépannage, Loi 25).n8n/code/, n8n/build_workflow.py, n8n/source_v1.json et tests/ : les sources des nœuds Code, le générateur du workflow et les tests automatisés (voir la section 13 du procédurier).procedurier/ : les sources du procédurier (facultatif ; le .docx se modifie directement dans Word).Suivez docs/MISE_EN_PLACE.md, étape par étape (DNS, préparation des données, Google Cloud, n8n, ses data tables et sa clé d’API, GitHub et ses secrets, textes à compléter, fusion, tests, sécurité, lancement).
Total_Visites, Infolettre_Abonne et Nombre_Scan, puis sauvegarde (.zip d’un CSV par table, sans jetons de session) dans le dossier Google Drive « Sauvegardes La boucle », 30 jours conservés. Les pages se rafraîchissent aux 20 secondes en attente de confirmation et aux 30 secondes après un scan, puis s’arrêtent.docs/EFVP.md.| Courriel | Destinataire | Part… | |—|—|—| | Bienvenue, confirmation, codes, mot de passe | client ou commerce qui l’a demandé | immédiatement (action de la personne) | | Promotion (et nouvelles) approuvée / refusée | commerce | après votre décision (avec le texte final, et une note s’il a été corrigé) | | Trousse de publications du mois | vous | le 1er, automatiquement (rien n’est publié sans vous) | | Coordonnées du commerce (invitation à le contacter) | client | après votre approbation | | Rappels de promotions (J-14, J-4) | commerces sans soumission | seulement si vous approuvez (sinon rien après 2 jours) | | Commentaires du vendredi | commerces | seulement si vous approuvez (sinon rien après 2 jours) | | Gagnant du concours | gagnant | seulement si vous approuvez (sinon rien après 7 jours) | | Rapport du lundi, alertes de trafic, erreurs | vous | automatiquement |
Si personne n’approuve plus rien, le système cesse de solliciter les commerces et les clients.
1 participation par membre confirmé ; +1 par commerce visité par jour (avec ou sans promotion) ; +1 par commentaire approuvé ; +1 par Tournée locale (3 commerces le même jour) ; +2 Explorateur (5 commerces différents dans le mois) ; +1 Habitué (une visite chacun des 3 derniers mois). Les seuils sont dans CONCOURS (n8n/code/_commun.js). Tirage pondéré le 1er à 00 h 30, consigné dans la table Concours ; vous approuvez avant que le gagnant soit avisé. Les participations sans achat reçues par courriel ou par la poste s’inscrivent à la main dans la table Participations (2 par texte). Une personne qui ne veut pas participer : Concours = Non dans Clients.
site/lib/leaflet/). Fond de plan : © OpenStreetMap contributors, © CARTO (mention affichée sur la carte).site/lib/polices/ttf/OFL-IBM-Plex.txt).