Aller au contenu
s3nd.sh

Fournisseur de stockage

s3nd avec Cloudflare R2

Aucun frais de sortie, exactement ce qu’il faut pour déplacer un fichier de 2 Go entre deux laptops.

createBucket()
import { createBucket } from 's3nd'

const store = createBucket({
  bucket: 'transfers',
  endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: process.env.R2_ACCESS_KEY_ID!,
    secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
  },
  publicUrl: 'https://cdn.example.com', // optional: your R2 custom domain
})

Pourquoi celui-ci

Cloudflare R2

R2 parle l’API S3, ignore la région, et ne facture rien en sortie. C’est le fournisseur contre lequel le guide « sans serveur » est écrit : un bucket, un jeton limité à celui-ci, un fichier de configuration, et un code transmis entre deux machines pour une facture de zéro.

Depuis la ligne de commande

Une configuration de départ, et ce qu’il reste à faire.

init écrit le fichier avec des références ${VAR} plutôt que des secrets, donc il est fait pour être versionné ; le fichier d’environnement qu’il désigne, non.

s3nd.config.json
{
  "bucket": "transfers",
  "region": "auto",
  "endpoint": "https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com",
  "prefix": "transfers",
  "expiresIn": "24h",
  "envFile": ".env",
  "credentials": {
    "accessKeyId": "${R2_ACCESS_KEY_ID}",
    "secretAccessKey": "${R2_SECRET_ACCESS_KEY}"
  }
}

Ensuite

  1. 01Mettez R2_ACCOUNT_ID, R2_ACCESS_KEY_ID et R2_SECRET_ACCESS_KEY dans .env, et gardez-le hors de git.
  2. 02Le jeton d’API a besoin de Object Read & Write sur ce bucket, et de rien d’autre.
  3. 03Ajoutez une règle de cycle de vie qui supprime les objets sous transfers/ après un jour ou deux.
  4. 04Lancez s3nd doctor. Il effectue les opérations dont s3nd a besoin et rapporte ce qui s’est passé.

Bon à savoir

Notes sur R2.

region: "auto"

R2 ignore la région et le SDK en exige une. Définir un endpoint fait que s3nd choisit "auto" par défaut, donc il n’y a rien à écrire.

Les écritures conditionnelles fonctionnent

R2 implémente If-None-Match et If-Match sur PutObject, ce qui empêche deux transferts simultanés de s’écraser.

Nettoyage des expirés

expiresIn empêche un transfert d’être remis ; seule une règle de cycle de vie supprime l’objet. Donnez au préfixe une règle qui expire les objets après un jour ou deux, et s3nd doctor passe au vert.

Déposez un fichier. Donnez le code.

Pointez-le sur le bucket que vous payez déjà. Rien à déployer, aucune inscription, personne au milieu.