Plateforme SaaS · En production
EnvoiDirect
Rendre l’envoi de fichiers volumineux aussi direct qu’un e-mail, avec une architecture qui protège les données, facture ses offres et reste fiable quand le transfert dure.
Le problème
Un geste très simple côté utilisateur cache une chaîne technique exigeante.
Un transfert peut réunir plusieurs fichiers, durer assez longtemps pour rencontrer une coupure réseau, puis être téléchargé plus tard depuis un autre appareil. Il faut reprendre les morceaux sans confusion, assembler sans saturer la mémoire du serveur, conserver les noms utiles sans leur faire confiance, supprimer les données à la date prévue — et, sur un produit vendu par abonnement, refuser proprement ce qui dépasse l’offre souscrite.
Fonctions en service
Le parcours utile, de l’envoi à l’expiration.
Envoi par morceaux
Chaque fichier est découpé en blocs de 5 Mo, envoyés un par un. Un bloc en échec est réessayé seul, sans reprendre le transfert au début.
Transferts multiples
Plusieurs fichiers restent réunis sous un même lien et se récupèrent séparément ou en archive ZIP construite à la volée.
Liens temporaires
Un identifiant aléatoire de 32 caractères donne accès au transfert jusqu’à sa date d’expiration, choisie selon l’offre.
Stockage isolé
Les fichiers portent des noms internes aléatoires et vivent hors du répertoire servi par Apache : aucune URL directe n’y mène.
Transferts protégés
Un mot de passe peut conditionner l’accès. Tant qu’il n’est pas validé, ni les noms, ni les tailles, ni le ZIP ne sont accessibles.
Comptes et quotas
Confirmation d’adresse, réinitialisation de mot de passe, quota de stockage cumulé et limites appliquées par offre.
Abonnements Stripe
Paiement, renouvellement, échec de prélèvement et résiliation reflétés en base par un webhook signé et idempotent.
Statistiques et alertes
Compteur de téléchargements par transfert et e-mail à l’expéditeur au tout premier téléchargement, envoyé une seule fois.
Exploitation
Nettoyage planifié, journaux dédiés, rotation des logs, garde d’espace disque et contrôle de santé maintiennent le service.
Ce que voit l’utilisateur
- Une zone d’envoi lisible sur ordinateur comme sur mobile
- La progression fichier par fichier pendant le transfert
- Un seul lien à partager, sans créer de compte
- Un téléchargement individuel ou groupé
- Ses transferts retrouvés, prolongés ou supprimés
Ce qui se passe dessous
- Des morceaux rattachés à une session et à un fichier précis
- Un assemblage diffusé sur disque avec empreinte SHA-256
- Des droits recalculés côté serveur à chaque requête
- Des métadonnées séparées du stockage physique
- Un nettoyage automatique de la base et des fichiers expirés
Le point délicat
Un compte Stripe partagé entre plusieurs projets.
Le même compte de paiement sert à d’autres services que celui-ci. Un webhook naïf aurait traité l’abonnement d’un projet voisin comme un abonnement EnvoiDirect et modifié le mauvais compte. Le point d’entrée vérifie donc la signature, puis n’agit que si le tarif reçu appartient réellement à ce produit ; tout autre événement est acquitté auprès de Stripe puis ignoré sans rien écrire. Une table d’événements traités rend l’ensemble idempotent : un renvoi de Stripe ne peut pas produire deux fois le même effet.
Mon rôle
Reprendre une base existante et la transformer en produit exploitable et vendable.
Audit du code et du serveur, sauvegarde vérifiée, déplacement des secrets et du stockage hors du site public, refonte du téléversement et du téléchargement, protections de session et CSRF, limitation de débit, journalisation sans données sensibles, nettoyage automatique. Puis la partie produit : comptes avec confirmation d’adresse et réinitialisation, offres et quotas pilotés par une configuration unique, abonnements Stripe synchronisés par webhook signé, transferts protégés par mot de passe, statistiques de téléchargement. Enfin l’interface : un design system maison qui a permis de retirer toutes les dépendances externes du navigateur, et une suite de tests d’intégration jouée contre le site réel avant chaque livraison.
Essayer EnvoiDirect ↗