From a0655d2e45b85b7bb18e17614376dd38372ee0c8 Mon Sep 17 00:00:00 2001 From: Dan Allaire Date: Thu, 25 Jun 2026 18:45:42 -0400 Subject: [PATCH] site web --- .../ansible/inventories/prod/hosts.yml | 49 +-- site-alliance-boreale/README.md | 91 +++++ .../deploy/alliance-boreale.nginx.conf | 78 ++++ site-alliance-boreale/deploy/deployer.sh | 54 +++ site-alliance-boreale/promo.piz | Bin 0 -> 27129 bytes site-alliance-boreale/public/404.html | 30 ++ .../public/assets/css/styles.css | 350 ++++++++++++++++++ .../public/assets/js/constellation.js | 102 +++++ site-alliance-boreale/public/atelier.html | 141 +++++++ .../public/constellation.html | 107 ++++++ site-alliance-boreale/public/contact.html | 100 +++++ site-alliance-boreale/public/faq.html | 236 ++++++++++++ site-alliance-boreale/public/favicon.svg | 46 +++ site-alliance-boreale/public/index.html | 124 +++++++ site-alliance-boreale/public/label.html | 152 ++++++++ site-alliance-boreale/public/vision.html | 119 ++++++ 16 files changed, 1739 insertions(+), 40 deletions(-) create mode 100644 site-alliance-boreale/README.md create mode 100644 site-alliance-boreale/deploy/alliance-boreale.nginx.conf create mode 100755 site-alliance-boreale/deploy/deployer.sh create mode 100644 site-alliance-boreale/promo.piz create mode 100644 site-alliance-boreale/public/404.html create mode 100644 site-alliance-boreale/public/assets/css/styles.css create mode 100644 site-alliance-boreale/public/assets/js/constellation.js create mode 100644 site-alliance-boreale/public/atelier.html create mode 100644 site-alliance-boreale/public/constellation.html create mode 100644 site-alliance-boreale/public/contact.html create mode 100644 site-alliance-boreale/public/faq.html create mode 100644 site-alliance-boreale/public/favicon.svg create mode 100644 site-alliance-boreale/public/index.html create mode 100644 site-alliance-boreale/public/label.html create mode 100644 site-alliance-boreale/public/vision.html diff --git a/infrastructure/ansible/inventories/prod/hosts.yml b/infrastructure/ansible/inventories/prod/hosts.yml index 24f30b5..7314d3e 100644 --- a/infrastructure/ansible/inventories/prod/hosts.yml +++ b/infrastructure/ansible/inventories/prod/hosts.yml @@ -10,66 +10,35 @@ "c2_edge": "hosts": {} "c3_core": - "hosts": - "c3-netbox-01": - "ansible_host": "192.168.10.30" - "boreale_env": null - "boreale_layer": "c3" - "boreale_managed_by": "opentofu" - "boreale_role": "netbox" + "hosts": {} "c3_identity": "hosts": {} "c3_supervision": - "hosts": - "c3-icinga-01": - "ansible_host": "192.168.10.31" - "boreale_env": null - "boreale_layer": "c3" - "boreale_managed_by": "opentofu" - "boreale_role": "icinga" - "icinga_role": "master" + "hosts": {} "c4_forge": - "hosts": - "c4-forgejo-01": - "ansible_host": "192.168.10.40" - "boreale_env": null - "boreale_layer": "c4" - "boreale_managed_by": "opentofu" - "boreale_role": "forgejo" + "hosts": {} "c5_pivot": - "hosts": - "c5-runner-01": - "ansible_host": "192.168.10.50" - "boreale_env": null - "boreale_layer": "c5" - "boreale_managed_by": "opentofu" - "boreale_role": "runner" + "hosts": {} "tenants": "children": "c6_services": "hosts": {} "c7_products": "hosts": - "c7-87-16-01": - "ansible_host": "192.168.12.45" - "boreale_env": null - "boreale_layer": "c7" - "boreale_managed_by": "opentofu" - "boreale_role": "87-16" "c7-87-16-02": "ansible_host": "192.168.12.46" "boreale_env": null "boreale_layer": "c7" "boreale_managed_by": "opentofu" "boreale_role": "87-16" - "c7-life-noc-01": - "ansible_host": "192.168.12.40" + "c7-gestion-01": + "ansible_host": "192.168.8.30" "boreale_env": null "boreale_layer": "c7" "boreale_managed_by": "opentofu" - "boreale_role": "life-noc" - "c7-life-noc-02": - "ansible_host": "192.168.12.20" + "boreale_role": "gestion" + "c7-life-noc-01": + "ansible_host": "192.168.12.40" "boreale_env": null "boreale_layer": "c7" "boreale_managed_by": "opentofu" diff --git a/site-alliance-boreale/README.md b/site-alliance-boreale/README.md new file mode 100644 index 0000000..7de0c84 --- /dev/null +++ b/site-alliance-boreale/README.md @@ -0,0 +1,91 @@ +# Site — Alliance Boréale + +Site web statique de l'**Alliance Boréale — souveraineté numérique**. +Thème : aurore boréale, étoiles, constellation. Aucune dépendance, aucun build, +aucun pistage, aucune ressource tierce (police système, JS et CSS locaux). + +> Ce site **remplace** l'ancien `alliance-boreale.ca`, déclaré obsolète. +> Il abandonne volontairement toute imagerie **forestière** (sapin, « forêt +> numérique ») pour éviter la confusion avec l'OBNL *Alliance Forêt Boréale*, +> et adopte le registre **aurore / constellation**. + +## Arborescence + +``` +site-alliance-boreale/ +├── public/ # racine web (ce que nginx sert) +│ ├── index.html # Accueil +│ ├── vision.html # Vision, valeurs, infrastructure mutualisée, « tout est libre » +│ ├── label.html # Le Label : 3 niveaux (Souverain / Résilient / Exemplaire) +│ ├── constellation.html # Les artisans = étoiles ; réciprocité +│ ├── atelier.html # Set-OPS (moteur libre) + la forge de l'Alliance +│ ├── faq.html # Questions & réponses (par public + le Label) +│ ├── contact.html # Contact +│ ├── 404.html +│ └── assets/ +│ ├── css/styles.css +│ └── js/constellation.js # champ d'étoiles + lignes de constellation +└── deploy/ + ├── alliance-boreale.nginx.conf # exemple de vhost + └── deployer.sh # synchronisation rsync + reload nginx +``` + +## Prévisualiser en local + +Aucun outil requis ; un simple serveur statique suffit : + +```bash +cd public +python3 -m http.server 8080 +# puis http://localhost:8080 +``` + +## Déployer sur web-frontal-01 + +1. **Créer la racine web** sur le serveur (une fois) : + + ```bash + ssh ansible@web-frontal-01 'sudo mkdir -p /var/www/alliance-boreale \ + && sudo chown ansible:ansible /var/www/alliance-boreale' + ``` + +2. **Installer le vhost** (une fois) : + + ```bash + scp deploy/alliance-boreale.nginx.conf \ + ansible@web-frontal-01:/tmp/alliance-boreale.conf + ssh ansible@web-frontal-01 ' + sudo mv /tmp/alliance-boreale.conf /etc/nginx/sites-available/ && + sudo ln -sf /etc/nginx/sites-available/alliance-boreale.conf \ + /etc/nginx/sites-enabled/alliance-boreale.conf && + sudo nginx -t && sudo systemctl reload nginx' + ``` + + > Adapter `server_name` et les chemins TLS dans le vhost. Le bloc HTTPS + > attend un certificat (step-ca interne, Let's Encrypt, etc.). + +3. **Déployer le contenu** (à chaque mise à jour) : + + ```bash + ./deploy/deployer.sh # valeurs par défaut + RECHARGER_NGINX=1 ./deploy/deployer.sh # + reload nginx + DRY_RUN=1 ./deploy/deployer.sh # simulation + ``` + + Variables : `HOTE`, `UTILISATEUR`, `RACINE`, `PORT_SSH`, `RECHARGER_NGINX`, `DRY_RUN`. + +## À personnaliser avant publication + +- **Courriel de contact** dans `public/contact.html` (`info@alliance-boreale.ca` + est un repère à remplacer). +- **`server_name`** et **chemins des certificats** dans le vhost. +- Logo si vous en avez un (le « brand-mark » de l'en-tête est dessiné en CSS). + Le **favicon** (`public/favicon.svg`, étoile + aurore) est déjà fourni. + +## Choix techniques + +- **Statique pur** : portable, auditable, longévité maximale, souverain. +- **Zéro tiers** : pas de CDN, pas de Google Fonts, pas de tracker. CSP stricte + `default-src 'self'`. +- **Accessibilité** : navigation au clavier, `skip-link`, contrastes, + `prefers-reduced-motion` respecté (l'animation s'arrête). diff --git a/site-alliance-boreale/deploy/alliance-boreale.nginx.conf b/site-alliance-boreale/deploy/alliance-boreale.nginx.conf new file mode 100644 index 0000000..8662b42 --- /dev/null +++ b/site-alliance-boreale/deploy/alliance-boreale.nginx.conf @@ -0,0 +1,78 @@ +# ============================================================================= +# Alliance Boréale — vhost nginx (site statique) +# À déposer sur web-frontal-01 dans /etc/nginx/sites-available/, puis lier +# dans sites-enabled/. Sert le contenu statique de /var/www/alliance-boreale. +# +# sudo ln -s /etc/nginx/sites-available/alliance-boreale.conf \ +# /etc/nginx/sites-enabled/alliance-boreale.conf +# sudo nginx -t && sudo systemctl reload nginx +# +# Adapter : server_name, chemins des certificats TLS, racine si besoin. +# ============================================================================= + +# --- Redirection HTTP -> HTTPS --------------------------------------------- +server { + listen 80; + listen [::]:80; + server_name alliance-boreale.ca www.alliance-boreale.ca; + + # Laisser passer les défis ACME si vous en utilisez un : + location /.well-known/acme-challenge/ { + root /var/www/alliance-boreale; + } + + location / { + return 301 https://$host$request_uri; + } +} + +# --- Site HTTPS ------------------------------------------------------------- +server { + listen 443 ssl; + listen [::]:443 ssl; + http2 on; + server_name alliance-boreale.ca www.alliance-boreale.ca; + + root /var/www/alliance-boreale; + index index.html; + + # --- TLS (adapter les chemins : step-ca interne, Let's Encrypt, etc.) --- + ssl_certificate /etc/ssl/alliance-boreale/fullchain.pem; + ssl_certificate_key /etc/ssl/alliance-boreale/privkey.pem; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers off; + ssl_session_timeout 1d; + ssl_session_cache shared:AB_TLS:10m; + + # --- En-têtes de sécurité (site statique, sans pistage) ---------------- + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; + # Tout le contenu est local : pas de CDN, pas de tiers. + add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always; + # Décommenter une fois le HTTPS stabilisé sur le domaine : + # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + + # --- Compression -------------------------------------------------------- + gzip on; + gzip_types text/css application/javascript text/html image/svg+xml; + gzip_min_length 1024; + + # --- Cache des actifs statiques ---------------------------------------- + location /assets/ { + expires 7d; + add_header Cache-Control "public"; + } + + # --- Routage ------------------------------------------------------------ + location / { + try_files $uri $uri/ $uri.html =404; + } + + error_page 404 /404.html; + + # Pas de logs d'accès nominatifs au-delà du nécessaire (sobriété/vie privée). + access_log /var/log/nginx/alliance-boreale.access.log; + error_log /var/log/nginx/alliance-boreale.error.log; +} diff --git a/site-alliance-boreale/deploy/deployer.sh b/site-alliance-boreale/deploy/deployer.sh new file mode 100755 index 0000000..233ff8f --- /dev/null +++ b/site-alliance-boreale/deploy/deployer.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# ============================================================================= +# Déploiement du site Alliance Boréale vers web-frontal-01 (ou tout hôte nginx). +# +# Synchronise public/ vers la racine web distante, puis (optionnel) recharge +# nginx. N'embarque aucun secret. À lancer depuis votre poste. +# +# ./deploy/deployer.sh # déploie avec les valeurs par défaut +# HOTE=web-frontal-01 ./deploy/deployer.sh +# RACINE=/var/www/alliance-boreale UTILISATEUR=ansible ./deploy/deployer.sh +# RECHARGER_NGINX=1 ./deploy/deployer.sh # recharge nginx après copie +# DRY_RUN=1 ./deploy/deployer.sh # simulation, ne copie rien +# ============================================================================= +set -euo pipefail + +# --- Paramètres (surcharger par variables d'environnement) ------------------ +HOTE="${HOTE:-web-frontal-01}" +UTILISATEUR="${UTILISATEUR:-ansible}" +RACINE="${RACINE:-/var/www/alliance-boreale}" +PORT_SSH="${PORT_SSH:-22}" +RECHARGER_NGINX="${RECHARGER_NGINX:-0}" +DRY_RUN="${DRY_RUN:-0}" + +# --- Emplacements ----------------------------------------------------------- +ICI="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +SOURCE="${ICI}/public/" + +if [[ ! -d "${SOURCE}" ]]; then + echo "ERREUR : dossier source introuvable : ${SOURCE}" >&2 + exit 1 +fi + +CIBLE="${UTILISATEUR}@${HOTE}:${RACINE}/" + +OPTS_RSYNC=(-az --delete --human-readable --itemize-changes + --exclude ".DS_Store" --exclude "*.swp") +[[ "${DRY_RUN}" == "1" ]] && OPTS_RSYNC+=(--dry-run) + +echo "==> Source : ${SOURCE}" +echo "==> Cible : ${CIBLE} (port SSH ${PORT_SSH})" +[[ "${DRY_RUN}" == "1" ]] && echo "==> MODE SIMULATION (aucune écriture)" +echo + +rsync "${OPTS_RSYNC[@]}" -e "ssh -p ${PORT_SSH}" "${SOURCE}" "${CIBLE}" + +if [[ "${RECHARGER_NGINX}" == "1" && "${DRY_RUN}" != "1" ]]; then + echo + echo "==> Vérification et rechargement de nginx sur ${HOTE}" + ssh -p "${PORT_SSH}" "${UTILISATEUR}@${HOTE}" 'sudo nginx -t && sudo systemctl reload nginx' +fi + +echo +echo "==> Terminé." +[[ "${DRY_RUN}" == "1" ]] && echo " (simulation — relancer sans DRY_RUN=1 pour déployer pour de vrai)" diff --git a/site-alliance-boreale/promo.piz b/site-alliance-boreale/promo.piz new file mode 100644 index 0000000000000000000000000000000000000000..795b08c0fa1019effbdf9c19c9e306178893ed45 GIT binary patch literal 27129 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 g|4UNzf_+Vf + + + + + Page introuvable — Alliance Boréale + + + + + + + +
+
+

