Ajout: Système de gestion et synchronisation production

- Script audit-production.sh pour audit complet
- Script sync-from-production.sh pour synchronisation facile
- Guide WORKFLOW.md pour processus de modification
- README pour le dossier scripts
- Documentation complète du workflow Git
This commit is contained in:
Folzo
2026-04-04 09:09:46 +02:00
parent d1e12cff60
commit ba0dea40e1
5 changed files with 769 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
# 🛠️ Scripts Utilitaires
Ce dossier contient des scripts pour faciliter la gestion d'Effi.
---
## Scripts disponibles
### 🔍 `audit-production.sh`
**Usage** : `./audit-production.sh`
**Où l'exécuter** : Sur effi-server (dans ~/effi)
**Fait** :
- Liste tous les conteneurs en cours d'exécution
- Affiche les images Docker utilisées
- Montre les variables d'environnement (anonymisées)
- Vérifie l'utilisation des volumes
- Liste les ports en écoute
- Vérifie l'état Git (si initialisé)
- Teste la connectivité avec les services externes
- Donne des recommandations
**Exemple de sortie** :
```
═════════════════════════════════════════════════════════════
🔍 AUDIT EFFI - Production Server
═════════════════════════════════════════════════════════════
📦 CONTENEURS DOCKER
─────────────────────────────────────────────────────────────
NAME STATUS PORTS
open-webui Up 3 days 0.0.0.0:3000->8080/tcp
qdrant Up 3 days 0.0.0.0:6333->6333/tcp
...
💡 RECOMMANDATIONS
─────────────────────────────────────────────────────────────
✓ .env.example est à jour
⚠️ Le dépôt local et Gitea sont désynchronisés
```
---
### 🔄 `sync-from-production.sh`
**Usage** : `./sync-from-production.sh`
**Où l'exécuter** : Sur ton PC (dans le dépôt Git Effi)
**Fait** :
- Se connecte à effi-server via SSH
- Récupère le docker-compose.yml
- Récupère le .env (anonymisé → .env.production)
- Récupère les scripts
- Affiche les différences avec Git
- Guide pour le commit/push
**Prérequis** :
- Clé SSH configurée vers effi-server
- Être dans le dépôt Git (~/Documents/OpenCode/Projets/Effi)
**Workflow** :
```bash
cd ~/Documents/OpenCode/Projets/Effi
./scripts/sync-from-production.sh
# Vérifier les différences
git diff
# Commiter si OK
git add . && git commit -m "Sync production"
git push
```
---
## Installation sur effi-server
Pour utiliser ces scripts sur effi-server, copie-les depuis le dépôt :
```bash
# Sur effi-server
cd ~/effi
mkdir -p scripts
# Copier depuis le dépôt (via SCP depuis ton PC)
# OU simplement créer les fichiers manuellement
```
---
## Futurs scripts à créer
- [ ] `backup.sh` - Sauvegarde automatique des volumes
- [ ] `update.sh` - Mise à jour des images Docker
- [ ] `deploy.sh` - Déploiement depuis Gitea (GitOps avancé)
- [ ] `health-check.sh` - Vérification santé complète
---
## ⚠️ Sécurité
- Les scripts ne contiennent pas de mots de passe
- Les scripts ne modifient pas les données utilisateur
- Toujours faire une sauvegarde avant d'exécuter un script de modification
+194
View File
@@ -0,0 +1,194 @@
#!/bin/bash
# ═══════════════════════════════════════════════════════════
# EFFI - Script d'audit de la production
# Usage: ./audit-production.sh
# Ce script génère un rapport complet de l'état actuel
# ═══════════════════════════════════════════════════════════
set -e
# Couleurs pour la lisibilité
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo "═════════════════════════════════════════════════════════════"
echo " 🔍 AUDIT EFFI - Production Server"
echo " Date: $(date)"
echo " Host: $(hostname)"
echo "═════════════════════════════════════════════════════════════"
echo ""
# Vérifier qu'on est dans le bon dossier
if [ ! -f "docker-compose.yml" ]; then
echo -e "${RED}❌ Erreur: docker-compose.yml non trouvé${NC}"
echo "Lancez ce script depuis le dossier ~/effi"
exit 1
fi
echo -e "${GREEN}✓ Dossier effi détecté${NC}"
echo ""
# ═══════════════════════════════════════════════════════════
# 1. ÉTAT DES CONTENEURS
# ═══════════════════════════════════════════════════════════
echo "📦 CONTENEURS DOCKER"
echo "─────────────────────────────────────────────────────────────"
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || echo "Aucun conteneur en cours d'exécution"
echo ""
# ═══════════════════════════════════════════════════════════
# 2. IMAGES UTILISÉES
# ═══════════════════════════════════════════════════════════
echo "🐳 IMAGES DOCKER"
echo "─────────────────────────────────────────────────────────────"
docker compose images 2>/dev/null || echo "Aucune image"
echo ""
# ═══════════════════════════════════════════════════════════
# 3. STRUCTURE DES FICHIERS
# ═══════════════════════════════════════════════════════════
echo "📁 STRUCTURE DES FICHIERS"
echo "─────────────────────────────────────────────────────────────"
ls -la | grep -E "^-|^d" | grep -v "^d.*\.git" | awk '{print $9, "(" $5 " bytes)"}'
echo ""
# ═══════════════════════════════════════════════════════════
# 4. VARIABLES D'ENVIRONNEMENT (anonymisées)
# ═══════════════════════════════════════════════════════════
echo "⚙️ VARIABLES D'ENVIRONNEMENT"
echo "─────────────────────────────────────────────────────────────"
if [ -f ".env" ]; then
echo "Fichier .env présent"
echo "Variables définies:"
grep -E "^[A-Z].*=" .env | cut -d= -f1 | sed 's/^/ - /'
echo ""
echo "⚠️ Pour la sécurité, les valeurs sont masquées"
else
echo -e "${RED}❌ Fichier .env manquant!${NC}"
fi
echo ""
# ═══════════════════════════════════════════════════════════
# 5. VOLUMES ET STOCKAGE
# ═══════════════════════════════════════════════════════════
echo "💾 VOLUMES ET STOCKAGE"
echo "─────────────────────────────────────────────────────────────"
echo "Dossiers de données:"
du -sh *-data 2>/dev/null || echo " Aucun dossier *-data trouvé"
du -sh *-storage 2>/dev/null || echo " Aucun dossier *-storage trouvé"
echo ""
echo "Utilisation disque:"
df -h . | tail -1
echo ""
# ═══════════════════════════════════════════════════════════
# 6. PORTS EN ÉCOUTE
# ═══════════════════════════════════════════════════════════
echo "🌐 PORTS EN ÉCOUTE"
echo "─────────────────────────────────────────────────────────────"
sudo ss -tlnp | grep -E "3000|3011|3100|5678|5984|6333|8000|8100|8200|9099|11434" || echo "Aucun port Effi détecté"
echo ""
# ═══════════════════════════════════════════════════════════
# 7. DIFFÉRENCES AVEC LE DÉPÔT GIT (si présent)
# ═══════════════════════════════════════════════════════════
if [ -d ".git" ]; then
echo "📝 ÉTAT GIT"
echo "─────────────────────────────────────────────────────────────"
echo "Branche actuelle: $(git branch --show-current 2>/dev/null || echo 'N/A')"
echo "Dernier commit: $(git log -1 --pretty=format:'%h - %s (%ar)' 2>/dev/null || echo 'N/A')"
# Vérifier s'il y a des modifications non commitées
if ! git diff --quiet HEAD 2>/dev/null; then
echo ""
echo -e "${YELLOW}⚠️ Modifications non commitées détectées:${NC}"
git status --short
else
echo -e "${GREEN}✓ Pas de modifications locales${NC}"
fi
# Vérifier si on est synchronisé avec le remote
if git remote get-url origin >/dev/null 2>&1; then
git fetch origin --quiet 2>/dev/null || true
LOCAL=$(git rev-parse @ 2>/dev/null || echo "0")
REMOTE=$(git rev-parse @{u} 2>/dev/null || echo "0")
if [ "$LOCAL" != "$REMOTE" ] && [ "$REMOTE" != "0" ]; then
echo ""
echo -e "${YELLOW}⚠️ Le dépôt local et Gitea sont désynchronisés${NC}"
echo "Commits à pousser:"
git log --oneline @{u}.. 2>/dev/null || echo " N/A"
fi
fi
else
echo "📝 ÉTAT GIT"
echo "─────────────────────────────────────────────────────────────"
echo -e "${YELLOW}⚠️ Pas de dépôt Git initialisé${NC}"
fi
echo ""
# ═══════════════════════════════════════════════════════════
# 8. SERVICES EXTERNES (vérification de connectivité)
# ═══════════════════════════════════════════════════════════
echo "🔗 CONNECTIVITÉ SERVICES EXTERNES"
echo "─────────────────────────────────────────────────────────────"
# Vérifier Ollama
if curl -s http://192.168.1.11:11434/api/tags >/dev/null 2>&1; then
echo -e "${GREEN}✓ Ollama (192.168.1.11:11434) accessible${NC}"
else
echo -e "${YELLOW}⚠️ Ollama (192.168.1.11:11434) inaccessible${NC}"
fi
# Vérifier speaches
if curl -s http://192.168.1.11:8200/v1/models >/dev/null 2>&1; then
echo -e "${GREEN}✓ Speaches STT (192.168.1.11:8200) accessible${NC}"
else
echo -e "${YELLOW}⚠️ Speaches STT (192.168.1.11:8200) inaccessible${NC}"
fi
# Vérifier openedai-speech
if curl -s http://192.168.1.11:8100/v1/models >/dev/null 2>&1; then
echo -e "${GREEN}✓ OpenedAI TTS (192.168.1.11:8100) accessible${NC}"
else
echo -e "${YELLOW}⚠️ OpenedAI TTS (192.168.1.11:8100) inaccessible${NC}"
fi
echo ""
# ═══════════════════════════════════════════════════════════
# 9. RECOMMANDATIONS
# ═══════════════════════════════════════════════════════════
echo "💡 RECOMMANDATIONS"
echo "─────────────────────────────────────────────────────────────"
# Vérifier si le .env.example est à jour
if [ -f ".env.example" ]; then
ENV_VARS=$(grep -E "^[A-Z].*=" .env 2>/dev/null | cut -d= -f1 | sort)
EXAMPLE_VARS=$(grep -E "^[A-Z].*=" .env.example 2>/dev/null | cut -d= -f1 | sort)
if [ "$ENV_VARS" != "$EXAMPLE_VARS" ]; then
echo -e "${YELLOW}⚠️ Le fichier .env.example n'est pas synchronisé avec .env${NC}"
echo " Variables manquantes dans .env.example:"
comm -23 <(echo "$ENV_VARS") <(echo "$EXAMPLE_VARS") | sed 's/^/ - /'
else
echo -e "${GREEN}✓ .env.example est à jour${NC}"
fi
else
echo -e "${YELLOW}⚠️ Fichier .env.example manquant${NC}"
echo " Créez-le avec: cp .env .env.example && éditez pour masquer les valeurs"
fi
# Vérifier les backups
if [ -d "../Effi-BACKUP*" ]; then
echo -e "${GREEN}✓ Des sauvegardes locales existent${NC}"
else
echo -e "${YELLOW}⚠️ Aucune sauvegarde locale détectée${NC}"
echo " Créez une sauvegarde avec: cd .. && cp -r Effi Effi-BACKUP-$(date +%Y%m%d)"
fi
echo ""
echo "═════════════════════════════════════════════════════════════"
echo " Audit terminé!"
echo "═════════════════════════════════════════════════════════════"
+125
View File
@@ -0,0 +1,125 @@
#!/bin/bash
# ═══════════════════════════════════════════════════════════
# EFFI - Script de synchronisation depuis la production
# Usage: ./sync-from-production.sh
# Ce script récupère la config de effi-server et prépare le commit
# ═══════════════════════════════════════════════════════════
set -e
# Configuration
EFFI_SERVER="effi@192.168.1.27"
REMOTE_PATH="~/effi"
LOCAL_PATH="."
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo "═════════════════════════════════════════════════════════════"
echo " 🔄 SYNCHRONISATION DEPUIS LA PRODUCTION"
echo " Serveur: $EFFI_SERVER"
echo " Date: $(date)"
echo "═════════════════════════════════════════════════════════════"
echo ""
# Vérifier qu'on est dans le dépôt Git
if [ ! -d ".git" ]; then
echo -e "${RED}❌ Erreur: Ce script doit être exécuté dans le dépôt Git Effi${NC}"
echo "Exécutez: cd ~/Documents/OpenCode/Projets/Effi"
exit 1
fi
# Vérifier la connexion SSH
echo -e "${BLUE}🔌 Vérification connexion SSH...${NC}"
if ! ssh -q -o BatchMode=yes -o ConnectTimeout=5 $EFFI_SERVER exit 2>/dev/null; then
echo -e "${RED}❌ Impossible de se connecter à $EFFI_SERVER${NC}"
echo "Vérifiez:"
echo " 1. Que le serveur est allumé"
echo " 2. Que votre clé SSH est configurée"
echo " 3. L'adresse IP ($EFFI_SERVER)"
exit 1
fi
echo -e "${GREEN}✓ Connexion SSH OK${NC}"
echo ""
# Sauvegarder le .env local s'il existe
if [ -f ".env" ]; then
cp .env .env.local.backup
echo -e "${BLUE}💾 Sauvegarde du .env local créée (.env.local.backup)${NC}"
fi
# Récupérer docker-compose.yml
echo -e "${BLUE}📥 Récupération de docker-compose.yml...${NC}"
scp $EFFI_SERVER:$REMOTE_PATH/docker-compose.yml $LOCAL_PATH/
echo -e "${GREEN}✓ docker-compose.yml récupéré${NC}"
# Récupérer .env (on le renomme pour ne pas écraser accidentellement)
echo -e "${BLUE}📥 Récupération de .env (anonymisé)...${NC}"
scp $EFFI_SERVER:$REMOTE_PATH/.env $LOCAL_PATH/.env.production 2>/dev/null || echo -e "${YELLOW}⚠️ Pas de .env sur le serveur${NC}"
# Anonymiser le .env récupéré
if [ -f ".env.production" ]; then
echo -e "${BLUE}🔒 Anonymisation des valeurs sensibles...${NC}"
# Remplacer les valeurs par des placeholders
sed -i 's/=.*/=[valeur_production]/g' .env.production
echo -e "${GREEN}✓ .env.production créé (valeurs masquées)${NC}"
fi
# Récupérer les scripts s'ils existent
echo -e "${BLUE}📥 Récupération des scripts...${NC}"
scp $EFFI_SERVER:$REMOTE_PATH/scripts/*.sh $LOCAL_PATH/scripts/ 2>/dev/null || echo -e "${YELLOW}⚠️ Pas de scripts sur le serveur${NC}"
# Vérifier les différences
echo ""
echo "═════════════════════════════════════════════════════════════"
echo " 📊 DIFFÉRENCES DÉTECTÉES"
echo "═════════════════════════════════════════════════════════════"
echo ""
if git diff --quiet HEAD; then
echo -e "${GREEN}✓ Aucune différence avec le dépôt${NC}"
echo "La production est déjà synchronisée avec Gitea."
exit 0
else
echo -e "${YELLOW}⚠️ Différences trouvées:${NC}"
git diff --stat
echo ""
echo -e "${BLUE}Détails des changements:${NC}"
git diff --color-words
fi
echo ""
echo "═════════════════════════════════════════════════════════════"
echo " 📝 PROCHAINES ÉTAPES"
echo "═════════════════════════════════════════════════════════════"
echo ""
echo "Les fichiers ont été récupérés depuis la production."
echo ""
echo "Pour finaliser la synchronisation:"
echo ""
echo " 1. ${YELLOW}Vérifiez${NC} les changements:"
echo " git diff"
echo ""
echo " 2. ${YELLOW}Mettez à jour${NC} .env.example si de nouvelles variables:"
echo " diff .env.example .env.production"
echo ""
echo " 3. ${YELLOW}Commitez${NC} les changements:"
echo " git add docker-compose.yml"
echo " git commit -m \"Sync: Mise à jour depuis production - $(date +%Y-%m-%d)\""
echo ""
echo " 4. ${YELLOW}Poussez${NC} sur Gitea:"
echo " git push"
echo ""
echo "═════════════════════════════════════════════════════════════"
# Restaurer le .env local
if [ -f ".env.local.backup" ]; then
mv .env.local.backup .env
echo -e "${GREEN}✓ Votre .env local a été restauré${NC}"
fi
exit 0