Dashboard social media multi-clients (Meta/Instagram+Facebook, LinkedIn, TikTok, YouTube) avec synchronisation quotidienne et analytics par tenant.
# 1. Install dependencies
npm install
# 2. Copy environment file and configure
cp .env.example .env.local
# Edit .env.local with your credentials
# 3. Run Supabase migrations (if using Supabase CLI)
supabase db push
# OR apply SQL files in supabase/migrations/ manually in your Supabase dashboard
# 4. Start development server
npm run devL'application sera disponible sur http://localhost:3000
| Variable | Description | Exemple |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
URL du projet Supabase | https://xxx.supabase.co |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Clé anon Supabase | eyJ... |
SUPABASE_SERVICE_ROLE_KEY |
Clé service role (backend only) | eyJ... |
NEXT_PUBLIC_SITE_URL |
URL publique de l'app | https://app.example.com |
ENCRYPTION_SECRET |
Secret pour chiffrer les tokens OAuth (32 chars) | random-32-char-string |
CRON_SECRET |
Secret pour auth des cron jobs | random-long-string |
| Plateforme | Variables | Portail développeur |
|---|---|---|
| Meta | META_APP_ID, META_APP_SECRET |
developers.facebook.com |
LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET |
developer.linkedin.com | |
| TikTok | TIKTOK_CLIENT_KEY, TIKTOK_CLIENT_SECRET |
developers.tiktok.com |
| YouTube | GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET |
console.cloud.google.com |
| Twitter/X | TWITTER_CLIENT_ID, TWITTER_CLIENT_SECRET |
developer.twitter.com |
| Variable | Description | Default |
|---|---|---|
DEMO_MODE |
Active le mode démo avec données mock | false |
YOUTUBE_API_KEY |
Clé API YouTube (alternative à OAuth) | - |
DEBUG_ROUTES_ENABLED |
Active les routes /api/debug/* (admin + secret requis) |
false |
Les cron jobs sont définis dans vercel.json et utilisent Authorization: Bearer $CRON_SECRET.
| Endpoint | Schedule | Description |
|---|---|---|
/api/cron/sync |
0 3 * * * (3h UTC) | Sync quotidien des metrics |
/api/cron/refresh-tokens |
0 2 * * * (2h UTC) | Refresh des tokens OAuth |
curl -H "Authorization: Bearer YOUR_CRON_SECRET" \
http://localhost:3000/api/cron/syncapp/
├── (admin)/admin/ # Pages admin (gestion clients, connexions)
├── (auth)/login/ # Page de connexion
├── (client)/client/ # Dashboard client (stats, ads, documents)
├── api/
│ ├── cron/ # Endpoints cron (sync, refresh-tokens, backfill)
│ ├── oauth/ # Callbacks OAuth par plateforme
│ └── export/ # Export PDF/CSV
lib/
├── social-platforms/ # Connecteurs API par plateforme
│ ├── core/ # API client, rate limiter, token manager
│ ├── meta/ # Facebook + Instagram
│ ├── linkedin/
│ ├── tiktok/
│ ├── twitter/
│ └── youtube/
├── supabase/ # Clients Supabase (server + browser)
├── queries.ts # Requêtes dashboard
└── sync.ts # Logique de synchronisation
supabase/migrations/ # Migrations SQL
components/ # Composants UI
| Plateforme | Status | Notes |
|---|---|---|
| ✅ OK | Insights time series + posts media | |
| ✅ OK | Page insights + posts | |
| ✅ OK | Org stats + shares + follower gains | |
| TikTok | ✅ OK | User info + videos + metrics |
| YouTube | ✅ OK | Channel stats + recent videos |
| API v2 (Basic tier = limites strictes) |
npm run dev # Development server
npm run build # Production build
npm run start # Start production server
npm run lint # ESLint
npm run security-check # Vérification isolation tenant
npm run seed:demo # Seed du workspace demoLa documentation complete est disponible dans README-DEMO.md.
- Connecter le repo GitHub à Vercel
- Configurer les variables d'environnement dans Vercel Dashboard
- Les crons sont auto-configurés via
vercel.json - Exécuter les migrations sur Supabase avant le premier deploy
- Variables Supabase configurées
-
ENCRYPTION_SECRETgénéré (32 chars aléatoires) -
CRON_SECRETgénéré (string long aléatoire) - Au moins une plateforme OAuth configurée
- Migrations SQL appliquées sur Supabase
- Tokens OAuth chiffrés avec AES-256-GCM
- RLS (Row Level Security) sur toutes les tables
- Middleware auth sur routes
/clientet/admin - Cron protégé par Bearer token
- Aucun secret hardcodé dans le code
- YouTube: Les
viewssont cumulées (total de la chaîne), pas journalières - Twitter: Rate limits stricts sur API v2 Basic tier
- LinkedIn: Stats disponibles sur 12 mois glissants max
- Meta: Insights IG Business limités à 30 jours
Pour toute question ou bug, ouvrir une issue sur le repository.