# Proposer un changement depuis la console

> Objectif : changer le délai d'un amont, le budget d'un tenant ou la configuration d'une politique depuis la console, sans jamais écrire vers la passerelle…

Guide - Depuis la version 1.2.0 - Flexway v1.6.3 - https://flexway.io/docs/operations-proposals/

> Guide d'exploitation : configurer, déployer et observer la passerelle. Ce que fait la capacité côté produit : [guide produit](https://flexway.io/docs/product-overview/) ; l'appeler : [guide développeur](https://flexway.io/docs/developer-overview/).

**Objectif** : changer le délai d'un amont, le budget d'un tenant ou la configuration d'une politique
**depuis la console**, sans jamais écrire vers la passerelle : le changement devient une demande de
tirage dans le dépôt GitOps, revue et fusionnée sous ses règles ; GitOps le réconcilie ensuite.

**Configuration** - une fois, par l'exploitant :

| Étape | Ce qu'il fait |
| --- | --- |
| 1. Créer l'application GitHub | Permissions `Contents` et `Pull requests` en écriture, `Checks`, `Commit statuses` et `Metadata` en lecture ; **ni** `Administration` **ni** `Workflows` ; aucun webhook. L'installer sur **le seul** dépôt GitOps ; ne pas l'ajouter aux acteurs qui contournent les règles |
| 2. Poser la clé par référence | La clé privée dans le gestionnaire de secrets, synchronisée en `Secret` (ESO), montée en fichier : `repo.existingSecret` (clé `private-key` par défaut) - jamais une valeur du chart |
| 3. Protéger la branche cible | Une règle (*ruleset*) exigeant une PR et au moins une approbation, lisible par l'application ; une protection classique (illisible sans `Administration`) se déclare : `repo.protection: declared`, affichée « non vérifiée » |
| 4. Renseigner le dépôt | `repo.url`, `repo.branch`, `repo.path` (le répertoire de `flexway.yaml`), `repo.appId`, `repo.installationId` |

```yaml
repo:
  url: https://github.com/acme-platform/gateway-config
  branch: main
  path: deploy/flexway
  appId: "123456"
  installationId: "7890123"
  existingSecret: console-github-app
```

Hors Kubernetes (Docker, VM) : `FLEXWAY_CONSOLE_REPO_URL`, `_REPO_BRANCH`, `_REPO_PATH`, `_REPO_APP_ID`,
`_REPO_INSTALLATION_ID`, `_REPO_APP_KEY=file:/run/secrets/github-app/private-key` et
`FLEXWAY_CONSOLE_PROPOSALS_STORE=file:/var/lib/flexway-console/proposals` sur un volume, **une seule
réplique**. Les rôles : `flexway-proposer` et `flexway-reviewer` côté fournisseur (avec ou sans tenant),
ou choisis dans Utilisateurs pour un compte local.

**Parcours d'une proposition** :

1. Un `proposer` (ou un `reviewer`, un admin) ouvre l'étape d'une politique, le détail d'un amont ou la
   consommation d'un tenant et clique **« Proposer ce changement »** : nouvelle valeur, titre, motif.
2. La console lit `flexway.yaml` dans le dépôt, remplace le nœud en gardant commentaires et ordre, montre
   le **diff**, le fait charger par **le chargeur de la passerelle** et simule les requêtes décrites. Rien
   n'est écrit au dépôt.
3. L'auteur **soumet en revue** : le diff est figé (empreinte).
4. Un `reviewer` **ouvre la demande de tirage** (ou la rejette, motif à l'appui) : une branche
   `flexway/p-NNNN-...`, un commit qui porte exactement le diff revu, une PR au corps généré.
5. Revue et fusion se font **dans le dépôt**, sous ses règles ; la console lit revues, vérifications et
   fusion toutes les 30 s.
6. Après la fusion, la console calcule le `config_digest` attendu sur le commit de fusion ; la
   proposition est **appliquée** quand toutes les répliques le servent (`flexway_config_info`).

| Statut | Sens |
| --- | --- |
| Brouillon | À son auteur ; refusée par le chargeur, elle ne peut pas être soumise |
| En revue | Diff figé ; un relecteur ouvre la PR ou rejette |
| PR ouverte | Dans le dépôt ; « modifiée dans le dépôt » si la branche ne porte plus seulement le diff revu |
| Fusionnée | En attente du rechargement ; « fusionnée avec écart » si le contenu fusionné diffère du revu |
| Appliquée | Toutes les répliques servent l'empreinte attendue |
| Périmée | `flexway.yaml` a changé sur la branche cible : **Régénérer** rejoue l'édition sur la nouvelle tête |
| Rejetée, retirée | Terminée ; gardée 400 jours, son journal avec elle |

**Vérif** : `flexway validate` sur le dépôt après la fusion imprime le même `config_digest` que la
console attend ; `/config` de chaque réplique le publie.

```bash
docker run --rm -v "$PWD/deploy/flexway:/cfg" ghcr.io/flexwiz/flexway:<version> validate --config /cfg/flexway.yaml
# valid: 12 operation(s) served from 1 contract(s), 2 upstream(s)
# config_digest 9e41b7c0d2aa
```

**Dépannage**

| Symptôme | Cause et remède |
| --- | --- |
| `503 repo_unprotected`, bandeau « branche non protégée » | Aucune règle lisible n'exige PR et approbation : ajouter un *ruleset*, ou déclarer la protection (`repo.protection: declared`) |
| `502 repo_refused` | La clé est révoquée, l'installation ne couvre pas le dépôt, ou une permission manque : vérifier l'application, puis attendre la relecture de la clé (sans redémarrage) |
| « Modifiée dans le dépôt » | Quelqu'un a poussé sur la branche `flexway/*` : relire la PR dans le dépôt ; la console garde les deux empreintes au journal |
| « Fusionnée avec écart » | La fusion porte un autre contenu que celui revu : le journal le dit ; l'empreinte attendue est celle du commit de fusion |
| « Rechargement attendu » au-delà de 15 min | GitOps n'a pas synchronisé, ou la passerelle a refusé le rechargement (`last_reload` de `/config`) |

*Disponible depuis `1.2.0` ; règles automatiques et IA d'exploitation prévues en `1.10.0`. Vérifiée contre une doublure de GitHub ; un essai contre un dépôt de démonstration reste à
faire avant de promettre la compatibilité GitHub Enterprise Server et les commits signés.*
