Info16.fr

Le blog de B@rtounet

etherpad

#Gnu/Linux, Planet Libre

Installation d'une solution de collaboration Ethercalc: Feuille de calcul collaborative

ethercalc
Je cherchais depuis un moment, un outil collaboratif.
Je cherche toujours des alternatives aux Géants du Web tels que Google ou Microsoft.
Mais force est de constater qu'il n'existe aujourd'hui pas de réèls concurents à ses solutions...

Le traitement de texte collaboratif que j'utilise est Etherpad, mais en ce qui concerne les feuille de calcul collaborative, c'est une autre paire de manche...

Ethercalc est un système de feuille collaborative open source, ce type d'outil  est tellement rare, qu'il mérite un petit billet.

Ethercalc Logo

EtherCalc est un tableur collaboratif en temps réel. Il permet par défaut à un maximum de seize personnes de partager un texte en cours d'élaboration. Les contributions de chacun apparaissent immédiatement sur l'écran de tous les participants et sont signalées par des couleurs différentes. Une fenêtre de messagerie instantanée est également disponible.

Le système ne requiert aucune installation, ni aucune inscription, il suffit d'avoir une connexion internet et un navigateur web. EtherCalc est écrit en JavaScript.

L'application a été lancée le 19 novembre 2008 par David Greenspan, Aaron Iba et J.D. Zamfirescu (ces deux derniers travaillaient auparavant pour Google).

Le 4 décembre 2009, Google rachète AppJet, la société qui possède le logiciel et il est annoncé que cette application collaborative sera proposée sous licence Open Source1.

Le 17 décembre 2009, Google libère les sources d'EtherCalc sous licence Apache v2.

source: Wikipedia.

EtherCalc



Plateforme Materielle :



Comme d'habitude, j'ai monté mon prototype sur ma plateforme de virtualisation:

Dedibox Pro HP
Plateforme logicielle hyperviseur:
  • Dom0 Ubuntu 12.04 X86_64 Xen 4.1
Plateforme Virtuelle:

  • DomU Xen Ubuntu 12.04 X86_64 Paravirtualisé
  • 2 vcpus 
  • 512 Mo de Ram
  • HDD 16GB


Installation:

Pour commencer j'ai mis à jour totalement mon DomU ubuntu 12.04; mon template avait quelques maj de retard :)

  • Mise à niveau du DomU
root@ubuntults:/# apt-get update; apt-get upgrade
root@ubuntults:/# apt-get install linux-headers-server linux-image-server linux-server
root@ubuntults:/# reboot

  • Installation des prérequis
root@antony-linux:/home/antony# apt-get install gzip git-core curl python perl build-essential

  • Installation de node.js
On télécharge la dernière version de node.js et on la compile
Attention, ethercalc n'est pour l'instant pas compatible avec node.js v9
On utilise la version packagée dans ubuntu 12.04 : nodejs_0.6.12
    root@antony-linux:/home/antony# apt-get install nodejs npm

  • Installation de Ethercalc 
On utilse git pour récupérer la dernière version.
root@ubuntu:~# cd /opt/
root@ubuntu:/opt# git clone https://github.com/audreyt/ethercalc.git
Cloning into 'ethercalc'...
remote: Counting objects: 2049, done.
remote: Compressing objects: 100% (1263/1263), done.
remote: Total 2049 (delta 755), reused 1905 (delta 626)
Receiving objects: 100% (2049/2049), 3.03 MiB | 1.73 MiB/s, done.
Resolving deltas: 100% (755/755), done.

On installe ethercalc:

