Clean up project by removing unnecessary files and configurations
Removes obsolete deployment guides, scripts, nginx configs, and simplifies the Docker setup, favoring a single docker-compose.yml. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 91318273-c764-4fd4-be04-bdc12c38af32 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/99451107-d8a0-4f61-81e0-cae481285260.jpg
No files matched your search
@@ -1,244 +0,0 @@
|
||||
# Guide de Déploiement Production RegisFlow
|
||||
|
||||
## Pré-requis
|
||||
|
||||
1. **Docker et Docker Compose installés**
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt update
|
||||
sudo apt install docker.io docker-compose
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install docker docker-compose
|
||||
```
|
||||
|
||||
2. **Cloner le projet**
|
||||
```bash
|
||||
git clone <votre-repo-regisflow>
|
||||
cd regisflow
|
||||
```
|
||||
|
||||
## Configuration de Production
|
||||
|
||||
### 1. Créer le fichier d'environnement
|
||||
|
||||
```bash
|
||||
# Copier le fichier d'exemple
|
||||
cp .env.example .env
|
||||
|
||||
# Éditer le fichier .env avec vos valeurs
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 2. Configurer les variables OBLIGATOIRES
|
||||
|
||||
Dans le fichier `.env`, changez OBLIGATOIREMENT :
|
||||
|
||||
```bash
|
||||
# Générer un mot de passe fort pour PostgreSQL
|
||||
POSTGRES_PASSWORD=VotreMotDePassePostgreSQL2024!
|
||||
|
||||
# Générer une clé secrète pour les sessions
|
||||
SESSION_SECRET=$(openssl rand -base64 32)
|
||||
```
|
||||
|
||||
### 3. Créer les répertoires de données
|
||||
|
||||
```bash
|
||||
# Créer les répertoires nécessaires
|
||||
mkdir -p data/{postgres,backups,logs,postgres-logs}
|
||||
chmod 755 data data/*
|
||||
```
|
||||
|
||||
## Déploiement Automatique
|
||||
|
||||
### Option 1 : Script de déploiement automatique
|
||||
|
||||
```bash
|
||||
# Rendre le script exécutable
|
||||
chmod +x deploy-prod.sh
|
||||
|
||||
# Exécuter le déploiement
|
||||
./deploy-prod.sh
|
||||
```
|
||||
|
||||
### Option 2 : Déploiement manuel
|
||||
|
||||
```bash
|
||||
# Construire les images
|
||||
docker-compose build
|
||||
|
||||
# Démarrer les services
|
||||
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
||||
|
||||
# Vérifier le statut
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## Vérification du Déploiement
|
||||
|
||||
1. **Vérifier les services**
|
||||
```bash
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
2. **Accéder à l'application**
|
||||
- RegisFlow : http://localhost:5000
|
||||
- PostgreSQL : localhost:5433
|
||||
|
||||
3. **Vérifier les logs**
|
||||
```bash
|
||||
# Logs application
|
||||
docker-compose logs regisflow
|
||||
|
||||
# Logs base de données
|
||||
docker-compose logs regisflow-db
|
||||
```
|
||||
|
||||
## Connexion Initiale
|
||||
|
||||
1. **Compte administrateur par défaut**
|
||||
- Utilisateur : `admin`
|
||||
- Mot de passe : `admin123`
|
||||
|
||||
2. **Première connexion**
|
||||
- Connectez-vous avec les identifiants par défaut
|
||||
- Changez IMMÉDIATEMENT le mot de passe administrateur
|
||||
- Créez vos utilisateurs et magasins
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Sauvegardes
|
||||
|
||||
```bash
|
||||
# Sauvegarde manuelle
|
||||
docker-compose exec regisflow-db pg_dump -U regisflow regisflow > backup_$(date +%Y%m%d).sql
|
||||
|
||||
# Sauvegarde automatique (déjà configurée dans l'app)
|
||||
# - Toutes les 12 heures
|
||||
# - Conservation des 10 dernières sauvegardes
|
||||
```
|
||||
|
||||
### Monitoring
|
||||
|
||||
```bash
|
||||
# Utiliser le script de monitoring
|
||||
./monitoring.sh
|
||||
|
||||
# Ou manuellement
|
||||
docker-compose logs -f
|
||||
docker stats
|
||||
```
|
||||
|
||||
### Mise à jour
|
||||
|
||||
```bash
|
||||
# Arrêter les services
|
||||
docker-compose down
|
||||
|
||||
# Récupérer les mises à jour
|
||||
git pull
|
||||
|
||||
# Reconstruire et redémarrer
|
||||
docker-compose build
|
||||
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
## Sécurité Production
|
||||
|
||||
### Configuration HTTPS (Recommandé)
|
||||
|
||||
1. **Installer Nginx**
|
||||
```bash
|
||||
sudo apt install nginx
|
||||
```
|
||||
|
||||
2. **Configurer le reverse proxy**
|
||||
```bash
|
||||
# Copier la configuration Nginx
|
||||
sudo cp nginx-reverse-proxy.conf /etc/nginx/sites-available/regisflow
|
||||
sudo ln -s /etc/nginx/sites-available/regisflow /etc/nginx/sites-enabled/
|
||||
|
||||
# Redémarrer Nginx
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
3. **Obtenir un certificat SSL**
|
||||
```bash
|
||||
# Installer Certbot
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
|
||||
# Obtenir le certificat
|
||||
sudo certbot --nginx -d votre-domaine.com
|
||||
```
|
||||
|
||||
### Sécurisation
|
||||
|
||||
1. **Firewall**
|
||||
```bash
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
2. **Permissions**
|
||||
```bash
|
||||
chmod 600 .env
|
||||
chown root:root .env
|
||||
```
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Problèmes courants
|
||||
|
||||
1. **Service ne démarre pas**
|
||||
```bash
|
||||
docker-compose logs regisflow
|
||||
```
|
||||
|
||||
2. **Base de données non accessible**
|
||||
```bash
|
||||
docker-compose exec regisflow-db psql -U regisflow -d regisflow
|
||||
```
|
||||
|
||||
3. **Erreur de migration**
|
||||
```bash
|
||||
docker-compose exec regisflow npx drizzle-kit push
|
||||
```
|
||||
|
||||
### Commandes utiles
|
||||
|
||||
```bash
|
||||
# Redémarrer un service
|
||||
docker-compose restart regisflow
|
||||
|
||||
# Accéder au container
|
||||
docker-compose exec regisflow sh
|
||||
|
||||
# Voir les ressources utilisées
|
||||
docker stats
|
||||
|
||||
# Nettoyer les volumes (ATTENTION : supprime les données)
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation** : README.md
|
||||
- **Configuration** : .env.example
|
||||
- **Logs** : `docker-compose logs -f`
|
||||
- **Monitoring** : `./monitoring.sh`
|
||||
|
||||
## Caractéristiques Production
|
||||
|
||||
- ✅ Multi-utilisateur avec rôles (Admin, Manager, Employee)
|
||||
- ✅ Multi-magasins avec isolation des données
|
||||
- ✅ Sauvegardes automatiques toutes les 12 heures
|
||||
- ✅ Purge automatique des données > 19 mois
|
||||
- ✅ Interface responsive mobile/desktop
|
||||
- ✅ Export PDF et CSV
|
||||
- ✅ Validation EAN-13 et conformité réglementaire
|
||||
- ✅ Sécurité par défaut (HTTPS, sessions sécurisées)
|
||||
- ✅ Monitoring et health checks
|
||||
- ✅ Conteneurs sécurisés (utilisateur non-root)
|
||||
@@ -1,108 +0,0 @@
|
||||
# Guide de Test Docker pour RegisFlow
|
||||
|
||||
## ✅ Problème Résolu
|
||||
|
||||
Le problème `TypeError [ERR_INVALID_ARG_TYPE]: The "paths[0]" argument must be of type string. Received undefined` a été résolu avec un script de compatibilité Node.js 18.
|
||||
|
||||
### Cause du Problème
|
||||
- Node.js 18 ne supporte pas `import.meta.dirname`
|
||||
- Le code compilé dans `dist/index.js` utilise cette fonctionnalité non disponible
|
||||
- L'erreur se produit lors de la résolution des chemins (ligne 955 dans dist/index.js)
|
||||
|
||||
### Solution Appliquée
|
||||
- Création d'un script `server/prod-start.js` qui remplace `import.meta.dirname` par des valeurs statiques
|
||||
- Modification du script Docker d'entrée pour utiliser ce script de compatibilité
|
||||
- Le script lit le fichier compilé et remplace les références undefined par des chemins absolus
|
||||
- Création automatique du répertoire `public` pour les fichiers statiques
|
||||
|
||||
## Test du Déploiement Docker
|
||||
|
||||
### 1. Construction du Conteneur
|
||||
```bash
|
||||
# Construire l'image RegisFlow
|
||||
docker-compose build regisflow
|
||||
|
||||
# Ou reconstruction complète
|
||||
docker-compose build --no-cache regisflow
|
||||
```
|
||||
|
||||
### 2. Démarrage des Services
|
||||
```bash
|
||||
# Démarrer tous les services
|
||||
docker-compose up -d
|
||||
|
||||
# Vérifier les logs
|
||||
docker-compose logs -f regisflow
|
||||
docker-compose logs -f regisflow-db
|
||||
```
|
||||
|
||||
### 3. Vérification du Fonctionnement
|
||||
```bash
|
||||
# Statut des conteneurs
|
||||
docker-compose ps
|
||||
|
||||
# Test de connexion
|
||||
curl http://localhost:5000/api/health
|
||||
|
||||
# Accès à l'application
|
||||
# http://localhost:5000
|
||||
```
|
||||
|
||||
### 4. Arrêt et Nettoyage
|
||||
```bash
|
||||
# Arrêter les services
|
||||
docker-compose down
|
||||
|
||||
# Nettoyage complet avec volumes
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
## Configuration Finale
|
||||
|
||||
### Fichiers Modifiés
|
||||
- `docker-entrypoint-simple.sh` : Script d'entrée robuste
|
||||
- `Dockerfile` : Configuration optimisée pour Node.js 18
|
||||
- `.env` : Variables préconfigurées pour installation automatique
|
||||
|
||||
### Variables d'Environnement par Défaut
|
||||
```env
|
||||
DATABASE_URL=postgresql://regisflow:RegisFlow2024!PostgreSQL@regisflow-db:5432/regisflow
|
||||
SESSION_SECRET=RegisFlow2024SessionSecretKey1234567890ABCDEF
|
||||
NODE_ENV=production
|
||||
PORT=5000
|
||||
```
|
||||
|
||||
### Fonctionnalités Opérationnelles
|
||||
- ✅ Application web responsive
|
||||
- ✅ Base de données PostgreSQL intégrée
|
||||
- ✅ Authentification multi-utilisateur
|
||||
- ✅ Gestion des magasins et utilisateurs
|
||||
- ✅ Enregistrement des ventes conformes
|
||||
- ✅ Sauvegardes automatiques
|
||||
- ✅ Purge automatique (19 mois)
|
||||
- ✅ Export PDF et CSV
|
||||
|
||||
## Logs Attendus au Démarrage
|
||||
|
||||
```
|
||||
🚀 Démarrage de RegisFlow (mode simplifié)...
|
||||
📡 Attente de la base de données...
|
||||
✅ PostgreSQL prêt!
|
||||
✅ Base de données configurée
|
||||
🎯 Démarrage de RegisFlow...
|
||||
✅ Node.js 18 compatibility fix applied
|
||||
serving on port 5000
|
||||
📅 Automatic backup scheduler started
|
||||
🕐 Planificateur de purge des ventes démarré
|
||||
```
|
||||
|
||||
### Fichiers de Solution
|
||||
- `server/prod-start.js` : Script de compatibilité Node.js 18
|
||||
- `docker-entrypoint-simple.sh` : Script d'entrée Docker simplifié
|
||||
- `Dockerfile` : Configuration optimisée pour production
|
||||
|
||||
## Compte par Défaut
|
||||
- **Utilisateur** : admin
|
||||
- **Mot de passe** : admin123
|
||||
|
||||
⚠️ **Important** : Changez le mot de passe par défaut après la première connexion pour des raisons de sécurité.
|
||||
@@ -55,7 +55,6 @@ RUN npm cache clean --force && \
|
||||
|
||||
# Copier les scripts de configuration
|
||||
COPY --chown=regisflow:nodejs docker-entrypoint-simple.sh /usr/local/bin/docker-entrypoint.sh
|
||||
COPY --chown=regisflow:nodejs postgres-prod.conf ./
|
||||
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
||||
|
||||
# Changer vers l'utilisateur non-root
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
# Installation Simple RegisFlow
|
||||
|
||||
## 🎯 Installation Sans Intervention
|
||||
|
||||
RegisFlow est maintenant configuré pour une installation complètement automatique sans aucune intervention manuelle.
|
||||
|
||||
## 🚀 Installation en 2 Commandes
|
||||
|
||||
### Option 1 : Installation automatique (Recommandé)
|
||||
|
||||
```bash
|
||||
# Installation complète en une commande
|
||||
./install-simple.sh
|
||||
```
|
||||
|
||||
### Option 2 : Installation manuelle
|
||||
|
||||
```bash
|
||||
# Construire et démarrer
|
||||
docker-compose build
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## ✅ Configuration Automatique
|
||||
|
||||
- **Mots de passe pré-configurés** : Aucune modification nécessaire
|
||||
- **Base de données** : Configuration automatique PostgreSQL
|
||||
- **Sessions** : Clé secrète pré-générée
|
||||
- **Répertoires** : Création automatique des dossiers de données
|
||||
- **Migrations** : Exécution automatique au démarrage
|
||||
|
||||
## 📊 Accès Immédiat
|
||||
|
||||
- **URL** : http://localhost:5000
|
||||
- **Utilisateur** : admin
|
||||
- **Mot de passe** : admin123
|
||||
- **PostgreSQL** : localhost:5433
|
||||
|
||||
## 🔧 Mots de Passe Pré-configurés
|
||||
|
||||
```bash
|
||||
# PostgreSQL
|
||||
POSTGRES_PASSWORD=RegisFlow2024!PostgreSQL
|
||||
|
||||
# Sessions
|
||||
SESSION_SECRET=RegisFlow2024SessionSecretKey1234567890ABCDEF
|
||||
|
||||
# Compte admin par défaut
|
||||
Utilisateur: admin
|
||||
Mot de passe: admin123
|
||||
```
|
||||
|
||||
## 📋 Commandes de Base
|
||||
|
||||
```bash
|
||||
# Démarrer les services
|
||||
docker-compose up -d
|
||||
|
||||
# Voir les logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Arrêter les services
|
||||
docker-compose down
|
||||
|
||||
# Vérifier le statut
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## 🔒 Sécurité pour Production
|
||||
|
||||
Une fois l'installation testée, pour la production :
|
||||
|
||||
1. **Changez les mots de passe** dans le fichier `.env`
|
||||
2. **Configurez HTTPS** avec un reverse proxy
|
||||
3. **Changez le mot de passe admin** dans l'interface
|
||||
|
||||
## 🛠️ Dépannage
|
||||
|
||||
```bash
|
||||
# Si un service ne démarre pas
|
||||
docker-compose logs regisflow
|
||||
|
||||
# Redémarrer tous les services
|
||||
docker-compose restart
|
||||
|
||||
# Nettoyer et redémarrer
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 📱 Fonctionnalités Disponibles
|
||||
|
||||
- ✅ Multi-utilisateur (Admin/Manager/Employee)
|
||||
- ✅ Multi-magasins avec isolation
|
||||
- ✅ Sauvegardes automatiques
|
||||
- ✅ Purge automatique (19 mois)
|
||||
- ✅ Export PDF/CSV
|
||||
- ✅ Validation EAN-13
|
||||
- ✅ Interface mobile responsive
|
||||
|
||||
## 🎉 Installation Terminée !
|
||||
|
||||
L'application RegisFlow est maintenant accessible sur http://localhost:5000 avec le compte admin/admin123.
|
||||
|
||||
**Aucune configuration supplémentaire n'est nécessaire pour commencer à utiliser l'application.**
|
||||
@@ -1,124 +0,0 @@
|
||||
# Configuration Réseau Docker - RegisFlow
|
||||
|
||||
## 🌐 Problématique des Conflits Réseau
|
||||
|
||||
Le sous-réseau `172.20.0.0/24` peut créer des conflits avec des réseaux existants sur certains systèmes. Pour éviter ces problèmes, RegisFlow propose plusieurs configurations.
|
||||
|
||||
## 🔧 Configuration Simplifiée
|
||||
|
||||
### Configuration Unique
|
||||
|
||||
**Fichier** : `docker-compose.yml`
|
||||
|
||||
```yaml
|
||||
# Utilise le réseau par défaut de Docker
|
||||
networks:
|
||||
default:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
**Avantages** :
|
||||
- Aucun conflit de sous-réseau
|
||||
- Docker gère automatiquement les adresses IP
|
||||
- Configuration la plus simple
|
||||
- Compatible avec tous les environnements
|
||||
|
||||
**Utilisation** :
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Configuration Personnalisée (Si Nécessaire)
|
||||
|
||||
Si vous avez des exigences spécifiques, modifiez le sous-réseau :
|
||||
|
||||
```yaml
|
||||
networks:
|
||||
regisflow-internal:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.100.0.0/24 # Votre sous-réseau
|
||||
```
|
||||
|
||||
## 📋 Sous-réseaux Recommandés
|
||||
|
||||
### Évitez ces plages (souvent utilisées) :
|
||||
- `172.16.0.0/12` - Réseaux privés Docker
|
||||
- `192.168.1.0/24` - Réseaux domestiques
|
||||
- `10.0.0.0/8` - Réseaux d'entreprise
|
||||
|
||||
### Utilisez ces plages (plus sûres) :
|
||||
- `192.168.200.0/24` - Peu utilisé
|
||||
- `172.30.0.0/24` - Rarement en conflit
|
||||
- `10.100.0.0/24` - Espace libre
|
||||
|
||||
## 🔍 Vérifier les Conflits
|
||||
|
||||
```bash
|
||||
# Voir les réseaux Docker existants
|
||||
docker network ls
|
||||
|
||||
# Voir les détails d'un réseau
|
||||
docker network inspect bridge
|
||||
|
||||
# Voir les routes système
|
||||
ip route show
|
||||
|
||||
# Vérifier les interfaces réseau
|
||||
ip addr show
|
||||
```
|
||||
|
||||
## 🛠️ Résolution des Conflits
|
||||
|
||||
### Si vous avez un conflit :
|
||||
|
||||
1. **Identifier le conflit** :
|
||||
```bash
|
||||
docker network inspect regisflow_regisflow-internal
|
||||
```
|
||||
|
||||
2. **Changer le sous-réseau** :
|
||||
```bash
|
||||
# Arrêter les services
|
||||
docker-compose down
|
||||
|
||||
# Supprimer le réseau
|
||||
docker network rm regisflow_regisflow-internal
|
||||
|
||||
# Modifier docker-compose.yml avec un nouveau sous-réseau
|
||||
# Puis redémarrer
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
3. **Ou utiliser la configuration simple** :
|
||||
```bash
|
||||
docker-compose -f docker-compose.simple.yml up -d
|
||||
```
|
||||
|
||||
## 🎯 Recommandations
|
||||
|
||||
### Pour tous les environnements :
|
||||
- Utilisez `docker-compose.yml`
|
||||
- Aucune configuration réseau nécessaire
|
||||
- Démarrage rapide et compatible
|
||||
|
||||
### Si vous avez des besoins spécifiques :
|
||||
- Modifiez le fichier `docker-compose.yml`
|
||||
- Ajoutez une configuration réseau personnalisée
|
||||
- Testez avant déploiement
|
||||
|
||||
## 📚 Scripts Inclus
|
||||
|
||||
- `install-simple.sh` - Installation automatique
|
||||
- `deploy-prod.sh` - Déploiement production
|
||||
- `monitoring.sh` - Surveillance des services
|
||||
|
||||
## 🔒 Sécurité
|
||||
|
||||
La configuration est sécurisée :
|
||||
- Communications chiffrées entre conteneurs
|
||||
- Isolation des services
|
||||
- Accès contrôlé aux ports
|
||||
- Réseau Docker par défaut isolé du réseau hôte
|
||||
@@ -1,99 +0,0 @@
|
||||
# Démarrage Rapide RegisFlow
|
||||
|
||||
## 🚀 Installation Ultra-Simple
|
||||
|
||||
RegisFlow est maintenant configuré pour une installation sans aucune configuration réseau complexe.
|
||||
|
||||
### Installation en 1 Minute
|
||||
|
||||
```bash
|
||||
# Télécharger le projet
|
||||
git clone [url-du-projet]
|
||||
cd regisflow
|
||||
|
||||
# Installer immédiatement
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
**C'est tout !** L'application est accessible sur http://localhost:5000
|
||||
|
||||
## ✅ Configuration Automatique
|
||||
|
||||
- **Mots de passe** : Pré-configurés dans le fichier `.env`
|
||||
- **Base de données** : PostgreSQL configurée automatiquement
|
||||
- **Réseau** : Utilise le réseau par défaut Docker (aucun conflit IP)
|
||||
- **Volumes** : Gérés automatiquement par Docker
|
||||
- **Migrations** : Exécutées automatiquement au démarrage
|
||||
|
||||
## 🎯 Accès Immédiat
|
||||
|
||||
- **Application** : http://localhost:5000
|
||||
- **Utilisateur** : admin
|
||||
- **Mot de passe** : admin123
|
||||
- **PostgreSQL** : localhost:5433
|
||||
|
||||
## 🔧 Commandes Utiles
|
||||
|
||||
```bash
|
||||
# Voir les logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Redémarrer
|
||||
docker-compose restart
|
||||
|
||||
# Arrêter
|
||||
docker-compose down
|
||||
|
||||
# Statut
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## 🛠️ Problèmes Courants
|
||||
|
||||
### Application ne démarre pas
|
||||
```bash
|
||||
# Vérifier Docker
|
||||
docker --version
|
||||
docker-compose --version
|
||||
|
||||
# Nettoyer et redémarrer
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Port 5000 déjà utilisé
|
||||
```bash
|
||||
# Changer le port dans docker-compose.yml
|
||||
ports:
|
||||
- "5001:5000" # Utiliser port 5001 au lieu de 5000
|
||||
```
|
||||
|
||||
### Conflit PostgreSQL
|
||||
```bash
|
||||
# Changer le port PostgreSQL
|
||||
ports:
|
||||
- "5434:5432" # Utiliser port 5434 au lieu de 5433
|
||||
```
|
||||
|
||||
## 🔒 Sécurité pour Production
|
||||
|
||||
Une fois testé, pour la production :
|
||||
|
||||
1. **Changer les mots de passe** dans `.env`
|
||||
2. **Configurer HTTPS** si nécessaire
|
||||
3. **Changer le mot de passe admin** dans l'application
|
||||
|
||||
## 📱 Fonctionnalités Disponibles
|
||||
|
||||
- Multi-utilisateur avec rôles
|
||||
- Multi-magasins
|
||||
- Enregistrement des ventes
|
||||
- Historique complet
|
||||
- Sauvegardes automatiques
|
||||
- Purge automatique (19 mois)
|
||||
- Export PDF/CSV
|
||||
- Interface mobile
|
||||
|
||||
## 🎉 Prêt !
|
||||
|
||||
L'application RegisFlow est maintenant prête à l'emploi sans aucune configuration supplémentaire.
|
||||
@@ -1,110 +1,85 @@
|
||||
# Registre des Ventes de Pétards
|
||||
# RegisFlow
|
||||
|
||||
Application React complète pour la gestion et le suivi des ventes de feux d'artifice en conformité avec la réglementation française.
|
||||
Application web complète de gestion des ventes de feux d'artifice en conformité avec la réglementation française.
|
||||
|
||||
## Fonctionnalités
|
||||
|
||||
### 🔐 Système d'authentification
|
||||
- Connexion par nom d'utilisateur et mot de passe
|
||||
- Système de rôles : Administrateur, Manager, Employé
|
||||
- Sessions sécurisées avec PostgreSQL
|
||||
- ✅ Authentification multi-utilisateur avec rôles (Admin, Manager, Employee)
|
||||
- ✅ Gestion multi-magasins avec isolation des données
|
||||
- ✅ Enregistrement des ventes conforme à la réglementation
|
||||
- ✅ Sauvegardes automatiques toutes les 12h
|
||||
- ✅ Purge automatique des données (19 mois de rétention)
|
||||
- ✅ Export CSV/PDF pour rapports réglementaires
|
||||
- ✅ Interface responsive avec design moderne
|
||||
|
||||
### 👥 Gestion des utilisateurs et magasins
|
||||
- **Administrateur** : Accès complet à toutes les fonctionnalités
|
||||
- **Manager** : Accès à toutes les fonctionnalités sauf l'administration et les sauvegardes automatiques
|
||||
- **Employé** : Création de ventes et consultation de l'historique uniquement
|
||||
## Démarrage Rapide
|
||||
|
||||
### 🏪 Multi-magasins
|
||||
- Chaque magasin a son propre historique de ventes
|
||||
- Les utilisateurs sont liés à un magasin spécifique
|
||||
- Isolation des données par magasin
|
||||
### Développement
|
||||
```bash
|
||||
# Installation des dépendances
|
||||
npm install
|
||||
|
||||
### 📋 Enregistrement des ventes
|
||||
- Formulaire complet avec validation des champs obligatoires
|
||||
- Support des codes EAN13 avec validation
|
||||
- Capture photo des pièces d'identité
|
||||
- Classification des produits (F2/F3)
|
||||
# Démarrage en développement
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 📊 Historique et export
|
||||
- Historique des ventes avec filtrage par dates
|
||||
- Export CSV pour la conformité réglementaire
|
||||
- Suppression des ventes (Manager et Administrateur uniquement)
|
||||
### Production avec Docker
|
||||
```bash
|
||||
# Démarrage simple
|
||||
docker-compose up -d
|
||||
|
||||
## Installation et démarrage
|
||||
|
||||
1. **Installation des dépendances :**
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
2. **Configuration de la base de données :**
|
||||
```bash
|
||||
npm run db:push
|
||||
```
|
||||
|
||||
3. **Démarrage de l'application :**
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 🔑 Compte administrateur par défaut
|
||||
|
||||
Lors de la première installation sur une base de données vierge, un compte administrateur est automatiquement créé :
|
||||
|
||||
**Nom d'utilisateur :** `admin`
|
||||
**Mot de passe :** `admin123`
|
||||
|
||||
⚠️ **IMPORTANT** : Changez ce mot de passe immédiatement après la première connexion !
|
||||
# Vérification des logs
|
||||
docker-compose logs -f regisflow
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Variables d'environnement
|
||||
- `DATABASE_URL` : URL de connexion PostgreSQL
|
||||
- `SESSION_SECRET` : Clé secrète pour les sessions (optionnel, une clé par défaut est générée)
|
||||
### Variables d'environnement (.env)
|
||||
```env
|
||||
DATABASE_URL=postgresql://regisflow:RegisFlow2024!PostgreSQL@regisflow-db:5432/regisflow
|
||||
SESSION_SECRET=RegisFlow2024SessionSecretKey1234567890ABCDEF
|
||||
NODE_ENV=production
|
||||
PORT=5000
|
||||
```
|
||||
|
||||
### Structure des rôles
|
||||
### Compte par défaut
|
||||
- **Utilisateur** : admin
|
||||
- **Mot de passe** : admin123
|
||||
|
||||
#### Administrateur
|
||||
- ✅ Création et gestion des utilisateurs
|
||||
- ✅ Création et gestion des magasins
|
||||
- ✅ Accès à toutes les ventes de tous les magasins
|
||||
- ✅ Suppression des ventes
|
||||
- ✅ Export des données
|
||||
- ✅ Sauvegardes automatiques
|
||||
⚠️ **Important** : Changez le mot de passe par défaut après la première connexion.
|
||||
|
||||
#### Manager
|
||||
- ✅ Création de ventes
|
||||
- ✅ Consultation de l'historique du magasin
|
||||
- ✅ Suppression des ventes
|
||||
- ✅ Export des données
|
||||
- ❌ Administration des utilisateurs/magasins
|
||||
- ❌ Sauvegardes automatiques
|
||||
## Architecture Technique
|
||||
|
||||
#### Employé
|
||||
- ✅ Création de ventes
|
||||
- ✅ Consultation de l'historique du magasin
|
||||
- ❌ Suppression des ventes
|
||||
- ❌ Export des données
|
||||
- ❌ Administration
|
||||
- ❌ Sauvegardes automatiques
|
||||
|
||||
## Technologies utilisées
|
||||
|
||||
- **Frontend** : React 18, TypeScript, TailwindCSS, shadcn/ui
|
||||
- **Backend** : Express.js, TypeScript
|
||||
- **Frontend** : React 18 + TypeScript + TailwindCSS + shadcn/ui
|
||||
- **Backend** : Express.js + TypeScript
|
||||
- **Base de données** : PostgreSQL avec Drizzle ORM
|
||||
- **Authentification** : Sessions avec bcrypt
|
||||
- **Stockage local** : IndexedDB pour la résilience
|
||||
- **Authentification** : Sessions sécurisées avec bcrypt
|
||||
- **Déploiement** : Docker avec multi-stage build
|
||||
|
||||
## Conformité réglementaire
|
||||
## Scripts Disponibles
|
||||
|
||||
L'application respecte les exigences françaises pour la vente de feux d'artifice :
|
||||
- Enregistrement obligatoire des informations vendeur
|
||||
- Vérification de l'identité de l'acheteur
|
||||
- Classification des produits (F2/F3)
|
||||
- Traçabilité complète des ventes
|
||||
- Export des données pour les autorités
|
||||
- `npm run dev` : Développement avec hot-reload
|
||||
- `npm run build` : Construction pour production
|
||||
- `npm run start` : Démarrage en production
|
||||
- `npm run db:push` : Migration de base de données
|
||||
|
||||
## Support
|
||||
## Structure du Projet
|
||||
|
||||
Pour toute question ou problème, consultez la documentation ou contactez l'administrateur système.
|
||||
```
|
||||
RegisFlow/
|
||||
├── client/ # Frontend React
|
||||
├── server/ # Backend Express
|
||||
├── shared/ # Types partagés et schémas
|
||||
├── backups/ # Sauvegardes automatiques
|
||||
├── docker-compose.yml
|
||||
├── Dockerfile
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Conformité Réglementaire
|
||||
|
||||
L'application respecte la réglementation française pour la vente de feux d'artifice :
|
||||
- Enregistrement obligatoire des ventes
|
||||
- Conservation des données pendant 19 mois
|
||||
- Purge automatique des données expirées
|
||||
- Traçabilité complète des transactions
|
||||
@@ -1,328 +0,0 @@
|
||||
# RegisFlow - Déploiement Docker
|
||||
|
||||
Ce guide vous explique comment déployer RegisFlow avec Docker et Docker Compose.
|
||||
|
||||
## 🐳 Prérequis
|
||||
|
||||
- Docker Engine 20.10 ou supérieur
|
||||
- Docker Compose 2.0 ou supérieur
|
||||
- Au minimum 1 GB de RAM libre
|
||||
- Au minimum 2 GB d'espace disque libre
|
||||
|
||||
## 🚀 Démarrage Rapide
|
||||
|
||||
### 1. Préparer l'environnement
|
||||
|
||||
```bash
|
||||
# Cloner le projet
|
||||
git clone <votre-repo>
|
||||
cd regisflow
|
||||
|
||||
# Copier et configurer le fichier d'environnement
|
||||
cp .env.example .env
|
||||
|
||||
# Éditer le fichier .env avec vos paramètres
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 2. Configurer les variables d'environnement
|
||||
|
||||
Éditez le fichier `.env` avec votre serveur PostgreSQL externe :
|
||||
|
||||
```env
|
||||
# Configuration PostgreSQL (PRÉCONFIGURÉE)
|
||||
POSTGRES_PASSWORD=RegisFlow2024!
|
||||
|
||||
# Configuration de l'application
|
||||
NODE_ENV=production
|
||||
PORT=5000
|
||||
|
||||
# Clé secrète pour les sessions (OBLIGATOIRE EN PRODUCTION)
|
||||
SESSION_SECRET=votre-cle-secrete-super-longue-et-complexe
|
||||
|
||||
# Configuration du timezone
|
||||
TZ=Europe/Paris
|
||||
```
|
||||
|
||||
### Préparation de votre serveur PostgreSQL
|
||||
|
||||
**1. Se connecter à PostgreSQL :**
|
||||
```sql
|
||||
sudo -u postgres psql
|
||||
```
|
||||
|
||||
**2. Créer l'utilisateur et la base (préconfigurés) :**
|
||||
```sql
|
||||
CREATE USER regisflow WITH PASSWORD 'RegisFlow2024!';
|
||||
CREATE DATABASE regisflow OWNER regisflow;
|
||||
GRANT ALL PRIVILEGES ON DATABASE regisflow TO regisflow;
|
||||
\q
|
||||
```
|
||||
|
||||
**3. Configuration réseau PostgreSQL :**
|
||||
Éditez `/etc/postgresql/*/main/postgresql.conf` :
|
||||
```
|
||||
listen_addresses = '*'
|
||||
```
|
||||
|
||||
Éditez `/etc/postgresql/*/main/pg_hba.conf` :
|
||||
```
|
||||
host regisflow regisflow 0.0.0.0/0 md5
|
||||
```
|
||||
|
||||
**4. Redémarrer PostgreSQL :**
|
||||
```bash
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
**AUCUNE MODIFICATION NÉCESSAIRE** : Tout est préconfigué pour fonctionner immédiatement.
|
||||
|
||||
### 3. Lancer l'application
|
||||
|
||||
**Option 1 : Script automatique (recommandé)**
|
||||
```bash
|
||||
# Utiliser le script de déploiement automatique
|
||||
chmod +x deploy.sh
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
**Option 2 : Commandes manuelles**
|
||||
```bash
|
||||
# Construire et démarrer tous les services
|
||||
docker-compose up -d
|
||||
|
||||
# Vérifier les logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Accéder à l'application
|
||||
# http://localhost:5000
|
||||
```
|
||||
|
||||
## 📋 Services Inclus
|
||||
|
||||
### 1. PostgreSQL (Base de données)
|
||||
- **Container**: regisflow-db
|
||||
- **Port externe**: 5433 (accès depuis l'hôte)
|
||||
- **Port interne**: 5432 (communication Docker)
|
||||
- **Database**: regisflow
|
||||
- **Utilisateur**: regisflow
|
||||
- **Données persistantes**: Volume `postgres_data`
|
||||
|
||||
### 2. RegisFlow (Application)
|
||||
- **Container**: regisflow-app
|
||||
- **Port**: 5000
|
||||
- **Dépendances**: regisflow-db
|
||||
- **Sauvegardes**: Volume `backup_data`
|
||||
- **Health check**: `/health`
|
||||
- **Connexion DB**: Via nom de container `regisflow-db:5432`
|
||||
|
||||
|
||||
|
||||
## 🔧 Commandes Utiles
|
||||
|
||||
### Gestion des services
|
||||
|
||||
```bash
|
||||
# Démarrer les services
|
||||
docker-compose up -d
|
||||
|
||||
# Arrêter les services
|
||||
docker-compose down
|
||||
|
||||
# Redémarrer un service
|
||||
docker-compose restart regisflow
|
||||
|
||||
# Voir les logs
|
||||
docker-compose logs -f regisflow
|
||||
|
||||
# Voir le statut des services
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
### Gestion des données
|
||||
|
||||
```bash
|
||||
# Sauvegarder la base de données externe
|
||||
pg_dump -h IP_SERVEUR -p 5433 -U regisflow regisflow > backup.sql
|
||||
|
||||
# Restaurer la base de données externe
|
||||
psql -h IP_SERVEUR -p 5433 -U regisflow regisflow < backup.sql
|
||||
|
||||
# Accéder à la base de données externe
|
||||
psql -h IP_SERVEUR -p 5433 -U regisflow regisflow
|
||||
|
||||
# Connexion à la base externe
|
||||
psql -h IP_SERVEUR -p 5433 -U regisflow regisflow
|
||||
```
|
||||
|
||||
### Maintenance
|
||||
|
||||
```bash
|
||||
# Mettre à jour l'application
|
||||
docker-compose pull
|
||||
docker-compose up -d --build
|
||||
|
||||
# Nettoyer les images inutilisées
|
||||
docker system prune -f
|
||||
|
||||
# Voir l'utilisation des volumes
|
||||
docker volume ls
|
||||
docker volume inspect regisflow_backup_data
|
||||
```
|
||||
|
||||
## 🛡️ Sécurité
|
||||
|
||||
### Configuration de production
|
||||
|
||||
1. **Changez les mots de passe par défaut** :
|
||||
- `POSTGRES_PASSWORD`
|
||||
- `SESSION_SECRET`
|
||||
|
||||
2. **Configurez HTTPS** :
|
||||
- Obtenez un certificat SSL
|
||||
- Modifiez `nginx.conf` pour le HTTPS
|
||||
- Activez `secure: true` pour les cookies
|
||||
|
||||
3. **Limitez l'accès réseau** :
|
||||
- Utilisez un firewall
|
||||
- Limitez l'accès aux ports nécessaires
|
||||
|
||||
### Sauvegarde automatique
|
||||
|
||||
L'application inclut un système de sauvegarde automatique :
|
||||
- Sauvegarde toutes les 12 heures
|
||||
- Conservation des 10 dernières sauvegardes
|
||||
- Stockage dans le volume `backup_data`
|
||||
|
||||
## 📊 Surveillance
|
||||
|
||||
### Health Checks
|
||||
|
||||
```bash
|
||||
# Vérifier la santé de l'application
|
||||
curl http://localhost:5000/health
|
||||
|
||||
# Vérifier via Docker
|
||||
docker-compose exec regisflow wget -qO- http://localhost:5000/health
|
||||
```
|
||||
|
||||
### Métriques
|
||||
|
||||
```bash
|
||||
# Statistiques des conteneurs
|
||||
docker stats
|
||||
|
||||
# Utilisation des volumes
|
||||
docker system df
|
||||
```
|
||||
|
||||
## 🔧 Dépannage
|
||||
|
||||
### Problèmes courants
|
||||
|
||||
1. **L'application ne démarre pas** :
|
||||
```bash
|
||||
# Vérifier les logs
|
||||
docker-compose logs regisflow
|
||||
|
||||
# Vérifier la connexion à la base externe
|
||||
docker-compose exec regisflow pg_isready -h IP_SERVEUR -p 5433 -U regisflow
|
||||
```
|
||||
|
||||
2. **Erreur de connexion à la base** :
|
||||
```bash
|
||||
# Vérifier que PostgreSQL externe est accessible
|
||||
docker-compose exec regisflow pg_isready -h IP_SERVEUR -p 5433 -U regisflow
|
||||
|
||||
# Tester la connectivité réseau
|
||||
docker-compose exec regisflow nc -zv IP_SERVEUR 5433
|
||||
```
|
||||
|
||||
3. **Problème de permissions** :
|
||||
```bash
|
||||
# Vérifier les permissions des volumes
|
||||
docker-compose exec regisflow ls -la /app/backups
|
||||
```
|
||||
|
||||
### Réinitialisation complète
|
||||
|
||||
```bash
|
||||
# Arrêter tous les services
|
||||
docker-compose down
|
||||
|
||||
# Supprimer les volumes (ATTENTION: perte de données)
|
||||
docker-compose down -v
|
||||
|
||||
# Nettoyer les images
|
||||
docker system prune -af
|
||||
|
||||
# Redémarrer
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 🔄 Mise à jour
|
||||
|
||||
### Mise à jour de l'application
|
||||
|
||||
```bash
|
||||
# Récupérer les dernières modifications
|
||||
git pull origin main
|
||||
|
||||
# Reconstruire et redémarrer
|
||||
docker-compose up -d --build
|
||||
|
||||
# Vérifier les logs
|
||||
docker-compose logs -f regisflow
|
||||
```
|
||||
|
||||
### Migration de données
|
||||
|
||||
L'application gère automatiquement les migrations de base de données au démarrage.
|
||||
|
||||
## 📝 Configuration Avancée
|
||||
|
||||
### Accès via Reverse Proxy (Optionnel)
|
||||
|
||||
Si vous souhaitez ajouter un reverse proxy (Nginx, Apache, etc.) :
|
||||
- Configurez le proxy pour pointer vers `localhost:5000`
|
||||
- Ajoutez la configuration SSL/TLS si nécessaire
|
||||
- Optimisez les performances selon vos besoins
|
||||
|
||||
### Variables d'environnement complètes
|
||||
|
||||
```env
|
||||
# Base de données
|
||||
DATABASE_URL=postgresql://regisflow:RegisFlow2024!@IP_SERVEUR:5433/regisflow
|
||||
POSTGRES_PASSWORD=password
|
||||
|
||||
# Application
|
||||
NODE_ENV=production
|
||||
PORT=5000
|
||||
SESSION_SECRET=your-secret-key
|
||||
|
||||
# Timezone
|
||||
TZ=Europe/Paris
|
||||
|
||||
# Sauvegardes (optionnel)
|
||||
BACKUP_RETENTION_DAYS=30
|
||||
MAX_BACKUP_COUNT=10
|
||||
|
||||
# Logs (optionnel)
|
||||
LOG_LEVEL=info
|
||||
```
|
||||
|
||||
## 🆘 Support
|
||||
|
||||
En cas de problème :
|
||||
|
||||
1. Vérifiez les logs : `docker-compose logs`
|
||||
2. Consultez la documentation
|
||||
3. Vérifiez les issues sur GitHub
|
||||
4. Contactez le support
|
||||
|
||||
## 📚 Liens Utiles
|
||||
|
||||
- [Documentation Docker](https://docs.docker.com/)
|
||||
- [Documentation Docker Compose](https://docs.docker.com/compose/)
|
||||
- [Documentation PostgreSQL](https://www.postgresql.org/docs/)
|
||||
- [Documentation Nginx](https://nginx.org/en/docs/)
|
||||
@@ -1,110 +0,0 @@
|
||||
# RegisFlow - Application de Production
|
||||
|
||||
## 🎯 Application Prête pour la Production
|
||||
|
||||
RegisFlow est maintenant entièrement configurée pour un déploiement en production sous Docker avec toutes les fonctionnalités de sécurité et de performance nécessaires.
|
||||
|
||||
## 🚀 Déploiement Immédiat
|
||||
|
||||
### Option 1 : Déploiement automatique (Recommandé)
|
||||
|
||||
```bash
|
||||
# 1. Configurer l'environnement
|
||||
cp .env.example .env
|
||||
nano .env # Changez POSTGRES_PASSWORD et SESSION_SECRET
|
||||
|
||||
# 2. Créer les répertoires
|
||||
mkdir -p data/{postgres,backups,logs}
|
||||
|
||||
# 3. Déployer automatiquement
|
||||
./deploy-prod.sh
|
||||
```
|
||||
|
||||
### Option 2 : Déploiement manuel
|
||||
|
||||
```bash
|
||||
# 1. Construire les images
|
||||
docker-compose build
|
||||
|
||||
# 2. Démarrer en production
|
||||
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
||||
|
||||
# 3. Vérifier le statut
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## 📊 Accès à l'Application
|
||||
|
||||
- **URL** : http://localhost:5000
|
||||
- **Compte par défaut** : admin / admin123
|
||||
- **PostgreSQL** : localhost:5433
|
||||
|
||||
## 🔧 Configuration Minimale Requise
|
||||
|
||||
Dans le fichier `.env`, changez OBLIGATOIREMENT :
|
||||
|
||||
```bash
|
||||
# Mot de passe PostgreSQL fort
|
||||
POSTGRES_PASSWORD=VotreMotDePasseSecurise2024!
|
||||
|
||||
# Clé secrète pour sessions (générez avec: openssl rand -base64 32)
|
||||
SESSION_SECRET=VotreCleSecreteFortePourLesSessions
|
||||
```
|
||||
|
||||
## 🔒 Sécurité Production
|
||||
|
||||
- ✅ Utilisateur non-root dans les conteneurs
|
||||
- ✅ Réseau Docker isolé
|
||||
- ✅ Sessions sécurisées avec PostgreSQL
|
||||
- ✅ Health checks automatiques
|
||||
- ✅ Limites de ressources définies
|
||||
- ✅ Configuration HTTPS prête (avec Nginx)
|
||||
|
||||
## 📱 Fonctionnalités Intégrées
|
||||
|
||||
- **Multi-utilisateur** : Admin, Manager, Employee
|
||||
- **Multi-magasins** : Isolation complète des données
|
||||
- **Conformité réglementaire** : Validation EAN-13, purge 19 mois
|
||||
- **Sauvegardes automatiques** : Toutes les 12 heures
|
||||
- **Export de données** : PDF, CSV
|
||||
- **Interface responsive** : Mobile et desktop
|
||||
- **Monitoring intégré** : Logs et métriques
|
||||
|
||||
## 🚨 Commandes Essentielles
|
||||
|
||||
```bash
|
||||
# Vérifier le statut
|
||||
docker-compose ps
|
||||
|
||||
# Voir les logs
|
||||
docker-compose logs -f regisflow
|
||||
|
||||
# Arrêter/Redémarrer
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
|
||||
# Sauvegarde manuelle
|
||||
docker-compose exec regisflow-db pg_dump -U regisflow regisflow > backup.sql
|
||||
|
||||
# Monitoring
|
||||
./monitoring.sh
|
||||
```
|
||||
|
||||
## 📋 Prochaines Étapes
|
||||
|
||||
1. **Configurez HTTPS** avec Nginx (configuration incluse)
|
||||
2. **Changez le mot de passe admin** lors de la première connexion
|
||||
3. **Créez vos magasins et utilisateurs**
|
||||
4. **Testez les sauvegardes**
|
||||
5. **Configurez le monitoring**
|
||||
|
||||
## 📞 Support
|
||||
|
||||
- **Guide complet** : DEPLOYMENT_GUIDE.md
|
||||
- **Démarrage rapide** : QUICK_START.md
|
||||
- **Configuration** : .env.example
|
||||
- **Logs** : `docker-compose logs -f`
|
||||
|
||||
**🎉 L'application est maintenant prête pour la production !**
|
||||
|
||||
Consultez `DEPLOYMENT_GUIDE.md` pour la configuration complète et `QUICK_START.md` pour un démarrage rapide.
|
||||
@@ -1,868 +0,0 @@
|
||||
# 🎆 Application Registre des Ventes de Pétards
|
||||
## Squelette Complet et Spécifications Techniques
|
||||
|
||||
---
|
||||
|
||||
## 📋 **Vue d'ensemble de l'Application**
|
||||
|
||||
### **Objectif**
|
||||
Application web React pour la gestion et le suivi réglementaire des ventes de feux d'artifice et pétards, conforme à la législation française.
|
||||
|
||||
### **Utilisateurs cibles**
|
||||
- Commerçants vendant des feux d'artifice
|
||||
- Responsables de magasins spécialisés
|
||||
- Contrôleurs réglementaires
|
||||
|
||||
|
||||
|
||||
## 🎮 **Interface Utilisateur**
|
||||
|
||||
### **Navigation Principale**
|
||||
```
|
||||
Header: "Registre des Ventes de Pétards"
|
||||
└── Onglets Navigation:
|
||||
├── 📝 Nouvelle Vente
|
||||
└── 📊 Historique (X ventes)
|
||||
```
|
||||
|
||||
### **Palette de Couleurs**
|
||||
- **Primaire**: Bleu (#2563EB)
|
||||
- **Succès**: Vert (#16A34A)
|
||||
- **Erreur**: Rouge (#DC2626)
|
||||
- **Info**: Bleu clair (#3B82F6)
|
||||
- **Arrière-plan**: Gris clair (#F9FAFB)
|
||||
|
||||
---
|
||||
|
||||
## 📝 **Section 1: Nouvelle Vente**
|
||||
|
||||
### **Formulaire Complet**
|
||||
|
||||
#### **🧑💼 Informations Vendeur**
|
||||
```javascript
|
||||
{
|
||||
vendeur: {
|
||||
type: "string",
|
||||
required: true,
|
||||
placeholder: "Nom et prénom du vendeur",
|
||||
validation: "Non vide"
|
||||
},
|
||||
dateVente: {
|
||||
type: "date",
|
||||
default: "Date du jour",
|
||||
format: "YYYY-MM-DD"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **📦 Informations Produit**
|
||||
```javascript
|
||||
{
|
||||
typeArticle: {
|
||||
type: "select",
|
||||
required: true,
|
||||
options: [
|
||||
"Pétard à mèche",
|
||||
"Batterie",
|
||||
"Batterie nécessitant un support externe",
|
||||
"Combinaison",
|
||||
"Combinaison nécessitant un support externe",
|
||||
"Pétard aérien",
|
||||
"Pétard à composition flash",
|
||||
"Fusée",
|
||||
"Chandelle romaine",
|
||||
"Chandelle monocoup"
|
||||
]
|
||||
},
|
||||
categorie: {
|
||||
type: "select",
|
||||
required: true,
|
||||
dependsOn: "typeArticle",
|
||||
mapping: {
|
||||
"Pétard à mèche": ["F3"],
|
||||
"Batterie": ["F3"],
|
||||
"Batterie nécessitant un support externe": ["F3"],
|
||||
"Combinaison": ["F3"],
|
||||
"Combinaison nécessitant un support externe": ["F3"],
|
||||
"Pétard aérien": ["F2", "F3"],
|
||||
"Pétard à composition flash": ["F3"],
|
||||
"Fusée": ["F2", "F3"],
|
||||
"Chandelle romaine": ["F2", "F3"],
|
||||
"Chandelle monocoup": ["F2", "F3"]
|
||||
}
|
||||
},
|
||||
quantite: {
|
||||
type: "number",
|
||||
required: true,
|
||||
min: 1,
|
||||
validation: "Entier positif"
|
||||
},
|
||||
gencode: {
|
||||
type: "string",
|
||||
required: false,
|
||||
placeholder: "Code produit (optionnel)"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **🧑🤝🧑 Informations Client**
|
||||
```javascript
|
||||
{
|
||||
nom: {
|
||||
type: "string",
|
||||
required: true,
|
||||
placeholder: "Nom de famille"
|
||||
},
|
||||
prenom: {
|
||||
type: "string",
|
||||
required: true,
|
||||
placeholder: "Prénom"
|
||||
},
|
||||
dateNaissance: {
|
||||
type: "date",
|
||||
required: false,
|
||||
placeholder: "Date de naissance"
|
||||
},
|
||||
lieuNaissance: {
|
||||
type: "string",
|
||||
required: false,
|
||||
placeholder: "Ville de naissance"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **🆔 Pièce d'Identité**
|
||||
```javascript
|
||||
{
|
||||
typeIdentite: {
|
||||
type: "string",
|
||||
required: false,
|
||||
placeholder: "Ex: CNI 123456789",
|
||||
examples: ["CNI", "Passeport", "Permis de conduire"]
|
||||
},
|
||||
autoriteDelivrance: {
|
||||
type: "string",
|
||||
required: false,
|
||||
placeholder: "Préfecture, Mairie, etc."
|
||||
},
|
||||
dateDelivrance: {
|
||||
type: "date",
|
||||
required: false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **📷 Photos de la Pièce d'Identité**
|
||||
```javascript
|
||||
{
|
||||
photoRecto: {
|
||||
type: "image",
|
||||
format: "base64",
|
||||
source: "camera",
|
||||
required: false,
|
||||
compression: 0.8,
|
||||
maxSize: "5MB"
|
||||
},
|
||||
photoVerso: {
|
||||
type: "image",
|
||||
format: "base64",
|
||||
source: "camera",
|
||||
required: false,
|
||||
compression: 0.8,
|
||||
maxSize: "5MB"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Informations Réglementaires**
|
||||
```
|
||||
ℹ️ Information réglementaire :
|
||||
• F2 : Feux d'artifice de catégorie F2 - Vente libre aux majeurs
|
||||
• F3 : Feux d'artifice de catégorie F3 - Vente soumise à autorisation préfectorale
|
||||
```
|
||||
|
||||
### **Actions du Formulaire**
|
||||
- **💾 Enregistrer la Vente** (bouton principal)
|
||||
- **📸 Prendre photo Recto/Verso** (boutons caméra)
|
||||
- **❌ Supprimer photo** (boutons X sur images)
|
||||
|
||||
---
|
||||
|
||||
## 📊 **Section 2: Historique des Ventes**
|
||||
|
||||
### **Actions Globales**
|
||||
```javascript
|
||||
{
|
||||
exportCSV: {
|
||||
label: "📥 Exporter CSV (X)",
|
||||
function: "exportToCSV()",
|
||||
disabled: "si aucune vente",
|
||||
format: "UTF-8 avec BOM"
|
||||
},
|
||||
backupAuto: {
|
||||
label: "💾 Backup Auto",
|
||||
function: "downloadAutoBackup()",
|
||||
source: "localStorage"
|
||||
},
|
||||
diagnostic: {
|
||||
label: "🔍 Debug",
|
||||
function: "Diagnostic complet console"
|
||||
},
|
||||
testSuppression: {
|
||||
label: "🧪 Test Suppression",
|
||||
function: "Test sur première vente"
|
||||
},
|
||||
testBackup: {
|
||||
label: "🧪 Test Backup",
|
||||
function: "Test création + téléchargement"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Informations de Status**
|
||||
```
|
||||
📊 Données stockées localement (X vente(s)) • Export CSV compatible Excel • Sauvegarde automatique à chaque ajout
|
||||
Dernier backup: DD/MM/YYYY HH:MM (X enreg.)
|
||||
```
|
||||
|
||||
### **Tableau des Ventes**
|
||||
```javascript
|
||||
{
|
||||
colonnes: [
|
||||
{
|
||||
nom: "Date",
|
||||
champ: "dateVente",
|
||||
format: "DD/MM/YYYY",
|
||||
tri: "DESC par défaut"
|
||||
},
|
||||
{
|
||||
nom: "Vendeur",
|
||||
champ: "vendeur",
|
||||
fallback: "Non spécifié"
|
||||
},
|
||||
{
|
||||
nom: "Client",
|
||||
champ: "nom + prenom",
|
||||
sousChamp: "typeIdentite"
|
||||
},
|
||||
{
|
||||
nom: "Produit",
|
||||
champ: "typeArticle",
|
||||
sousChamp: "gencode (si présent)"
|
||||
},
|
||||
{
|
||||
nom: "Catégorie",
|
||||
champ: "categorie",
|
||||
style: {
|
||||
"F2": "badge jaune",
|
||||
"F3": "badge rouge"
|
||||
}
|
||||
},
|
||||
{
|
||||
nom: "Quantité",
|
||||
champ: "quantite"
|
||||
},
|
||||
{
|
||||
nom: "Actions",
|
||||
boutons: ["👁️ Voir", "🗑️ Supprimer"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### **Actions par Ligne**
|
||||
```javascript
|
||||
{
|
||||
voirDetails: {
|
||||
icon: "👁️",
|
||||
action: "Ouvrir modal détails",
|
||||
tooltip: "Voir les détails"
|
||||
},
|
||||
supprimer: {
|
||||
icon: "🗑️",
|
||||
action: "Suppression avec confirmation",
|
||||
tooltip: "Supprimer la vente",
|
||||
confirmation: "Supprimer définitivement la vente de {nom} {prenom} ?\n\n⚠️ Cette action est irréversible !\n\nID: {id}"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 **Modal de Détails**
|
||||
|
||||
### **Structure Complète**
|
||||
```javascript
|
||||
{
|
||||
titre: "Détails de la Vente",
|
||||
sections: [
|
||||
{
|
||||
nom: "Informations Vendeur",
|
||||
champs: ["vendeur", "dateVente"]
|
||||
},
|
||||
{
|
||||
nom: "Informations Produit",
|
||||
champs: ["typeArticle", "categorie", "quantite", "gencode"]
|
||||
},
|
||||
{
|
||||
nom: "Informations Client",
|
||||
champs: ["nom", "prenom", "dateNaissance", "lieuNaissance"]
|
||||
},
|
||||
{
|
||||
nom: "Pièce d'Identité",
|
||||
champs: ["typeIdentite", "autoriteDelivrance", "dateDelivrance"]
|
||||
},
|
||||
{
|
||||
nom: "Photos de la Pièce d'Identité",
|
||||
champs: ["photoRecto", "photoVerso"],
|
||||
affichage: "Images 128px ou placeholder"
|
||||
},
|
||||
{
|
||||
nom: "Informations Système",
|
||||
champs: ["timestamp"],
|
||||
format: "DD/MM/YYYY HH:MM:SS"
|
||||
}
|
||||
],
|
||||
actions: ["Fermer"]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📸 **Modal Caméra**
|
||||
|
||||
### **Interface Caméra**
|
||||
```javascript
|
||||
{
|
||||
titre: "Photo {Recto|Verso}",
|
||||
elements: [
|
||||
{
|
||||
videoStream: {
|
||||
source: "navigator.mediaDevices.getUserMedia",
|
||||
constraints: {
|
||||
video: { facingMode: 'environment' }
|
||||
},
|
||||
autoPlay: true,
|
||||
playsInline: true
|
||||
}
|
||||
},
|
||||
{
|
||||
canvas: {
|
||||
hidden: true,
|
||||
purpose: "Capture image"
|
||||
}
|
||||
}
|
||||
],
|
||||
actions: [
|
||||
{
|
||||
nom: "📸 Prendre la photo",
|
||||
function: "takePhoto()"
|
||||
},
|
||||
{
|
||||
nom: "❌ Fermer",
|
||||
function: "stopCamera()"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### **Processus de Capture**
|
||||
1. **Demande permission caméra**
|
||||
2. **Affichage flux vidéo temps réel**
|
||||
3. **Capture frame sur canvas**
|
||||
4. **Conversion en blob JPEG (80% qualité)**
|
||||
5. **Conversion en base64**
|
||||
6. **Stockage dans formData**
|
||||
7. **Arrêt du flux caméra**
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **Système de Notifications (Toast)**
|
||||
|
||||
### **Types de Notifications**
|
||||
```javascript
|
||||
{
|
||||
success: {
|
||||
couleur: "Vert",
|
||||
icon: "✅ CheckCircle",
|
||||
duree: 4000,
|
||||
exemples: [
|
||||
"Vente enregistrée avec succès",
|
||||
"Photo recto capturée avec succès",
|
||||
"Export réussi ! X vente(s) exportée(s)",
|
||||
"Vente de {nom} {prenom} supprimée"
|
||||
]
|
||||
},
|
||||
error: {
|
||||
couleur: "Rouge",
|
||||
icon: "❌ AlertCircle",
|
||||
duree: 4000,
|
||||
exemples: [
|
||||
"Veuillez remplir tous les champs obligatoires",
|
||||
"Impossible d'accéder à la caméra",
|
||||
"Erreur lors de l'enregistrement"
|
||||
]
|
||||
},
|
||||
info: {
|
||||
couleur: "Bleu",
|
||||
icon: "ℹ️ Info",
|
||||
duree: 4000,
|
||||
exemples: [
|
||||
"Caméra activée, positionnez la carte d'identité",
|
||||
"Photo recto supprimée",
|
||||
"Aucune vente à exporter"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Positionnement et Animation**
|
||||
```css
|
||||
{
|
||||
position: "fixed bottom-4 right-4",
|
||||
zIndex: 50,
|
||||
animation: "slideInRight 0.3s ease-out",
|
||||
autoRemove: "4 secondes",
|
||||
manualClose: "Bouton X"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ **Base de Données (IndexedDB)**
|
||||
|
||||
### **Configuration**
|
||||
```javascript
|
||||
{
|
||||
nom: "VentesPetardsDB",
|
||||
version: 1,
|
||||
objectStore: {
|
||||
nom: "ventes",
|
||||
keyPath: "id",
|
||||
autoIncrement: true,
|
||||
index: [
|
||||
{ nom: "nom", unique: false },
|
||||
{ nom: "dateVente", unique: false }
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Structure d'un Enregistrement**
|
||||
```javascript
|
||||
{
|
||||
id: "number (auto-increment)",
|
||||
|
||||
// Vendeur
|
||||
vendeur: "string",
|
||||
dateVente: "string (YYYY-MM-DD)",
|
||||
|
||||
// Produit
|
||||
typeArticle: "string",
|
||||
categorie: "string (F2|F3)",
|
||||
quantite: "number",
|
||||
gencode: "string|null",
|
||||
|
||||
// Client
|
||||
nom: "string",
|
||||
prenom: "string",
|
||||
dateNaissance: "string|null",
|
||||
lieuNaissance: "string|null",
|
||||
|
||||
// Identité
|
||||
typeIdentite: "string|null",
|
||||
numeroIdentite: "string|null",
|
||||
autoriteDelivrance: "string|null",
|
||||
dateDelivrance: "string|null",
|
||||
|
||||
// Photos
|
||||
photoRecto: "string (base64)|null",
|
||||
photoVerso: "string (base64)|null",
|
||||
|
||||
// Système
|
||||
timestamp: "string (ISO 8601)"
|
||||
}
|
||||
```
|
||||
|
||||
### **Opérations CRUD**
|
||||
```javascript
|
||||
{
|
||||
create: "saveVente(venteData)",
|
||||
read: "loadVentes() -> Array",
|
||||
update: "Non implémenté",
|
||||
delete: "deleteVente(id)"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💾 **Système de Sauvegarde**
|
||||
|
||||
### **Sauvegarde Automatique (localStorage)**
|
||||
```javascript
|
||||
{
|
||||
clé: "petards_backup_csv",
|
||||
déclencheurs: [
|
||||
"Après ajout vente",
|
||||
"Après suppression vente"
|
||||
],
|
||||
contenu: {
|
||||
timestamp: "ISO 8601",
|
||||
csvContent: "string (avec BOM UTF-8)",
|
||||
recordCount: "number"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Export CSV Manuel**
|
||||
```javascript
|
||||
{
|
||||
format: "CSV délimité par ';'",
|
||||
encodage: "UTF-8 avec BOM (\uFEFF)",
|
||||
colonnes: [
|
||||
"Date de vente",
|
||||
"Vendeur",
|
||||
"Type d'article",
|
||||
"Catégorie",
|
||||
"Quantité",
|
||||
"Code générique",
|
||||
"Nom client",
|
||||
"Prénom client",
|
||||
"Date de naissance",
|
||||
"Lieu de naissance",
|
||||
"Type et n° identité",
|
||||
"Autorité de délivrance",
|
||||
"Date de délivrance",
|
||||
"Photo recto (Oui/Non)",
|
||||
"Photo verso (Oui/Non)",
|
||||
"Horodatage"
|
||||
],
|
||||
méthodes: [
|
||||
"Data URL (principal)",
|
||||
"Blob + createObjectURL (fallback)",
|
||||
"Nouvelle fenêtre (fallback final)"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ **États et Gestion des Données**
|
||||
|
||||
### **État Principal (useState)**
|
||||
```javascript
|
||||
{
|
||||
activeTab: "string ('nouvelle-vente'|'historique')",
|
||||
ventes: "Array<VenteObject>",
|
||||
showCamera: "boolean",
|
||||
currentPhotoType: "string ('photoRecto'|'photoVerso')",
|
||||
toasts: "Array<ToastObject>",
|
||||
showDetailsModal: "boolean",
|
||||
selectedVente: "VenteObject|null",
|
||||
formData: "VenteObject (form state)"
|
||||
}
|
||||
```
|
||||
|
||||
### **Références (useRef)**
|
||||
```javascript
|
||||
{
|
||||
videoRef: "HTMLVideoElement",
|
||||
canvasRef: "HTMLCanvasElement",
|
||||
streamRef: "MediaStream"
|
||||
}
|
||||
```
|
||||
|
||||
### **Effets (useEffect)**
|
||||
```javascript
|
||||
{
|
||||
componentDidMount: [
|
||||
"initDB()",
|
||||
"loadVentes()"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 **Fonctions Principales**
|
||||
|
||||
### **Base de Données**
|
||||
```javascript
|
||||
{
|
||||
initDB: "Initialisation IndexedDB",
|
||||
saveVente: "Ajout nouvelle vente",
|
||||
loadVentes: "Chargement toutes ventes",
|
||||
deleteVente: "Suppression vente par ID"
|
||||
}
|
||||
```
|
||||
|
||||
### **Caméra et Photos**
|
||||
```javascript
|
||||
{
|
||||
startCamera: "Démarrage flux caméra",
|
||||
takePhoto: "Capture photo sur canvas",
|
||||
stopCamera: "Arrêt flux caméra"
|
||||
}
|
||||
```
|
||||
|
||||
### **Formulaire**
|
||||
```javascript
|
||||
{
|
||||
handleInputChange: "Gestion changements inputs",
|
||||
handleSubmit: "Soumission formulaire complet"
|
||||
}
|
||||
```
|
||||
|
||||
### **Export et Sauvegarde**
|
||||
```javascript
|
||||
{
|
||||
exportToCSV: "Export CSV manuel",
|
||||
createAutoBackup: "Création backup auto",
|
||||
downloadAutoBackup: "Téléchargement backup"
|
||||
}
|
||||
```
|
||||
|
||||
### **Interface Utilisateur**
|
||||
```javascript
|
||||
{
|
||||
showToast: "Affichage notification",
|
||||
removeToast: "Suppression notification",
|
||||
ToastContainer: "Container notifications",
|
||||
DetailsModal: "Modal détails vente"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎛️ **Configuration et Options**
|
||||
|
||||
### **Paramètres Généraux**
|
||||
```javascript
|
||||
{
|
||||
autoBackup: true,
|
||||
toastDuration: 4000,
|
||||
photoCompression: 0.8,
|
||||
csvDelimiter: ';',
|
||||
dateFormat: 'fr-FR'
|
||||
}
|
||||
```
|
||||
|
||||
### **Validation des Champs**
|
||||
```javascript
|
||||
{
|
||||
champsObligatoires: [
|
||||
"vendeur",
|
||||
"nom",
|
||||
"prenom",
|
||||
"typeArticle",
|
||||
"categorie",
|
||||
"quantite"
|
||||
],
|
||||
validations: {
|
||||
quantite: "min: 1, type: number",
|
||||
dateVente: "format: YYYY-MM-DD",
|
||||
photos: "maxSize: 5MB, format: JPEG"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Correspondances Produits**
|
||||
```javascript
|
||||
{
|
||||
articlesTypesCategories: {
|
||||
"Pétard à mèche": ["F3"],
|
||||
"Batterie": ["F3"],
|
||||
"Batterie nécessitant un support externe": ["F3"],
|
||||
"Combinaison": ["F3"],
|
||||
"Combinaison nécessitant un support externe": ["F3"],
|
||||
"Pétard aérien": ["F2", "F3"],
|
||||
"Pétard à composition flash": ["F3"],
|
||||
"Fusée": ["F2", "F3"],
|
||||
"Chandelle romaine": ["F2", "F3"],
|
||||
"Chandelle monocoup": ["F2", "F3"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 **Flux de Données Complet**
|
||||
|
||||
### **Ajout d'une Vente**
|
||||
```
|
||||
1. Utilisateur remplit formulaire
|
||||
2. Validation champs obligatoires
|
||||
3. Prise photos (optionnel)
|
||||
4. Clic "Enregistrer la Vente"
|
||||
5. saveVente() -> IndexedDB
|
||||
6. loadVentes() -> Mise à jour état
|
||||
7. createAutoBackup() -> localStorage
|
||||
8. Toast de succès
|
||||
9. Reset formulaire
|
||||
```
|
||||
|
||||
### **Affichage Historique**
|
||||
```
|
||||
1. Clic onglet "Historique"
|
||||
2. loadVentes() depuis IndexedDB
|
||||
3. Tri par date (DESC)
|
||||
4. Affichage tableau
|
||||
5. Actions disponibles par ligne
|
||||
```
|
||||
|
||||
### **Export CSV**
|
||||
```
|
||||
1. Clic "Exporter CSV"
|
||||
2. Vérification ventes > 0
|
||||
3. Transformation données -> CSV
|
||||
4. Création blob avec BOM UTF-8
|
||||
5. Déclenchement téléchargement
|
||||
6. Toast de confirmation
|
||||
```
|
||||
|
||||
### **Suppression Vente**
|
||||
```
|
||||
1. Clic bouton suppression
|
||||
2. Confirmation utilisateur
|
||||
3. deleteVente(id) -> IndexedDB
|
||||
4. loadVentes() -> Mise à jour état
|
||||
5. createAutoBackup() -> localStorage
|
||||
6. Toast de succès
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ **Conformité Réglementaire**
|
||||
|
||||
### **Exigences Légales Couvertes**
|
||||
- ✅ **Identification vendeur** (nom du vendeur)
|
||||
- ✅ **Date de vente** (horodatage)
|
||||
- ✅ **Type et catégorie produit** (classification F2/F3)
|
||||
- ✅ **Quantité vendue** (traçabilité)
|
||||
- ✅ **Identité acheteur** (nom, prénom, pièce d'identité)
|
||||
- ✅ **Photos pièce d'identité** (preuve visuelle)
|
||||
- ✅ **Archivage numérique** (IndexedDB + CSV)
|
||||
|
||||
### **Données de Traçabilité**
|
||||
```javascript
|
||||
{
|
||||
obligatoires: [
|
||||
"Date et heure de vente",
|
||||
"Identité du vendeur",
|
||||
"Identité de l'acheteur",
|
||||
"Nature et quantité des produits",
|
||||
"Catégorie réglementaire"
|
||||
],
|
||||
optionnelles: [
|
||||
"Photos pièces d'identité",
|
||||
"Code produit fabricant",
|
||||
"Lieu de naissance acheteur"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 **Responsive Design**
|
||||
|
||||
### **Breakpoints**
|
||||
```css
|
||||
{
|
||||
mobile: "max-width: 768px",
|
||||
tablet: "768px - 1024px",
|
||||
desktop: "min-width: 1024px"
|
||||
}
|
||||
```
|
||||
|
||||
### **Adaptations Mobile**
|
||||
```javascript
|
||||
{
|
||||
navigation: "Onglets empilés",
|
||||
formulaire: "Colonnes -> lignes",
|
||||
tableau: "Scroll horizontal",
|
||||
modal: "Pleine largeur",
|
||||
camera: "Optimisé tactile"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 **Debugging et Maintenance**
|
||||
|
||||
### **Outils de Debug Intégrés**
|
||||
```javascript
|
||||
{
|
||||
diagnosticComplet: "🔍 Debug (état + IndexedDB + localStorage)",
|
||||
testSuppression: "🧪 Test sur première vente",
|
||||
testBackup: "🧪 Test création + téléchargement",
|
||||
logsDetailles: "Console avec emojis et étapes"
|
||||
}
|
||||
```
|
||||
|
||||
### **Gestion d'Erreurs**
|
||||
```javascript
|
||||
{
|
||||
camera: "Permissions, compatibilité",
|
||||
indexedDB: "Ouverture, transactions, quotas",
|
||||
export: "Génération, téléchargement",
|
||||
validation: "Champs obligatoires, formats"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 **Déploiement et Installation**
|
||||
|
||||
### **Prérequis Navigateur**
|
||||
```javascript
|
||||
|
||||
optional: [
|
||||
"Camera access",
|
||||
"Download attribute support"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### **Performance**
|
||||
```javascript
|
||||
{
|
||||
tailleBD: "Illimitée (selon navigateur)",
|
||||
photoCompression: "80% JPEG",
|
||||
chargementLazy: "Images dans modal",
|
||||
memoire: "State minimal en React"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **Évolutions Futures Possibles**
|
||||
|
||||
### **Fonctionnalités Avancées**
|
||||
```javascript
|
||||
{
|
||||
authentification: "Login vendeurs",
|
||||
synchronisation: "Multi-appareils",
|
||||
notifications: "Rappels réglementaires",
|
||||
recherche: "Filtres avancés",
|
||||
backup: "Cloud storage",
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## 📚 **Documentation Utilisateur**
|
||||
|
||||
### **Guide d'Utilisation Rapide**
|
||||
1. **Nouvelle vente** : Remplir formulaire → Photos (optionnel) → Enregistrer
|
||||
2. **Consulter historique** : Onglet Historique → Voir/Supprimer
|
||||
3. **Export données** : Bouton "Exporter CSV" → Fichier téléchargé
|
||||
4. **Sauvegarde** : Automatique + "Backup Auto" manuel
|
||||
|
||||
### **Résolution Problèmes**
|
||||
- **Caméra ne marche pas** : Vérifier permissions navigateur
|
||||
- **Export CSV vide** : Vérifier qu'il y a des ventes enregistrées
|
||||
- **Suppression ne marche pas** : Utiliser bouton "🧪 Test Suppression"
|
||||
- **Données perdues** : Utiliser "Backup Auto" pour récupérer
|
||||
|
||||
---
|
||||
|
||||
*🎆 Application développée pour la conformité réglementaire française des ventes de feux d'artifice*
|
||||
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 27 KiB |
@@ -1,37 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de debug pour Docker RegisFlow (Base de données EXTERNE)
|
||||
echo "🔍 Debug Docker RegisFlow - Base PostgreSQL externe"
|
||||
|
||||
echo "1. État des containers:"
|
||||
docker-compose ps
|
||||
|
||||
echo ""
|
||||
echo "2. Logs Application (dernières 50 lignes):"
|
||||
docker-compose logs --tail=50 regisflow
|
||||
|
||||
echo ""
|
||||
echo "3. Variables d'environnement dans l'application:"
|
||||
docker-compose exec regisflow env | grep -E "(DATABASE_URL|NODE_ENV|TZ)"
|
||||
|
||||
echo ""
|
||||
echo "4. Test de connexion à la base externe:"
|
||||
echo " - Extraction des paramètres de connexion:"
|
||||
docker-compose exec regisflow sh -c 'echo "Host: $(echo $DATABASE_URL | sed -n \"s|.*@\([^:]*\):.*|\1|p\")"'
|
||||
docker-compose exec regisflow sh -c 'echo "Port: $(echo $DATABASE_URL | sed -n \"s|.*:\([0-9]*\)/.*|\1|p\")"'
|
||||
docker-compose exec regisflow sh -c 'echo "User: $(echo $DATABASE_URL | sed -n \"s|.*://\([^:]*\):.*|\1|p\")"'
|
||||
|
||||
echo ""
|
||||
echo "5. Test de connectivité vers la base externe:"
|
||||
docker-compose exec regisflow sh -c 'pg_isready -h $(echo $DATABASE_URL | sed -n "s|.*@\([^:]*\):.*|\1|p") -p $(echo $DATABASE_URL | sed -n "s|.*:\([0-9]*\)/.*|\1|p") -U regisflow'
|
||||
|
||||
echo ""
|
||||
echo "6. Test de résolution DNS:"
|
||||
docker-compose exec regisflow sh -c 'nslookup $(echo $DATABASE_URL | sed -n "s|.*@\([^:]*\):.*|\1|p") || echo "❌ DNS échoué"'
|
||||
|
||||
echo ""
|
||||
echo "7. Test de port depuis le container:"
|
||||
docker-compose exec regisflow sh -c 'nc -zv $(echo $DATABASE_URL | sed -n "s|.*@\([^:]*\):.*|\1|p") $(echo $DATABASE_URL | sed -n "s|.*:\([0-9]*\)/.*|\1|p") 2>&1 || echo "❌ Port inaccessible"'
|
||||
|
||||
echo ""
|
||||
echo "🏁 Debug terminé - Base PostgreSQL externe"
|
||||
@@ -1,133 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de déploiement PRODUCTION RegisFlow
|
||||
# Utilisation: ./deploy-prod.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Déploiement PRODUCTION RegisFlow"
|
||||
echo "===================================="
|
||||
|
||||
# Vérifications préalables
|
||||
echo "🔍 Vérifications préalables..."
|
||||
|
||||
# Vérifier que nous sommes en mode production
|
||||
if [ "$NODE_ENV" != "production" ]; then
|
||||
echo "⚠️ Variable NODE_ENV non définie sur 'production'"
|
||||
read -p "Continuer quand même ? (y/N): " -r
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Vérifier Docker et Docker Compose
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker n'est pas installé"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ Docker Compose n'est pas installé"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Créer les répertoires de données
|
||||
echo "📁 Création des répertoires de données..."
|
||||
mkdir -p data/{postgres,backups,logs,postgres-logs}
|
||||
chmod 755 data data/*
|
||||
|
||||
# Créer le fichier .env s'il n'existe pas
|
||||
if [ ! -f .env ]; then
|
||||
echo "📝 Création du fichier .env..."
|
||||
cp .env.example .env
|
||||
echo "✅ Fichier .env créé avec configuration par défaut"
|
||||
|
||||
echo ""
|
||||
echo "ℹ️ CONFIGURATION AUTOMATIQUE :"
|
||||
echo " - Mots de passe pré-configurés pour installation simple"
|
||||
echo " - Pour la production, modifiez POSTGRES_PASSWORD et SESSION_SECRET"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Vérifier les variables critiques
|
||||
echo "🔒 Vérification de la configuration..."
|
||||
source .env
|
||||
|
||||
if [ "$POSTGRES_PASSWORD" = "RegisFlow2024!PostgreSQL" ]; then
|
||||
echo "⚠️ Utilisation des mots de passe par défaut (OK pour test, changez pour production)"
|
||||
else
|
||||
echo "✅ Mots de passe personnalisés détectés"
|
||||
fi
|
||||
|
||||
echo "✅ Configuration validée"
|
||||
|
||||
# Arrêter les services existants
|
||||
echo "🛑 Arrêt des services existants..."
|
||||
docker-compose down 2>/dev/null || true
|
||||
|
||||
# Construire les images
|
||||
echo "🔨 Construction des images de production..."
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Vérifier l'espace disque
|
||||
echo "💾 Vérification de l'espace disque..."
|
||||
DISK_USAGE=$(df / | awk 'NR==2{print $5}' | cut -d'%' -f1)
|
||||
if [ "$DISK_USAGE" -gt 80 ]; then
|
||||
echo "⚠️ Attention: Espace disque faible ($DISK_USAGE%)"
|
||||
read -p "Continuer ? (y/N): " -r
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Démarrer les services avec configuration production
|
||||
echo "🚀 Démarrage des services de production..."
|
||||
docker-compose up -d
|
||||
|
||||
# Attendre le démarrage
|
||||
echo "⏳ Attente du démarrage des services..."
|
||||
sleep 30
|
||||
|
||||
# Vérifier la santé des services
|
||||
echo "🏥 Vérification de la santé des services..."
|
||||
for i in {1..30}; do
|
||||
if docker-compose ps | grep -q "healthy"; then
|
||||
echo "✅ Services démarrés avec succès"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 30 ]; then
|
||||
echo "❌ Timeout: Les services ne démarrent pas correctement"
|
||||
echo "📋 Logs des services :"
|
||||
docker-compose logs --tail=20
|
||||
exit 1
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
|
||||
# Test de connectivité
|
||||
echo "🔗 Test de connectivité..."
|
||||
if curl -f http://localhost:5000/health &>/dev/null; then
|
||||
echo "✅ Application accessible sur http://localhost:5000"
|
||||
else
|
||||
echo "❌ Application non accessible"
|
||||
docker-compose logs regisflow --tail=20
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Afficher le statut final
|
||||
echo ""
|
||||
echo "🎉 DÉPLOIEMENT PRODUCTION RÉUSSI !"
|
||||
echo "=================================="
|
||||
echo "📱 Application RegisFlow : http://localhost:5000"
|
||||
echo "🗄️ PostgreSQL : localhost:5433"
|
||||
echo "📊 Statut des services :"
|
||||
docker-compose ps
|
||||
|
||||
echo ""
|
||||
echo "📋 Commandes utiles :"
|
||||
echo " - Logs : docker-compose logs -f"
|
||||
echo " - Statut : docker-compose ps"
|
||||
echo " - Arrêt : docker-compose down"
|
||||
echo " - Sauvegarde : docker-compose exec regisflow-db pg_dump -U regisflow regisflow > backup.sql"
|
||||
echo ""
|
||||
echo "⚠️ N'oubliez pas de configurer HTTPS avec un reverse proxy pour la production !"
|
||||
@@ -1,66 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de déploiement simplifié pour RegisFlow
|
||||
echo "🚀 Déploiement de RegisFlow avec Docker"
|
||||
|
||||
# Vérifier si Docker est installé
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker n'est pas installé. Installez Docker d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ Docker Compose n'est pas installé. Installez Docker Compose d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Docker et Docker Compose détectés"
|
||||
|
||||
# Arrêter les services existants
|
||||
echo "🛑 Arrêt des services existants..."
|
||||
docker-compose down -v 2>/dev/null || true
|
||||
|
||||
# Nettoyer les anciens containers et images
|
||||
echo "🧹 Nettoyage des anciens containers..."
|
||||
docker system prune -f
|
||||
|
||||
# Créer le fichier .env s'il n'existe pas
|
||||
if [ ! -f .env ]; then
|
||||
echo "📝 Création du fichier .env..."
|
||||
cp .env.example .env
|
||||
echo "⚠️ Configuration PostgreSQL Docker :"
|
||||
echo " - PostgreSQL et RegisFlow seront créés dans Docker"
|
||||
echo " - Utilisateur/mot de passe préconfigurés : regisflow / RegisFlow2024!"
|
||||
echo " - Port PostgreSQL externe : 5433"
|
||||
echo " - Port RegisFlow : 5000"
|
||||
echo " - Changez SESSION_SECRET pour la sécurité"
|
||||
read -p "Appuyez sur Entrée pour continuer..."
|
||||
fi
|
||||
|
||||
# Construire et démarrer les services
|
||||
echo "🏗️ Construction et démarrage des services..."
|
||||
docker-compose up -d --build
|
||||
|
||||
# Attendre que les services soient prêts
|
||||
echo "⏳ Attente du démarrage des services..."
|
||||
sleep 30
|
||||
|
||||
# Vérifier le statut des services
|
||||
echo "📊 Vérification du statut des services..."
|
||||
docker-compose ps
|
||||
|
||||
# Afficher les logs des dernières minutes
|
||||
echo "📋 Logs récents:"
|
||||
docker-compose logs --tail=50
|
||||
|
||||
echo ""
|
||||
echo "🎉 Déploiement terminé!"
|
||||
echo "📱 Application accessible sur: http://localhost:5000"
|
||||
echo "🗄️ Base de données accessible sur: localhost:5433"
|
||||
echo "👤 Compte par défaut: admin / admin123"
|
||||
echo ""
|
||||
echo "📝 Pour voir les logs en continu:"
|
||||
echo " docker-compose logs -f"
|
||||
echo ""
|
||||
echo "🛑 Pour arrêter les services:"
|
||||
echo " docker-compose down"
|
||||
@@ -1,54 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Script d'entrée pour le container RegisFlow
|
||||
echo "🚀 Démarrage de RegisFlow..."
|
||||
|
||||
# Attendre que la base de données Docker soit prête
|
||||
echo "📡 Attente de la base de données regisflow-db..."
|
||||
echo "🔍 Test de connexion à regisflow-db:5432..."
|
||||
|
||||
# Attendre jusqu'à 120 secondes pour PostgreSQL Docker
|
||||
RETRIES=24
|
||||
while [ $RETRIES -gt 0 ]; do
|
||||
if pg_isready -h regisflow-db -p 5432 -U regisflow; then
|
||||
echo "✅ PostgreSQL regisflow-db est prêt!"
|
||||
break
|
||||
fi
|
||||
echo "⏳ Base de données non prête, tentative $((25-RETRIES))/24, attente de 5 secondes..."
|
||||
sleep 5
|
||||
RETRIES=$((RETRIES-1))
|
||||
done
|
||||
|
||||
if [ $RETRIES -eq 0 ]; then
|
||||
echo "❌ Timeout: Impossible de se connecter à regisflow-db après 2 minutes"
|
||||
echo "🔍 Diagnostic:"
|
||||
echo " - Vérifiez que le service regisflow-db démarre correctement"
|
||||
echo " - Vérifiez les logs: docker-compose logs regisflow-db"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Base de données prête!"
|
||||
|
||||
# Exécuter les migrations de base de données
|
||||
echo "🔄 Exécution des migrations..."
|
||||
if command -v drizzle-kit >/dev/null 2>&1; then
|
||||
npx drizzle-kit push
|
||||
else
|
||||
echo "⚠️ drizzle-kit non disponible, tentative avec npm run db:push..."
|
||||
if [ -f package.json ]; then
|
||||
npm run db:push || echo "ℹ️ Migrations manuelles nécessaires"
|
||||
else
|
||||
echo "ℹ️ Package.json non trouvé, poursuite sans migrations"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Créer le répertoire des sauvegardes s'il n'existe pas
|
||||
mkdir -p /app/backups
|
||||
|
||||
# L'application est déjà construite dans le Dockerfile
|
||||
echo "✅ Application pré-construite"
|
||||
|
||||
# Démarrer l'application en production
|
||||
echo "🎯 Démarrage de l'application RegisFlow..."
|
||||
exec npm run start
|
||||
@@ -1,10 +0,0 @@
|
||||
-- Script d'initialisation PostgreSQL pour RegisFlow
|
||||
-- Exécuté automatiquement lors de la création du container
|
||||
|
||||
-- L'utilisateur et la base sont créés automatiquement via les variables d'environnement
|
||||
-- POSTGRES_USER=regisflow
|
||||
-- POSTGRES_DB=regisflow
|
||||
-- POSTGRES_PASSWORD=RegisFlow2024!
|
||||
|
||||
-- Configuration additionnelle si nécessaire
|
||||
-- (Actuellement vide car Drizzle ORM gère la création des tables)
|
||||
@@ -1,77 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Installation RegisFlow - Configuration automatique
|
||||
# Utilisation: ./install-simple.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Installation Simple RegisFlow"
|
||||
echo "================================"
|
||||
echo "ℹ️ Installation automatique avec configuration par défaut"
|
||||
echo ""
|
||||
|
||||
# Vérifier Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker n'est pas installé"
|
||||
echo "💡 Installez Docker avec: sudo apt install docker.io docker-compose"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ Docker Compose n'est pas installé"
|
||||
echo "💡 Installez Docker Compose avec: sudo apt install docker-compose"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Créer le fichier .env automatiquement
|
||||
echo "📝 Configuration automatique..."
|
||||
cp .env.example .env
|
||||
echo "✅ Fichier .env créé avec configuration par défaut"
|
||||
|
||||
# Créer les répertoires nécessaires
|
||||
echo "📁 Création des répertoires..."
|
||||
mkdir -p data/{postgres,backups,logs,postgres-logs}
|
||||
chmod 755 data data/*
|
||||
echo "✅ Répertoires créés"
|
||||
|
||||
# Arrêter les services existants
|
||||
echo "🛑 Nettoyage des services existants..."
|
||||
docker-compose down 2>/dev/null || true
|
||||
|
||||
# Construire les images
|
||||
echo "🔨 Construction des images..."
|
||||
docker-compose build
|
||||
|
||||
# Démarrer les services avec configuration simple
|
||||
echo "🚀 Démarrage des services..."
|
||||
docker-compose up -d
|
||||
|
||||
# Attendre le démarrage
|
||||
echo "⏳ Attente du démarrage (60 secondes)..."
|
||||
sleep 60
|
||||
|
||||
# Vérifier le statut
|
||||
echo "🔍 Vérification du statut..."
|
||||
docker-compose ps
|
||||
|
||||
# Test de connectivité
|
||||
echo "🔗 Test de l'application..."
|
||||
if curl -f http://localhost:5000 &>/dev/null; then
|
||||
echo "✅ Application accessible !"
|
||||
else
|
||||
echo "⚠️ Application en cours de démarrage..."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🎉 INSTALLATION TERMINÉE !"
|
||||
echo "========================="
|
||||
echo "📱 Application RegisFlow : http://localhost:5000"
|
||||
echo "🗄️ PostgreSQL : localhost:5433"
|
||||
echo "👤 Compte par défaut : admin / admin123"
|
||||
echo ""
|
||||
echo "📋 Commandes utiles :"
|
||||
echo " - Logs : docker-compose logs -f"
|
||||
echo " - Arrêt : docker-compose down"
|
||||
echo " - Statut : docker-compose ps"
|
||||
echo ""
|
||||
echo "⚠️ Pour la production, changez les mots de passe dans .env"
|
||||
@@ -1,120 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de monitoring pour RegisFlow Production
|
||||
# Usage: ./monitoring.sh [check|logs|backup|stats]
|
||||
|
||||
COMMAND=${1:-check}
|
||||
|
||||
case $COMMAND in
|
||||
"check")
|
||||
echo "🔍 Vérification de l'état des services RegisFlow"
|
||||
echo "=============================================="
|
||||
|
||||
echo "📊 Statut des containers :"
|
||||
docker-compose ps
|
||||
|
||||
echo ""
|
||||
echo "🏥 Health checks :"
|
||||
|
||||
# Vérifier RegisFlow
|
||||
if curl -f -s http://localhost:5000/health > /dev/null; then
|
||||
echo "✅ RegisFlow : OK"
|
||||
else
|
||||
echo "❌ RegisFlow : ERREUR"
|
||||
fi
|
||||
|
||||
# Vérifier PostgreSQL
|
||||
if docker-compose exec -T regisflow-db pg_isready -U regisflow -q; then
|
||||
echo "✅ PostgreSQL : OK"
|
||||
else
|
||||
echo "❌ PostgreSQL : ERREUR"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "💾 Utilisation des ressources :"
|
||||
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
|
||||
|
||||
echo ""
|
||||
echo "💿 Espace disque :"
|
||||
df -h | grep -E "(Filesystem|/dev/)"
|
||||
|
||||
echo ""
|
||||
echo "📁 Taille des volumes :"
|
||||
du -sh data/* 2>/dev/null || echo "Répertoire data non trouvé"
|
||||
;;
|
||||
|
||||
"logs")
|
||||
echo "📋 Logs des services RegisFlow"
|
||||
echo "=============================="
|
||||
|
||||
echo "📱 Logs RegisFlow (20 dernières lignes) :"
|
||||
docker-compose logs --tail=20 regisflow
|
||||
|
||||
echo ""
|
||||
echo "🗄️ Logs PostgreSQL (20 dernières lignes) :"
|
||||
docker-compose logs --tail=20 regisflow-db
|
||||
;;
|
||||
|
||||
"backup")
|
||||
echo "💾 Création d'une sauvegarde manuelle"
|
||||
echo "===================================="
|
||||
|
||||
BACKUP_FILE="backup-$(date +%Y%m%d-%H%M%S).sql"
|
||||
|
||||
echo "Création de la sauvegarde : $BACKUP_FILE"
|
||||
docker-compose exec -T regisflow-db pg_dump -U regisflow regisflow > "data/backups/$BACKUP_FILE"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ Sauvegarde créée avec succès : data/backups/$BACKUP_FILE"
|
||||
echo "📊 Taille : $(ls -lh data/backups/$BACKUP_FILE | awk '{print $5}')"
|
||||
else
|
||||
echo "❌ Erreur lors de la création de la sauvegarde"
|
||||
fi
|
||||
;;
|
||||
|
||||
"stats")
|
||||
echo "📊 Statistiques détaillées RegisFlow"
|
||||
echo "===================================="
|
||||
|
||||
echo "🔢 Statistiques base de données :"
|
||||
docker-compose exec -T regisflow-db psql -U regisflow -d regisflow -c "
|
||||
SELECT
|
||||
schemaname,
|
||||
tablename,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size,
|
||||
pg_stat_get_tuples_returned(c.oid) as tuple_read,
|
||||
pg_stat_get_tuples_fetched(c.oid) as tuple_fetch,
|
||||
pg_stat_get_tuples_inserted(c.oid) as tuple_insert,
|
||||
pg_stat_get_tuples_updated(c.oid) as tuple_update,
|
||||
pg_stat_get_tuples_deleted(c.oid) as tuple_delete
|
||||
FROM pg_tables t
|
||||
LEFT JOIN pg_class c ON c.relname = t.tablename
|
||||
WHERE schemaname = 'public'
|
||||
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
|
||||
"
|
||||
|
||||
echo ""
|
||||
echo "📁 Utilisation des volumes Docker :"
|
||||
docker system df
|
||||
|
||||
echo ""
|
||||
echo "🔄 Uptime des services :"
|
||||
docker-compose ps --format "table {{.Name}}\t{{.Status}}"
|
||||
|
||||
echo ""
|
||||
echo "📈 Métriques système :"
|
||||
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)%"
|
||||
echo "RAM: $(free -m | awk 'NR==2{printf "%.1f%%", $3*100/$2 }')"
|
||||
echo "Disk: $(df / | awk 'NR==2{print $5}')"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $0 [check|logs|backup|stats]"
|
||||
echo ""
|
||||
echo "Commandes disponibles :"
|
||||
echo " check - Vérifier l'état des services"
|
||||
echo " logs - Afficher les logs"
|
||||
echo " backup - Créer une sauvegarde manuelle"
|
||||
echo " stats - Afficher les statistiques détaillées"
|
||||
;;
|
||||
esac
|
||||
@@ -1,84 +0,0 @@
|
||||
# Configuration Nginx pour RegisFlow Production
|
||||
# Placez ce fichier dans /etc/nginx/sites-available/regisflow
|
||||
# Puis créez un lien : ln -s /etc/nginx/sites-available/regisflow /etc/nginx/sites-enabled/
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name votre-domaine.com www.votre-domaine.com;
|
||||
|
||||
# Redirection automatique vers HTTPS
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name votre-domaine.com www.votre-domaine.com;
|
||||
|
||||
# Configuration SSL (Let's Encrypt recommandé)
|
||||
ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem;
|
||||
|
||||
# Configuration SSL sécurisée
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_prefer_server_ciphers off;
|
||||
ssl_session_cache shared:SSL:10m;
|
||||
ssl_session_timeout 10m;
|
||||
|
||||
# Sécurité headers
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
add_header X-Frame-Options DENY always;
|
||||
add_header X-Content-Type-Options nosniff always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';" always;
|
||||
|
||||
# Configuration des logs
|
||||
access_log /var/log/nginx/regisflow_access.log;
|
||||
error_log /var/log/nginx/regisflow_error.log;
|
||||
|
||||
# Limite de taille des uploads
|
||||
client_max_body_size 10M;
|
||||
|
||||
# Configuration du proxy vers RegisFlow
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
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;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
|
||||
# Timeouts
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
|
||||
# Optimisations pour les fichiers statiques
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# Health check
|
||||
location /health {
|
||||
proxy_pass http://127.0.0.1:5000/health;
|
||||
access_log off;
|
||||
}
|
||||
|
||||
# Protection contre les attaques
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
|
||||
# Limitation du taux de requêtes
|
||||
limit_req_zone $binary_remote_addr zone=regisflow:10m rate=10r/s;
|
||||
limit_req zone=regisflow burst=20 nodelay;
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
# Configuration PostgreSQL optimisée pour production RegisFlow
|
||||
|
||||
# Connexions et authentification
|
||||
max_connections = 50
|
||||
shared_buffers = 128MB
|
||||
effective_cache_size = 256MB
|
||||
work_mem = 4MB
|
||||
maintenance_work_mem = 32MB
|
||||
|
||||
# WAL et checkpoint
|
||||
wal_buffers = 4MB
|
||||
checkpoint_completion_target = 0.9
|
||||
max_wal_size = 256MB
|
||||
min_wal_size = 80MB
|
||||
|
||||
# Logging pour production
|
||||
log_destination = 'stderr'
|
||||
logging_collector = on
|
||||
log_directory = '/var/log/postgresql'
|
||||
log_filename = 'postgresql-%Y-%m-%d.log'
|
||||
log_statement = 'mod'
|
||||
log_min_duration_statement = 1000
|
||||
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
|
||||
|
||||
# Sécurité
|
||||
ssl = off
|
||||
password_encryption = md5
|
||||
shared_preload_libraries = ''
|
||||
|
||||
# Performance
|
||||
random_page_cost = 1.1
|
||||
effective_io_concurrency = 200
|
||||
default_statistics_target = 100
|
||||
|
||||
# Timeouts
|
||||
statement_timeout = 30000
|
||||
lock_timeout = 5000
|
||||
idle_in_transaction_session_timeout = 300000
|
||||
|
||||
# Autovacuum optimisé pour RegisFlow
|
||||
autovacuum = on
|
||||
autovacuum_max_workers = 2
|
||||
autovacuum_naptime = 30s
|
||||
autovacuum_vacuum_threshold = 50
|
||||
autovacuum_analyze_threshold = 50
|
||||
@@ -1 +0,0 @@
|
||||
<html><body><h1>RegisFlow - Loading...</h1></body></html>
|
||||
@@ -202,7 +202,7 @@ Preferred communication style: Simple, everyday language.
|
||||
- ✅ Safety confirmation dialogs for manual purge operations
|
||||
- ✅ Real-time monitoring of data retention status with visual indicators
|
||||
|
||||
### Docker Configuration (January 9, 2025)
|
||||
### Docker Configuration & Cleanup (January 9, 2025)
|
||||
- ✅ Complete Docker setup optimized for external PostgreSQL database
|
||||
- ✅ Docker Compose configuration with RegisFlow application only
|
||||
- ✅ Automated database connection and migration scripts for external PostgreSQL
|
||||
@@ -210,14 +210,15 @@ Preferred communication style: Simple, everyday language.
|
||||
- ✅ Production-ready configuration with security best practices
|
||||
- ✅ Persistent volumes for backup data
|
||||
- ✅ Environment variable configuration with preconfigured PostgreSQL credentials
|
||||
- ✅ Comprehensive Docker documentation with deployment instructions
|
||||
- ✅ Nginx configuration removed for simplified deployment (application accessible on port 5000)
|
||||
- ✅ Preconfigured PostgreSQL user (regisflow/RegisFlow2024!) - only IP change needed
|
||||
- ✅ Removed all nginx configuration files and dependencies
|
||||
- ✅ Cleaned up redundant Docker scripts and deployment files
|
||||
- ✅ Simplified network configuration without IP presets to avoid conflicts
|
||||
- ✅ Default Docker bridge network usage for maximum compatibility
|
||||
- ✅ Ultra-simple installation process with single command: docker-compose up -d
|
||||
- ✅ Single docker-compose.yml file for all environments (dev, test, production)
|
||||
- ✅ Eliminated multiple configuration files to reduce complexity
|
||||
- ✅ Removed unnecessary documentation files and assets
|
||||
- ✅ Streamlined project structure with only essential files
|
||||
|
||||
### Node.js 18 Compatibility Fix (January 9, 2025)
|
||||
- ✅ Resolved TypeError with undefined paths in Node.js 18 production environment
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
-- Script de configuration PostgreSQL pour RegisFlow
|
||||
-- Exécuter sur votre serveur PostgreSQL externe
|
||||
|
||||
-- Se connecter en tant que superutilisateur postgres :
|
||||
-- sudo -u postgres psql
|
||||
|
||||
-- 1. Créer l'utilisateur RegisFlow
|
||||
CREATE USER regisflow WITH PASSWORD 'RegisFlow2024!';
|
||||
|
||||
-- 2. Créer la base de données RegisFlow
|
||||
CREATE DATABASE regisflow OWNER regisflow;
|
||||
|
||||
-- 3. Donner tous les privilèges à l'utilisateur
|
||||
GRANT ALL PRIVILEGES ON DATABASE regisflow TO regisflow;
|
||||
|
||||
-- 4. Se connecter à la base regisflow pour configurer les permissions
|
||||
\c regisflow
|
||||
|
||||
-- 5. Donner les permissions sur le schéma public
|
||||
GRANT ALL PRIVILEGES ON SCHEMA public TO regisflow;
|
||||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO regisflow;
|
||||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO regisflow;
|
||||
|
||||
-- 6. Permissions par défaut pour les futurs objets
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO regisflow;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO regisflow;
|
||||
|
||||
-- 7. Vérifier la configuration
|
||||
SELECT usename, usecreatedb, usesuper FROM pg_user WHERE usename = 'regisflow';
|
||||
SELECT datname, datowner FROM pg_database WHERE datname = 'regisflow';
|
||||
|
||||
-- Configuration terminée !
|
||||
-- Utilisateur: regisflow
|
||||
-- Mot de passe: RegisFlow2024!
|
||||
-- Base de données: regisflow
|
||||
-- Port: 5433 (assurez-vous que PostgreSQL écoute sur ce port)
|
||||