# Choisir son déploiement

> Binaire, conteneur, Kubernetes à plusieurs répliques, derrière un maillage ou sans sortie réseau : quelle topologie pour quel besoin.

Concept - Depuis la version 0.1.0 - Flexway v1.7.1 - https://flexway.io/docs/operations-deployment/

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

## Ce que c'est

Flexway est **un seul binaire**, sans base de données ni plan de contrôle. Le même `flexway.yaml` et
les mêmes contrats tournent partout ; d'une topologie à l'autre ne changent que trois choses : comment
le processus est lancé, où vivent les compteurs partagés, et qui peut joindre le port
d'administration.

## Comment choisir

```mermaid
%%{init: {'theme':'base','themeVariables':{'fontSize':'14px','lineColor':'#94a3b8'}}}%%
flowchart TD
  Q1{"Une seule instance suffit ?"}:::hub
  Q1 -->|"oui"| Q2{"Un moteur de conteneurs ?"}:::hub
  Q2 -->|"oui"| C["Conteneur"]:::spoke
  Q2 -->|"non"| B["Binaire seul"]:::spoke
  Q1 -->|"non"| K["Kubernetes,<br/>plusieurs répliques"]:::spoke
  K --> Q3{"Quotas de tenant ou<br/>débits partagés ?"}:::hub
  Q3 -->|"oui"| S["+ cache partagé"]:::data
  K --> Q4{"Un maillage chiffre<br/>déjà le trafic ?"}:::hub
  Q4 -->|"oui"| M["Derrière le maillage"]:::private
  K --> Q5{"Aucune sortie réseau<br/>hors du déclaré ?"}:::hub
  Q5 -->|"oui"| E["Souverain :<br/>sortie limitée au déclaré"]:::private

  classDef hub     fill:#4f46e5,stroke:#3730a3,color:#fff,font-weight:bold
  classDef spoke   fill:#0891b2,stroke:#155e75,color:#fff,font-weight:bold
  classDef data    fill:#3b82f6,stroke:#1d4ed8,color:#fff,font-weight:bold
  classDef private fill:#10b981,stroke:#047857,color:#fff,font-weight:bold
```

Les trois dernières questions se cumulent : une grappe peut avoir un cache partagé compatible Redis, un maillage
et une sortie limitée à la fois.

## Les topologies

| Topologie | Pour qui | Ce qu'il faut | Guide |
| --- | --- | --- | --- |
| **Binaire seul** (VM, bare métal) | Une instance sous systemd ou tout superviseur | L'archive de la release pour `amd64` ou `arm64` et `FLEXWAY_CONFIG` ; `SIGHUP` recharge, `SIGTERM` draine | [Configurer et exploiter](https://flexway.io/docs/operations-overview/) |
| **Conteneur** | Un poste, une VM avec Docker ou Podman | L'image `ghcr.io/flexwiz/flexway:<version>` (`amd64` et `arm64`, sans shell, utilisateur non root), la configuration montée en lecture seule | [Servir sa première API](https://flexway.io/docs/operations-first-api/) |
| **Kubernetes, plusieurs répliques** | La production : disponibilité, montée en charge | Le chart `oci://ghcr.io/flexwiz/charts/flexway` ; `replicaCount`, `autoscaling` (2 à 10 répliques par défaut quand il est activé), `pdb` | [Passer en Kubernetes](https://flexway.io/docs/operations-kubernetes/) |
| **+ cache partagé** | Des débits partagés entre répliques, des quotas de tenant au jour ou au mois | Un Redis, Dragonfly ou Valkey dans `server.counters` | [Poser des quotas](https://flexway.io/docs/operations-quotas/) |
| **Derrière un maillage** (Linkerd, Istio) | Une grappe où le maillage chiffre et authentifie déjà les pods | Aucun TLS propre à la passerelle ; les anonymes comptés par identité de pair (`server.trusted_proxies: [local]` et `server.peer_identity_header`) ; l'identité d'un ingress de confiance par `auth.trusted_headers` | [Poser des quotas](https://flexway.io/docs/operations-quotas/), [Exemples : inférence](https://flexway.io/docs/operations-examples-inference/) |
| **Souverain, sortie limitée** | Un environnement sans accès à internet, ou dont chaque flux sortant est déclaré | La liste des destinations ci-dessous, et la `NetworkPolicy` de sortie du chart (`egress.enabled`, `egress.rules`) | [Passer en Kubernetes](https://flexway.io/docs/operations-kubernetes/) |

Sans cache partagé, chaque réplique compte pour elle-même et aucun quota de tenant ne se
déclare. Cache partagé perdu, la passerelle continue de servir en compteurs locaux et le dit
(`flexway_counters_store_up` à `0`).

### Ce que la passerelle appelle

La passerelle n'ouvre de connexion que vers ce que sa configuration déclare : les amonts, les
émetteurs OIDC (découverte, clés, introspection, échange de jeton), les courtiers, le registre de
schémas, le KMS, les cibles de webhook, le cache partagé, et le collecteur OTLP s'il est
renseigné - sans `observability.otlp_endpoint` ni `OTEL_EXPORTER_OTLP_ENDPOINT`, rien n'est poussé.
Aucun appel vers l'éditeur du produit. Pour un environnement isolé : recopier les images dans votre
registre après les avoir vérifiées avec `cosign`, et écrire les schémas de l'éditeur depuis l'image avec
`flexway schema` ([ligne de commande](https://flexway.io/docs/reference-cli/)).

## Limites

| Sujet | État |
| --- | --- |
| État partagé | Le cache partagé des compteurs seul. Le cache de réponses, `/events` et `/errors` sont **par réplique** |
| Port d'administration | Jamais exposé, quelle que soit la topologie ([API d'administration](https://flexway.io/docs/reference-admin-api/)) |
| Plusieurs passerelles, une console | **Pas encore construit** : aujourd'hui une console par déploiement de passerelle ([installer la console](https://flexway.io/docs/operations-console-install/)). Une console partagée entre passerelles est cadrée, sans version fixée |
| Mode edge | **Prévu en `1.12.0`** : le même binaire sur un site distant, une configuration signée tirée, des décisions locales |

## Aller plus loin

- [Changer la configuration sans redémarrer](https://flexway.io/docs/operations-live-config/)
- [Mettre à jour](https://flexway.io/docs/operations-upgrade/)
- [Glossaire](https://flexway.io/docs/reference-glossary/)