root@ubuntults:/opt/ethercalc# root@ubuntu:/opt/ethercalc# npm i -g ethercalc
npm http GET https://registry.npmjs.org/ethercalc
npm http 200 https://registry.npmjs.org/ethercalc
npm http GET https://registry.npmjs.org/ethercalc/-/ethercalc-0.20121026.162049.tgz
npm http 200 https://registry.npmjs.org/ethercalc/-/ethercalc-0.20121026.162049.tgz
npm http GET https://registry.npmjs.org/redis
npm http GET https://registry.npmjs.org/uuid-pure
npm http GET https://registry.npmjs.org/optimist
npm http GET https://registry.npmjs.org/zappajs
npm http GET https://registry.npmjs.org/hiredis
npm http 200 https://registry.npmjs.org/uuid-pure
npm http GET https://registry.npmjs.org/uuid-pure/-/uuid-pure-1.0.10.tgz
npm http 200 https://registry.npmjs.org/optimist
npm http GET https://registry.npmjs.org/optimist/-/optimist-0.3.5.tgz
npm http 200 https://registry.npmjs.org/uuid-pure/-/uuid-pure-1.0.10.tgz
npm http 200 https://registry.npmjs.org/zappajs
npm http GET https://registry.npmjs.org/zappajs/-/zappajs-0.4.12.tgz
npm http 200 https://registry.npmjs.org/optimist/-/optimist-0.3.5.tgz
npm http 200 https://registry.npmjs.org/hiredis
npm http GET https://registry.npmjs.org/hiredis/-/hiredis-0.1.14.tgz
npm http 200 https://registry.npmjs.org/zappajs/-/zappajs-0.4.12.tgz
npm http 200 https://registry.npmjs.org/hiredis/-/hiredis-0.1.14.tgz
npm http 200 https://registry.npmjs.org/redis
npm http GET https://registry.npmjs.org/redis/-/redis-0.8.1.tgz
npm http 200 https://registry.npmjs.org/redis/-/redis-0.8.1.tgz
npm http GET https://registry.npmjs.org/wordwrap
npm http GET https://registry.npmjs.org/coffeecup/0.3.17
npm http GET https://registry.npmjs.org/coffee-css/0.0.5
npm http GET https://registry.npmjs.org/node-uuid/1.4.0
npm http GET https://registry.npmjs.org/uglify-js/1.3.4
npm http GET https://registry.npmjs.org/express/3.0.0
npm http GET https://registry.npmjs.org/socket.io/0.9.10

> hiredis@0.1.14 preinstall /usr/local/lib/node_modules/ethercalc/node_modules/hiredis
> make || gmake

