Actualiser Guide-migration-moodle-rber-v2
This commit is contained in:
@@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user