---
title: "Stockage objet S3 en France : la doc de while.sh"
url: https://while.sh/fr/docs/briques/s3/
updated: 2026-11-09
---

# Stockage objet (S3)

Des buckets S3 en France pour les fichiers de votre appli : images, exports, documents. Ils sont chiffrés et versionnés, et votre appli reçoit une clé qui ne vaut que pour eux.

> Vous, à votre agent : Ajoute un stockage pour les photos des visites.

## Ce que votre agent écrit

Votre agent l'écrit dans while.yaml, à la racine de votre appli :

```yaml titre="while.yaml"
buckets:
  - name: uploads
```

## Ce que reçoit votre appli

Votre appli reçoit ces variables d'environnement à chaque mise en ligne :

| Variable | Ce qu'elle contient |
|---|---|
| `S3_ENDPOINT` | Le point S3 que joint votre appli. |
| `S3_REGION` | La région S3. |
| `AWS_REGION` | La même, pour les SDK d'AWS. |
| `AWS_ENDPOINT_URL_S3` | Le point S3, pour les SDK d'AWS. |
| `S3_BUCKET_UPLOADS` | Le nom du bucket uploads. |
| `S3_BUCKET` | Le nom du premier bucket. |
| `AWS_ACCESS_KEY_ID` | La clé d'accès, limitée aux buckets de l'environnement. |
| `AWS_SECRET_ACCESS_KEY` | Son secret. |
| `S3_ACCESS_KEY_ID` | La même clé, sous un autre nom. |
| `S3_SECRET_ACCESS_KEY` | Son secret. |
| `S3_ENDPOINT_PUBLIC` | Le point S3 public, pour une URL présignée qu'ouvre un navigateur. |

## Quand vous en servir

Servez-vous-en pour les fichiers (images, exports, documents), plutôt que dans la base.

## Comment ça marche

Chaque bucket S3 déclaré est créé en France, chiffré et versionné. L'appli reçoit le point S3, le nom de ses buckets et une clé limitée aux buckets de son environnement.

## Ce qu'il faut savoir

Une appli aux sorties fermées (le défaut) joint ses buckets par le relais S3 de while (`S3_ENDPOINT`, dans le cluster). Par le relais, la clé reçue ne vaut que pour les buckets de l'environnement, et seulement depuis ses pods. Pour lire un bucket depuis un poste, sans clé, votre agent utilise l'outil `read_bucket`.

Une URL présignée pour un navigateur se fait sur `S3_ENDPOINT_PUBLIC`, en style chemin (forcePathStyle), et les adresses de l'appli y sont permises (CORS). Pour une autre origine, déclarez `buckets: [{ name, cors: [https://…] }]`. L'adresse publique prend des URL présignées pour lire ou envoyer un objet (GET, HEAD, PUT, 5 Go au plus), et des formulaires POST présignés (createPresignedPost) : le relais vérifie la politique (signature, expiration, bucket, key ou son préfixe, Content-Type, x-amz-meta-*) et compte content-length-range pendant l'envoi. Une URL qui signe content-length impose la taille : le relais vérifie la signature avec elle et transmet Content-Length tel quel ; une autre longueur est refusée.

Le bucket est créé à la mise en ligne : c'est une ressource facturée, validée comme une base, et `public: true` (lecture anonyme) se fait valider aussi. Une version remplacée ou supprimée d'un objet est gardée 30 jours. Une prévisualisation a ses propres buckets, vides : rien n'est copié. Les buckets partent avec leur environnement, vidés, versions comprises. Le verrouillage d'objets en mode compliance n'est pas proposé.

## Prix

Ces prix sont les mêmes dans toutes les offres, hors taxes :

| Ressource | Prix | Détail |
|---|---|---|
| Stockage objet | 0,25 € les 10 Gio·mois | requêtes comprises |

## Les outils MCP de votre agent

Votre agent s'en occupe avec les outils `get_app_status` et `read_bucket`.

## Guides

- [Stocker les fichiers de votre appli dans un bucket S3, depuis votre agent IA](/fr/guides/stocker-des-fichiers/)