cd deps/hiredis && make static
make[1]: Entering directory `/usr/local/lib/node_modules/ethercalc/node_modules/hiredis/deps/hiredis'
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb net.c
npm http 200 https://registry.npmjs.org/wordwrap
npm http GET https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz
npm http 200 https://registry.npmjs.org/coffeecup/0.3.17
npm http GET https://registry.npmjs.org/coffeecup/-/coffeecup-0.3.17.tgz
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb hiredis.c
npm http 200 https://registry.npmjs.org/coffee-css/0.0.5
npm http GET https://registry.npmjs.org/coffee-css/-/coffee-css-0.0.5.tgz
npm http 200 https://registry.npmjs.org/uglify-js/1.3.4
npm http GET https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.4.tgz
npm http 200 https://registry.npmjs.org/socket.io/0.9.10
npm http 200 https://registry.npmjs.org/express/3.0.0
npm http GET https://registry.npmjs.org/socket.io/-/socket.io-0.9.10.tgz
npm http GET https://registry.npmjs.org/express/-/express-3.0.0.tgz
npm http 200 https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz
npm http 200 https://registry.npmjs.org/node-uuid/1.4.0
npm http GET https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz
npm http 200 https://registry.npmjs.org/coffeecup/-/coffeecup-0.3.17.tgz
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb sds.c
npm http 200 https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.4.tgz
npm http 200 https://registry.npmjs.org/socket.io/-/socket.io-0.9.10.tgz
npm http 200 https://registry.npmjs.org/express/-/express-3.0.0.tgz
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb async.c
npm http 200 https://registry.npmjs.org/coffee-css/-/coffee-css-0.0.5.tgz
ar rcs libhiredis.a net.o hiredis.o sds.o async.o
npm http 200 https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz
make[1]: Leaving directory `/usr/local/lib/node_modules/ethercalc/node_modules/hiredis/deps/hiredis'
node-waf configure build
Setting srcdir to : /usr/local/lib/node_modules/ethercalc/node_modules/hiredis
Setting blddir to : /usr/local/lib/node_modules/ethercalc/node_modules/hiredis/build
Checking for program g++ or c++ : /usr/bin/g++
Checking for program cpp : /usr/bin/cpp
Checking for program ar : /usr/bin/ar
Checking for program ranlib : /usr/bin/ranlib
Checking for g++ : ok
Checking for node path : not found
Checking for node prefix : ok /usr
'configure' finished successfully (0.075s)
Waf: Entering directory `/usr/local/lib/node_modules/ethercalc/node_modules/hiredis/build'
[1/3] cxx: hiredis.cc -> build/Release/hiredis_1.o
[2/3] cxx: reader.cc -> build/Release/reader_1.o
[3/3] cxx_link: build/Release/hiredis_1.o build/Release/reader_1.o -> build/Release/hiredis.node
Waf: Leaving directory `/usr/local/lib/node_modules/ethercalc/node_modules/hiredis/build'
'build' finished successfully (1.526s)
npm http GET https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/commander/0.6.1
npm http GET https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/mkdirp/0.3.3
npm http GET https://registry.npmjs.org/cookie/0.0.4
npm http GET https://registry.npmjs.org/crc/0.2.0
npm http GET https://registry.npmjs.org/fresh/0.1.0
npm http GET https://registry.npmjs.org/methods/0.0.1
npm http GET https://registry.npmjs.org/send/0.1.0
npm http GET https://registry.npmjs.org/debug
npm http GET https://registry.npmjs.org/connect/2.6.0
npm http GET https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/redis/0.7.2
npm http GET https://registry.npmjs.org/socket.io-client/0.9.10
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/optparse/1.0.3
npm http GET https://registry.npmjs.org/uglify-js/1.2.6
npm http GET https://registry.npmjs.org/stylus/0.27.2
npm http 200 https://registry.npmjs.org/mkdirp/0.3.3
npm http GET https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.3.tgz
npm http 200 https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz
npm http 200 https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script/-/coffee-script-1.4.0.tgz
npm http 200 https://registry.npmjs.org/commander/0.6.1
npm http GET https://registry.npmjs.org/commander/-/commander-0.6.1.tgz
npm http 200 https://registry.npmjs.org/cookie/0.0.4
npm http GET https://registry.npmjs.org/cookie/-/cookie-0.0.4.tgz
npm http 200 https://registry.npmjs.org/crc/0.2.0
npm http GET https://registry.npmjs.org/crc/-/crc-0.2.0.tgz
npm http 200 https://registry.npmjs.org/fresh/0.1.0
npm http GET https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz
npm http 200 https://registry.npmjs.org/methods/0.0.1
npm http GET https://registry.npmjs.org/methods/-/methods-0.0.1.tgz
npm http 200 https://registry.npmjs.org/send/0.1.0
npm http GET https://registry.npmjs.org/send/-/send-0.1.0.tgz
npm http 200 https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz
npm http 200 https://registry.npmjs.org/connect/2.6.0
npm http GET https://registry.npmjs.org/connect/-/connect-2.6.0.tgz
npm http 200 https://registry.npmjs.org/debug
npm http GET https://registry.npmjs.org/debug/-/debug-0.7.0.tgz
npm http 200 https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/underscore/-/underscore-1.4.2.tgz
npm http 200 https://registry.npmjs.org/optparse/1.0.3
npm http GET https://registry.npmjs.org/optparse/-/optparse-1.0.3.tgz
npm http 200 https://registry.npmjs.org/redis/0.7.2
npm http GET https://registry.npmjs.org/redis/-/redis-0.7.2.tgz
npm http 200 https://registry.npmjs.org/socket.io-client/0.9.10
npm http GET https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.10.tgz
npm http 200 https://registry.npmjs.org/uglify-js/1.2.6
npm http GET https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.6.tgz
npm http 200 https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.3.tgz
npm http 200 https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz
npm http 200 https://registry.npmjs.org/coffee-script/-/coffee-script-1.4.0.tgz
npm http 200 https://registry.npmjs.org/stylus/0.27.2
npm http GET https://registry.npmjs.org/stylus/-/stylus-0.27.2.tgz
npm http 200 https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz
npm http 200 https://registry.npmjs.org/commander/-/commander-0.6.1.tgz
npm http 200 https://registry.npmjs.org/cookie/-/cookie-0.0.4.tgz
npm http 200 https://registry.npmjs.org/crc/-/crc-0.2.0.tgz
npm http 200 https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz
npm http 200 https://registry.npmjs.org/methods/-/methods-0.0.1.tgz
npm http 200 https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz
npm http 200 https://registry.npmjs.org/send/-/send-0.1.0.tgz
npm http 200 https://registry.npmjs.org/connect/-/connect-2.6.0.tgz
npm http 200 https://registry.npmjs.org/debug/-/debug-0.7.0.tgz
npm http 200 https://registry.npmjs.org/underscore/-/underscore-1.4.2.tgz
npm http 200 https://registry.npmjs.org/optparse/-/optparse-1.0.3.tgz
npm http 200 https://registry.npmjs.org/redis/-/redis-0.7.2.tgz
npm http 200 https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.10.tgz
npm http 200 https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.6.tgz
npm http 200 https://registry.npmjs.org/stylus/-/stylus-0.27.2.tgz
npm http 200 https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz
npm http GET https://registry.npmjs.org/mime/1.2.6
npm http GET https://registry.npmjs.org/qs/0.5.1
npm http GET https://registry.npmjs.org/formidable/1.0.11
npm http GET https://registry.npmjs.org/bytes/0.1.0
npm http GET https://registry.npmjs.org/send/0.0.4
npm http GET https://registry.npmjs.org/pause/0.0.1
npm http 200 https://registry.npmjs.org/qs/0.5.1
npm http GET https://registry.npmjs.org/qs/-/qs-0.5.1.tgz
npm http 200 https://registry.npmjs.org/formidable/1.0.11
npm http GET https://registry.npmjs.org/formidable/-/formidable-1.0.11.tgz
npm http 200 https://registry.npmjs.org/mime/1.2.6
npm http GET https://registry.npmjs.org/mime/-/mime-1.2.6.tgz
npm http 200 https://registry.npmjs.org/pause/0.0.1
npm http GET https://registry.npmjs.org/pause/-/pause-0.0.1.tgz
npm http 200 https://registry.npmjs.org/bytes/0.1.0
npm http GET https://registry.npmjs.org/bytes/-/bytes-0.1.0.tgz
npm http 200 https://registry.npmjs.org/send/0.0.4
npm http GET https://registry.npmjs.org/send/-/send-0.0.4.tgz
npm http 200 https://registry.npmjs.org/qs/-/qs-0.5.1.tgz
npm http 200 https://registry.npmjs.org/formidable/-/formidable-1.0.11.tgz
npm http 200 https://registry.npmjs.org/mime/-/mime-1.2.6.tgz
npm http 200 https://registry.npmjs.org/pause/-/pause-0.0.1.tgz
npm http 200 https://registry.npmjs.org/bytes/-/bytes-0.1.0.tgz
npm http 200 https://registry.npmjs.org/send/-/send-0.0.4.tgz
npm http GET https://registry.npmjs.org/mime/1.2.6
npm http 304 https://registry.npmjs.org/mime/1.2.6
npm http GET https://registry.npmjs.org/debug
npm http GET https://registry.npmjs.org/cssom
npm http GET https://registry.npmjs.org/mkdirp
npm http 200 https://registry.npmjs.org/mkdirp
npm http GET https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.4.tgz
npm http 200 https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.4.tgz
npm http 304 https://registry.npmjs.org/debug
npm http 200 https://registry.npmjs.org/cssom
npm http GET https://registry.npmjs.org/cssom/-/cssom-0.2.5.tgz
npm http 200 https://registry.npmjs.org/cssom/-/cssom-0.2.5.tgz
npm http GET https://registry.npmjs.org/uglify-js/1.2.5
npm http GET https://registry.npmjs.org/ws
npm http GET https://registry.npmjs.org/xmlhttprequest/1.4.2
npm http GET https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http 200 https://registry.npmjs.org/uglify-js/1.2.5
npm http GET https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz
npm http 200 https://registry.npmjs.org/xmlhttprequest/1.4.2
npm http GET https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz
npm http 200 https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http GET https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz
npm http 200 https://registry.npmjs.org/ws
npm http GET https://registry.npmjs.org/ws/-/ws-0.4.22.tgz
npm http 200 https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz
npm http 200 https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz
npm http 200 https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz
npm http 200 https://registry.npmjs.org/ws/-/ws-0.4.22.tgz
npm http GET https://registry.npmjs.org/zeparser/0.0.5
npm http GET https://registry.npmjs.org/commander
npm http GET https://registry.npmjs.org/tinycolor
npm http GET https://registry.npmjs.org/options
npm http 200 https://registry.npmjs.org/zeparser/0.0.5
npm http GET https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz
npm http 200 https://registry.npmjs.org/tinycolor
npm http GET https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz
npm http 200 https://registry.npmjs.org/options
npm http GET https://registry.npmjs.org/options/-/options-0.0.3.tgz
npm http 200 https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz
npm http 200 https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz
npm http 200 https://registry.npmjs.org/options/-/options-0.0.3.tgz
npm http 200 https://registry.npmjs.org/commander

