Actualiser Guide-migration-moodle-rber-v2

This commit is contained in:
2026-03-02 15:27:21 +00:00
parent b3cd2f26a1
commit 15cd462078

View File

@@ -67,41 +67,42 @@ rsync --version
## 2. Phase 1 : Audit de l'environnement source
### 2.1 Informations système
> **Note :** Les Moodle sources sont des pods Kubernetes. Toutes les commandes utilisent `kubectl exec`.
### 2.1 Identifier le pod source
```bash
# Connexion au serveur source
ssh admin@elearning.UNIVERSITE.bj
# Variables - ADAPTER selon l'université et le namespace source
SOURCE_NS="moodle-source" # Namespace où se trouve le Moodle actuel
SOURCE_DEPLOY="moodle" # Nom du deployment
# Version système
cat /etc/os-release
uname -a
# Vérifier le pod
kubectl get pods -n ${SOURCE_NS}
# Version Moodle
sudo -u www-data php /var/www/moodle/admin/cli/version.php
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php /bitnami/moodle/admin/cli/version.php
# Version PHP et extensions
php -v
php -m | grep -E "curl|gd|intl|mbstring|pgsql|mysqli|xml|zip|soap|ldap"
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php -v
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php -m | grep -E "curl|gd|intl|mbstring|pgsql|mysqli|xml|zip|soap|ldap"
```
### 2.2 Audit base de données
**Pour MySQL/MariaDB :**
```bash
mysql -u root -p -e "
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size_MB'
FROM information_schema.tables
WHERE table_schema = 'moodle'
GROUP BY table_schema;
"
```
# Identifier le cluster PostgreSQL source
kubectl get cluster -n ${SOURCE_NS}
**Pour PostgreSQL :**
```bash
sudo -u postgres psql -d moodle -c "
# Ou se connecter via le pod Moodle
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php -r "
require('/bitnami/moodle/config.php');
global \$DB;
echo 'Host: ' . \$CFG->dbhost . PHP_EOL;
echo 'Database: ' . \$CFG->dbname . PHP_EOL;
"
# Taille de la base (si accès direct au pod PostgreSQL)
kubectl exec -n ${SOURCE_NS} <pg-pod-name> -- psql -U postgres -d moodle -c "
SELECT pg_size_pretty(pg_database_size('moodle')) AS size;
"
```
@@ -109,12 +110,13 @@ SELECT pg_size_pretty(pg_database_size('moodle')) AS size;
### 2.3 Statistiques Moodle
```bash
# Remplacer par la commande appropriée selon le type de BDD
mysql -u root -p moodle -e "
SELECT 'Utilisateurs' AS metric, COUNT(*) AS value FROM mdl_user WHERE deleted=0
UNION ALL SELECT 'Cours', COUNT(*) FROM mdl_course WHERE id > 1
UNION ALL SELECT 'Fichiers', COUNT(*) FROM mdl_files WHERE filename != '.'
UNION ALL SELECT 'Devoirs', COUNT(*) FROM mdl_assign;
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php -r "
require('/bitnami/moodle/config.php');
global \$DB;
echo 'Utilisateurs actifs: ' . \$DB->count_records('user', ['deleted' => 0]) . PHP_EOL;
echo 'Cours: ' . (\$DB->count_records('course') - 1) . PHP_EOL;
echo 'Fichiers: ' . \$DB->count_records_select('files', \"filename != '.'\") . PHP_EOL;
echo 'Devoirs: ' . \$DB->count_records('assign') . PHP_EOL;
"
```
@@ -122,37 +124,36 @@ UNION ALL SELECT 'Devoirs', COUNT(*) FROM mdl_assign;
```bash
# Taille totale
du -sh /var/moodledata/
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- du -sh /bitnami/moodledata/
# Répartition
du -h --max-depth=1 /var/moodledata/ | sort -hr
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- du -h --max-depth=1 /bitnami/moodledata/ | sort -hr
# Nombre de fichiers
find /var/moodledata -type f | wc -l
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- find /bitnami/moodledata -type f | wc -l
```
### 2.5 Plugins installés
```bash
# Liste des plugins
php /var/www/moodle/admin/cli/plugin_list.php > /tmp/plugins_list.txt
cat /tmp/plugins_list.txt
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php /bitnami/moodle/admin/cli/plugin_list.php
# Plugins custom (local)
ls -la /var/www/moodle/local/
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- ls -la /bitnami/moodle/local/
# Thèmes custom
ls -la /var/www/moodle/theme/ | grep -v boost | grep -v classic
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- ls -la /bitnami/moodle/theme/ | grep -v boost | grep -v classic
```
### 2.6 Configuration actuelle
```bash
# Sauvegarder config.php
cat /var/www/moodle/config.php > /tmp/config.php.backup
# Afficher config.php
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- cat /bitnami/moodle/config.php
# Paramètres critiques à noter
grep -E "wwwroot|dataroot|dbtype|dbhost|dbname|prefix" /var/www/moodle/config.php
# Paramètres critiques
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- grep -E "wwwroot|dataroot|dbtype|dbhost|dbname|prefix" /bitnami/moodle/config.php
```
---
@@ -293,148 +294,174 @@ helm install moodle-${UNIVERSITY} bitnami/moodle \
### 4.1 Activer le mode maintenance
```bash
# Sur le serveur source
sudo -u www-data php /var/www/moodle/admin/cli/maintenance.php --enable
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php /bitnami/moodle/admin/cli/maintenance.php --enable
# Vérifier
curl -I http://elearning.UNIVERSITE.bj
curl -I https://elearning-source.rber.bj
```
### 4.2 Dump de la base de données
**Source MySQL → Cible PostgreSQL :**
**Option A : Dump depuis le pod PostgreSQL**
```bash
# Dump MySQL
mysqldump -u root -p \
--single-transaction \
--quick \
--lock-tables=false \
--routines \
--triggers \
--hex-blob \
--default-character-set=utf8mb4 \
moodle > moodle_dump_$(date +%Y%m%d_%H%M%S).sql
# Identifier le pod PostgreSQL
PG_POD=$(kubectl get pods -n ${SOURCE_NS} -l cnpg.io/cluster=<cluster-name> -o jsonpath='{.items[0].metadata.name}')
# Compresser
gzip moodle_dump_*.sql
# Dump
kubectl exec -n ${SOURCE_NS} ${PG_POD} -- pg_dump -U postgres -Fc moodle > moodle_dump_$(date +%Y%m%d_%H%M%S).dump
# Vérifier
ls -lh moodle_dump_*.dump
```
**Source PostgreSQL → Cible PostgreSQL :**
**Option B : Dump via port-forward**
```bash
sudo -u postgres pg_dump -Fc moodle > moodle_dump_$(date +%Y%m%d_%H%M%S).dump
# Port-forward
kubectl port-forward -n ${SOURCE_NS} svc/<pg-service> 5432:5432 &
# Dump
PGPASSWORD=<password> pg_dump -h localhost -U moodle -Fc moodle > moodle_dump_$(date +%Y%m%d_%H%M%S).dump
# Arrêter le port-forward
kill %1
```
### 4.3 Archiver moodledata
```bash
# Exclure cache, sessions, temp
tar -czf moodledata_backup_$(date +%Y%m%d_%H%M%S).tar.gz \
# Créer l'archive depuis le pod source
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- tar -czf /tmp/moodledata_backup.tar.gz \
--exclude='cache/*' \
--exclude='sessions/*' \
--exclude='temp/*' \
--exclude='trashdir/*' \
--exclude='localcache/*' \
-C /var moodledata
-C /bitnami moodledata
# Vérifier la taille
# Copier l'archive vers le poste local
kubectl cp ${SOURCE_NS}/${SOURCE_DEPLOY}:/tmp/moodledata_backup.tar.gz ./moodledata_backup_$(date +%Y%m%d_%H%M%S).tar.gz
# Vérifier
ls -lh moodledata_backup_*.tar.gz
# Checksum
sha256sum moodledata_backup_*.tar.gz > moodledata.sha256
# Nettoyer le fichier temporaire dans le pod
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- rm /tmp/moodledata_backup.tar.gz
```
### 4.4 Sauvegarder plugins custom
**Alternative : Extraction directe (gros volumes)**
```bash
tar -czf moodle_plugins_$(date +%Y%m%d).tar.gz \
-C /var/www/moodle \
# Streamer directement sans fichier intermédiaire
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- tar -czf - \
--exclude='cache/*' \
--exclude='sessions/*' \
--exclude='temp/*' \
--exclude='trashdir/*' \
--exclude='localcache/*' \
-C /bitnami moodledata > moodledata_backup_$(date +%Y%m%d_%H%M%S).tar.gz
```
### 4.4 Sauvegarder plugins custom (si nécessaire)
```bash
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- tar -czf /tmp/plugins.tar.gz \
-C /bitnami/moodle \
local/ \
theme/ \
mod/ \
blocks/ \
auth/
theme/
kubectl cp ${SOURCE_NS}/${SOURCE_DEPLOY}:/tmp/plugins.tar.gz ./moodle_plugins_$(date +%Y%m%d).tar.gz
```
---
## 5. Phase 4 : Transfert et restauration
### 5.1 Transfert des fichiers
**Option A : Via MinIO (recommandé pour gros volumes)**
### 5.1 Variables cibles
```bash
# Sur le serveur source
# ADAPTER selon l'université
UNIVERSITY="unstim"
TARGET_NS="moodle-${UNIVERSITY}"
TARGET_DEPLOY="moodle-${UNIVERSITY}"
```
### 5.2 Transfert via MinIO (recommandé)
```bash
# Configurer MinIO
mc alias set rber http://minio.rber.bj:9000 ACCESS_KEY SECRET_KEY
# Créer le bucket
mc mb rber/migrations/${UNIVERSITY}
mc cp moodle_dump_*.gz rber/migrations/${UNIVERSITY}/
# Upload
mc cp moodle_dump_*.dump rber/migrations/${UNIVERSITY}/
mc cp moodledata_backup_*.tar.gz rber/migrations/${UNIVERSITY}/
mc cp moodledata.sha256 rber/migrations/${UNIVERSITY}/
# Vérifier
mc ls rber/migrations/${UNIVERSITY}/
```
**Option B : SCP direct**
### 5.3 Restaurer la base de données
**PostgreSQL → PostgreSQL :**
```bash
scp moodle_dump_*.gz admin@10.29.112.130:/tmp/migration/
scp moodledata_backup_*.tar.gz admin@10.29.112.130:/tmp/migration/
```
### 5.2 Conversion MySQL → PostgreSQL (si nécessaire)
```bash
# Installer pgloader
sudo apt-get install -y pgloader
# Créer le fichier de configuration
cat > migration.load << 'EOF'
LOAD DATABASE
FROM mysql://user:password@source-server:3306/moodle
INTO postgresql://moodle:password@edu-pg-main-rw.shared.svc.cluster.local:5432/moodle
WITH include drop, create tables, create indexes, reset sequences
CAST type datetime to timestamp using zero-dates-to-null,
type date using zero-dates-to-null
EOF
# Exécuter (peut prendre plusieurs heures)
pgloader migration.load
```
**Ou import direct PostgreSQL → PostgreSQL :**
```bash
# Port-forward vers le cluster PG
# Port-forward vers le cluster PG cible
kubectl port-forward -n shared svc/edu-pg-main-rw 5432:5432 &
# Restaurer
pg_restore -h localhost -U moodle -d moodle moodle_dump_*.dump
pg_restore -h localhost -U moodle -d moodle --no-owner --no-acl moodle_dump_*.dump
# Arrêter le port-forward
kill %1
```
### 5.3 Restaurer moodledata
**Ou directement dans le pod PostgreSQL :**
```bash
# Copier le dump dans le pod PG
kubectl cp moodle_dump_*.dump shared/edu-pg-main-1:/tmp/
# Restaurer
kubectl exec -n shared edu-pg-main-1 -- pg_restore -U postgres -d moodle --no-owner /tmp/moodle_dump.dump
# Nettoyer
kubectl exec -n shared edu-pg-main-1 -- rm /tmp/moodle_dump.dump
```
### 5.4 Restaurer moodledata
**Méthode recommandée avec suivi de progression :**
```bash
# Avec pv pour voir la progression
pv moodledata_backup_*.tar.gz | kubectl exec -i -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- tar -xzf - -C /bitnami/moodledata --strip-components=1 --no-same-owner
pv moodledata_backup_*.tar.gz | kubectl exec -i -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- tar -xzf - -C /bitnami/moodledata --strip-components=1 --no-same-owner
```
# Sans pv
cat moodledata_backup_*.tar.gz | kubectl exec -i -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- tar -xzf - -C /bitnami/moodledata --strip-components=1 --no-same-owner
**Sans pv :**
```bash
cat moodledata_backup_*.tar.gz | kubectl exec -i -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- tar -xzf - -C /bitnami/moodledata --strip-components=1 --no-same-owner
```
**Suivre la progression (autre terminal) :**
```bash
watch -n 5 'kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- du -sh /bitnami/moodledata'
watch -n 5 "kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- du -sh /bitnami/moodledata"
```
### 5.4 Corriger les permissions
### 5.5 Corriger les permissions
```bash
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- chown -R 1001:1001 /bitnami/moodledata
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- chmod -R 755 /bitnami/moodledata
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- chown -R 1001:1001 /bitnami/moodledata
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- chmod -R 755 /bitnami/moodledata
```
---
@@ -446,50 +473,60 @@ kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- chmod -R 755 /bitnam
**⚠️ Point critique** - Un config.php mal configuré casse l'affichage (CSS non chargé).
```bash
kubectl exec -i -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- bash -c 'cat > /bitnami/moodle/config.php' << 'EOF'
# ADAPTER les valeurs selon l'université
UNIVERSITY="unstim"
TARGET_NS="moodle-${UNIVERSITY}"
TARGET_DEPLOY="moodle-${UNIVERSITY}"
TARGET_URL="elearningum.rber.bj" # Adapter selon université
DB_HOST="edu-pg-main-rw.shared.svc.cluster.local"
DB_NAME="moodle"
DB_USER="moodle"
DB_PASS="MOT_DE_PASSE"
kubectl exec -i -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- bash -c 'cat > /bitnami/moodle/config.php' << EOF
<?php // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
unset(\$CFG);
global \$CFG;
\$CFG = new stdClass();
// === DATABASE ===
$CFG->dbtype = 'pgsql';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'edu-pg-main-rw.shared.svc.cluster.local'; // Adapter si base dédiée
$CFG->dbname = 'moodle'; // Adapter : moodle_uac, moodle_una, etc.
$CFG->dbuser = 'moodle'; // Adapter
$CFG->dbpass = 'MOT_DE_PASSE'; // Adapter
$CFG->prefix = 'mdl_';
$CFG->dboptions = array(
\$CFG->dbtype = 'pgsql';
\$CFG->dblibrary = 'native';
\$CFG->dbhost = '${DB_HOST}';
\$CFG->dbname = '${DB_NAME}';
\$CFG->dbuser = '${DB_USER}';
\$CFG->dbpass = '${DB_PASS}';
\$CFG->prefix = 'mdl_';
\$CFG->dboptions = array(
'dbpersist' => 0,
'dbport' => 5432,
'dbsocket' => '',
);
// === URL ===
if (empty($_SERVER['HTTP_HOST'])) {
$_SERVER['HTTP_HOST'] = '127.0.0.1:8080';
if (empty(\$_SERVER['HTTP_HOST'])) {
\$_SERVER['HTTP_HOST'] = '127.0.0.1:8080';
}
// Détection automatique HTTP/HTTPS
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$CFG->wwwroot = 'https://elearningXX.rber.bj'; // Adapter XX
if (isset(\$_SERVER['HTTPS']) && \$_SERVER['HTTPS'] == 'on') {
\$CFG->wwwroot = 'https://${TARGET_URL}';
} else {
$CFG->wwwroot = 'http://elearningXX.rber.bj'; // Adapter XX
\$CFG->wwwroot = 'http://${TARGET_URL}';
}
// === PATHS ===
$CFG->dataroot = '/bitnami/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 02775;
\$CFG->dataroot = '/bitnami/moodledata';
\$CFG->admin = 'admin';
\$CFG->directorypermissions = 02775;
// === PERFORMANCE (optionnel) ===
$CFG->cachejs = true;
$CFG->langstringcache = true;
// === PERFORMANCE ===
\$CFG->cachejs = true;
\$CFG->langstringcache = true;
// === PROXY SETTINGS (si derrière HAProxy) ===
$CFG->reverseproxy = true;
$CFG->sslproxy = true; // Si HTTPS terminé au niveau ingress
// === PROXY SETTINGS (derrière HAProxy) ===
\$CFG->reverseproxy = true;
\$CFG->sslproxy = true;
require_once(__DIR__ . '/lib/setup.php');
EOF
@@ -498,22 +535,23 @@ EOF
### 6.2 Purger les caches
```bash
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php /bitnami/moodle/admin/cli/purge_caches.php
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php /bitnami/moodle/admin/cli/purge_caches.php
```
### 6.3 Mettre à jour les URLs dans la base
```bash
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php /bitnami/moodle/admin/cli/replace.php \
--search="http://elearning.ANCIEN-DOMAINE.bj" \
--replace="https://elearningXX.rber.bj" \
# Remplacer l'ancienne URL par la nouvelle
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php /bitnami/moodle/admin/cli/replace.php \
--search="http://ANCIEN-DOMAINE" \
--replace="https://${TARGET_URL}" \
--non-interactive
```
### 6.4 Exécuter les mises à jour de base
```bash
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php /bitnami/moodle/admin/cli/upgrade.php --non-interactive
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php /bitnami/moodle/admin/cli/upgrade.php --non-interactive
```
---
@@ -682,7 +720,7 @@ Si le client n'existe pas encore dans Keycloak :
```bash
# Compter les utilisateurs
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php -r "
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php -r "
require('/bitnami/moodle/config.php');
global \$DB;
echo 'Utilisateurs actifs: ' . \$DB->count_records('user', ['deleted' => 0]) . PHP_EOL;
@@ -712,13 +750,14 @@ elearningXX.rber.bj. IN A 10.29.112.100 ; IP HAProxy VIP
elearning.UNIVERSITY.bj. IN CNAME elearningXX.rber.bj.
```
### 8.5 Désactiver la maintenance sur l'ancien serveur
### 8.5 Désactiver la maintenance sur le pod source
```bash
# Sur l'ancien serveur (si toujours accessible)
sudo -u www-data php /var/www/moodle/admin/cli/maintenance.php --disable
# Désactiver la maintenance
kubectl exec -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} -- php /bitnami/moodle/admin/cli/maintenance.php --disable
# Ou éteindre l'ancien serveur après validation complète
# Ou si l'ancien pod n'est plus nécessaire, le scaler à 0
kubectl scale -n ${SOURCE_NS} deploy/${SOURCE_DEPLOY} --replicas=0
```
### 8.6 Communication aux utilisateurs
@@ -745,20 +784,27 @@ Support : support@rber.bj
## 9. Troubleshooting
> **Note :** Dans toutes les commandes ci-dessous, utiliser les variables définies :
> ```bash
> UNIVERSITY="unstim" # Adapter
> TARGET_NS="moodle-${UNIVERSITY}"
> TARGET_DEPLOY="moodle-${UNIVERSITY}"
> ```
### 9.1 CSS ne charge pas (page sans style)
**Cause :** `wwwroot` incorrect dans config.php
```bash
# Vérifier
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- grep wwwroot /bitnami/moodle/config.php
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- grep wwwroot /bitnami/moodle/config.php
# Le protocole (http/https) doit correspondre à l'URL utilisée
# Corriger si nécessaire
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- sed -i "s|http://|https://|g" /bitnami/moodle/config.php
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- sed -i "s|http://|https://|g" /bitnami/moodle/config.php
# Purger le cache
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php /bitnami/moodle/admin/cli/purge_caches.php
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php /bitnami/moodle/admin/cli/purge_caches.php
# Vider le cache du navigateur : Ctrl+Shift+R
```
@@ -767,81 +813,81 @@ kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php /bitnami/moodle/
```bash
# Vérifier la connectivité
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php -r "
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php -r "
\$conn = pg_connect('host=edu-pg-main-rw.shared.svc.cluster.local port=5432 dbname=moodle user=moodle password=XXX');
if (\$conn) { echo 'DB OK'.PHP_EOL; } else { echo 'DB FAIL'.PHP_EOL; }
"
# Vérifier les credentials dans config.php
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- grep -E "dbhost|dbname|dbuser|dbpass" /bitnami/moodle/config.php
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- grep -E "dbhost|dbname|dbuser|dbpass" /bitnami/moodle/config.php
```
### 9.3 Erreur 502 Bad Gateway
```bash
# Vérifier le pod
kubectl get pods -n ${NAMESPACE}
kubectl logs -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} --tail=50
kubectl get pods -n ${TARGET_NS}
kubectl logs -n ${TARGET_NS} deploy/${TARGET_DEPLOY} --tail=50
# Vérifier l'ingress
kubectl get ingress -n ${NAMESPACE}
kubectl describe ingress -n ${NAMESPACE}
kubectl get ingress -n ${TARGET_NS}
kubectl describe ingress -n ${TARGET_NS}
# Vérifier le service
kubectl get svc -n ${NAMESPACE}
kubectl get svc -n ${TARGET_NS}
```
### 9.4 Fichiers non accessibles
```bash
# Vérifier les permissions
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- ls -la /bitnami/moodledata/
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- ls -la /bitnami/moodledata/
# Corriger
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- chown -R 1001:1001 /bitnami/moodledata
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- chmod -R 755 /bitnami/moodledata
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- chown -R 1001:1001 /bitnami/moodledata
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- chmod -R 755 /bitnami/moodledata
```
### 9.5 rberConnect ne fonctionne pas
```bash
# Vérifier que OAuth2 est activé
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- php /bitnami/moodle/admin/cli/cfg.php --name=auth
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- php /bitnami/moodle/admin/cli/cfg.php --name=auth
# Tester la connectivité vers Keycloak
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- curl -I https://auth.rber.bj/realms/rber/.well-known/openid-configuration
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- curl -I https://auth.rber.bj/realms/rber/.well-known/openid-configuration
# Vérifier les logs
kubectl logs -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} | grep -i oauth
kubectl logs -n ${TARGET_NS} deploy/${TARGET_DEPLOY} | grep -i oauth
```
### 9.6 Pod en CrashLoopBackOff
```bash
# Voir les logs du pod précédent
kubectl logs -n ${NAMESPACE} -l app.kubernetes.io/name=moodle --previous
kubectl logs -n ${TARGET_NS} -l app.kubernetes.io/name=moodle --previous
# Vérifier les events
kubectl get events -n ${NAMESPACE} --sort-by='.lastTimestamp' | tail -20
kubectl get events -n ${TARGET_NS} --sort-by='.lastTimestamp' | tail -20
# Vérifier les ressources
kubectl describe pod -n ${NAMESPACE} -l app.kubernetes.io/name=moodle
kubectl describe pod -n ${TARGET_NS} -l app.kubernetes.io/name=moodle
```
### 9.7 Commandes de diagnostic générales
```bash
# État général
kubectl get all -n ${NAMESPACE}
kubectl get all -n ${TARGET_NS}
# Logs en temps réel
kubectl logs -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -f
kubectl logs -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -f
# Entrer dans le pod
kubectl exec -it -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- bash
kubectl exec -it -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- bash
# Vérifier le config.php complet
kubectl exec -n ${NAMESPACE} deploy/moodle-${UNIVERSITY} -- cat /bitnami/moodle/config.php
kubectl exec -n ${TARGET_NS} deploy/${TARGET_DEPLOY} -- cat /bitnami/moodle/config.php
```
---