Création complète de l'application NoteFlow - Notes & Todo List

Application web Dockerisée moderne avec:
- Backend Node.js + Express + SQLite
- Frontend HTML/CSS/JavaScript vanilla
- Authentification JWT + bcrypt
- Gestion des notes avec images et todos intégrés
- Sidebar todos globaux avec filtres
- Interface utilisateur fluide avec animations CSS
- Administration des utilisateurs
- Sécurité production-ready (Helmet, rate limiting, validation)
- Configuration Docker complète
- Documentation README détaillée

Stack technique:
- Node.js 20 Alpine
- SQLite3 avec indexes optimisés
- Multer pour upload d'images
- Winston pour logging
- Express-validator pour validation
- Architecture modulaire (routes, middleware, config)

Fonctionnalités:
- Notes: CRUD complet, recherche, images, todos intégrés
- Todos globaux: création, toggle, filtres, suppression
- Auth: JWT 24h, bcrypt 12 rounds
- Admin: gestion utilisateurs complète
- UI: masonry grid, modal animations, responsive

Configuration Docker:
- Healthcheck intégré
- Volumes persistants pour data et uploads
- Network nginx_default pour reverse proxy
- Variables d'environnement configurables

Prêt pour déploiement avec: docker-compose up -d
This commit is contained in:
Claude committed 2025-11-11 09:36:32 +00:00
1 parent a8599c8703
commit 7a716dc17a
22 files changed
+3414 -589

No files matched your search

+13 -9
View File
@@ -5,21 +5,25 @@ services:
build: .
container_name: notes-todo-app
ports:
- "2222:2222"
- "3000:3000"
volumes:
- notes_data:/home/node/app/data
- notes_uploads:/home/node/app/public/uploads
- ./data:/app/data
- ./public/uploads:/app/public/uploads
environment:
- NODE_ENV=production
- JWT_SECRET=changeme_in_production
- PORT=2222
- JWT_SECRET=${JWT_SECRET:-change_me_in_production_please_use_strong_secret}
- PORT=3000
- UPLOADS_PATH=/app/public/uploads
- DB_PATH=/app/data/notes.db
restart: unless-stopped
networks:
- nginx_default
volumes:
notes_data:
notes_uploads:
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1))"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
nginx_default: