Admin Dotclear 503

Oops, l'administration de Dotclear me retourne une erreur

Service unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Une belle erreur 503, voilà la mésaventure qui m'est arrivé dans la foulée de la mise en route compliquée (la loi des séries ;) ).

Alors que j'ai travaillé pendant plusieurs semaines sur mon thème en local et sans soucis, au moment de mettre mon blog en production je me retrouve bloqué par une interface d'administration qui ne répond plus. Ça m'était déjà arrivé et je me souvenais que c'était lié à la recherche de mise à jour du meilleur CMS du monde, Dotclear 8-) .

Après une rapide recherche je suis tombé sur l'article de Franck auquel je vais apporter un complément d'informations, car il n'a pas suffi à me sortir du bourbier. J'avais déjà identifié et modifier la constante DC_NOT_UPDATE citée dans l'article, mais l’erreur 503 persisté.

En fait, elle était causée par l’affichage des news et comme l'a écrit Franck :

supprimer l’affichage des nouvelles de Dotclear sur le tableau de bord peut aussi aider

Il y a juste un détail, il faut avoir accès à l’administration ce qui n’était pas mon cas. Du coup j’ai directement tapé dans la base de données et je vais vous livrer la procédure mais j'attire votre attention sur les risques. Avant toute manipulation sur la base de données faite une sauvegarde !

Pour commencer, il faut se connecter au SGBD. Si vous utilisez MySQL ou MariaDB et que vous avez installé phpMyAdmin c'est très simple, il suffit de se logger dessus. Sinon il faut se connecter en console :

mysql –u root

Vous n'avez pas d'accès root ? Pas de stress, l'utilisateur de votre base de données suffit, vous avez toutes les informations dans le fichier /inc/config.php de votre installation Dotclear.

Cherchez les lignes suivantes :

// Database user
define('DC_DBUSER','mon_Utilisateur');

// Database password
define('DC_DBPASSWORD','mon_MotDePasse');

// Database name
define('DC_DBNAME','ma_BaseDeDonnées');

1) Avec phpMyAdmin

Si vous avez phpMyAdmin il faut afficher la table dc_pref (trier en cliquant sur la colonne pref_id) et chercher l'entrée dcnews :

phpMyAdmin dc_pref

Si vous n'avez qu'une entrée avec user_id = NULL il suffit de la copier via le bouton ad-hoc, puis de l'éditer pour sélectionner le bon utilisateur et mettre la valeur pref_value à zéro :

phpMyAdmin edit dcnews

On répète l'opération avec l'entrée nodcupdate et le tour est joué.

2) Sans phpMyAdmin

Avec l'utilisateur de la base de données la commande sera :

mysql –u mon_Utilisateur -pmon_MotDePasse

Une fois connecté on sélectionne la base de données :

MariaDB [(none)]> use mabase;

Database changed
MariaDB [mabase]>

Puis on va vérifier les valeurs qui nous intéressent :

SELECT pref_id, user_id, pref_value FROM dc_pref WHERE pref_id IN ('dcnews','nodcupdate') AND user_id IS NOT NULL ORDER BY `pref_id` ASC;

On devrait avoir un résultat semblable à celui-ci :

+------------+---------+------------+
| pref_id    | user_id | pref_value |
+------------+---------+------------+
| dcnews     | monUser | 1          |
| nodcupdate | monUser | 0          |
+------------+---------+------------+
2 rows in set (0.00 sec)

Si vous avez un résultat équivalent, on va simplement changer les valeurs comme ceci (n'oubliez pas d'adapter le 'user_id') :

UPDATE dc_pref SET pref_value='0' WHERE pref_id='dcnews' AND user_id='monUser';
UPDATE dc_pref SET pref_value='1' WHERE pref_id='nodcupdate' AND user_id='monUser';

Tester votre accès admin, il ne devrai plus y avoir de soucis.

Par contre, si la première requête ne retourne pas de résultat, c'est que les préférences utilisateur n’ont pas encore été modifiées. Pour en avoir le cœur net on va exécuter la requête suivante :

SELECT pref_id, user_id, pref_value FROM dc_pref WHERE pref_id IN ('dcnews','nodcupdate') ORDER BY `pref_id` ASC;

Là on doit avoir un résultat comme ceci :

+------------+---------+------------+
| pref_id    | user_id | pref_value |
+------------+---------+------------+
| dcnews     | NULL    | 1          |
| nodcupdate | NULL    | 0          |
+------------+---------+------------+
2 rows in set (0.00 sec)

Dans ce cas il va falloir créer les deux entrées pour l’utilisateur. Mais avant, on va vérifier le nom d’utilisateur qui nous intéresse :

SELECT user_id FROM dc_pref WHERE user_id IS NOT NULL;

Cette requête doit retourner un certain nombre de lignes contenant le nom d'utilisateur. Une fois le nom d'utilisateur clairement identifié on va créer nos deux entrées (n'oubliez pas de modifier le nom d'utilisateur) :

INSERT INTO `dc_pref` (`pref_id`, `user_id`, `pref_ws`, `pref_value`, `pref_type`, `pref_label`) VALUES ('dcnews', 'ici_le_nom_d_utilisateur', 'dashboard', '0', 'boolean', '');
INSERT INTO `dc_pref` (`pref_id`, `user_id`, `pref_ws`, `pref_value`, `pref_type`, `pref_label`) VALUES ('nodcupdate', 'ici_le_nom_d_utilisateur', 'dashboard', '1', 'boolean', '');

Il est impératif d'utiliser un nom d'utilisateur existant, faute de quoi vous allez vous faire insulter avec un truc du style :

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mabase`.`dc_pref`, CONSTRAINT `dc_fk_pref_user` FOREIGN KEY (`user_id`) REFERENCES `dc_user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE)

Vérifions le résultat des insertions :

SELECT pref_id, user_id, pref_value FROM dc_pref WHERE pref_id IN ('dcnews','nodcupdate') AND user_id IS NOT NULL ORDER BY `pref_id` ASC;

Cette fois on doit avoir ce résultat :

+------------+---------+------------+
| pref_id    | user_id | pref_value |
+------------+---------+------------+
| dcnews     | monUser | 0          |
| nodcupdate | monUser | 1          |
+------------+---------+------------+
2 rows in set (0.00 sec)

Tester votre accès admin, vous ne devriez plus avoir de problème.

Haut de page