Version

SPB Private Cloud

Cloud personnel privé, souverain, sécurisé et mobile-first.
Plus clean que Dropbox. Plus privé que Google Drive. 100% local-first.

Next.js TypeScript Tailwind Prisma SQLite Claude AI

License Platform Mobile 2FA Encryption API

--- ## 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

Next.js TypeScript Tailwind Framer

Prisma SQLite iron-session Claude

--- ## 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
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

Files Lines API Routes Components

Plugins DB Models AI Functions Dependencies

--- ## 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.