> ws@0.4.22 install /usr/local/lib/node_modules/ethercalc/node_modules/zappajs/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws
> node install.js

[ws v0.4.22] Attempting to compile blazing fast native extensions.
[ws v0.4.22] Native code compile failed (but the module will still work):
[ws v0.4.22] The native extensions are faster, but not required.
[ws v0.4.22] On Windows, native extensions require Visual Studio and Python.
[ws v0.4.22] On Unix, native extensions require Python, make and a C++ compiler.
[ws v0.4.22] Start npm with --ws:verbose to show compilation output (if any).
/usr/local/bin/ethercalc -> /usr/local/lib/node_modules/ethercalc/bin/ethercalc
ethercalc@0.20121026.162049 /usr/local/lib/node_modules/ethercalc
├── uuid-pure@1.0.10
├── redis@0.8.1
├── optimist@0.3.5 (wordwrap@0.0.2)
├── hiredis@0.1.14
└── zappajs@0.4.12



C'est bien joli, mais déjà on le lance en root ce qui n'est pas jojo et on est obligé de lancer le script à la main...
C'est pas très optimisé...

On crée un user Ethercalc et on donne les droits adéquats.
root@ubuntults:~# useradd ethercalc

root@ubuntults:~# chown -R ethercalc /opt/ethercalc


