SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
47 min agolast push
JavaScript 56.7% TypeScript 42.6%
ZIP tar.gz
NameLast commitUpdated
app feat: regrouper les dossiers racine par espace partagé (explorateur,... 25 days ago
components feat: regrouper les dossiers racine par espace partagé (explorateur,... 25 days ago
lib feat(v3.1): connexion par code courriel (Resend), audit fonctionnel... 25 days ago
prisma chore: fichiers d'exécution (db/wal/shm/log) retirés du suivi git... 47 min ago
public feat(v3): refonte Aurora — design system, shell repliable, palette ⌘K,... 25 days ago
scripts feat(v3.1): connexion par code courriel (Resend), audit fonctionnel... 25 days ago
types feat: Excel/Word edit, PDF annotations, FileCard redesign & AI fixes 7 mo ago
.env.example feat(v3.1): connexion par code courriel (Resend), audit fonctionnel... 25 days ago
.gitignore chore: fichiers d'exécution (db/wal/shm/log) retirés du suivi git... 47 min ago
CLAUDE.md SPB Private Cloud v2.0 - Full-featured personal cloud 7 mo ago
middleware.ts feat(v3.1): connexion par code courriel (Resend), audit fonctionnel... 25 days ago
next-env.d.ts SPB Private Cloud v2.0 - Full-featured personal cloud 7 mo ago
next.config.mjs chore: checkpoint v2 WIP before v3 redesign (2026-09-07) 25 days ago
package-lock.json feat: Excel/Word edit, PDF annotations, FileCard redesign & AI fixes 7 mo ago
package.json chore: checkpoint v2 WIP before v3 redesign (2026-09-07) 25 days ago
postcss.config.mjs SPB Private Cloud v2.0 - Full-featured personal cloud 7 mo ago
README.md feat(v3.1): connexion par code courriel (Resend), audit fonctionnel... 25 days ago
server.ts feat(v3.1): connexion par code courriel (Resend), audit fonctionnel... 25 days ago
spb.sh chore: checkpoint v2 WIP before v3 redesign (2026-09-07) 25 days ago
start-cloud.sh chore: checkpoint v2 WIP before v3 redesign (2026-09-07) 25 days ago
tailwind.config.ts feat(v3): refonte Aurora — design system, shell repliable, palette ⌘K,... 25 days ago
TODO.md SPB Private Cloud v2.0 - Full-featured personal cloud 7 mo ago
tsconfig.json SPB Private Cloud v2.0 - Full-featured personal cloud 7 mo ago
README.md source

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 <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 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&eacute;pendances
npm install

# 3. Configurer l'environnement
cp .env.example .env
# &Eacute;diter .env avec vos valeurs

# 4. Initialiser la base de donn&eacute;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.

# 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

text
spb-private-cloud/
├── app/
│   ├── admin/            # Pages administration
│   │   ├── activity/     # Historique d'activit&eacute;
│   │   ├── api-keys/     # Gestion cl&eacute;s API
│   │   ├── backup/       # Gestion backups
│   │   ├── settings/     # Param&egrave;tres (2FA)
│   │   ├── shares/       # Liens partag&eacute;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&eacute;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&eacute;gration Claude API
│   ├── auth.ts           # Authentification multi-user
│   ├── backup.ts         # Syst&egrave;me de backup
│   ├── encryption.ts     # Chiffrement AES-256-GCM
│   ├── notifications.ts  # Syst&egrave;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&eacute;ma de base de donn&eacute;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

  • 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

Files Lines API Routes Components

Plugins DB Models AI Functions Dependencies


# Contact


Built with passion by Simon-Pierre Boucher & Claude Opus 4.6
© 2024-2026 SPB Private Cloud. Tous droits réservés.