Erreur 404

+

Cette étoile n'existe pas

+

La page demandée s'est éteinte ou n'a jamais brillé. Revenons vers la constellation.

+ +
+
+ + + + diff --git a/site-alliance-boreale/public/assets/css/styles.css b/site-alliance-boreale/public/assets/css/styles.css new file mode 100644 index 0000000..3931374 --- /dev/null +++ b/site-alliance-boreale/public/assets/css/styles.css @@ -0,0 +1,350 @@ +/* ========================================================================= + Alliance Boréale — souveraineté numérique + Thème : aurore boréale · étoiles · constellation + 100 % statique, sans dépendance, sans pistage. Police système (souveraineté). + ========================================================================= */ + +:root { + --bg: #05060f; + --bg-2: #0a0d24; + --panel: rgba(255, 255, 255, 0.045); + --panel-2: rgba(255, 255, 255, 0.07); + --border: rgba(255, 255, 255, 0.10); + --ink: #e9ecff; + --ink-dim: #99a1c9; + --ink-faint: #6b739b; + + --aurora-teal: #4fe3c1; + --aurora-cyan: #56c2ff; + --aurora-violet: #a98bff; + --aurora-green: #2ec18f; + --star: #ffffff; + --gold: #ffd58a; + + --maxw: 1080px; + --radius: 16px; + --shadow: 0 18px 50px rgba(0, 0, 0, 0.45); + + --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, + Ubuntu, Cantarell, "Noto Sans", "Helvetica Neue", Arial, sans-serif; +} + +*, +*::before, +*::after { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + font-family: var(--font); + color: var(--ink); + background: var(--bg); + line-height: 1.65; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + overflow-x: hidden; +} + +/* ---------- Ciel : aurore + constellation (fixe, derrière tout) ---------- */ +.sky { + position: fixed; + inset: 0; + z-index: -1; + background: + radial-gradient(1200px 700px at 80% -10%, #131a44 0%, transparent 60%), + radial-gradient(900px 600px at 10% 0%, #0e1640 0%, transparent 55%), + linear-gradient(180deg, var(--bg-2) 0%, var(--bg) 70%); +} + +.sky canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: block; +} + +.aurora { + position: absolute; + inset: -20% -10% auto -10%; + height: 70vh; + filter: blur(60px) saturate(140%); + opacity: 0.55; + background: + radial-gradient(40% 60% at 20% 30%, var(--aurora-teal) 0%, transparent 70%), + radial-gradient(45% 70% at 55% 20%, var(--aurora-cyan) 0%, transparent 70%), + radial-gradient(40% 65% at 80% 35%, var(--aurora-violet) 0%, transparent 70%); + animation: aurora-drift 22s ease-in-out infinite alternate; +} + +@keyframes aurora-drift { + 0% { transform: translate3d(-4%, -2%, 0) scale(1.05); opacity: 0.45; } + 50% { transform: translate3d(3%, 2%, 0) scale(1.15); opacity: 0.60; } + 100% { transform: translate3d(6%, -1%, 0) scale(1.08); opacity: 0.50; } +} + +/* ---------- Mise en page ---------- */ +.wrap { width: min(100% - 2.5rem, var(--maxw)); margin-inline: auto; } + +section { padding: clamp(3rem, 7vw, 6rem) 0; } + +.eyebrow { + display: inline-block; + font-size: 0.78rem; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--aurora-teal); + margin: 0 0 0.6rem; +} + +h1, h2, h3 { line-height: 1.15; letter-spacing: -0.015em; font-weight: 700; } +h1 { font-size: clamp(2.3rem, 6vw, 4rem); margin: 0 0 1rem; } +h2 { font-size: clamp(1.7rem, 3.6vw, 2.5rem); margin: 0 0 1rem; } +h3 { font-size: 1.2rem; margin: 0 0 0.5rem; } + +p { color: var(--ink-dim); margin: 0 0 1rem; } +.lead { font-size: clamp(1.05rem, 2vw, 1.3rem); color: var(--ink); max-width: 60ch; } + +a { color: var(--aurora-cyan); text-decoration: none; } +a:hover { text-decoration: underline; } + +.gradient-text { + background: linear-gradient(100deg, var(--aurora-teal), var(--aurora-cyan) 45%, var(--aurora-violet)); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +/* ---------- En-tête / navigation ---------- */ +.site-header { + position: sticky; + top: 0; + z-index: 50; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0.9rem clamp(1rem, 4vw, 2.5rem); + background: rgba(5, 6, 15, 0.55); + backdrop-filter: blur(14px); + border-bottom: 1px solid var(--border); +} + +.brand { display: inline-flex; align-items: center; gap: 0.7rem; color: var(--ink); } +.brand:hover { text-decoration: none; } + +.brand-mark { + width: 30px; height: 30px; + border-radius: 50%; + background: + radial-gradient(circle at 35% 30%, var(--star) 0 2px, transparent 3px), + conic-gradient(from 200deg, var(--aurora-violet), var(--aurora-cyan), var(--aurora-teal), var(--aurora-violet)); + box-shadow: 0 0 18px rgba(86, 194, 255, 0.55); + flex: none; +} + +.brand-text { display: flex; flex-direction: column; line-height: 1.1; } +.brand-name { font-weight: 700; letter-spacing: 0.01em; } +.brand-sub { font-size: 0.72rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); } + +.site-nav ul { + list-style: none; + display: flex; + gap: 0.4rem; + margin: 0; padding: 0; +} +.site-nav a { + display: block; + padding: 0.5rem 0.85rem; + border-radius: 999px; + color: var(--ink-dim); + font-size: 0.95rem; +} +.site-nav a:hover { color: var(--ink); background: var(--panel); text-decoration: none; } +.site-nav a[aria-current="page"] { color: var(--ink); background: var(--panel-2); } + +.nav-toggle { + display: none; + background: var(--panel); + border: 1px solid var(--border); + color: var(--ink); + border-radius: 10px; + padding: 0.5rem 0.7rem; + font-size: 0.95rem; + cursor: pointer; +} + +/* ---------- Héro ---------- */ +.hero { padding-top: clamp(3rem, 8vw, 6.5rem); text-align: center; } +.hero .lead { margin-inline: auto; } +.hero-cta { display: flex; gap: 0.8rem; justify-content: center; flex-wrap: wrap; margin-top: 1.8rem; } + +/* ---------- Boutons ---------- */ +.btn { + display: inline-block; + padding: 0.8rem 1.4rem; + border-radius: 999px; + font-weight: 600; + border: 1px solid var(--border); + color: var(--ink); + transition: transform 0.15s ease, box-shadow 0.15s ease; +} +.btn:hover { text-decoration: none; transform: translateY(-2px); } +.btn-primary { + background: linear-gradient(100deg, var(--aurora-teal), var(--aurora-cyan)); + color: #04121a; + border-color: transparent; + box-shadow: 0 10px 30px rgba(79, 227, 193, 0.25); +} +.btn-primary:hover { box-shadow: 0 14px 38px rgba(86, 194, 255, 0.35); } +.btn-ghost { background: var(--panel); } + +/* ---------- Cartes / grilles ---------- */ +.grid { display: grid; gap: 1.2rem; } +.grid-3 { grid-template-columns: repeat(3, 1fr); } +.grid-2 { grid-template-columns: repeat(2, 1fr); } + +.card { + background: var(--panel); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 1.6rem; + backdrop-filter: blur(6px); +} +.card h3 { color: var(--ink); } +.card p:last-child { margin-bottom: 0; } + +.star-bullet { color: var(--aurora-teal); margin-right: 0.4rem; } + +/* ---------- Le Label : paliers ---------- */ +.tiers { display: grid; gap: 1.2rem; grid-template-columns: repeat(3, 1fr); align-items: stretch; } +.tier { + position: relative; + background: var(--panel); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 1.8rem 1.6rem; + overflow: hidden; +} +.tier::before { + content: ""; + position: absolute; + inset: 0 0 auto 0; + height: 4px; +} +.tier-1::before { background: var(--aurora-teal); } +.tier-2::before { background: var(--aurora-cyan); } +.tier-3::before { background: var(--aurora-violet); } +.tier .tier-rank { font-size: 0.8rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-faint); } +.tier h3 { font-size: 1.5rem; margin-top: 0.2rem; } +.tier ul { padding-left: 0; list-style: none; margin: 1rem 0 0; } +.tier li { color: var(--ink-dim); padding: 0.35rem 0; border-top: 1px solid var(--border); } +.tier li:first-child { border-top: none; } +.tier .privilege { color: var(--ink); font-weight: 600; } + +/* ---------- Citation ---------- */ +.quote { + border-left: 3px solid var(--aurora-cyan); + padding: 0.4rem 0 0.4rem 1.4rem; + font-size: clamp(1.15rem, 2.4vw, 1.6rem); + color: var(--ink); + font-style: italic; + max-width: 60ch; +} +.quote cite { display: block; font-style: normal; font-size: 0.95rem; color: var(--ink-faint); margin-top: 0.8rem; } + +/* ---------- Bandeau ---------- */ +.panel-feature { + background: var(--panel); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: clamp(1.8rem, 4vw, 3rem); +} + +/* ---------- Pied de page ---------- */ +.site-footer { + border-top: 1px solid var(--border); + background: rgba(5, 6, 15, 0.6); + padding: clamp(2.5rem, 5vw, 4rem) 0 2rem; + margin-top: 2rem; +} +.footer-grid { display: grid; grid-template-columns: 2fr 1fr; gap: 2rem; } +.site-footer nav ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 0.4rem; } +.site-footer nav a { color: var(--ink-dim); } +.site-footer .legal { + margin-top: 2rem; + padding-top: 1.4rem; + border-top: 1px solid var(--border); + font-size: 0.85rem; + color: var(--ink-faint); +} + +/* ---------- Accessibilité ---------- */ +:focus-visible { outline: 2px solid var(--aurora-cyan); outline-offset: 3px; border-radius: 6px; } +.skip-link { + position: absolute; left: -9999px; top: 0; + background: var(--aurora-cyan); color: #04121a; padding: 0.6rem 1rem; border-radius: 0 0 10px 0; z-index: 100; +} +.skip-link:focus { left: 0; } + +/* ---------- FAQ (accordéons natifs) ---------- */ +.faq-group { margin-top: 1rem; } +details.qa { + background: var(--panel); + border: 1px solid var(--border); + border-radius: 14px; + margin: 0.7rem 0; + padding: 0 1.3rem; +} +details.qa[open] { background: var(--panel-2); } +details.qa summary { + list-style: none; + cursor: pointer; + position: relative; + padding: 1.1rem 2.2rem 1.1rem 0; + font-weight: 600; + color: var(--ink); + font-size: 1.05rem; +} +details.qa summary::-webkit-details-marker { display: none; } +details.qa summary::after { + content: "+"; + position: absolute; right: 0; top: 50%; + transform: translateY(-50%); + color: var(--aurora-teal); + font-size: 1.5rem; line-height: 1; font-weight: 400; + transition: transform 0.2s ease; +} +details.qa[open] summary::after { content: "\2212"; } +details.qa .answer { + color: var(--ink-dim); + padding: 0 0 1.3rem; + max-width: 68ch; +} +details.qa .answer strong { color: var(--ink); } +details.qa .answer em { color: var(--aurora-teal); font-style: italic; } + +/* ---------- Responsive ---------- */ +@media (max-width: 820px) { + .grid-3, .grid-2, .tiers, .footer-grid { grid-template-columns: 1fr; } + + .nav-toggle { display: inline-block; } + .site-nav ul { + position: absolute; + top: 100%; left: 0; right: 0; + flex-direction: column; + gap: 0; + background: rgba(5, 6, 15, 0.96); + border-bottom: 1px solid var(--border); + padding: 0.5rem; + display: none; + } + .site-nav.open ul { display: flex; } + .site-nav a { border-radius: 10px; } +} + +@media (prefers-reduced-motion: reduce) { + .aurora { animation: none; } + html { scroll-behavior: auto; } +} diff --git a/site-alliance-boreale/public/assets/js/constellation.js b/site-alliance-boreale/public/assets/js/constellation.js new file mode 100644 index 0000000..3e7e825 --- /dev/null +++ b/site-alliance-boreale/public/assets/js/constellation.js @@ -0,0 +1,102 @@ +/* Alliance Boréale — champ d'étoiles + constellation. + Vanilla JS, aucune dépendance. Désactivé si l'utilisateur préfère moins + d'animation. La métaphore : chaque artisan est une étoile ; reliés, ils + forment la constellation. */ + +(function () { + "use strict"; + + /* ---- Menu mobile ---- */ + var nav = document.querySelector(".site-nav"); + var toggle = document.querySelector(".nav-toggle"); + if (nav && toggle) { + toggle.addEventListener("click", function () { + var open = nav.classList.toggle("open"); + toggle.setAttribute("aria-expanded", open ? "true" : "false"); + }); + } + + /* ---- Constellation ---- */ + var canvas = document.getElementById("constellation"); + if (!canvas) return; + + var reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + var ctx = canvas.getContext("2d"); + var stars = []; + var w = 0, h = 0, dpr = Math.min(window.devicePixelRatio || 1, 2); + var LINK_DIST = 130; + + function resize() { + w = canvas.clientWidth; + h = canvas.clientHeight; + canvas.width = w * dpr; + canvas.height = h * dpr; + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + seed(); + } + + function seed() { + var count = Math.round((w * h) / 14000); + count = Math.max(40, Math.min(160, count)); + stars = []; + for (var i = 0; i < count; i++) { + stars.push({ + x: Math.random() * w, + y: Math.random() * h, + r: Math.random() * 1.3 + 0.4, + vx: (Math.random() - 0.5) * 0.12, + vy: (Math.random() - 0.5) * 0.12, + tw: Math.random() * Math.PI * 2 + }); + } + } + + function draw() { + ctx.clearRect(0, 0, w, h); + + // liens de constellation + for (var i = 0; i < stars.length; i++) { + for (var j = i + 1; j < stars.length; j++) { + var dx = stars[i].x - stars[j].x; + var dy = stars[i].y - stars[j].y; + var d = Math.sqrt(dx * dx + dy * dy); + if (d < LINK_DIST) { + var a = (1 - d / LINK_DIST) * 0.22; + ctx.strokeStyle = "rgba(120, 200, 255," + a + ")"; + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.moveTo(stars[i].x, stars[i].y); + ctx.lineTo(stars[j].x, stars[j].y); + ctx.stroke(); + } + } + } + + // étoiles + for (var k = 0; k < stars.length; k++) { + var s = stars[k]; + s.tw += 0.02; + var glow = 0.6 + Math.sin(s.tw) * 0.4; + ctx.beginPath(); + ctx.arc(s.x, s.y, s.r, 0, Math.PI * 2); + ctx.fillStyle = "rgba(255,255,255," + glow + ")"; + ctx.shadowColor = "rgba(160,220,255,0.9)"; + ctx.shadowBlur = 6; + ctx.fill(); + ctx.shadowBlur = 0; + + if (!reduce) { + s.x += s.vx; + s.y += s.vy; + if (s.x < 0 || s.x > w) s.vx *= -1; + if (s.y < 0 || s.y > h) s.vy *= -1; + } + } + + if (!reduce) requestAnimationFrame(draw); + } + + window.addEventListener("resize", resize); + resize(); + draw(); // un rendu statique si reduce, sinon animé +})(); diff --git a/site-alliance-boreale/public/atelier.html b/site-alliance-boreale/public/atelier.html new file mode 100644 index 0000000..21a9de8 --- /dev/null +++ b/site-alliance-boreale/public/atelier.html @@ -0,0 +1,141 @@ + + + + + + L'atelier — Alliance Boréale + + + + + + + + + + + + +
+
+

L'atelier ouvert

+

Le moteur derrière la promesse : Set-OPS

+

La souveraineté ne se décrète pas, elle s'outille. Set-OPS est le moteur Ansible libre de l'Alliance Boréale : on décrit l'écosystème dans un plan, et la flotte de serveurs se déploie, durcie et reproductible, sur du logiciel libre de bout en bout.

+ +
+ +
+

Comment ça marche

+

Un plan déclaratif, une flotte cohérente

+
+
+

On édite le plan

+

Serveurs, applications, bases de données, domaines : tout est décrit dans des fichiers lisibles. La vérité tient dans le plan, pas dans la tête d'un administrateur.

+
+
+

L'inventaire se génère

+

Set-OPS dérive l'inventaire Ansible depuis le plan : adressage, groupes et rôles découlent de la nomenclature, sans saisie en double.

+
+
+

Les VM se clonent

+

Chaque serveur naît d'un golden template Debian 13 durci sur Proxmox : socle commun, identité par cloud-init, puis configuration réelle par Ansible.

+
+
+

Les rôles s'appliquent

+

Par groupes, de façon idempotente. Le même plan rejoué redonne le même état : traçable, auditable, reproductible.

+
+
+
+ +
+
+

Un écosystème complet

+

Des piliers, tous libres

+

Set-OPS assemble les briques d'un écosystème souverain — chacune un logiciel libre éprouvé :

+
+

Socle durci

Debian 13, AppArmor, auditd, fail2ban, mises à jour automatiques, nftables préparé.

+

PKI & DNS

Autorité de certification interne et résolution de noms souveraine.

+

Identité & SSO

Annuaire et authentification unique pour tout l'écosystème.

+

Bases de données

Stockage relationnel et cache, opérés selon les mêmes règles.

+

Observabilité

Métriques, journaux, tableaux de bord et supervision.

+

Forge

Hébergement du code et de l'automatisation — la forge de l'Alliance.

+
+
+
+ +
+

La forge

+

Là où vit le code commun

+

La forge de l'Alliance Boréale héberge Set-OPS et l'automatisation de l'écosystème, sur du logiciel libre. C'est l'un des services mutualisés de l'infrastructure — et la preuve concrète que « tout est libre » n'est pas qu'une devise.

+
+ +
+

Cloner Set-OPS

+

Le moteur est offert à la communauté québécoise :

+

git clone https://forge.alliance-boreale.ca/Alliance-Boreale/Set-OPS-Public.git

+
+
+
+ +
+
+
+ « Set-OPS s'exploite entièrement à la main, sans aucune IA. La souveraineté, c'est aussi ne dépendre d'aucune boîte noire. » +
+
+
+
+ +
+ + +
+ + + + diff --git a/site-alliance-boreale/public/constellation.html b/site-alliance-boreale/public/constellation.html new file mode 100644 index 0000000..038161f --- /dev/null +++ b/site-alliance-boreale/public/constellation.html @@ -0,0 +1,107 @@ + + + + + + La Constellation — Alliance Boréale + + + + + + + + + + + + +
+
+

La Constellation

+

Chaque artisan est une étoile

+

Pris séparément, un artisan du numérique reste fragile : une panne, une absence, un sinistre. Reliés, les artisans forment une constellation — un dessin stable que l'on reconnaît dans le ciel, même si une étoile vacille.

+
+ « Tu ne dépends pas d'une étoile, mais de la constellation. » +
+
+ +
+

Comment ça tient

+

La réciprocité, pas la hiérarchie

+
+
+

Entraide opérée

+

L'infrastructure commune — DNS, forges, supervision, sauvegardes — est portée par le réseau, pas par chacun dans son coin.

+
+
+

Reprise mutuelle

+

Si une étoile tombe, une autre reprend ses clients. La portabilité prouvée rend cette promesse réelle, pas théorique.

+
+
+

Audit entre pairs

+

On se vérifie mutuellement, avec bienveillance et rigueur. La confiance circule de pair à pair, gratuitement.

+
+
+
+ +
+
+

Qui peut rejoindre

+

Une place pour chaque étoile

+

L'Alliance Boréale s'adresse aux artisans et organisations du numérique au Québec — petits ou grands — qui veulent offrir des services souverains, libres et dignes de confiance. On entre par la transparence : on déclare ce que l'on fait, on accepte le regard des pairs, on progresse à travers le Label.

+ +
+
+
+ +
+ + +
+ + + + diff --git a/site-alliance-boreale/public/contact.html b/site-alliance-boreale/public/contact.html new file mode 100644 index 0000000..6853fe5 --- /dev/null +++ b/site-alliance-boreale/public/contact.html @@ -0,0 +1,100 @@ + + + + + + Contact — Alliance Boréale + + + + + + + + + + + + +
+
+

Contact

+

Allumons une nouvelle étoile

+

Vous portez un projet numérique souverain, ou vous voulez rejoindre la constellation ? Écrivez-nous. L'Alliance Boréale est un projet collectif et polyphonique — votre voix y a sa place.

+
+ +
+
+ +
+

Président-fondateur

+

Daniel Allaire

+

Porteur d'une vision : une façon différente, responsable et durable, de concevoir nos écosystèmes numériques.

+
+
+
+ +
+
+
+ « L'Alliance Boréale, c'est avant tout une vision : une façon différente de concevoir nos écosystèmes numériques. » + — Daniel Allaire, président-fondateur +
+
+
+
+ +
+ + +
+ + + + diff --git a/site-alliance-boreale/public/faq.html b/site-alliance-boreale/public/faq.html new file mode 100644 index 0000000..a80f7f1 --- /dev/null +++ b/site-alliance-boreale/public/faq.html @@ -0,0 +1,236 @@ + + + + + + FAQ — Alliance Boréale + + + + + + + + + + + + +
+
+

Questions & réponses

+

Des réponses franches

+

Voici les questions qu'on nous pose le plus souvent — des professionnels du milieu aux décideurs publics. Quand quelque chose est encore en chantier, on le dit : la franchise distingue l'artisan sérieux du vendeur de rêve.

+
+ +
+

Aux professionnels du milieu

+

MSP, intégrateurs, revendeurs

+
+
+ Confier des données de PME à des structures moins outillées, n'est-ce pas risqué ? +
L'outil encode les bonnes pratiques — durcissement, PKI interne, validations à chaque étape, golden template commun. Il élève le plancher, il ne l'abaisse pas. Un sysadmin compétent n'est pas un amateur ; il lui manquait surtout un levier. Et la continuité ne repose plus sur un individu, mais sur le réseau.
+
+
+ Vous cassez le marché avec du gratuit. +
On ne casse rien : on rouvre un marché que les géants étrangers ont capté. L'outil est libre, mais l'expertise et le service, eux, se paient — c'est le modèle Red Hat. Et très franchement, un professionnel aguerri serait un excellent candidat : l'outil le rend plus efficace, il ne le remplace pas.
+
+
+ Vous n'aurez jamais notre échelle ni nos SLA. +
Exact, et c'est volontaire. On ne cherche pas à battre le géant sur son terrain — le capital — on change de terrain : la proximité et la souveraineté. Pour une PME, un hébergeur local qu'on peut appeler vaut souvent mieux qu'un SLA papier d'un géant injoignable.
+
+
+ Pourquoi ne devrais-je pas vous voir comme un concurrent ? +
Parce que le vrai concurrent, celui qui aspire vos clients année après année, c'est l'hyperscaler — pas nous. Nous, on vous donne le levier pour les garder ici, au Québec. On joue dans la même équipe.
+
+
+
+ +
+

Aux prudents et exigeants

+

Techniciens et investisseurs prudents

+
+
+ Un hébergeur seul peut-il offrir la fiabilité d'un hyperscaler ? +
Seul, non — et on ne le prétend pas. En constellation, oui, et c'est tout le design. La clé, c'est la portabilité : l'écosystème d'un client est un plan déclaratif reproductible. Si un hébergeur tombe, un autre le ré-instancie ailleurs. Le client ne fait pas confiance à un individu, mais au standard et au réseau.
+
+
+ Qui est responsable quand ça plante ? Sauvegardes, reprise ? +
L'hébergeur, contractuellement, comme tout hébergeur. La différence : plus de point unique de défaillance humain. Honnêtement, la sauvegarde et la reprise sont des volets encore à muscler — c'est sur la feuille de route.
+
+
+ Le Québec ne peut pas rivaliser avec des milliards de R&D. +
On ne rivalise pas en R&D — on récupère ce qui fuit déjà. Des dizaines de milliers de PME paient des géants étrangers ; en rapatrier une fraction localement, c'est énorme. Ça ne demande pas de battre AWS, juste d'offrir une alternative souveraine et joignable.
+
+
+ Open source, n'est-ce pas synonyme de mal maintenu ? +
Maintenu par un artisan et par l'Alliance, avec des validations automatiques à chaque changement. Et un point fort sous-estimé : l'outil s'exploite entièrement à la main, sans aucune IA, sans magie ni opacité — un humain lit et comprend tout. La transparence, c'est l'inverse du trou de sécurité.
+
+
+ Vous réinventez NetBox ou YunoHost. +
On en recoupe des morceaux, on l'assume — c'est écrit noir sur blanc dans le dépôt. Mais l'assemblage — Proxmox + Ansible + un modèle souverain léger, possédé en entier — n'existe nulle part. Et la règle est claire : si on se surprend à réimplémenter un NetBox, on l'adopte — on ne le réécrit pas.
+
+
+ N'est-ce pas déjà ce que font les CHATONS ? +
Un cousin qu'on admire — et il en existe déjà au Québec, donc on s'inscrit dans leur lignée. Mais deux pièces leur manquent par choix : un moteur technique commun (chaque chaton bricole sa propre stack) et un modèle viable pour servir des entreprises. On ajoute exactement ça : la portabilité et l'outillage. Pas un rival — le cousin d'ici, outillé.
+
+
+ C'est déployé en production, ou c'est de la vapeur ? +
Le moteur et la modélisation sont prouvés et validés ; le déploiement à grande échelle sur de vraies machines est l'étape en cours. On ne vend pas du « déployé partout » — on montre une fondation solide et un chemin clair.
+
+
+ C'est construit avec une IA — est-ce sérieux et maintenable ? +
L'IA a aidé à construire, mais l'outil ne dépend d'aucune IA pour s'exécuter ni se maintenir — c'est un impératif gravé dans le dépôt. Tout est commité, documenté, validé, lisible par un humain. La souveraineté va jusque-là : pas de laisse, ni géant, ni IA.
+
+
+ Êtes-vous certifiés SOC 2 ou ISO ? +
Pas aujourd'hui, et on ne le prétend pas. SOC 2 est un audit lourd, coûteux et surtout américain — un peu dissonant dans un récit de souveraineté. Ce que l'outil montre déjà : il encode les principes que ces normes auditent (sécurité, disponibilité, traçabilité), avec une trajectoire vers ISO 27001 à mesure que la constellation mûrit.
+
+
+
+ +
+

Aux curieux et futurs partenaires

+

Clients, hébergeurs candidats, alliés

+
+
+ En quoi est-ce mieux que Google ou AWS ? +
Tes données restent au Québec, chez un humain que tu peux appeler, sans verrouillage propriétaire. C'est souvent moins cher à ton échelle — et surtout réversible : tu repars avec ton écosystème quand tu veux. Tu n'es jamais prisonnier.
+
+
+ Et si mon hébergeur disparaît ? +
Tu n'es pas coincé : ton écosystème est portable, et un autre artisan de la constellation le reprend. Tu ne dépends pas d'un homme, mais d'un réseau et d'un standard. C'est ça, la vraie sécurité.
+
+
+ Est-ce aussi simple que le cloud ? +
Pour toi, oui — l'artisan s'occupe de toute la technique. La différence, c'est qu'il est à toi, local, joignable, et que tu n'es jamais enfermé. Le confort du cloud, sans la laisse.
+
+
+ Qu'est-ce qu'il me faut pour me lancer comme hébergeur ? +
Des bases solides en Linux, Ansible et Proxmox, une grappe Proxmox, et l'envie. L'outil est libre et ouvert ; tu pars d'un modèle prêt à déployer, tu le mets à tes couleurs, et un guide pas-à-pas te tient la main.
+
+
+ Est-ce que je peux en vivre ? +
Le modèle est celui de la boutique : peu de clients, à haute valeur, bien servis. Le levier de l'outil et le Label de l'Alliance te rendent crédible face à des PME qui veulent du local. Tu ne vises pas le volume — tu vises la relation.
+
+
+ Comment fonctionne la gouvernance ? +
Une alliance sans subordination : chaque membre reste pleinement souverain, et on mutualise ce qui a du sens — DNS, forge, supervision, label. La gouvernance est distribuée, et prendra une forme coopérative ou OBNL quand la constellation aura sa masse critique.
+
+
+
+ +
+

Aux décideurs publics

+

Décideurs, médias, bailleurs

+
+
+ En quoi est-ce un enjeu de souveraineté pour le Québec ? +
Aujourd'hui, les données et les dollars des PME québécoises partent chez des géants étrangers, soumis à des lois étrangères. Set-OPS et l'Alliance gardent les deux ici : sous le droit d'ici, contrôlés par des gens d'ici. La souveraineté numérique, concrètement.
+
+
+ Et le Cloud Act, les lois étrangères ? +
Des données chez un géant américain restent soumises au Cloud Act, même hébergées ici. Un hébergement souverain local, lui, relève uniquement du droit canadien et québécois. La localisation ne suffit pas — il faut la propriété.
+
+
+ Qu'en est-il de la Loi 25 ? +
La Loi 25 exige une évaluation avant toute communication de renseignements personnels hors Québec — une vraie friction. L'hébergement local l'efface : pas de transfert à justifier, pas d'exposition à un droit étranger. La conformité reste toutefois organisationnelle — l'outil la facilite, il ne la garantit pas.
+
+
+ Quelles retombées économiques concrètes ? +
On rapatrie une part des dépenses cloud de milliers de PME, et on crée des emplois d'artisans numériques répartis sur le territoire — régions comprises — plutôt que concentrés dans une tour. La valeur circule localement.
+
+
+ Est-ce pertinent pour les données publiques et le parapublic ? +
Oui, dès aujourd'hui : hébergement souverain pour OBNL, collectivités et organismes, avec une localisation et un contrôle réels, hors juridiction étrangère. C'est exactement le terrain où la souveraineté compte le plus.
+
+
+ Est-ce sérieux, ou un rêve militant ? +
La fondation technique est réelle et validée, et le modèle économique est éprouvé : du libre + des services, façon Red Hat. On ne parie pas des milliards — on réplique une petite cellule qui fonctionne. Une croissance fractale, pas un pari d'hyperscaler.
+
+
+ Et la sobriété numérique, l'environnement ? +
Le modèle est décentralisé et dimensionné juste — pas la surcapacité permanente d'un hyperscaler. C'est une valeur fondatrice de l'Alliance, pas un argument de façade.
+
+
+ Comment l'État ou un bailleur peut-il aider ? +
Trois leviers : orienter ses propres besoins vers du souverain ; financer la structuration (coopérative ou OBNL) et la formation des hébergeurs ; et reconnaître le Label comme gage de confiance. Pas subventionner un géant — outiller une constellation.
+
+
+
+ +
+

Le Label de l'Alliance

+

Une garantie vérifiable, jamais une hiérarchie de prestige

+
+
+ Qu'est-ce que le Label, concrètement ? +
Trois niveaux accumulatifs, qui certifient la garantie offerte au client — pas le « prestige » de l'artisan. Souverain : libre, local, transparent (le socle). Résilient : portable et couvert — si une étoile s'éteint, une autre te reprend. Exemplaire : porte le commun (contribution, transparence). Chaque niveau ajoute autant d'obligations que de privilèges. Voir le détail du Label.
+
+
+ Un audit par les pairs va-t-il exposer mes méthodes ? +
Non. Comme le standard est ouvert et déclaratif, le pair vérifie la conformité au barème via des preuves publiques (le plan, les CGU, la pile libre) + une démo de reprise — pas ta recette. Tu montres que ta stack atteint une barre publique ; tu n'ouvres pas tes livres. L'Alliance ne se mêle jamais de ta régie interne — ni salaires, ni prix.
+
+
+
+ +
+
+

Une autre question ?

+

Écrivez-nous

+

On répond avec la même franchise. Et si on ne sait pas, on le dit.

+ +
+
+
+ +
+ + +
+ + + + diff --git a/site-alliance-boreale/public/favicon.svg b/site-alliance-boreale/public/favicon.svg new file mode 100644 index 0000000..057b7e0 --- /dev/null +++ b/site-alliance-boreale/public/favicon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site-alliance-boreale/public/index.html b/site-alliance-boreale/public/index.html new file mode 100644 index 0000000..fc8fa7a --- /dev/null +++ b/site-alliance-boreale/public/index.html @@ -0,0 +1,124 @@ + + + + + + Alliance Boréale — souveraineté numérique + + + + + + + + + + + + +
+
+

Fédération québécoise du numérique éthique

+

Bâtir ensemble une infrastructure numérique souveraine

+

L'Alliance Boréale réunit des artisans du numérique qui partagent une même exigence : responsabilité, traçabilité, portabilité et sobriété. Chacun est une étoile ; ensemble, nous formons une constellation.

+ +
+ +
+
+
+

Infrastructure mutualisée

+

DNS, forges, supervision et sauvegardes opérés en commun, sur du logiciel libre. La robustesse d'un grand opérateur, à l'échelle d'un artisan.

+
+
+

Un Label de confiance

+

Trois niveaux — Souverain, Résilient, Exemplaire — qui certifient la garantie offerte au client, pas la taille de l'entreprise.

+
+
+

Tout est libre

+

L'écosystème entier se construit exclusivement avec du logiciel libre. Pas de boîte noire, pas de dépendance, pas de pistage.

+
+
+
+ +
+
+
+ « Tu ne dépends pas d'une étoile, mais de la constellation. » + — le principe de réciprocité de l'Alliance Boréale +
+
+
+ +
+
+

L'atelier ouvert

+

Le moteur derrière la promesse : Set-OPS

+

Notre souveraineté est outillée. Set-OPS, notre moteur Ansible libre, déploie des écosystèmes numériques durcis et reproductibles — et tout le code vit sur notre forge, ouvert à qui veut le lire.

+ +
+
+ +
+

Pourquoi maintenant

+

Le numérique souverain n'est pas un slogan

+

C'est une façon différente de concevoir nos écosystèmes : des données qui restent au Québec, des outils que l'on comprend de bout en bout, une résilience qui ne tient pas à un seul acteur. L'Alliance Boréale en fait un bien commun, documenté et partagé.

+ +
+
+ +
+ + +
+ + + + diff --git a/site-alliance-boreale/public/label.html b/site-alliance-boreale/public/label.html new file mode 100644 index 0000000..37e7276 --- /dev/null +++ b/site-alliance-boreale/public/label.html @@ -0,0 +1,152 @@ + + + + + + Le Label — Alliance Boréale + + + + + + + + + + + + +
+
+

Le Label de confiance

+

Trois niveaux, une même promesse au client

+

Le Label certifie la garantie offerte au client — jamais la « valeur » de l'artisan ni ses méthodes internes. Les niveaux sont accumulatifs : chacun ajoute autant d'obligations que de privilèges. Noblesse oblige.

+
+ +
+
+
+

Niveau 1 · Socle

+

Souverain

+

Le socle de confiance que tous respectent.

+
    +
  • 100 % logiciel libre
  • +
  • Données hébergées au Québec
  • +
  • Durcissement appliqué (Set-OPS)
  • +
  • CGU claires — zéro revente, zéro pub
  • +
  • Sauvegardes en place
  • +
+
+ +
+

Niveau 2 · + Souverain

+

Résilient

+

Le client est libre, et couvert s'il tombe.

+
    +
  • Portabilité prouvée (pas seulement promise)
  • +
  • Reprise après sinistre testée
  • +
  • Supervision active
  • +
  • Résilience par géo-redondance ou par réciprocité de la constellation
  • +
  • ✦ « La constellation te reprend » si tu tombes
  • +
+
+ +
+

Niveau 3 · + Résilient

+

Exemplaire

+

Celui qui porte le commun.

+
    +
  • Contribution vérifiable au commun (code, doc, formation, mentorat)
  • +
  • Transparence renforcée envers les clients
  • +
  • Audit pair-à-pair approfondi
  • +
  • Aucune ingérence dans la régie interne : ni salaires, ni prix, ni méthodes
  • +
  • ✦ Voix accrue dans la gouvernance de l'Alliance
  • +
+
+
+
+ +
+
+

Un garde-fou social

+

Le mérite, pas le capital

+
+
+

La résilience peut être collective

+

Un petit artisan atteint « Résilient » par la réciprocité de la constellation, sans s'imposer une coûteuse géo-redondance. La force du réseau remplace la taille.

+
+
+

« Exemplaire » se gagne par la générosité

+

On y accède par la contribution et l'éthique, pas par le chiffre d'affaires. Un petit artisan généreux y accède ; un gros sans contribution, non.

+
+
+
+
+ +
+

Comment on certifie

+

Par la transparence, entre pairs

+
+
+

Audits pair-à-pair

+

À tous les niveaux, rigueur croissante. Pas de tiers externe payant : gratuit, réciproque, et ça tisse la constellation.

+
+
+

Preuves publiques

+

Le pair vérifie la conformité à un barème public via des preuves déclaratives — plan Set-OPS, CGU, pile libre — et une démo de reprise réciproque. On ne fouille pas tes méthodes.

+
+
+

La porte d'entrée

+

La transparence est l'entrée, pas une contrainte. Le profil totalement fermé, qui refuse toute vérification, s'auto-exclut — c'est tout.

+
+
+
+
+ +
+ + +
+ + + + diff --git a/site-alliance-boreale/public/vision.html b/site-alliance-boreale/public/vision.html new file mode 100644 index 0000000..6405c29 --- /dev/null +++ b/site-alliance-boreale/public/vision.html @@ -0,0 +1,119 @@ + + + + + + Vision — Alliance Boréale + + + + + + + + + + + + +
+
+

Notre vision

+

La gouvernance numérique souveraine comme bien commun

+

L'Alliance Boréale n'est pas qu'une infrastructure : c'est une façon différente de concevoir nos écosystèmes numériques. Une infrastructure que l'on comprend, que l'on possède, et dont on répond.

+
+ +
+

Quatre exigences

+

Ce qui nous tient ensemble

+
+
+

Responsabilité

+

Chaque acteur répond de ses services devant ses clients et devant ses pairs. La confiance se mérite et se documente.

+
+
+

Traçabilité

+

Ce qui est déployé est décrit, versionné, auditable. Pas de magie : des configurations explicites, comprises de bout en bout.

+
+
+

Portabilité

+

Le client n'est jamais prisonnier. Ses données et ses services peuvent migrer d'une étoile à l'autre : c'est prouvé, pas promis.

+
+
+

Sobriété

+

Des outils dimensionnés au besoin réel, durables, économes. La sobriété numérique est aussi une responsabilité environnementale.

+
+
+
+ +
+
+

Concrètement

+

Une infrastructure mutualisée

+

Seuls, les artisans réinventent chacun la même plomberie. Ensemble, nous l'opérons une fois, bien, en commun :

+
+

DNS interne

Résolution de noms souveraine pour tout l'écosystème.

+

Forges

Hébergement du code et de l'automatisation, chez nous.

+

Supervision

Métriques, journaux et alertes pour veiller sur la flotte.

+

Sauvegardes

Des copies testées : la reprise se vérifie, elle ne se suppose pas.

+
+
+
+ +
+

Le socle

+

Tout est libre

+

L'écosystème de l'Alliance Boréale se construit exclusivement avec du logiciel libre. Ce n'est pas un choix d'outillage : c'est la condition de la souveraineté. Du logiciel que l'on peut lire, auditer, corriger et transmettre — sans demander la permission de personne.

+ +
+
+ +
+ + +
+ + + +