On crée maintenant un script d'init afin de pouvoir lancer Ethercalc en tant que daemon
Ce script nous permet de lancer ethercalc en tant que ethercalc et aussi de pouvoir la lancer au demmarage.

#!/bin/sh

### BEGIN INIT INFO
# Provides: ethercalc
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts ethercalc
# Description: starts ethercalc lite using start-stop-daemon
### END INIT INFO

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/node/bin"
LOGFILE="/var/log/ethercalc.log"
EPLITE_DIR="/usr/local/bin/"
EPLITE_BIN="ethercalc"
USER="ethercalc"
GROUP="ethercalc"
DESC="Ethercalc"
NAME="ethercalc"

set -e

. /lib/lsb/init-functions

start() {
echo "Starting $DESC... "

start-stop-daemon --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile /var/run/$NAME.pid --exec $EPLITE_DIR/$EPLITE_BIN -- $LOGFILE || true
echo "done"
}

#We need this function to ensure the whole process tree will be killed
killtree() {
local _pid=$1
local _sig=${2-TERM}
for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
killtree ${_child} ${_sig}
done
kill -${_sig} ${_pid}
}

stop() {
echo "Stopping $DESC... "
while test -d /proc/$(cat /var/run/$NAME.pid); do
killtree $(cat /var/run/$NAME.pid) 15
sleep 0.5
done
rm /var/run/$NAME.pid
echo "done"
}

