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
|
# Copier les scripts de configuration
|
||||||
COPY --chown=regisflow:nodejs docker-entrypoint-simple.sh /usr/local/bin/docker-entrypoint.sh
|
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
|
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
||||||
|
|
||||||
# Changer vers l'utilisateur non-root
|
# 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
|
## Fonctionnalités
|
||||||
|
|
||||||
### 🔐 Système d'authentification
|
- ✅ Authentification multi-utilisateur avec rôles (Admin, Manager, Employee)
|
||||||
- Connexion par nom d'utilisateur et mot de passe
|
- ✅ Gestion multi-magasins avec isolation des données
|
||||||
- Système de rôles : Administrateur, Manager, Employé
|
- ✅ Enregistrement des ventes conforme à la réglementation
|
||||||
- Sessions sécurisées avec PostgreSQL
|
- ✅ 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
|
## Démarrage Rapide
|
||||||
- **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
|
|
||||||
|
|
||||||
### 🏪 Multi-magasins
|
### Développement
|
||||||
- Chaque magasin a son propre historique de ventes
|
```bash
|
||||||
- Les utilisateurs sont liés à un magasin spécifique
|
# Installation des dépendances
|
||||||
- Isolation des données par magasin
|
npm install
|
||||||
|
|
||||||
### 📋 Enregistrement des ventes
|
# Démarrage en développement
|
||||||
- Formulaire complet avec validation des champs obligatoires
|
npm run dev
|
||||||
- Support des codes EAN13 avec validation
|
```
|
||||||
- Capture photo des pièces d'identité
|
|
||||||
- Classification des produits (F2/F3)
|
|
||||||
|
|
||||||
### 📊 Historique et export
|
### Production avec Docker
|
||||||
- Historique des ventes avec filtrage par dates
|
```bash
|
||||||
- Export CSV pour la conformité réglementaire
|
# Démarrage simple
|
||||||
- Suppression des ventes (Manager et Administrateur uniquement)
|
docker-compose up -d
|
||||||
|
|
||||||
## Installation et démarrage
|
# Vérification des logs
|
||||||
|
docker-compose logs -f regisflow
|
||||||
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 !
|
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
### Variables d'environnement
|
### Variables d'environnement (.env)
|
||||||
- `DATABASE_URL` : URL de connexion PostgreSQL
|
```env
|
||||||
- `SESSION_SECRET` : Clé secrète pour les sessions (optionnel, une clé par défaut est générée)
|
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
|
⚠️ **Important** : Changez le mot de passe par défaut après la première connexion.
|
||||||
- ✅ 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
|
|
||||||
|
|
||||||
#### Manager
|
## Architecture Technique
|
||||||
- ✅ Création de ventes
|
|
||||||
- ✅ Consultation de l'historique du magasin
|
|
||||||
- ✅ Suppression des ventes
|
|
||||||
- ✅ Export des données
|
|
||||||
- ❌ Administration des utilisateurs/magasins
|
|
||||||
- ❌ Sauvegardes automatiques
|
|
||||||
|
|
||||||
#### Employé
|
- **Frontend** : React 18 + TypeScript + TailwindCSS + shadcn/ui
|
||||||
- ✅ Création de ventes
|
- **Backend** : Express.js + TypeScript
|
||||||
- ✅ 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
|
|
||||||
- **Base de données** : PostgreSQL avec Drizzle ORM
|
- **Base de données** : PostgreSQL avec Drizzle ORM
|
||||||
- **Authentification** : Sessions avec bcrypt
|
- **Authentification** : Sessions sécurisées avec bcrypt
|
||||||
- **Stockage local** : IndexedDB pour la résilience
|
- **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 :
|
- `npm run dev` : Développement avec hot-reload
|
||||||
- Enregistrement obligatoire des informations vendeur
|
- `npm run build` : Construction pour production
|
||||||
- Vérification de l'identité de l'acheteur
|
- `npm run start` : Démarrage en production
|
||||||
- Classification des produits (F2/F3)
|
- `npm run db:push` : Migration de base de données
|
||||||
- Traçabilité complète des ventes
|
|
||||||
- Export des données pour les autorités
|
|
||||||
|
|
||||||
## 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
|
- ✅ Safety confirmation dialogs for manual purge operations
|
||||||
- ✅ Real-time monitoring of data retention status with visual indicators
|
- ✅ 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
|
- ✅ Complete Docker setup optimized for external PostgreSQL database
|
||||||
- ✅ Docker Compose configuration with RegisFlow application only
|
- ✅ Docker Compose configuration with RegisFlow application only
|
||||||
- ✅ Automated database connection and migration scripts for external PostgreSQL
|
- ✅ 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
|
- ✅ Production-ready configuration with security best practices
|
||||||
- ✅ Persistent volumes for backup data
|
- ✅ Persistent volumes for backup data
|
||||||
- ✅ Environment variable configuration with preconfigured PostgreSQL credentials
|
- ✅ Environment variable configuration with preconfigured PostgreSQL credentials
|
||||||
- ✅ Comprehensive Docker documentation with deployment instructions
|
- ✅ Removed all nginx configuration files and dependencies
|
||||||
- ✅ Nginx configuration removed for simplified deployment (application accessible on port 5000)
|
- ✅ Cleaned up redundant Docker scripts and deployment files
|
||||||
- ✅ Preconfigured PostgreSQL user (regisflow/RegisFlow2024!) - only IP change needed
|
|
||||||
- ✅ Simplified network configuration without IP presets to avoid conflicts
|
- ✅ Simplified network configuration without IP presets to avoid conflicts
|
||||||
- ✅ Default Docker bridge network usage for maximum compatibility
|
- ✅ Default Docker bridge network usage for maximum compatibility
|
||||||
- ✅ Ultra-simple installation process with single command: docker-compose up -d
|
- ✅ Ultra-simple installation process with single command: docker-compose up -d
|
||||||
- ✅ Single docker-compose.yml file for all environments (dev, test, production)
|
- ✅ Single docker-compose.yml file for all environments (dev, test, production)
|
||||||
- ✅ Eliminated multiple configuration files to reduce complexity
|
- ✅ 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)
|
### Node.js 18 Compatibility Fix (January 9, 2025)
|
||||||
- ✅ Resolved TypeError with undefined paths in Node.js 18 production environment
|
- ✅ 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)
|
|
||||||