CloudVault est une plateforme de stockage et de partage de fichiers sécurisée, construite avec une stack moderne TypeScript et déployée sur AWS. Ce projet démontre une architecture cloud complète avec CI/CD, monitoring et bonnes pratiques DevOps.
- Maîtriser les services AWS (S3, Lambda, ECS Fargate)
- Implémenter une stack TypeScript moderne (NestJS + Next.js)
- Gérer un monorepo avec Turborepo et pnpm
- Mettre en place un pipeline CI/CD professionnel
- Intégrer Cloudflare pour CDN et sécurité
- Développer des Lambda Python pour traitement asynchrone
- Appliquer les bonnes pratiques DevOps (Docker, monitoring, tests)
Backend
- NestJS (TypeScript)
- Prisma ORM
- PostgreSQL
- JWT Authentication
- AWS SDK (S3)
Frontend
- Next.js 16 (App Router)
- React 19
- TypeScript
- Tailwind CSS
Infrastructure
- AWS S3 eu-west-3 (stockage fichiers, SSE-S3, pre-signed POST)
- AWS Lambda (traitement asynchrone Python — thumbnails Pillow)
- AWS ECS Fargate eu-west-3 (hébergement API NestJS)
- PostgreSQL (Neon EU, via Prisma 7)
- Cloudflare (DNS, CDN, WAF)
- Docker & Docker Compose
DevOps
- Turborepo (monorepo)
- pnpm (package manager)
- GitHub Actions (CI/CD)
- Nginx (reverse proxy)
- CloudWatch (logs & monitoring)
cloudvault/
├── apps/
│ ├── api/ # Backend NestJS
│ └── web/ # Frontend Next.js
├── packages/
│ └── types/ # Types TypeScript partagés
├── lambdas/
│ └── thumbnail-generator/ # Lambda Python
├── infra/ # Configuration infrastructure
└── .github/workflows/ # CI/CD
- Node.js >= 20
- pnpm >= 9
- Docker & Docker Compose
- PostgreSQL (local ou Docker)
- Compte AWS configuré
# Cloner le repo
git clone https://github.com/votre-username/cloudvault.git
cd cloudvault
# Installer les dépendances
pnpm install
# Configuration environnement
cp .env.example .env
# Configurer la base de données
pnpm db:generate
pnpm db:migrate
# Lancer en mode développement
pnpm dev
L'API sera accessible sur http://localhost:4000
Le frontend sur http://localhost:3000
# Développement
pnpm dev # Lance tous les services en mode watch
# Build
pnpm build # Build tous les packages
# Tests
pnpm test # Lance tous les tests
# Lint
pnpm lint # Vérifie le code
# Format
pnpm format # Formate le code avec Prettier
# Prisma
pnpm db:generate # Génère le client Prisma
pnpm db:migrate # Crée une migration
pnpm db:studio # Interface GUI base de données
- Authentification utilisateur (register/login)
- Upload de fichiers vers S3 avec URL pré-signée
- Liste des fichiers utilisateur
- Suppression de fichiers
- Génération automatique de thumbnails (Lambda Python)
- Dashboard utilisateur
- Partage de fichiers (liens publics/privés)
- Organisation par dossiers
- Statistiques d'utilisation
- Gestion des quotas
- Worker Lambda de nettoyage automatique
- Métriques et alertes avancées
docker-compose -f infra/docker-compose.yml up -d
pnpm dev
Le déploiement passe par GitHub Actions (.github/workflows/deploy.yml) :
- trigger : succès CI sur
mainouworkflow_dispatchdepuismainuniquement - gate : environnement GitHub
production(approbation manuelle obligatoire) - auth : OIDC vers AWS via
aws-actions/configure-aws-credentials(SHA-pinned, aucune clé IAM long-lived) - 3 jobs parallèles :
deploy-infra(CDK),deploy-api(Fargate),deploy-lambda
Le bootstrap du provider OIDC + rôle IAM est suivi dans KON-88 (story 1-7).
- Authentification JWT
- Hash argon2id (
@node-rs/argon2) pour mots de passe - URL S3 pré-signées (expiration 15min)
- CORS configuré
- Variables d'environnement sécurisées
- Cloudflare WAF actif
- Logs CloudWatch (Lambda)
- Healthcheck endpoint
/health - Métriques système (CPU, RAM, disque)
Le repository utilise GitHub Actions avec authentification OIDC vers AWS.
.github/workflows/ci.yml— déclenché sur chaque pull request et push surmain. Exécutepnpm lint,pnpm test,pnpm build, upload la couverture, et lint les workflows avecactionlint..github/workflows/deploy.yml— déclenché après succès de CI surmainou viaworkflow_dispatch. Contient trois jobs (deploy-infra,deploy-api,deploy-lambda) derrière l'environnementproduction(approbation manuelle GitHub)..github/actions/setup-monorepo— composite action partagée : pnpm 9 (depuispackageManagerdupackage.json), Node (depuisengines.node), install,prisma generate. Toutes les actions tierces sont SHA-pinned.
| Secret | Statut | Usage |
|---|---|---|
AWS_ROLE_TO_ASSUME |
requis | ARN du rôle IAM assumé via OIDC par les jobs deploy-* |
TURBO_TOKEN |
optionnel | Active le cache distant Turborepo (fallback local sans lui) |
TURBO_TEAM |
optionnel | Team slug Turborepo (paire avec TURBO_TOKEN) |
VERCEL_TOKEN |
futur | Réservé pour le futur job de déploiement Vercel (frontend) |
Permissions requises côté job. Chaque job
deploy-*doit déclarerpermissions: { id-token: write, contents: read }pour que l'échange de token OIDC fonctionne. Déjà configuré dansdeploy.yml— à préserver dans tout nouveau job de déploiement.Required reviewers. L'environnement GitHub
productionDOIT être configuré avec au moins un required reviewer (Settings → Environments → production). Sans reviewers,workflow_dispatchdevient une porte ouverte sur la prod.
Ne créez jamais de clés IAM long-lived (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY) pour CI. L'authentification est OIDC-only :
- Le provider OIDC GitHub est enregistré dans le compte AWS (
https://token.actions.githubusercontent.com). - Un rôle IAM avec trust policy restreinte à
repo:<org>/CloudVault-official:ref:refs/heads/mainetrepo:<org>/CloudVault-official:environment:production. - L'ARN du rôle est exposé via le secret
AWS_ROLE_TO_ASSUME.
Le bootstrap du provider OIDC et du rôle IAM est suivi dans KON-88 (story 1-7 AWS CDK stacks).
- Fork le projet
- Créer une branche (
git checkout -b feature/amazing-feature) - Commit (
git commit -m 'Add amazing feature') - Push (
git push origin feature/amazing-feature) - Ouvrir une Pull Request
MIT
Frédéric Yaba
- GitHub: @yabafre
- LinkedIn: Frédéric Yaba
⭐ Si ce projet vous aide, n'hésitez pas à lui donner une étoile !