SPB Private Cloud
Cloud personnel privé, souverain, sécurisé et mobile-first.
Plus clean que Dropbox. Plus privé que Google Drive. 100% local-first.
v3.1 — Connexion par code courriel, audit fonctionnel, réorganisation IA (2026-09-07)
Connexion par code courriel (Resend) — méthode par défaut : saisir son adresse (spbou4@protonmail.com, r-boucher@sympatico.ca…), recevoir un code à 6 chiffres (10 min, 5 essais, renvoi 30 s), le saisir. Le code est stocké haché dans le cookie de session chiffré (aucune table). Routes POST /api/auth/otp/request et /verify ; envoi via lib/mailer.ts (Resend REST, RESEND_API_KEY, MAIL_FROM). ⚠ Sans domaine vérifié dans Resend, seul onboarding@resend.dev est autorisé et il ne livre qu'au propriétaire du compte : vérifier spboucher.ai dans Resend puis mettre MAIL_FROM="SPB Cloud <no-reply@spboucher.ai>" pour que Richard reçoive ses codes. Connexion par mot de passe conservée (administration).
Audit fonctionnel (11 correctifs) — suppression de dossier = corbeille récursive (plus de fichiers orphelins ni de contenu effacé du disque), restauration fidèle (dossier d'origine recréé), purge réelle (contenu + versions + vignettes) et purge horaire des > 30 j (server.ts), partage de dossier (POST /api/shares {folderId}, page publique avec navigation, ZIP, mot de passe via cookie signé), sous-dossiers héritant de l'espace partagé, quotas cohérents (chunks, duplication, corbeille exclue), duplication conservant l'extension, validations 404/400, notifications d'upload, WebDAV DELETE → corbeille. Migration : scripts/migrations/apply-2026-09-07-audit.ts (idempotente) puis npx prisma generate dans le dossier de l'app (le client Prisma mémorise le dossier prisma/ au moment de la génération).
Réorganisation IA des espaces partagés (scripts/organize/) — extract.ts (Claude Opus 5 : vision pour les photos, PDF natif, texte/Office), dupes.ts (SHA-256), plan.ts (arborescence + noms par espace, albums photo par ordre de numérisation), apply.ts --dry-run puis apply.ts (sauvegarde VACUUM INTO, journal data/applied.jsonl), verify.ts, rollback.ts. Appliqué le 2026-09-07 : 9 espaces, 1 171 fichiers renommés/déplacés, 85 dossiers créés, 44 anciens supprimés, 78 doublons identiques isolés dans « 99 Doublons identiques ». data/ est ignoré par git (métadonnées personnelles).
Nouveautés v3 « Aurora » (2026-09-07)
Refonte complète du front-end, déployée sur cloud.spboucher.ai (M2U64, PM2 cloud).
Design system
- Tokens sémantiques (
canvas,surface,elevated,line), thème clair / sombre / système, 7 couleurs d'accent au choix (Aurore, Océan, Glacier, Forêt, Corail, Ambre, Améthyste) appliquées à toute l'interface via--accent-*. - Police Geist locale (plus d'appel à Google Fonts), verre dépoli, ombres douces, animations réductibles (préférence « Réduire les animations »).
- Densité des listes (confortable / compacte). Préférences dans
⌘,— persistées enlocalStorageet appliquées avant le premier rendu (script inline dansapp/layout.tsx, clés danslib/prefs.ts).
Coquille
- Barre latérale repliable en rail (
⌘B), sections Dossiers / Espaces / Outils / Administration / Tags, jauge de stockage, menu utilisateur. - Barre supérieure avec fil d'Ariane (cible de dépôt), bouton Envoyer, assistant IA, notifications, thème.
- Palette de commandes
⌘K(ou/) : recherche de fichiers et dossiers en direct, navigation, actions (envoyer, nouveau dossier, thème, préférences, déconnexion), historique des commandes. - Mobile : barre d'onglets iOS-like, tiroir glissable, PWA installable (
manifest.webmanifest, icônes,viewport-fit=cover).
Explorateur
- Liste avec en-tête collant et colonnes triables, grille avec vignettes et actions rapides, sélection par plage (⇧-clic), clic droit → menu contextuel, navigation clavier complète.
- Glisser-déposer : fichiers du bureau (overlay plein écran), déplacement interne vers dossiers, arbre latéral (auto-expansion) et fil d'Ariane ; déplacement multiple.
- Liens profonds
?file=,?upload=1,?new=1(utilisés par la palette, la barre supérieure et l'accueil). - Aperçu : plein écran réel, balayage tactile, panneau d'informations et versions refaits.
Accueil et administration
- Bandeau vivant, anneau de stockage par catégorie, activité sur 14 jours, KPI, « Reprendre », favoris, fichiers volumineux.
GET /api/admin/statsenrichi (rétro-compatible) :byCategory,activityByDay,favoriteCount,trashCount,versionCount,largestFiles.
Correctifs
- Recherche
/api/files?search=:mode: "insensitive"(non supporté par Prisma/SQLite) renvoyait 500. - Limiteur de débit : 600 req/min/IP et exemption des aperçus/flux (une grille de 50 vignettes dépassait l'ancien plafond de 100).
- Vignettes de l'accueil pointaient vers une route
/rawinexistante. - Route
/admin/snapshotsmanquante (404) ;app/api/snapshotsn'était pas versionné (.gitignoretrop large). SNAPSHOT_DISABLED=1désactive le snapshot quotidien (utile pour un serveur de staging).
Qu'est-ce que SPB Cloud ?
SPB Private Cloud est un cloud personnel auto-hébergé conçu pour offrir un contrôle total sur vos données. Aucune dépendance à Google, Dropbox ou iCloud. Vos fichiers restent chez vous, chiffrés, accessibles depuis n'importe quel appareil.
Pourquoi SPB Cloud ?
| SPB Cloud | Google Drive | Dropbox | |
|---|---|---|---|
| Propriété des données | Vous | Dropbox | |
| Chiffrement at-rest | AES-256-GCM | Oui (leur clé) | Oui (leur clé) |
| IA intégrée | Claude Sonnet 4.5 | Gemini (limité) | Non |
| OCR intelligent | Oui (Vision IA) | Basique | Non |
| Coût mensuel | 0$ (auto-hébergé) | 2.99$/mois+ | 11.99$/mois+ |
| Code source | Accès complet | Fermé | Fermé |
| Multi-utilisateur | Oui (roles) | Oui | Oui |
| 2FA TOTP | Oui | Oui | Oui |
| API REST | Oui | Oui | Oui |
Fonctionnalités
Gestion de fichiers
- Upload multi-fichiers avec drag & drop
- Upload depuis caméra mobile
- Rename, delete, move, duplicate
- Organisation en dossiers imbriqués
- Breadcrumb navigation
- Vue grille et liste
- Sélection multiple + actions en lot
- Téléchargement de dossiers en ZIP
- Progress bar d'upload
Preview de fichiers
- Images (JPG, PNG, GIF, WebP, SVG)
- Vidéos (MP4, WebM, MOV)
- Audio (MP3, WAV, OGG) avec waveform
- PDF avec navigation de pages
- Code source avec syntax highlighting (20+ langages)
- Markdown avec rendu
- CSV/JSON avec tableau interactif
- Archives ZIP (exploration du contenu)
Intelligence Artificielle (Claude Sonnet 4.5)
- Recherche sémantique : trouvez des fichiers par description naturelle
- Chat IA : posez des questions sur vos fichiers
- Auto-tagging : classification automatique par contenu
- OCR intelligent : extraction de texte depuis images et PDFs
- Description IA : génération automatique de descriptions
Sécurité
- Hash bcrypt pour les mots de passe
- Authentification 2FA TOTP (Google Authenticator, Authy)
- Chiffrement AES-256-GCM at-rest
- Sessions HTTP-only cookies (iron-session)
- Rate limiting sur le login
- CSRF protection
- Validation des types de fichiers
Multi-utilisateur
- Système de rôles : Admin, User, Viewer
- Gestion CRUD des utilisateurs
- Permissions par rôle
- Logs d'activité par utilisateur
Partage sécurisé
- Liens de partage avec token unique
- Protection par mot de passe optionnel
- Date d'expiration configurable
- Mode téléchargement ou aperçu seul
- Désactivation instantanée
- Gestion centralisée des liens
Système de backup
- Backup complet (DB + fichiers) en ZIP
- Backup incrémental
- Historique des backups avec statut
- Suppression des anciens backups
Notifications
- Notifications en temps réel (polling 30s)
- Badge avec compteur non-lus
- Types : upload, backup, IA, partage
- Marquer comme lu / tout lire
API REST publique
- Authentification par clé API (Bearer token)
- Génération et révocation de clés
- Permissions configurable (read, write, admin)
- Expiration optionnelle des clés
- Endpoint :
GET /api/v1/files
Interface
- Design mobile-first (iPhone optimisé)
- Mode clair / sombre avec persistance
- Touch targets 44px minimum
- Bottom sheet modals sur mobile
- Safe area support (notch iPhone)
- Sidebar collapsible
- Animations Framer Motion
- Typographie Inter
Stack technique
Installation
Prérequis
- Node.js 18+
- npm 9+
- Clé API Anthropic (pour les fonctionnalités IA)
Installation rapide
# 1. Cloner le repo
git clone https://github.com/simonpierreboucher02/spb-private-cloud.git
cd spb-private-cloud
# 2. Installer les dépendances
npm install
# 3. Configurer l'environnement
cp .env.example .env
# Éditer .env avec vos valeurs
# 4. Initialiser la base de données
npx prisma db push
npx tsx prisma/seed.ts
# 5. Lancer l'application
npm run devL'application sera accessible sur http://localhost:3000.
Configuration (.env)
DATABASE_URL="file:./dev.db"
SESSION_PASSWORD="votre-secret-session-min-32-caracteres"
ANTHROPIC_API_KEY="sk-ant-api03-..."
ENCRYPTION_KEY="votre-cle-encryption-32-caracteres"
BACKUP_DIR="./backups"
UPLOAD_DIR="./uploads"
MAX_FILE_SIZE="524288000"Identifiants par défaut
| Champ | Valeur |
|---|---|
admin@spbcloud.local |
|
| Mot de passe | admin123 |
| Rôle | Admin |
Important : Changez le mot de passe après la première connexion via Admin > Utilisateurs.
Architecture
spb-private-cloud/
├── app/
│ ├── admin/ # Pages administration
│ │ ├── activity/ # Historique d'activité
│ │ ├── api-keys/ # Gestion clés API
│ │ ├── backup/ # Gestion backups
│ │ ├── settings/ # Paramètres (2FA)
│ │ ├── shares/ # Liens partagés
│ │ └── users/ # Gestion utilisateurs
│ ├── api/
│ │ ├── ai/ # Endpoints IA (search, chat, tag, ocr, describe)
│ │ ├── auth/ # Login, logout, 2FA
│ │ ├── backup/ # CRUD backups
│ │ ├── files/ # CRUD fichiers + bulk + versions
│ │ ├── folders/ # CRUD dossiers + ZIP download
│ │ ├── keys/ # CRUD clés API
│ │ ├── notifications/# Notifications
│ │ ├── shares/ # Liens de partage
│ │ ├── tags/ # Tags
│ │ ├── users/ # Gestion utilisateurs
│ │ └── v1/ # API REST publique
│ ├── dashboard/ # File explorer
│ ├── login/ # Page de connexion
│ └── shared/ # Pages de partage public
├── components/
│ ├── admin/ # Composants admin
│ ├── ai/ # Panel IA
│ ├── files/ # FileCard, FileExplorer, BulkActions
│ ├── folders/ # FolderCard, CreateFolderModal
│ ├── layout/ # AppShell, Sidebar, MobileNav, Notifications
│ ├── preview/ # Preview engine + plugins (image, video, pdf...)
│ ├── tags/ # TagBadge, TagSelector
│ ├── theme/ # ThemeProvider, ThemeToggle
│ └── ui/ # Button, Modal, SearchBar
├── lib/
│ ├── ai.ts # Intégration Claude API
│ ├── auth.ts # Authentification multi-user
│ ├── backup.ts # Système de backup
│ ├── encryption.ts # Chiffrement AES-256-GCM
│ ├── notifications.ts # Système de notifications
│ ├── prisma.ts # Client Prisma
│ ├── rate-limit.ts # Rate limiting
│ ├── session.ts # Configuration sessions
│ ├── storage.ts # Gestion fichiers sur disque
│ └── utils.ts # Utilitaires
├── prisma/
│ ├── schema.prisma # Schéma de base de données
│ └── seed.ts # Seed admin user
├── types/
│ └── files.ts # Types TypeScript
└── uploads/ # Stockage fichiers (git-ignored)Base de données
Modèles Prisma
| Modèle | Description |
|---|---|
User |
Utilisateurs avec rôles et 2FA |
File |
Fichiers avec métadonnées, IA, chiffrement |
Folder |
Dossiers imbriqués (arbre récursif) |
SharedLink |
Liens de partage sécurisés |
Permission |
Permissions par dossier/utilisateur |
ActivityLog |
Journal d'activité |
FileMetadata |
Métadonnées étendues (favoris, annotations) |
Tag / FileTag |
Système de tags |
FileVersion |
Versioning de fichiers |
Notification |
Notifications utilisateur |
ApiKey |
Clés API REST |
BackupLog |
Historique des backups |
API REST
Authentification
Toutes les requêtes à l'API publique nécessitent un header Authorization :
curl -H "Authorization: Bearer spb_votre_cle_api" \
https://votre-domaine/api/v1/filesEndpoints
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/api/v1/files |
Lister les fichiers |
GET |
/api/v1/files?folderId=xxx |
Fichiers d'un dossier |
Générer une clé API
- Connectez-vous en tant qu'admin
- Allez dans Administration > Clés API
- Cliquez Nouvelle clé
- Copiez la clé générée (affichée une seule fois)
Déploiement
Mac Studio / NAS (local)
# Build de production
npm run build
# Lancer en production
PORT=3001 npm startVPS (avec Nginx)
server {
listen 443 ssl;
server_name cloud.votredomaine.com;
ssl_certificate /etc/letsencrypt/live/cloud.votredomaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.votredomaine.com/privkey.pem;
client_max_body_size 500M;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}Docker (optionnel)
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npx prisma generate
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]Roadmap
Fait
- Upload multi-fichiers + drag & drop
- Organisation en dossiers imbriqués
- Preview 10+ formats (PDF, images, vidéo, audio, code, markdown...)
- Partage sécurisé avec expiration et mot de passe
- Mode clair / sombre
- Multi-utilisateur avec rôles
- 2FA TOTP
- Recherche IA (Claude Sonnet 4.5)
- Chat IA intégré
- Auto-tagging IA
- OCR intelligent (images + PDF)
- Chiffrement AES-256-GCM
- Système de backup
- Notifications
- API REST avec clés
- Actions en lot (supprimer, déplacer, ZIP, chiffrer)
- Interface mobile-first (iPhone optimisé)
À venir
- Migration PostgreSQL
- HTTPS / SSL intégré
- Corbeille (soft delete)
- Thumbnails auto-générés
- Video streaming HLS
- Infinite scroll
- Docker Compose
- WebDAV
- Sync multi-device
Sécurité
SPB Cloud est conçu avec la sécurité en priorité :
| Mesure | Détail |
|---|---|
| Mots de passe | Hash bcrypt (12 rounds) |
| 2FA | TOTP RFC 6238 (Google Authenticator) |
| Sessions | Cookies HTTP-only, SameSite, expiration 24h |
| Chiffrement | AES-256-GCM avec clé dérivée (scrypt) |
| Rate limiting | 5 tentatives/min sur login |
| API Keys | SHA-256 hash, jamais stockées en clair |
| Upload | Limite de taille configurable |
Auteurs
|
Simon-Pierre Boucher Créateur & Propriétaire www.spboucher.ai spbou4@protonmail.com |
Claude Opus 4.6 Co-auteur & Développeur IA Anthropic Architecture, code, optimisation mobile |
Statistiques du projet
Contact
- Email : spbou4@protonmail.com
- Site web : www.spboucher.ai
- GitHub : github.com/simonpierreboucher02
Built with passion by Simon-Pierre Boucher & Claude Opus 4.6
© 2024-2026 SPB Private Cloud. Tous droits réservés.