docs: overhaul and expand technical documentation
Revamped the documentation structure and content to enhance usability and organization. Added detailed sections on architecture, pipeline, security, API reference, deployment steps, compliance, and supported modules. Introduced new visuals like cards, accordions, and callouts for improved readability and navigation.
This commit is contained in:
@@ -1,10 +1,27 @@
|
||||
{
|
||||
"index": "Introduction",
|
||||
"---core---": {
|
||||
"type": "separator",
|
||||
"label": "Architecture Core"
|
||||
},
|
||||
"features": "Fonctionnalités",
|
||||
"stack": "Stack Technologique",
|
||||
"database": "Modèle de Données",
|
||||
"api": "API & Intégrations",
|
||||
"---security---": {
|
||||
"type": "separator",
|
||||
"label": "Sécurité & Conformité"
|
||||
},
|
||||
"security": "Sécurité",
|
||||
"compliance": "Conformité (RGPD)",
|
||||
"---api---": {
|
||||
"type": "separator",
|
||||
"label": "Intégrations & API"
|
||||
},
|
||||
"api": "API & Intégrations",
|
||||
"api-reference": "Référence API",
|
||||
"---ops---": {
|
||||
"type": "separator",
|
||||
"label": "Opérations"
|
||||
},
|
||||
"deployment": "Déploiement & Tests"
|
||||
}
|
||||
|
||||
191
documentation/content/docs/api-reference.mdx
Normal file
191
documentation/content/docs/api-reference.mdx
Normal file
@@ -0,0 +1,191 @@
|
||||
---
|
||||
title: Référence API
|
||||
description: Documentation détaillée de tous les points de terminaison de l'API Memegoat.
|
||||
---
|
||||
|
||||
## 📖 Référence API
|
||||
|
||||
Cette page documente tous les points de terminaison disponibles sur l'API Memegoat. L'URL de base de l'API est `https://api.memegoat.fr`.
|
||||
|
||||
<Callout type="info">
|
||||
L'authentification est gérée via des **cookies HttpOnly sécurisés** (`iron-session`). Les tokens ne sont pas exposés dans le corps des réponses après connexion pour une sécurité maximale.
|
||||
</Callout>
|
||||
|
||||
### 🔐 Authentification (`/auth`)
|
||||
|
||||
<Accordions>
|
||||
<Accordion title="POST /auth/register">
|
||||
Inscrit un nouvel utilisateur.
|
||||
|
||||
**Corps de la requête (JSON) :**
|
||||
- `username` (string) : Nom d'utilisateur unique.
|
||||
- `email` (string) : Adresse email valide.
|
||||
- `password` (string) : Mot de passe (min. 8 caractères).
|
||||
|
||||
```json
|
||||
{
|
||||
"username": "goat_user",
|
||||
"email": "user@memegoat.fr",
|
||||
"password": "strong-password"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="POST /auth/login">
|
||||
Authentifie un utilisateur et retourne les jetons de session. Si la 2FA est activée, retourne un indicateur.
|
||||
|
||||
**Corps de la requête :**
|
||||
- `email` (string)
|
||||
- `password` (string)
|
||||
|
||||
**Réponse (Succès) :**
|
||||
```json
|
||||
{
|
||||
"message": "User logged in successfully",
|
||||
"userId": "uuid-v4"
|
||||
}
|
||||
```
|
||||
*Note: L'access_token et le refresh_token sont stockés dans un cookie HttpOnly chiffré.*
|
||||
|
||||
**Réponse (2FA requise) :**
|
||||
```json
|
||||
{
|
||||
"message": "2FA required",
|
||||
"requires2FA": true,
|
||||
"userId": "uuid-v4"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="POST /auth/verify-2fa">
|
||||
Finalise la connexion si la 2FA est requise.
|
||||
|
||||
**Corps de la requête :**
|
||||
- `userId` (uuid) : ID de l'utilisateur.
|
||||
- `token` (string) : Code TOTP à 6 chiffres.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="POST /auth/refresh">
|
||||
Obtient un nouvel `access_token` à partir du `refresh_token` stocké dans la session.
|
||||
Met à jour automatiquement le cookie de session.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="POST /auth/logout">
|
||||
Invalide la session actuelle.
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
|
||||
### 👤 Utilisateurs (`/users`)
|
||||
|
||||
<Accordions>
|
||||
<Accordion title="GET /users/me">
|
||||
Récupère les informations détaillées de l'utilisateur connecté. Requiert l'authentification.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="GET /users/me/export">
|
||||
Extrait l'intégralité des données de l'utilisateur au format JSON (Conformité RGPD).
|
||||
Contient le profil, les contenus et les favoris.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="PATCH /users/me">
|
||||
Met à jour les informations du profil.
|
||||
- `displayName` (string)
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="DELETE /users/me">
|
||||
Marque le compte pour suppression (Soft Delete).
|
||||
<Callout type="warn">
|
||||
Les données sont définitivement purgées après un délai légal de 30 jours.
|
||||
</Callout>
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Gestion 2FA">
|
||||
- `POST /users/me/2fa/setup` : Génère un secret et QR Code.
|
||||
- `POST /users/me/2fa/enable` : Active après vérification du jeton.
|
||||
- `POST /users/me/2fa/disable` : Désactive avec jeton.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Administration (GET /users/admin)">
|
||||
Liste tous les utilisateurs. Réservé aux administrateurs.
|
||||
**Params :** `limit`, `offset`.
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
|
||||
### 🖼️ Contenus (`/contents`)
|
||||
|
||||
<Accordions>
|
||||
<Accordion title="GET /contents/explore | /trends | /recent">
|
||||
Recherche et filtre les contenus. Ces endpoints sont mis en cache (Redis + Navigateur).
|
||||
|
||||
**Query Params :**
|
||||
- `sort` : `trend` | `recent` (uniquement sur `/explore`)
|
||||
- `tag` (string)
|
||||
- `category` (slug ou id)
|
||||
- `author` (username)
|
||||
- `query` (titre)
|
||||
- `favoritesOnly` (bool)
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="GET /contents/:idOrSlug">
|
||||
Récupère un contenu par son ID ou son Slug.
|
||||
|
||||
**Détection de Bots (SEO) :**
|
||||
Si l'User-Agent correspond à un robot d'indexation (Googlebot, Twitterbot, etc.), l'API retourne un rendu HTML minimal contenant les méta-tags **OpenGraph** et **Twitter Cards** pour un partage optimal. Pour les autres clients, les données sont retournées en JSON.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="POST /contents/upload">
|
||||
Upload un fichier avec traitement automatique.
|
||||
**Type :** `multipart/form-data`
|
||||
|
||||
**Champs :**
|
||||
- `file` (binary) : png, jpeg, webp, webm, gif.
|
||||
- `type` : `meme` | `gif`
|
||||
- `title` : string
|
||||
- `categoryId`? : uuid
|
||||
- `tags`? : string[]
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="POST /contents/:id/view | /use">
|
||||
Incrémente les statistiques de vue ou d'utilisation.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="DELETE /contents/:id">
|
||||
Supprime un contenu (Soft Delete). Doit être l'auteur.
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
|
||||
### 📂 Catégories, ⭐ Favoris, 🚩 Signalements
|
||||
|
||||
<Accordions>
|
||||
<Accordion title="Catégories (/categories)">
|
||||
- `GET /categories` : Liste toutes les catégories.
|
||||
- `POST /categories` : Création (Admin uniquement).
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Favoris (/favorites)">
|
||||
- `GET /favorites` : Liste les favoris de l'utilisateur.
|
||||
- `POST /favorites/:contentId` : Ajoute un favori.
|
||||
- `DELETE /favorites/:contentId` : Retire un favori.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Signalements (/reports)">
|
||||
- `POST /reports` : Signale un contenu ou un tag.
|
||||
- `GET /reports` : Liste (Modérateurs).
|
||||
- `PATCH /reports/:id/status` : Gère le workflow.
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
|
||||
### 🔑 Clés API & 🏷️ Tags
|
||||
|
||||
<Accordions>
|
||||
<Accordion title="Clés API (/api-keys)">
|
||||
- `POST /api-keys` : Génère une clé `{ name, expiresAt? }`.
|
||||
- `GET /api-keys` : Liste les clés actives.
|
||||
- `DELETE /api-keys/:id` : Révoque une clé.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Tags (/tags)">
|
||||
- `GET /tags` : Recherche de tags populaires ou récents.
|
||||
**Params :** `query`, `sort`, `limit`.
|
||||
</Accordion>
|
||||
</Accordions>
|
||||
@@ -7,14 +7,18 @@ description: Documentation des API et services tiers
|
||||
|
||||
### Documentation API
|
||||
|
||||
Documentation MDX.
|
||||
L'API Memegoat est documentée de manière exhaustive dans notre [Référence API](/docs/api-reference).
|
||||
Vous y trouverez la liste de tous les points de terminaison, les formats de requête et de réponse, ainsi que les niveaux d'autorisation requis.
|
||||
|
||||
### Authentification
|
||||
|
||||
Le système utilise plusieurs méthodes d'authentification sécurisées :
|
||||
- **Sessions (JWT)** : Utilisation de JSON Web Tokens signés pour les sessions utilisateurs via le web. Les sessions sont persistées en base de données (`sessions`) pour permettre la révocation (Logout) et le suivi des appareils connectés.
|
||||
- **API Keys** : Pour les intégrations programmatiques. Les clés sont hachées en base de données (`key_hash`) et associées à un utilisateur. Elles peuvent être nommées et révoquées individuellement.
|
||||
- **Double Authentification (2FA)** : Support natif (TOTP) avec secret chiffré en base de données.
|
||||
Le système utilise plusieurs méthodes d'authentification sécurisées pour répondre à différents besoins :
|
||||
|
||||
<Cards>
|
||||
<Card title="Sessions (JWT)" description="Utilisation de tokens signés pour les sessions web, persistés en base pour la révocation." />
|
||||
<Card title="API Keys" description="Clés hachées (SHA-256) pour les intégrations programmatiques, révocables individuellement." />
|
||||
<Card title="Double Authentification" description="Support TOTP natif avec secret chiffré PGP pour une sécurité maximale." />
|
||||
</Cards>
|
||||
|
||||
### Webhooks / Services Externes
|
||||
|
||||
|
||||
@@ -9,9 +9,11 @@ Le projet Memegoat s'inscrit dans une démarche de respect de la vie privée et
|
||||
|
||||
### 🛡️ Principes Fondamentaux
|
||||
|
||||
- **Minimisation des données** : Seules les données strictement nécessaires au fonctionnement du service sont collectées.
|
||||
- **Transparence** : Les utilisateurs sont informés de la finalité des traitements de leurs données.
|
||||
- **Sécurité** : Mise en œuvre de mesures techniques et organisationnelles pour protéger les données.
|
||||
<Cards>
|
||||
<Card title="Minimisation" description="Seules les données strictement nécessaires sont collectées." />
|
||||
<Card title="Transparence" description="Finalité des traitements explicitée aux utilisateurs." />
|
||||
<Card title="Sécurité" description="Mesures techniques et organisationnelles de pointe." />
|
||||
</Cards>
|
||||
|
||||
### 🔒 Mesures Techniques de Protection
|
||||
|
||||
@@ -20,19 +22,35 @@ Conformément à la section [Sécurité](/docs/security), les mesures suivantes
|
||||
- **Hachage aveugle** : Pour permettre les opérations sur données chiffrées sans compromettre la confidentialité.
|
||||
- **Hachage des mots de passe** : Utilisation de l'algorithme **Argon2id**.
|
||||
- **Communications sécurisées** : Utilisation de **TLS 1.3** via Caddy.
|
||||
- **Suivi des Erreurs (Sentry)** : Configuration conforme avec désactivation de l'envoi des PII (Personally Identifiable Information) et masquage des données sensibles.
|
||||
|
||||
### 👤 Droits des Utilisateurs
|
||||
|
||||
Conformément au RGPD, les utilisateurs disposent des droits suivants, facilités par l'architecture technique :
|
||||
- **Droit à l'effacement (droit à l'oubli)** : Mis en œuvre via un mécanisme de **Soft Delete** (`deleted_at`), suivi d'une purge définitive des données après un délai de conservation légal.
|
||||
- **Droit d'accès et portabilité** : L'utilisation de schémas structurés (Drizzle/PostgreSQL) permet l'extraction facile des données d'un utilisateur sur demande.
|
||||
- **Gestion du consentement** : Suivi rigoureux des versions de CGU et de politique de confidentialité acceptées (`terms_version`, `privacy_version`, `gdpr_accepted_at`).
|
||||
Conformément au RGPD, les utilisateurs disposent des droits suivants :
|
||||
|
||||
<Callout type="info" title="Droit à l'effacement">
|
||||
Mis en œuvre via un mécanisme de **Soft Delete** (`deleted_at`), suivi d'une purge définitive après 30 jours.
|
||||
</Callout>
|
||||
|
||||
<Callout type="info" title="Portabilité">
|
||||
Route dédiée `GET /users/me/export` permettant l'extraction immédiate au format JSON.
|
||||
</Callout>
|
||||
|
||||
<Callout type="info" title="Consentement">
|
||||
Suivi des versions de CGU et politique de confidentialité (`terms_version`, `privacy_version`).
|
||||
</Callout>
|
||||
|
||||
### ⏳ Conservation et Purge
|
||||
|
||||
- **Purge Automatique** : Les données liées aux signalements (`reports`) disposent d'une date d'expiration (`expires_at`) pour garantir qu'elles ne sont pas conservées au-delà du nécessaire.
|
||||
- **Anonymisation technique** : Les adresses IP stockées dans les tables `audit_logs` et `sessions` sont hachées (`ip_hash`), ce qui permet d'identifier des comportements malveillants tout en protégeant l'identité réelle de l'utilisateur.
|
||||
- **Logs d'Audit** : Les journaux d'audit sont conservés pendant une période glissante pour répondre aux obligations de sécurité tout en respectant la minimisation.
|
||||
- **Purge Automatique (Jobs Cron)** : Un service de purge planifiée s'exécute régulièrement pour :
|
||||
- Supprimer définitivement les comptes et contenus marqués pour suppression depuis plus de 30 jours.
|
||||
- Nettoyer les sessions expirées ou révoquées.
|
||||
- Supprimer les signalements (`reports`) ayant atteint leur date d'expiration.
|
||||
|
||||
<Callout type="warn" title="Anonymisation">
|
||||
Les adresses IP sont hachées (`ip_hash`) via SHA-256 dans les logs d'audit et de session.
|
||||
</Callout>
|
||||
- **Logs d'Audit** : Les journaux d'audit sont conservés pour répondre aux obligations de sécurité tout en respectant la minimisation.
|
||||
|
||||
### 📍 Hébergement des Données
|
||||
|
||||
|
||||
@@ -17,12 +17,16 @@ erDiagram
|
||||
USER ||--o{ SESSION : "detient"
|
||||
USER ||--o{ API_KEY : "genere"
|
||||
USER ||--o{ AUDIT_LOG : "genere"
|
||||
USER ||--o{ FAVORITE : "ajoute"
|
||||
|
||||
CONTENT ||--o{ CONTENT_TAG : "possede"
|
||||
TAG ||--o{ CONTENT_TAG : "est_lie_a"
|
||||
CONTENT ||--o{ REPORT : "est_signale"
|
||||
CONTENT ||--o{ FAVORITE : "est_mis_en"
|
||||
TAG ||--o{ REPORT : "est_signale"
|
||||
|
||||
CATEGORY ||--o{ CONTENT : "catégorise"
|
||||
|
||||
ROLE ||--o{ USER_ROLE : "attribue_a"
|
||||
ROLE ||--o{ ROLE_PERMISSION : "possede"
|
||||
PERMISSION ||--o{ ROLE_PERMISSION : "est_lie_a"
|
||||
@@ -93,15 +97,32 @@ erDiagram
|
||||
contents {
|
||||
uuid id PK
|
||||
uuid user_id FK
|
||||
uuid category_id FK
|
||||
content_type type
|
||||
varchar title
|
||||
varchar storage_key
|
||||
varchar mime_type
|
||||
integer file_size
|
||||
integer views
|
||||
integer usage_count
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
timestamp deleted_at
|
||||
}
|
||||
categories {
|
||||
uuid id PK
|
||||
varchar name
|
||||
varchar slug
|
||||
varchar description
|
||||
varchar icon_url
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
favorites {
|
||||
uuid user_id PK, FK
|
||||
uuid content_id PK, FK
|
||||
timestamp created_at
|
||||
}
|
||||
tags {
|
||||
uuid id PK
|
||||
varchar name
|
||||
@@ -182,6 +203,9 @@ erDiagram
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
users ||--o{ favorites : "user_id"
|
||||
contents ||--o{ favorites : "content_id"
|
||||
categories ||--o{ contents : "category_id"
|
||||
users ||--o{ contents : "user_id"
|
||||
users ||--o{ users_to_roles : "user_id"
|
||||
roles ||--o{ users_to_roles : "role_id"
|
||||
|
||||
@@ -9,10 +9,67 @@ description: Procédures de déploiement et stratégie de tests
|
||||
|
||||
Un conteneur **Caddy** est utilisé en tant que reverse proxy pour fournir le TLS et la gestion du FQDN.
|
||||
|
||||
### Pré-requis
|
||||
### Pré-requis Système
|
||||
|
||||
Liste des outils nécessaires (Node.js, pnpm, Docker).
|
||||
<Cards>
|
||||
<Card title="Environnement" description="Node.js >= 20, pnpm >= 10." />
|
||||
<Card title="Base de données" description="PostgreSQL >= 15 + pgcrypto et Redis." />
|
||||
<Card title="Stockage" description="MinIO ou S3 Compatible." />
|
||||
<Card title="Services" description="ClamAV (clamd) et FFmpeg." />
|
||||
</Cards>
|
||||
|
||||
## 🧪 Tests
|
||||
### Procédure de Déploiement
|
||||
|
||||
- **Unitaires** : sur le backend
|
||||
<Steps>
|
||||
<Step>
|
||||
### Configuration de l'environnement
|
||||
Copiez le fichier `.env.example` vers `.env` et configurez les variables essentielles (clés PGP, secrets JWT, accès S3).
|
||||
</Step>
|
||||
|
||||
<Step>
|
||||
### Installation des dépendances
|
||||
Utilisez pnpm pour installer les packages dans le monorepo :
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
</Step>
|
||||
|
||||
<Step>
|
||||
### Initialisation de la base de données
|
||||
Exécutez les migrations Drizzle pour créer les tables et les types nécessaires.
|
||||
```bash
|
||||
pnpm --filter backend db:migrate
|
||||
```
|
||||
</Step>
|
||||
|
||||
<Step>
|
||||
### Lancement des services
|
||||
Utilisez Docker Compose pour lancer l'infrastructure complète ou démarrez les services individuellement.
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
## 🧪 Tests & Qualité
|
||||
|
||||
<Tabs items={['Tests', 'Linting', 'Build']}>
|
||||
<Tab value="Tests">
|
||||
Exécutez la suite de tests unitaires avec Jest :
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
</Tab>
|
||||
<Tab value="Linting">
|
||||
Vérifiez la conformité du code avec Biome :
|
||||
```bash
|
||||
pnpm lint
|
||||
```
|
||||
</Tab>
|
||||
<Tab value="Build">
|
||||
Validez la compilation de tous les modules :
|
||||
```bash
|
||||
pnpm build
|
||||
```
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@@ -3,55 +3,73 @@ title: Fonctionnalités Techniques
|
||||
description: Détails des fonctionnalités clés du projet Memegoat
|
||||
---
|
||||
|
||||
## 🚀 Fonctionnalités Techniques
|
||||
# 🚀 Fonctionnalités Techniques
|
||||
|
||||
Le projet Memegoat intègre un ensemble de fonctionnalités avancées pour garantir une expérience utilisateur fluide, sécurisée et performante.
|
||||
|
||||
### 📧 Emailing
|
||||
Le système intègre un service d'envoi d'emails pour :
|
||||
- La vérification des comptes lors de l'inscription.
|
||||
- La récupération de mots de passe.
|
||||
- Les notifications de sécurité (nouvelles connexions, changements de profil).
|
||||
- Les alertes de modération.
|
||||
## 🏗️ Infrastructure & Médias
|
||||
|
||||
### 📤 Publication & Traitement
|
||||
Le coeur de la plateforme permet la publication sécurisée de mèmes et de GIFs avec un pipeline de traitement complet :
|
||||
|
||||
<Cards>
|
||||
<Card icon="🛡️" title="Sécurité (Antivirus)" description="Chaque fichier uploadé est scanné en temps réel par ClamAV." />
|
||||
<Card icon="🎞️" title="Transcodage" description="Conversion automatique vers WebP (images) et WebM (vidéos)." />
|
||||
<Card icon="✅" title="Validation" description="Contrôle strict des formats (png, jpeg, webp, webm, gif) et des tailles." />
|
||||
</Cards>
|
||||
|
||||
#### Détails du Pipeline :
|
||||
- **Transcodage Haute Performance** :
|
||||
- **Images & GIFs** : Conversion vers **WebP** (via `sharp`). Support de l'**AVIF** intégré.
|
||||
- **Vidéos** : Conversion vers **WebM** (VP9/Opus via `ffmpeg`). Support de l'**AV1** implémenté.
|
||||
- **Validation Stricte** :
|
||||
- Limites de taille configurables (par défaut : 512 Ko pour les images, 1024 Ko pour les GIFs).
|
||||
- **Gestion du Cycle de Vie** : Support du **Soft Delete** (Droit à l'oubli) et de la restauration temporaire.
|
||||
|
||||
### 📦 Stockage S3 (MinIO)
|
||||
Pour la gestion des médias, Memegoat utilise **MinIO**, une solution de stockage d'objets compatible S3, auto-hébergée.
|
||||
- **Sécurité** : Le serveur MinIO est isolé dans le réseau interne de Docker et n'est pas exposé directement sur internet.
|
||||
- **Accès** : Le Backend fait office de proxy ou génère des URLs présignées pour l'accès aux fichiers, garantissant un contrôle total sur la diffusion des contenus.
|
||||
- **Performance** : Optimisé pour le service rapide de fichiers volumineux comme les GIFs.
|
||||
Pour la gestion des médias, Memegoat utilise **MinIO**, une solution de stockage d'objects compatible S3, auto-hébergée.
|
||||
|
||||
<Callout type="info" title="Isolation Réseau">
|
||||
Le serveur MinIO est isolé dans le réseau interne de Docker et n'est pas exposé directement sur internet. Le Backend fait office de proxy ou génère des URLs présignées.
|
||||
</Callout>
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Expérience Utilisateur
|
||||
|
||||
### 🔍 SEO & Partage
|
||||
La plateforme est optimisée pour le référencement naturel et le partage social :
|
||||
- **Metatags dynamiques** : Génération de balises OpenGraph et Twitter Cards pour chaque mème.
|
||||
- **Metatags dynamiques** : Le Backend détecte les robots (Twitter, Facebook, Google) et sert un rendu HTML spécifique avec les balises OpenGraph et Twitter Cards.
|
||||
- **URLs Sémantiques** : Chaque mème possède un slug unique généré à partir de son titre (ex: `memegoat.fr/contents/mon-super-meme`).
|
||||
- **Indexation** : Structure sémantique HTML5 et Sitemap dynamique.
|
||||
- **Rendus côté serveur (SSR)** : Utilisation de Next.js pour un affichage instantané et une indexation parfaite par les robots.
|
||||
- **Rendus côté serveur (SSR)** : Utilisation de Next.js pour un affichage instantané pour les utilisateurs.
|
||||
|
||||
### 🔗 URLs de Terminaison
|
||||
À l'instar de plateformes comme Tenor, Memegoat utilise des structures d'URLs courtes et sémantiques :
|
||||
- Format : `memegoat.fr/m/[slug-unique]` ou `memegoat.fr/g/[slug-unique]`.
|
||||
- Les slugs sont générés de manière à être lisibles par l'humain tout en garantissant l'unicité.
|
||||
### ⚡ Performance & Cache
|
||||
Pour garantir une réactivité maximale, Memegoat utilise plusieurs niveaux de cache :
|
||||
- **Cache Redis** : Les résultats des requêtes fréquentes (tendances, exploration) sont stockés dans un cache Redis côté serveur.
|
||||
- **Directives HTTP** : Utilisation rigoureuse des headers `Cache-Control` pour permettre la mise en cache par les navigateurs et les CDNs.
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Gouvernance & Sécurité
|
||||
|
||||
### 🕵️ Audit des Actions
|
||||
Chaque action sensible sur la plateforme est tracée dans la table `audit_logs` :
|
||||
- Modification de profil, suppression de contenu, changements de permissions.
|
||||
- Enregistrement de l'auteur, de l'action, de l'horodatage et des détails techniques (IP hachée, User-Agent).
|
||||
- Outil essentiel pour la sécurité et la conformité RGPD.
|
||||
|
||||
### 👤 Gestion du Profil
|
||||
Un système complet de gestion de profil permet aux utilisateurs de :
|
||||
- Gérer leurs informations personnelles (nom d'affichage, avatar).
|
||||
- Configurer la **Double Authentification (2FA)**.
|
||||
- Consulter leurs sessions actives et révoquer des accès.
|
||||
- Les données sensibles sont protégées par **chiffrement PGP** au repos.
|
||||
|
||||
### 🚩 Gestion des Signalements
|
||||
<Callout type="info">
|
||||
Toutes les données sensibles du profil sont protégées par **chiffrement PGP** au repos.
|
||||
</Callout>
|
||||
|
||||
### 🚩 Modération & Signalements
|
||||
Un système de modération intégré permet de maintenir la qualité du contenu :
|
||||
- Signalement de contenus (mèmes, GIFs) ou de tags inappropriés.
|
||||
- Workflow de traitement : `pending` -> `reviewed` -> `resolved` / `dismissed`.
|
||||
- Signalement de contenus ou de tags inappropriés.
|
||||
- Workflow : `pending` -> `reviewed` -> `resolved` / `dismissed`.
|
||||
- Purge automatique des signalements obsolètes pour respecter la minimisation des données (RGPD).
|
||||
|
||||
### 📤 Publication de Contenu
|
||||
Le coeur de la plateforme permet la publication de mèmes et de GIFs :
|
||||
- Support des formats images standards et animés.
|
||||
- Système de **Tags** pour catégoriser et faciliter la recherche.
|
||||
- Gestion du cycle de vie des contenus (Publication, Edition, Soft Delete).
|
||||
|
||||
@@ -5,15 +5,13 @@ description: Détails techniques du projet Memegoat
|
||||
|
||||
# 🐐 Détails Techniques - Memegoat
|
||||
|
||||
Ce document regroupe l'ensemble des spécifications techniques du projet Memegoat.
|
||||
Bienvenue dans la documentation technique de Memegoat. Ce portail centralise toutes les spécifications, modèles et guides nécessaires à la compréhension et à l'évolution de la plateforme.
|
||||
|
||||
## 🏗️ Architecture Globale
|
||||
|
||||
### Vue d'ensemble
|
||||
Memegoat repose sur une architecture **monorepo** moderne, garantissant une cohérence forte entre le frontend, le backend et l'infrastructure.
|
||||
|
||||
Description de l'architecture en monorepo et des interactions entre les services.
|
||||
|
||||
### Diagrammes
|
||||
### Interaction des Services
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
@@ -22,22 +20,48 @@ graph TD
|
||||
Frontend[Frontend: Next.js]
|
||||
Backend[Backend: NestJS]
|
||||
DB[(Database: PostgreSQL)]
|
||||
Storage[Storage: S3 Compatible]
|
||||
Storage[Storage: S3/MinIO]
|
||||
Cache[(Cache: Redis)]
|
||||
Monitoring[Monitoring: Sentry]
|
||||
|
||||
User <--> Caddy
|
||||
Caddy <--> Frontend
|
||||
Caddy <--> Backend
|
||||
Backend <--> DB
|
||||
Backend <--> Storage
|
||||
Backend <--> Cache
|
||||
Backend --> Monitoring
|
||||
```
|
||||
|
||||
### Navigation
|
||||
### Navigation Rapide
|
||||
|
||||
Consultez les différentes sections pour plus de détails :
|
||||
- [Fonctionnalités Techniques](/docs/features)
|
||||
- [Stack Technologique](/docs/stack)
|
||||
- [Modèle de Données](/docs/database)
|
||||
- [Sécurité](/docs/security)
|
||||
- [Conformité RGPD](/docs/compliance)
|
||||
- [API & Intégrations](/docs/api)
|
||||
- [Déploiement](/docs/deployment)
|
||||
Explorez les sections clés pour approfondir vos connaissances techniques :
|
||||
|
||||
<Cards>
|
||||
<Card
|
||||
title="🚀 Fonctionnalités"
|
||||
href="/docs/features"
|
||||
description="Détails des capacités techniques et du pipeline média haute performance."
|
||||
/>
|
||||
<Card
|
||||
title="🔐 Sécurité"
|
||||
href="/docs/security"
|
||||
description="Chiffrement PGP natif, Argon2id, RBAC et protection proactive ClamAV."
|
||||
/>
|
||||
<Card
|
||||
title="⚖️ Conformité"
|
||||
href="/docs/compliance"
|
||||
description="Mise en œuvre du RGPD, droit à l'oubli et portabilité des données."
|
||||
/>
|
||||
<Card
|
||||
title="📖 Référence API"
|
||||
href="/docs/api-reference"
|
||||
description="Documentation exhaustive de tous les points de terminaison de l'API."
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
---
|
||||
|
||||
<Callout type="info">
|
||||
Cette documentation est destinée aux développeurs et aux administrateurs système. Pour toute question sur l'utilisation du site, merci de consulter l'aide en ligne sur [memegoat.fr](https://memegoat.fr).
|
||||
</Callout>
|
||||
|
||||
@@ -7,7 +7,12 @@ description: Mesures de sécurité implémentées
|
||||
|
||||
### Protection des Données (At Rest)
|
||||
|
||||
- **Chiffrement PGP Natif** : Les données identifiantes (PII) comme l'email, le nom d'affichage et le **secret 2FA** sont chiffrées dans PostgreSQL via `pgcrypto` (`pgp_sym_encrypt`). Les clés de déchiffrement ne sont jamais stockées en base de données.
|
||||
- **Chiffrement PGP Natif** : Les données identifiantes (PII) comme l'email, le nom d'affichage et le **secret 2FA** sont chiffrées dans PostgreSQL via `pgcrypto` (`pgp_sym_encrypt`).
|
||||
|
||||
<Callout type="warn" title="Sécurité des Clés">
|
||||
Les clés de déchiffrement ne sont jamais stockées en base de données. Elles sont injectées via les variables d'environnement au démarrage du service.
|
||||
</Callout>
|
||||
|
||||
- **Hachage aveugle (Blind Indexing)** : Pour permettre la recherche et l'unicité sur les données chiffrées (comme l'email), un hash non réversible (SHA-256) est stocké séparément (`email_hash`).
|
||||
- **Hachage des mots de passe** : Utilisation d'**Argon2id** (via `@node-rs/argon2`), configuré selon les recommandations de l'ANSSI pour résister aux attaques par force brute et par table de correspondance.
|
||||
|
||||
@@ -15,12 +20,18 @@ description: Mesures de sécurité implémentées
|
||||
|
||||
- **TLS 1.3** : Assuré par le reverse proxy **Caddy** avec renouvellement automatique des certificats Let's Encrypt.
|
||||
- **Protocoles d'Authentification** :
|
||||
- **Sessions (JWT)** : Les jetons de rafraîchissement (`refresh_token`) sont stockés de manière sécurisée en base de données. L'IP de l'utilisateur est hachée (`ip_hash`) pour concilier sécurité et respect de la vie privée.
|
||||
- **Sessions (iron-session)** : Utilisation de cookies sécurisés, `HttpOnly`, `Secure` et `SameSite: Strict`. Les tokens (JWT) sont stockés dans ces cookies chiffrés côté serveur, empêchant tout accès via JavaScript (XSS).
|
||||
- **API Keys** : Les clés API sont hachées en base de données (**SHA-256**) via la colonne `key_hash`. Seul un préfixe est conservé en clair pour l'identification.
|
||||
|
||||
### Infrastructure & Défense
|
||||
### Infrastructure & Surveillance
|
||||
|
||||
- **Rate Limiting** : Protection contre le brute-force et le déni de service (DoS).
|
||||
- **CORS Policy** : Restriction stricte des origines autorisées.
|
||||
- **RBAC (Role Based Access Control)** : Gestion granulaire des permissions avec une structure complète de rôles et de permissions liées (`roles`, `permissions`, `roles_to_permissions`).
|
||||
<Cards>
|
||||
<Card title="Antivirus (ClamAV)" description="Scan systématique de tous les fichiers entrants avant stockage." />
|
||||
<Card title="Sentry" description="Suivi des erreurs en temps réel avec respect strict du RGPD." />
|
||||
<Card title="Rate Limiting" description="Protection contre le brute-force et le DoS via NestJS Throttler." />
|
||||
<Card title="RBAC" description="Contrôle d'accès granulaire basé sur les rôles et permissions." />
|
||||
</Cards>
|
||||
|
||||
- **CORS Policy** : Restriction stricte des origines autorisées, configurée dynamiquement selon l'environnement.
|
||||
- **Security Headers** : Utilisation de `helmet` pour activer les protections standards des navigateurs (XSS, Clickjacking, etc.).
|
||||
- **Audit Logs** : Traçabilité complète des actions sensibles via la table `audit_logs`. Elle enregistre l'action, l'entité concernée, les détails au format JSONB, ainsi que l'IP hachée et le User-Agent pour l'imputabilité.
|
||||
|
||||
@@ -7,22 +7,39 @@ description: Technologies utilisées dans le projet Memegoat
|
||||
|
||||
### Frontend
|
||||
|
||||
- **Framework** : NextJS
|
||||
- **Gestion d'état** : Zustand
|
||||
- **Style** : Tailwind CSS
|
||||
- **Composants UI** : Shadcn/ui
|
||||
<Cards>
|
||||
<Card title="NextJS" description="Framework React pour le SSR et la performance." />
|
||||
<Card title="Tailwind CSS" description="Design système utilitaire pour le styling." />
|
||||
<Card title="Zustand" description="Gestion d'état légère et performante." />
|
||||
<Card title="Shadcn/ui" description="Composants UI accessibles et personnalisables." />
|
||||
</Cards>
|
||||
|
||||
### Backend
|
||||
|
||||
- **Framework** : NestJS
|
||||
- **Langage** : TypeScript
|
||||
- **Base de données** : PostgresQL
|
||||
- **ORM** : DrizzleORM
|
||||
<Cards>
|
||||
<Card title="NestJS" description="Framework Node.js modulaire et robuste." />
|
||||
<Card title="PostgreSQL" description="Base de données relationnelle puissante." />
|
||||
<Card title="Redis" description="Store clé-valeur pour le cache haute performance." />
|
||||
<Card title="Drizzle ORM" description="ORM TypeScript-first avec support des migrations." />
|
||||
<Card title="Sharp & FFmpeg" description="Traitement haute performance des images et vidéos." />
|
||||
</Cards>
|
||||
|
||||
### Sécurité & Monitoring
|
||||
|
||||
<Cards>
|
||||
<Card title="ClamAV" description="Protection antivirus en temps réel." />
|
||||
<Card title="Sentry" description="Reporting d'erreurs et profiling de performance." />
|
||||
<Card title="Argon2id" description="Hachage de mots de passe de grade militaire." />
|
||||
<Card title="PGP (pgcrypto)" description="Chiffrement natif des données sensibles." />
|
||||
<Card title="otplib" description="Implémentation TOTP pour la 2FA." />
|
||||
<Card title="iron-session" description="Gestion sécurisée des sessions via cookies chiffrés." />
|
||||
</Cards>
|
||||
|
||||
### Infrastructure & DevOps
|
||||
|
||||
- **Conteneurisation** : Docker / Docker Compose
|
||||
- **Reverse Proxy & TLS** : Caddy
|
||||
- **Stockage d'objets** : MinIO (compatible S3)
|
||||
- **CI/CD** : Gitea Actions
|
||||
- **Hébergement** : Hetzner Dedicated Server
|
||||
<Cards>
|
||||
<Card title="Docker" description="Conteneurisation et orchestration (Compose)." />
|
||||
<Card title="Caddy" description="Reverse proxy moderne avec TLS automatique." />
|
||||
<Card title="MinIO" description="Stockage d'objets auto-hébergé compatible S3." />
|
||||
<Card title="Hetzner" description="Hébergement sur serveurs dédiés en Europe." />
|
||||
</Cards>
|
||||
|
||||
Reference in New Issue
Block a user