mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-14 10:47:08 +02:00
Problème: Le redéploiement du stack échouait avec l'erreur "network nginx_default declared as external, but could not be found" car le réseau Docker externe n'existait pas. Solution: - Modification du réseau nginx_default de externe à interne dans docker-compose.yml - Le réseau est maintenant créé automatiquement par Docker Compose - Ajout de documentation pour l'utilisation avec Nginx existant - Ajout d'une section de dépannage pour cette erreur spécifique Changements: - docker-compose.yml: Changement de external: true à external: false avec configuration explicite du driver bridge - README.md: Suppression du prérequis réseau externe, ajout de la section "Réseau Docker" et documentation de l'erreur dans le dépannage Cette modification permet au stack de se déployer automatiquement sans nécessiter de configuration réseau préalable, tout en restant compatible avec des services Nginx existants.
258 lines
6.1 KiB
Markdown
258 lines
6.1 KiB
Markdown
# 📝 NoteFlow - Application de Notes et Todo List
|
|
|
|
Application web moderne de gestion de notes et de tâches, Dockerisée, avec authentification JWT, interface utilisateur fluide et animations CSS natives.
|
|
|
|
## ✨ Fonctionnalités
|
|
|
|
### 🔐 Authentification
|
|
- Connexion JWT sécurisée avec bcrypt
|
|
- Session de 24 heures
|
|
- Gestion des utilisateurs par les administrateurs
|
|
|
|
### 📝 Gestion des Notes
|
|
- Création, édition et suppression de notes
|
|
- Support des images (upload, preview, suppression)
|
|
- Todos intégrés dans les notes
|
|
- Recherche en temps réel par titre/contenu
|
|
- Interface masonry layout responsive
|
|
- Animations fluides sur les interactions
|
|
|
|
### ✅ Todos Globaux
|
|
- Sidebar permanente avec quick tasks
|
|
- Création, modification, suppression de todos
|
|
- Toggle completed/active
|
|
- Filtres : Toutes / Actives / Terminées
|
|
- Compteur de tâches restantes
|
|
|
|
### 👥 Administration
|
|
- Gestion des utilisateurs (création, modification, suppression)
|
|
- Attribution des droits administrateur
|
|
- Interface dédiée pour les admins
|
|
|
|
## 🛠️ Stack Technique
|
|
|
|
- **Backend** : Node.js 20 + Express
|
|
- **Base de données** : SQLite3
|
|
- **Authentification** : JWT + bcrypt
|
|
- **Frontend** : React 19 + TypeScript + Vite
|
|
- **UI Components** : shadcn/ui + Tailwind CSS
|
|
- **Routing** : React Router v7
|
|
- **State Management** : TanStack Query (React Query)
|
|
- **Sécurité** : Helmet.js, rate limiting, validation des entrées
|
|
- **Logging** : Winston
|
|
- **Upload** : Multer
|
|
- **Container** : Docker + Docker Compose
|
|
|
|
## 🚀 Installation et Démarrage
|
|
|
|
### Prérequis
|
|
- Docker et Docker Compose installés
|
|
|
|
### Installation
|
|
|
|
1. **Cloner le repository**
|
|
```bash
|
|
git clone <repository-url>
|
|
cd noteflow
|
|
```
|
|
|
|
2. **Configurer les variables d'environnement**
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Éditer le fichier `.env` :
|
|
```env
|
|
PORT=2222
|
|
JWT_SECRET=<générer_une_clé_secrète_forte>
|
|
NODE_ENV=production
|
|
```
|
|
|
|
**Générer un JWT_SECRET fort** :
|
|
```bash
|
|
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
|
|
```
|
|
|
|
3. **Builder et démarrer l'application**
|
|
```bash
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
4. **Accéder à l'application**
|
|
```
|
|
http://localhost:2222
|
|
```
|
|
|
|
### Identifiants par défaut
|
|
```
|
|
Username: admin
|
|
Password: admin
|
|
```
|
|
|
|
**⚠️ IMPORTANT** : Changez immédiatement le mot de passe admin en production !
|
|
|
|
## 🐳 Commandes Docker
|
|
|
|
```bash
|
|
# Démarrer
|
|
docker-compose up -d
|
|
|
|
# Arrêter
|
|
docker-compose down
|
|
|
|
# Rebuild
|
|
docker-compose build
|
|
|
|
# Logs
|
|
docker-compose logs -f
|
|
|
|
# Backup base de données (depuis le volume Docker)
|
|
docker cp notes-todo-app:/app/data/notes.db ./backup_$(date +%Y%m%d).db
|
|
|
|
# Restore base de données
|
|
docker cp ./backup_YYYYMMDD.db notes-todo-app:/app/data/notes.db
|
|
docker-compose restart
|
|
|
|
# Lister les volumes Docker
|
|
docker volume ls | grep notes
|
|
|
|
# Inspecter un volume
|
|
docker volume inspect noteflow_notes_data
|
|
|
|
# Supprimer les volumes (⚠️ supprime toutes les données)
|
|
docker-compose down -v
|
|
```
|
|
|
|
## 🌐 Réseau Docker
|
|
|
|
L'application crée automatiquement un réseau Docker `nginx_default`. Si vous utilisez déjà ce réseau avec d'autres services (ex: Nginx), ils pourront communiquer automatiquement.
|
|
|
|
### Utilisation avec Nginx existant
|
|
|
|
Si vous avez déjà un container Nginx dans le réseau `nginx_default`, vous pouvez y connecter votre Nginx :
|
|
|
|
```bash
|
|
# Connecter un container Nginx existant au réseau
|
|
docker network connect nginx_default <nginx-container-name>
|
|
```
|
|
|
|
## ⚙️ Configuration Nginx
|
|
|
|
```nginx
|
|
location /notes {
|
|
proxy_pass http://notes-todo-app:2222;
|
|
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;
|
|
client_max_body_size 10M;
|
|
}
|
|
```
|
|
|
|
## 📡 API Endpoints
|
|
|
|
### Authentification
|
|
```
|
|
POST /api/auth/login
|
|
POST /api/auth/logout
|
|
GET /api/auth/me
|
|
```
|
|
|
|
### Utilisateurs (Admin)
|
|
```
|
|
GET /api/users
|
|
POST /api/users
|
|
PUT /api/users/:id
|
|
DELETE /api/users/:id
|
|
```
|
|
|
|
### Notes
|
|
```
|
|
GET /api/notes
|
|
POST /api/notes
|
|
GET /api/notes/:id
|
|
PUT /api/notes/:id
|
|
DELETE /api/notes/:id
|
|
POST /api/notes/:id/image
|
|
DELETE /api/notes/:id/image
|
|
GET /api/search?q=query
|
|
```
|
|
|
|
### Todos Notes
|
|
```
|
|
POST /api/notes/:id/todos
|
|
PUT /api/notes/todos/:todoId
|
|
DELETE /api/notes/todos/:todoId
|
|
```
|
|
|
|
### Todos Globaux
|
|
```
|
|
GET /api/todos
|
|
POST /api/todos
|
|
PUT /api/todos/:id
|
|
DELETE /api/todos/:id
|
|
```
|
|
|
|
## 🔒 Sécurité
|
|
|
|
- Bcrypt 12 rounds
|
|
- JWT expiration 24h
|
|
- Helmet.js
|
|
- Rate limiting
|
|
- Input validation
|
|
- File type whitelist
|
|
- SQL prepared statements
|
|
|
|
## 🔧 Dépannage
|
|
|
|
### Erreur "network nginx_default declared as external, but could not be found"
|
|
|
|
Cette erreur survient lors du déploiement si le réseau Docker externe n'existe pas.
|
|
|
|
**Solution** :
|
|
Le réseau est maintenant créé automatiquement par Docker Compose. Si vous rencontrez encore ce problème :
|
|
```bash
|
|
docker-compose down
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
### Erreur "no such column: n.image_filename"
|
|
|
|
Cette erreur survient lorsque la base de données a été créée avec une ancienne version du schéma.
|
|
|
|
**Solution automatique (recommandée)** :
|
|
L'application détecte et ajoute automatiquement la colonne manquante au démarrage. Redéployez simplement :
|
|
```bash
|
|
docker-compose down
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
**Solution manuelle** :
|
|
Si nécessaire, vous pouvez appliquer la migration manuellement :
|
|
```bash
|
|
docker exec notes-todo-app sh /app/migrations/run-migrations.sh
|
|
```
|
|
|
|
### Erreur de permissions sur les volumes Docker
|
|
|
|
Si vous rencontrez des erreurs SQLITE_CANTOPEN ou EACCES, recréez les volumes :
|
|
```bash
|
|
docker-compose down -v
|
|
docker-compose up -d --build
|
|
```
|
|
⚠️ Attention : Cela supprimera toutes les données existantes.
|
|
|
|
### L'application ne démarre pas
|
|
|
|
Vérifiez les logs :
|
|
```bash
|
|
docker-compose logs -f notes-todo-app
|
|
```
|
|
|
|
## 📝 Licence
|
|
|
|
MIT
|