La Lanterne Rouge

Warning: Geek Inside

Erreur au démarrage d'Etherpad-Lite avec PostgreSQL

- Posted in Sans catégorie by

J'utilise depuis au moins un an et demi à présent Etherpad-Lite sur mon serveur Usul tournant sous Debian Squeeze.

Ce logiciel tournant sous Node.js est un éditeur de texte collaboratif, similaire dans le principe à celui que l'on trouve dans Google Documents. Il permet très simplement d'éditer un texte à plusieurs, en sauvegardant au fur et à mesure toutes les modifications, ce qui permet de retrouver un historique complet du document, du premier au dernier caractère.

Etherpad-Lite en action

Etherpad-Lite en action

Etherpad-Lite en action

Personnellement, je m'en sers assez peu pour l'aspect collaboratif dans le sens "à plusieurs personnes", mais plus dans le sens "depuis plusieurs machines". Je rédige en effet la plupart des articles pour ce blog dessus, car ainsi je peux compléter, modifier ou réorganiser le texte peu importe où je suis, en temps-réel, tout en sachant que chacune de mes modifications est sauvegardée automatiquement.

Je tournais depuis l'installation sur une version 1.0.x ou 1.1.x au maximum et j'ai décidé qu'il était temps de mettre à jour. Je voulais surtout en profiter pour passer de la base de données "dirty" (un fichier texte à plat contenant du JSON) à quelque chose de plus costaud et plus fiable : une base propre sur mon instance de PostgreSQL.

Si je n'avais pas sauté le pas plus tôt c'est tout simplement car le support de ce SGBD est arrivé plus tard. On n'avait alors le choix que parmi "dirty" (par défaut, mais déconseillé pour de la prod), SQLite et MySQL.

Mais voilà, sur Usul j'ai opté pour PostgreSQL car je voulais essayer autre chose que MySQL. Si pour la plupart des applications il suffit d'installer le DEB qui va bien, pour d'autres c'est un peu moins simple et le support de PostgreSQL est parfois un peu bancal. Mais globalement je ne rencontre que rarement des problèmes à ce niveau.

Mais revenons à nos moutons.

Je fais donc un simple

# cd /var/etherpad-lite
# git pull origin
# chown -R etherpad:etherpad .

et les fichiers sont mis à jour. Pour info, le chemin /var/etherpad-lite est purement personnel.
Comme le fichier settings.json a changé entre temps, je repars de la dernière version et reconfigure mon instance. En gros cela revient à définir une "clé de session" (nouveauté, permettant apparemment de faciliter les reconnexions des clients après une coupure), puis à paramétrer la connexion à la base de données.

"dbType" : "postgres",
"dbSettings" : {
                   "user"     : "etherpad",
                   "host"     : "localhost",
                   "password" : "unmotdepasselongetcomplique",
                   "database" : "etherpad"
                 },

J'avais bien entendu au préalable créé la base "etherpad" ainsi que l'utilisateur homonyme.

Le langage "plpgsql" n'existe pas : WTF?

Pour tester le résultat, il suffit de lancer la commande bin/run.sh depuis le dossier racine, en tant que l'utilisateur exécutant Etherpad-Lite habituellement (celui spécifié dans le script de démarrage dans /etc/init.d).

$ bin/run.sh
Ensure that all dependencies are up to date...  If this is the first time you have run Etherpad please be patient.
npm WARN package.json ep_etherpad-lite@1.2.11 No repository field.
npm WARN package.json channels@0.0.4 No repository field.
npm WARN package.json tinycon@0.0.1 No repository field.
npm WARN package.json ueberDB@0.2.0 No repository field.
npm WARN package.json ejs@0.6.1 No repository field.
npm WARN package.json formidable@1.0.9 No repository field.
npm WARN package.json jshint@0.7.3 No repository field.
npm WARN package.json jsdom-nocontextifiy@0.2.10 No repository field.
npm WARN package.json jsdom-nocontextifiy@0.2.10 'repositories' (plural) Not supported.
npm WARN package.json Please pick one as the 'repository' field
npm WARN package.json async-stacktrace@0.0.2 No repository field.
npm WARN prefer global jshint@0.7.3 should be installed with -g
npm WARN package.json bytes@0.2.0 No repository field.
npm WARN package.json cookie-signature@1.0.1 No repository field.
npm WARN package.json fresh@0.1.0 No repository field.
npm WARN package.json pause@0.0.1 No repository field.
npm WARN package.json cookie-signature@0.0.1 No repository field.
npm WARN package.json methods@0.0.1 No repository field.
npm WARN package.json range-parser@0.0.4 No repository field.
npm WARN package.json send@0.1.0 No repository field.
npm WARN package.json cssom@0.2.5 No readme data.
npm WARN package.json docco@0.4.0 No repository field.
npm WARN package.json channels@0.0.2 No repository field.
npm WARN package.json vargs@0.1.0 No repository field.
npm WARN package.json dirty@0.9.7 No repository field.
npm WARN package.json policyfile@0.0.4 No repository field.
npm WARN package.json policyfile@0.0.4 'repositories' (plural) Not supported.
npm WARN package.json Please pick one as the 'repository' field
npm WARN package.json bytes@0.1.0 No repository field.
npm WARN package.json formidable@1.0.11 No repository field.
npm WARN package.json github-url-from-git@1.1.1 No repository field.
npm WARN package.json addressparser@0.1.3 No repository field.
npm WARN package.json assert-plus@0.1.2 No repository field.
npm WARN package.json ctype@0.5.2 No repository field.
Ensure jQuery is downloaded and up to date...
Clear minfified cache...
ensure custom css/js files are created...
start...

events.js:72
        throw er; // Unhandled 'error' event
              ^
error: le langage « plpgsql » n'existe pas
    at Connection.parseE (/var/etherpad-lite/src/node_modules/ueberDB/node_modules/pg/lib/connection.js:508:11)
    at Connection.parseMessage (/var/etherpad-lite/src/node_modules/ueberDB/node_modules/pg/lib/connection.js:368:17)
    at Socket. (/var/etherpad-lite/src/node_modules/ueberDB/node_modules/pg/lib/connection.js:84:20)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket. (_stream_readable.js:736:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    at emitReadable (_stream_readable.js:404:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)

Ah.

J'ai passé au moins une heure et demi à chercher s'il me manquait un package Debian ou NPM, ou si l'un d'entre eux n'était pas à jour. J'ai évidemment parcouru le wiki d'Etherpad-Lite en long en large et en travers. Sans succès.

Car Etherpad-Lite, NodeJS ou NPM n'ont rien à voir là-dedans. Il s'agit d'une erreur retournée par PostgreSQL.

Pour la corriger, il suffit simplement dans la base de données nouvellement créée d'exécuter la requête SQL suivante :

CREATE LANGUAGE 'plpgsql';

Une fois. Et c'est tout. (Source)
On peut ensuite relancer Etherpad-Lite et tout fonctionne sans problème.

Je déteste ce genre de problème. On se sent stupide tant qu'on reste bloqué, et une fois résolu on n'a pas l'impression d'avoir appris quoi que ce soit.