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 "` 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 en `localStorage` et appliquées avant le premier rendu (script inline dans `app/layout.tsx`, clés dans `lib/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/stats` enrichi (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 `/raw` inexistante.
- Route `/admin/snapshots` manquante (404) ; `app/api/snapshots` n'était pas versionné (`.gitignore` trop large).
- `SNAPSHOT_DISABLED=1` dé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 | Google | 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
```bash
# 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 dev
```
L'application sera accessible sur [http://localhost:3000](http://localhost:3000).
### Configuration (.env)
```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 |
|---|---|
| **Email** | `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` :
```bash
curl -H "Authorization: Bearer spb_votre_cle_api" \
https://votre-domaine/api/v1/files
```
### Endpoints
| 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
1. Connectez-vous en tant qu'admin
2. Allez dans **Administration > Clés API**
3. Cliquez **Nouvelle clé**
4. Copiez la clé générée (affichée une seule fois)
---
## Déploiement
### Mac Studio / NAS (local)
```bash
# Build de production
npm run build
# Lancer en production
PORT=3001 npm start
```
### VPS (avec Nginx)
```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)
```dockerfile
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
- [x] Upload multi-fichiers + drag & drop
- [x] Organisation en dossiers imbriqués
- [x] Preview 10+ formats (PDF, images, vidéo, audio, code, markdown...)
- [x] Partage sécurisé avec expiration et mot de passe
- [x] Mode clair / sombre
- [x] Multi-utilisateur avec rôles
- [x] 2FA TOTP
- [x] Recherche IA (Claude Sonnet 4.5)
- [x] Chat IA intégré
- [x] Auto-tagging IA
- [x] OCR intelligent (images + PDF)
- [x] Chiffrement AES-256-GCM
- [x] Système de backup
- [x] Notifications
- [x] API REST avec clés
- [x] Actions en lot (supprimer, déplacer, ZIP, chiffrer)
- [x] 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
---
## Statistiques du projet
---
## Contact
- **Email** : [spbou4@protonmail.com](mailto:spbou4@protonmail.com)
- **Site web** : [www.spboucher.ai](https://www.spboucher.ai)
- **GitHub** : [github.com/simonpierreboucher02](https://github.com/simonpierreboucher02)
---
Built with passion by Simon-Pierre Boucher & Claude Opus 4.6
© 2024-2026 SPB Private Cloud. Tous droits réservés.