status() {
status_of_proc -p /var/run/$NAME.pid "" "ethercalc" && exit 0 || exit $?
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $NAME {start|stop|restart|status}" >&2
exit 1
;;
esac

exit 0


On le rend executable.
root@ubuntults:/var/log# chmod +x /etc/init.d/ethercalc

On active le script au démmarage:

 root@ubuntu:/opt/ethercalc# update-rc.d ethercalc defaults
Adding system startup for /etc/init.d/ethercalc ...
/etc/rc0.d/K20ethercalc -> ../init.d/ethercalc
/etc/rc1.d/K20ethercalc -> ../init.d/ethercalc
/etc/rc6.d/K20ethercalc -> ../init.d/ethercalc
/etc/rc2.d/S20ethercalc -> ../init.d/ethercalc
/etc/rc3.d/S20ethercalc -> ../init.d/ethercalc
/etc/rc4.d/S20ethercalc -> ../init.d/ethercalc
/etc/rc5.d/S20ethercalc -> ../init.d/ethercalc


root@ubuntults:/var/log# /etc/init.d/ethercalc start

Notre ethercalc est bien lancé

root@ubuntu:/opt/ethercalc# ps aux | grep ethercalc
1001 12154 1.7 7.1 724976 35712 ? Sl 22:09 0:00 node /usr/local/bin//ethercalc /var/log/ethercalc.log
root 12190 0.0 0.1 8104 924 pts/0 S+ 22:10 0:00 grep --color=auto ethercalc


L'interface:

ethercalc interface web



ethercalc interface web
  • La fonction Graphs

Ethercalc interface web



Ethercalc est un outil simple installer, léger,  et agréable à utiliser.
Bien sur il est bien loin des fonctionnalités de Google Docs ou autres, mais il a le mérite d'exister.
Pour un usage ponctuel il est très souvent suffisant.
Surtout le plus important c'est qu'il est installé sur vos serveurs.

Ethercalc est un moteur, après il faut faire toute l'intégration CMS autour.

Quelques projets existent déjà:



29 octobre 2012 15 commentaires

#Gnu/Linux, Planet Libre

Installation d'une solution de collaboration: Etherpad Lite

etherpad
Installation d'une solution de collaboration Etherpad Lite

J'ai eut besoin récemment pour les associations pour lesquelles je suis un peu sysadmin, de mettre en place une solution de collaboration texte.
Bien sur il existe les Google Docs et autres mais je voulais un outil simple et hebergé par mes serveurs.
J'ai un peu cherché et je suis tombé sur Etherpad !





EtherPad est un éditeur de texte collaboratif en temps réel. Il permet par défaut à un maximum de seize personnes de partager un texte en cours d'élaboration. Les contributions de chacun apparaissent immédiatement sur l'écran de tous les participants et sont signalées par des couleurs différentes. Une fenêtre de messagerie instantanée est également disponible.

Le système ne requiert aucune installation, ni aucune inscription, il suffit d'avoir une connexion internet et un navigateur web. EtherPad est écrit en JavaScript.

Etherpad était un éditeur (de texte) en ligne permettant de travailler à plusieurs sur un document. Le code fut ouvert par Google quand ils en firent l'acquisition pour l'intégrer à Google Wave (il me semble, ou alors c'était dans Google Docs), dans la foulée une fondation fut créée pour continuer à le faire vivre, et des pads fleurirent un peu partout, malgré la gourmandise du logiciel (les mauvaises langues, dont je ne suis pas, attribueront cette lourdeur au fait que le logiciel ait été écrit en Scala, et donc dépende de Java). Mais il était hors de portée des serveurs dédiés virtuels (VPS) pas chers, et autres mini serveurs.

C'est là qu'entre en scène Etherpad Lite, nettement moins gourmand, il se base sur Node.js, a moins de dépendances ésotériques que son ancêtre, et d'après les développeurs, là où un Etherpad occupait 257 Mo de RAM juste après son démarrage, Etherpad
Lite n'en occupe que 16 Mo. Il est disponible sous licence Apache 2.0. (source :http://linuxfr.org/news/etherpad-lite)


Etherpad vs Etherpad Lite

  Etherpad Etherpad Lite
Size of the folder (without git history) 30 MB 1.5 MB
Languages used server side Javascript (Rhino), Java, Scala Javascript (node.js)
Lines of server side Javascript code ~101k ~9k
RAM Usage immediately after start 257 MB (grows to ~1GB) 16 MB (grows to ~30MB)



Plateforme Materielle :

Comme d'habitude, j'ai monté mon prototype sur ma plateforme de virtualisation:

Dedibox Pro HP
Plateforme logicielle hyperviseur:
  • Dom0 Opensuse 12.1 X86_64 Xen 4.1
Plateforme Virtuelle:

  • DomU Xen Ubuntu 10.04 X86_64 Paravirtualisé
  • 2 vcpus 
  • 512 Mo de Ram
  • HDD 16GB


Installation:

Pour commencer j'ai mis à jour totalement mon DomU ubuntu 10.04; mon template avait quelques maj de retard :)

  • Mise à niveau du DomU
root@ubuntults:/# apt-get update; apt-get upgrade
root@ubuntults:/# apt-get install linux-headers-server linux-image-server linux-server
root@ubuntults:/# reboot

  • Installation des prérequis
root@antony-linux:/home/antony# apt-get install gzip git-core curl python libssl-dev pkg-config build-essential

  • Installation de node.js
On télécharge la dernière version de node.js et on la compile
    root@antony-linux:/home/antony# wget http://nodejs.org/dist/v0.6.15/node-v0.6.15.tar.gz
    root@antony-linux:/home/antony# tar xvfz node-v0.6.15.tar.gz
    root@antony-linux:/home/antony/# cd node-v0.6.15
    root@antony-linux:/home/antony/#./configure; make; make install

  • Installation de Etherpad lite 
On utilse git pour récupérer la dernière version.
root@antony-linux:/home/antony# git clone 'git://github.com/Pita/etherpad-lite.git'
Initialized empty Git repository in /home/antony/etherpad-lite/.git/
remote: Counting objects: 8065, done.
remote: Compressing objects: 100% (2632/2632), done.
remote: Total 8065 (delta 5738), reused 7590 (delta 5318)
Receiving objects: 100% (8065/8065), 2.76 MiB | 626 KiB/s, done.
Resolving deltas: 100% (5738/5738), done.


Je déplace le tout ce /opt

root@antony-linux:/home/antony# mv etherpad-lite /opt/etherpad

On installe les dépendances
root@ubuntults:/opt/etherpad# /opt/etherpad/bin/installDeps.sh

A partir d'ici on peut déjà lancer Etherpad.

root@ubuntults:/opt/etherpad# /opt/etherpad/bin/run.sh 
You shouldn't start Etherpad-Lite as root!
Please type 'Etherpad Lite rocks my socks' if you still want to start it as root
Etherpad Lite rocks my socks
Ensure that all dependencies are up to date...
Ensure jQuery is downloaded and up to date...
Ensure prefixfree is downloaded and up to date...
Clear minfified cache...
ensure custom css/js files are created...
start...
[2012-04-20 17:01:09.999] [INFO] console - Your Etherpad Lite git version is 309e3b0
[2012-04-20 17:01:10.002] [INFO] console - Report bugs at https://github.com/Pita/etherpad-lite/issues
[2012-04-20 17:01:10.124] [INFO] console - Server is listening at 0.0.0.0:9001
[2012-04-20 17:01:10.125] [INFO] console -    info  - 'socket.io started'


Accès à l'interface Web:



Si tout est bien installé démarré, on peut acceder à l'interface Web de etherpard sur le port 9001



http://votre_ip:9001


Bon on à installer Etherpad Lite et on l'a lancé.
C'est bien joli, mais déjà on le lance en root ce qui n'est pas jojo et on est obligé de lancer le script à la main...
C'est pas très optimisé...


Optimisations :
Afin de pouvoir bénéficier des fonctions d'import il faut installer abiword
root@ubuntults:~# apt-get install abiword

Il faut modifier le settings.json dans le dossier etherpad pour que ce soit pris en compte
root@ubuntults:~# vi /opt/etherpad/settings.json

///////
   Abiword is needed to enable the import/export of pads*/
 "abiword" : "/usr/bin/abiword",
//////

Afin que se soit utilisable, nous allons créer un script qui permettera de lancer Etherpad en daemon et surtout pas en root....

On crée un user Etherpad et on donne les droits adéquats.
root@ubuntults:~# useradd etherpad

root@ubuntults:~# chown -R etherpad /opt/etherpad


On crée maintenant un script d'init afin de pouvoir lancer Etherpad en tant que daemon
Ce script nous permet de lancer etherpad en tant que etherpad et aussi de pouvoir la lancer au demmarage.

#!/bin/sh

### BEGIN INIT INFO
# Provides: etherpad-lite
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts etherpad lite
# Description: starts etherpad lite using start-stop-daemon
### END INIT INFO

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/node/bin"
LOGFILE="/var/log/etherpad.log"
EPLITE_DIR="/opt/etherpad"
EPLITE_BIN="bin/run.sh"
USER="etherpad"
GROUP="etherpad"
DESC="Etherpad"
NAME="etherpad"

set -e

. /lib/lsb/init-functions

start() {
echo "Starting $DESC... "

start-stop-daemon --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile /var/run/$NAME.pid --exec $EPLITE_DIR/$EPLITE_BIN -- $LOGFILE || true
echo "done"
}

#We need this function to ensure the whole process tree will be killed
killtree() {
local _pid=$1
local _sig=${2-TERM}
for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
killtree ${_child} ${_sig}
done
kill -${_sig} ${_pid}
}

stop() {
echo "Stopping $DESC... "
while test -d /proc/$(cat /var/run/$NAME.pid); do
killtree $(cat /var/run/$NAME.pid) 15
sleep 0.5
done
rm /var/run/$NAME.pid
echo "done"
}

status() {
status_of_proc -p /var/run/$NAME.pid "" "etherpad" && exit 0 || exit $?
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $NAME {start|stop|restart|status}" >&2
exit 1
;;
esac

exit 0

On le rend executable.
root@ubuntults:/var/log# chmod +x /etc/init.d/etherpad

On active le script au démmarage:

root@ubuntults:/var/log# update-rc.d etherpad defaults
 Adding system startup for /etc/init.d/etherpad ...
   /etc/rc0.d/K20etherpad -> ../init.d/etherpad
  /etc/rc1.d/K20etherpad -> ../init.d/etherpad
   /etc/rc6.d/K20etherpad -> ../init.d/etherpad
   /etc/rc2.d/S20etherpad -> ../init.d/etherpad
  /etc/rc3.d/S20etherpad -> ../init.d/etherpad
   /etc/rc4.d/S20etherpad -> ../init.d/etherpad
   /etc/rc5.d/S20etherpad -> ../init.d/etherpad

root@ubuntults:/var/log# /etc/init.d/etherpad start

Notre etherpad est bien lancé

root@ubuntults:/var/log# ps aux | grep etherpad
etherpad 15021  0.0  0.0   4096   628 ?        S    21:39   0:00 /bin/sh /opt/etherpad/bin/run.sh /var/log/etherpad.log
etherpad 15049  1.5  1.2 717752 25192 ?        Sl   21:39   0:09 node server.js /var/log/etherpad.log

L'interface:






  • La fonction Chat




  • Les options


  • La fonction d'import




  • La fonction partage avec QRcode !

  • La fonction replay







Etherpad est un outil simple installer, léger,  et agréable à utiliser.
Bien sur il n'a pas toutes les fonctionnalités de Google Docs ou autres, mais il suffit bien pour la majorité des usages
Surtout le plus important c'est qu'il est installé sur vos serveurs.


Optimisations :

Je repends cet article pour améliorer un peu le système.

De base, les pads dans etherpad-lite sont stockés dans un fichier appelé dirtydb
Il porte bien son nom puisque tout est écrit à la suite en dur, sans aucune optimisations...
Ca va bien pour tester, mais si le nombre de pads devient conséquents ca va vite devenir problématique...

C'est pourquoi j'ai préféré utiliser mysql pour stocker les données...


root@ubuntults#mysql -u root -p
create database `etherpad`;
grant all privileges on `etherpad`.* to 'etherpad'@'localhost' identified by 'etherpad';
Relancer etherpad-lite afin qu'il peuple la base de donnée.

root@ubuntults#ALTER DATABASE `etherpad` CHARACTER SET utf8 COLLATE utf8_bin;
USE `etherpad`;
ALTER TABLE `store` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
Modifier votre settings.json pour utiliser mysql

 // An Example of MySQL Configuration
"dbType" : "mysql",
"dbSettings" : {
"user" : "etherpad",
"host" : "localhost",
"password": "etherpad",
"database": "etherpad"
},

Relancer Etherpad et voilà il utilise mysql.



Interface Web :

L'interface web de base de Etherpad-lite est très basique.
Je recherche activement une interface complète qui perméttrait d'utiliser toutes les fonctions de etherpad-lite

En effet Etherpad-lite dispose dune api bien fournie et on peut aller très loin...

En attendant un developpeur motivé, j'ai du faire 2 ou 3 ligne de php pour avoir quelquechose d'utilisable...
Je ne suis pas du tout developpeur... alors j'ai un peu galéré..

L'interface de base permet juste de creer un pad, ce qui est l'essentiel, mais si on veut modifier un pad déjà crée il fallait connaitre son nom...
ce qui n'est pas très pratique...
Je voulais au moins pouvoir visualiser le nom des pad déjà crées.

Je suis arrivé en bricolant un peu de html, jquery, php à avoir ça...



Je ne mettrai pas le code sur le billet.
Si vous etes interessé par cette petite page web contactez moi.

21 avril 2012 13 commentaires