L’onglet Fichiers d’un projet est un gestionnaire de fichiers simple au-dessus d’un compartiment privé. C’est l’endroit idéal pour les artefacts qu’un build ne devrait pas contenir : ce qui change à l’exécution, est trop volumineux pour être versionné, ou est produit par l’application elle-même.
Gérer les fichiers
Ouvrez l’onglet Fichiers d’un projet pour téléverser un fichier, le télécharger de nouveau ou le supprimer. La liste affiche la clé, la taille et la date de modification de chaque objet. Chaque téléversement est plafonné selon le forfait, et l’usage total du compartiment compte dans votre quota de stockage — Forfaits et limites donne les chiffres. Lorsque l’usage atteint le plafond, les téléversements s’interrompent jusqu’à ce que vous libériez de l’espace ou passiez à un forfait supérieur, plutôt que d’échouer de façon imprévisible.
Privé par défaut
Le compartiment est privé — les objets ne sont pas servis sur une URL publique du simple fait qu’ils existent. Les fichiers sont stockés dans un stockage objet compatible S3, de propriété canadienne (MinIO); la résidence des données correspond donc au reste de votre application. Gardez ici tout ce qui est sensible plutôt que dans votre dépôt ou votre sortie de build.
Se connecter depuis votre propre code
Ceci s’adresse au code serveur de votre application exécuté sur Canner. Le point de terminaison du compartiment se trouve sur l’hôte même où s’exécute votre projet; ces identifications fonctionnent donc depuis le code de votre application déployée — pas depuis votre poste, votre intégration continue, ni aucune machine à l’extérieur de Canner. Il n’existe aucun point de terminaison public vers lequel diriger un client S3 externe.
Le code serveur de votre application se connecte directement au compartiment — de vraies informations d’identification compatibles S3, pas seulement le gestionnaire de fichiers du tableau de bord. Ouvrez l’onglet Fichiers et créez une identification sous Accès API. Sa création révèle un bloc de variables d’environnement prêt à coller — point de terminaison, compartiment, région, ID de clé d’accès et clé d’accès secrète — affiché une seule fois. Ajoutez-les aux variables d’environnement de votre projet (elles ne sont pas injectées automatiquement), puis lisez-les comme ci-dessous. Le secret ne peut pas être récupéré à nouveau — si vous le perdez, régénérez l’identification pour en obtenir un nouveau.
Chaque identification est limitée à votre projet uniquement, appliqué par la politique d’accès de MinIO elle-même, pas seulement une convention côté client — elle ne peut pas lister, lire, écrire ou supprimer des objets appartenant à un autre projet, même au sein de votre propre organisation. Les clés d’objet doivent commencer par le slug de votre projet; la politique de l’identification rejette tout ce qui est en dehors de ce préfixe.
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
const s3 = new S3Client({
endpoint: process.env.CANNER_STORAGE_ENDPOINT,
region: process.env.CANNER_STORAGE_REGION,
credentials: {
accessKeyId: process.env.CANNER_STORAGE_ACCESS_KEY_ID,
secretAccessKey: process.env.CANNER_STORAGE_SECRET_ACCESS_KEY,
},
forcePathStyle: true, // MinIO uses path-style addressing, not virtual-hosted-style
});
const bucket = process.env.CANNER_STORAGE_BUCKET;
// Keys must start with your project's slug — that's the prefix your
// credential is scoped to. A key outside it is rejected, not just hidden.
const key = `macapsule-production/certificates/${userId}.pdf`;
await s3.send(new PutObjectCommand({
Bucket: bucket,
Key: key,
Body: pdfBuffer,
ContentType: 'application/pdf',
}));
// A short-lived signed URL, if you want the browser to fetch the file
// directly instead of proxying it through your own server.
const url = await getSignedUrl(
s3,
new GetObjectCommand({ Bucket: bucket, Key: key }),
{ expiresIn: 300 }
);Besoin que le navigateur télécharge un fichier directement? Émettez une URL présignée de courte durée (l’appel getSignedUrl ci-dessus) — un lien à durée limitée vers un seul objet privé, sans jamais exposer quoi que ce soit sur une URL publique.
Style de chemin, pas style d’hôte virtuel : activez forcePathStyle: true sur votre client S3, ou l’option équivalente pour le SDK que vous utilisez. La connexion elle-même est en HTTP simple — elle ne quitte jamais l’hôte sur lequel votre application s’exécute, donc il n’y a aucun saut réseau public à sécuriser avec TLS.
Révoquez ou régénérez une identification à tout moment depuis le même panneau — l’ancien secret d’une identification régénérée cesse de fonctionner immédiatement, et une identification révoquée est rejetée dès sa prochaine requête.
Ce qui va ici plutôt que dans le build
- Stockage objet : images téléversées, PDF et CSV générés, sauvegardes, tout ce qui est créé ou modifié après le déploiement.
- Votre build : les ressources statiques qui font partie de l’application (logos, JS/CSS empaquetés) — livrez-les dans le déploiement, pas dans le compartiment.
- Données structurées : utilisez une base Postgres pour les enregistrements que vous interrogez, pas des fichiers dans un compartiment.