Installer Etherpad sous Ubuntu jaunty
Note: installation ci-dessous est réalisée sur un vserver.
Installation avec source deb <- des notes de tests
Les sources:
http://code.google.com/p/etherpad/
Suivre ces étapes:
https://wiki.ubuntu.com/Etherpad
Autres références:
Fork:
Site utilisant Etherpad:
Voir pour export: un patch:
http://karteek.selfdabba.com/post/301488675/etherpad-opensourced
Pour la compilation des jar
Attention au /etc/hosts, il doit contenir une ligne comme celle-ci:
127.0.0.1 localhost
la commande hostname doit donner le bon nom de machine: etherpad.recit.org
le répertoire /tmp du vserver doit avoir plus de 16Mo d'espace, on change alors le fichier /etc/vservers/nomvserver/fstab pour ajouter des Mo dans le fichier. ON redémarre le vserver.
Après la compilation
Proxypass (retirer le port 9000): pour que le apache entête travaille bien pour ne pas avoir port à mettre le fichier .conf ressemble à ceci:
<VirtualHost 192.168.1.192:80>
ServerName epad.recit.org
ServerAlias *.epad.recit.org
ServerAdmin pierres@recitmst.qc.ca
ServerSignature Off
ProxyPass / http://192.168.1.198:9000/
ProxyPassReverse / http://192.168.1.198:9000/
ProxyRequests Off
ProxyPreserveHost on
<Directory />
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#LogLevel error
</VirtualHost>
Le fichier de config de etherpad ressemble à ceci (/etc/etherpad.localdev-default.properties)
ajstdlibHome = ../infrastructure/framework-src/modules
appjetHome = ./data/appjet
devMode = false
etherpad.adminPass = unbonmotdepasse
etherpad.fakeProduction = false
etherpad.isProduction = true
etherpad.SQL_JDBC_DRIVER = com.mysql.jdbc.Driver
etherpad.SQL_JDBC_URL = jdbc:mysql://localhost:3306/etherpad
etherpad.SQL_PASSWORD = motpassemysql
etherpad.SQL_USERNAME = utilisateurmysql
listen = 9000
logDir = ./data/logs
modulePath = ./src
transportPrefix = /comet
transportUseWildcardSubdomains = true
useVirtualFileRoot = ./src
Ajouter dans /etc/init.d/rc.local du vserver les lignes suivantes pour que etherpad démarre avec le vserver (le répertoire de etherpad se trouve dans /home/epad):
cd /home/epad/etherpad/trunk/etherpad/
sh bin/run-local.sh &
Compte Pro
http://groups.google.com/group/etherpad-open-source-discuss/browse_thread/thread/aad77dd4c875402d/602656f3ad8b76e9?#602656f3ad8b76e9
Des modifications pour faire fonctionner la version pro
> function getRequestSuperdomain() {
> var parts = request.domain.split('.');
> parts.reverse();
> if (parts[0] == ".") {
> parts.shift();
> }
> return [parts[2],parts[1], parts[0]].join('.');
http://groups.google.com/group/etherpad-open-source-discuss/browse_thread/thread/3d9f264921533285
renderFramed('pro/pro_home.ejs', {
isEvaluation: licensing.isEvaluation(),
// evalExpDate: licensing.getLicense().expiresDate,
account: getSessionProAccount(),
isPNE: pne_utils.isPNE(),
pneVersion: pne_utils.getVersionString(),
livePads: livePads,
recentPads: recentPads,
renderRecentPads: renderRecentPads,
renderLivePads: renderLivePads,
orgName: r.orgName
});
dans src/etherpad/control/pro_signup_control.js
+ response.redirect('http://'+subdomain+'.epad.recit.org/ep/finish-activation');
+ // response.redirect('http://'+subdomain+"."+request.host+'/ep/finish-activation'); enleve par pl, cause prob pour la partie pro
Sources modifiées
Après avoir une installation fonctionnelle, on peut traduire en utilisant le répertoire /src ci-dessous. Attention, il y a des endroits où j'ai dû entrer l'adresse de mon installation à la dure (epad.recit.org). À modifier donc pour votre installation.
Commande pour la création d'un patch (appliquer mes changements sur un répertoire src original):
diff -burN src src_0.1 >src_patch.diff
patch -p 1 < src_patch.diff (placer le .diff dnas le répertoire src à patcher)
Voici le fichier .diff du répertoire src contenant l'interface à traduire:
Voici le répertoire src que j'utilise, il contient les images traduites, les fichiers traduits pour l'interface. J'ai copié la licence dans ce répertoire, j'y ai mis le .diff de mes modifications afin de respecter la licence apache.
Les fichiers de configuration où epad.recit.org est inscrit à la dure (depuis /etherpad/trunk/etherpad/src/):
- mains.js
- etherpad/global.js
- static/crossdomain.xml
- etherpad/control/pro_signup_control.js
- etherpad/pro/pro_utils.js
Fondation Etherpad.org
Les sources de Google ont été modifiées par ce groupe. Voici ce que j'ai pris de ces sources.
Ajout de couleurs
Pour avoir plus de choix de couleurs, 3 fichiers à modifier.
/etherpad/global.js, /static/css/pad2_ejs.css et /templates/pad/pad_body2.ejs
Des diff
diff -burN epad_8couleurs/globals.js epad_32couleurs/globals.js
--- epad_8couleurs/globals.js 2010-03-12 17:44:23.000000000 -0500
+++ epad_32couleurs/globals.js 2010-04-16 07:45:59.000000000 -0400
@@ -19,8 +19,8 @@
//----------------------------------------------------------------
var COMETPATH = "/comet";
-
-var COLOR_PALETTE = ['#ffc6c6','#ffe2bf','#fffcbf','#cbffb3','#b3fff1','#c6e7ff','#dcccff','#ffd9fb'];
+//var COLOR_PALETTE = ['#ffc6c6','#ffe2bf','#fffcbf','#cbffb3','#b3fff1','#c6e7ff','#dcccff','#ffd9fb'];
+var COLOR_PALETTE = ['#ffc7c7','#fff1c7','#e3ffc7','#c7ffd5','#c7ffff','#c7d5ff','#e3c7ff','#ffc7f1','#ff8f8f','#ffe38f','#c7ff8f','#8fffab','#8fffff','#8fabff','#c78fff','#ff8fe3','#d97979','#d9c179','#a9d979','#79d991','#79d9d9','#7991d9','#a979d9','#d979c1','#d9a9a9','#d9cda9','#c1d9a9','#a9d9b5','#a9d9d9','#a9b5d9','#c1a9d9','#d9a9cd'];
function isProduction() {
return (appjet.config['etherpad.isProduction'] == "true");
@@ -29,6 +29,8 @@
var SUPERDOMAINS = {
'localbox.info': true,
'localhost': true,
+
+ 'epad.recit.org': true,
'etherpad.com': true
};
diff -burN epad_8couleurs/pad2_ejs.css epad_32couleurs/pad2_ejs.css
--- epad_8couleurs/pad2_ejs.css 2010-03-11 10:14:06.000000000 -0500
+++ epad_32couleurs/pad2_ejs.css 2010-04-16 07:54:14.000000000 -0400
@@ -245,7 +245,7 @@
#myswatch { width: 100%; height: 100%; background: transparent;/*...initially*/ }
#mycolorpicker {
background: url(/static/img/jun09/pad/colorpicker.gif) no-repeat left top;
- width: 232px; height: 76px;
+ width: 232px; height: 140px;
position: absolute;
left: 13px; top: 13px; z-index: 101;
display: none;/*...initially*/
@@ -258,6 +258,33 @@
#mycolorpicker .n6 { left: 148px; }
#mycolorpicker .n7 { left: 175px; }
#mycolorpicker .n8 { left: 202px; }
+#mycolorpicker .n9 { left: 13px; top: 34px ! important;}
+#mycolorpicker .n10 { left: 40px; top: 34px ! important;}
+#mycolorpicker .n11 { left: 67px; top: 34px ! important;}
+#mycolorpicker .n12 { left: 94px; top: 34px ! important;}
+#mycolorpicker .n13 { left: 121px; top: 34px ! important;}
+#mycolorpicker .n14 { left: 148px; top: 34px ! important;}
+#mycolorpicker .n15 { left: 175px; top: 34px ! important;}
+#mycolorpicker .n16 { left: 202px; top: 34px ! important;}
+
+#mycolorpicker .n17 { left: 13px; top: 56px ! important;}
+#mycolorpicker .n18 { left: 40px; top: 56px ! important;}
+#mycolorpicker .n19 { left: 67px; top: 56px ! important;}
+#mycolorpicker .n20 { left: 94px; top: 56px ! important;}
+#mycolorpicker .n21 { left: 121px; top: 56px ! important;}
+#mycolorpicker .n22 { left: 148px; top: 56px ! important;}
+#mycolorpicker .n23 { left: 175px; top: 56px ! important;}
+#mycolorpicker .n24 { left: 202px; top: 56px ! important;}
+
+#mycolorpicker .n25 { left: 13px; top: 78px ! important;}
+#mycolorpicker .n26 { left: 40px; top: 78px ! important;}
+#mycolorpicker .n27 { left: 67px; top: 78px ! important;}
+#mycolorpicker .n28 { left: 94px; top: 78px ! important;}
+#mycolorpicker .n29 { left: 121px; top: 78px ! important;}
+#mycolorpicker .n30 { left: 148px; top: 78px ! important;}
+#mycolorpicker .n31 { left: 175px; top: 78px ! important;}
+#mycolorpicker .n32 { left: 202px; top: 78px ! important;}
+
#mycolorpicker .pickerswatchouter {
border: 1px solid white;
width: 15px; height: 15px; position: absolute;
@@ -272,10 +299,10 @@
}
#mycolorpicker .picked { border: 1px solid #666 !important; }
#mycolorpicker .picked .pickerswatch { border: 1px solid #666; }
-#mycolorpickersave { position: absolute; left: 14px; top: 42px;
+#mycolorpickersave { position: absolute; left: 14px; top: 102px;
width: 47px; height: 0; padding-top: 20px; overflow: hidden;
cursor: pointer; }
-#mycolorpickercancel { position: absolute; left: 87px; top: 42px;
+#mycolorpickercancel { position: absolute; left: 87px; top: 102px;
width: 44px; height: 0; padding-top: 20px; overflow: hidden;
cursor: pointer; }
#myusernameform { margin-left: 35px; }
diff -burN epad_8couleurs/pad_body2.ejs epad_32couleurs/pad_body2.ejs
--- epad_8couleurs/pad_body2.ejs 2010-03-26 16:43:01.000000000 -0400
+++ epad_32couleurs/pad_body2.ejs 2010-04-16 07:48:19.000000000 -0400
@@ -187,7 +187,7 @@
</div><!-- /savedrevs close -->
</div>
</div><!-- /savedrevs-wrapper -->
- <div id="revision-notifier"><span class="label">Saved:</span> <span class="name">Revision 1</span></div>
+ <div id="revision-notifier"><span class="label">Enregistre:</span> <span class="name">Revision 1</span></div>
<div id="options-wrapper" class="dbpanel-wrapper">
<div id="options-panel" class="dbpanel-panel">
<div class="dbpanel-leftedge"><!-- --></div>
@@ -307,7 +307,8 @@
</div>
<div id="myuser">
- <div id="mycolorpicker">
+<div id="mycolorpicker">
+ <div>
<div class="pickerswatchouter n1"><div class="pickerswatch"><!-- --></div></div>
<div class="pickerswatchouter n2"><div class="pickerswatch"><!-- --></div></div>
<div class="pickerswatchouter n3"><div class="pickerswatch"><!-- --></div></div>
@@ -316,8 +317,35 @@
<div class="pickerswatchouter n6"><div class="pickerswatch"><!-- --></div></div>
<div class="pickerswatchouter n7"><div class="pickerswatch"><!-- --></div></div>
<div class="pickerswatchouter n8"><div class="pickerswatch"><!-- --></div></div>
- <div id="mycolorpickersave">Save</div>
- <div id="mycolorpickercancel">Cancel</div>
+ </div><div>
+ <div class="pickerswatchouter n9"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n10"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n11"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n12"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n13"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n14"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n15"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n16"><div class="pickerswatch"><!-- --></div></div>
+ </div><div>
+ <div class="pickerswatchouter n17"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n18"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n19"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n20"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n21"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n22"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n23"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n24"><div class="pickerswatch"><!-- --></div></div>
+ </div><div>
+ <div class="pickerswatchouter n25"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n26"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n27"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n28"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n29"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n30"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n31"><div class="pickerswatch"><!-- --></div></div>
+ <div class="pickerswatchouter n32"><div class="pickerswatch"><!-- --></div></div>
+ </div>
+ <div id="mycolorpickersave">Save</div> <div id="mycolorpickercancel">Cancel</div>
</div>
<div id="myswatchbox"><div id="myswatch"><!-- --></div></div>
<div id="myusernameform"><input type="text" id="myusernameedit" disabled="disabled" /></div>
Trucs
Pour insérer un epad.recit.org dans une page web, on inscrit le code comme ceci:
<iframe height="800" src="http://epad.recit.org/uVLljSYNLh" width="100%"></iframe>
Où uVLljSYNLh est le nom de la note à insérer.
Un billet pour les trucs:
http://recit.org/index.php/2010/04/16/inserer_un_epad_dans_une_page_web
Effacer le clavardage
Trou de sécurité
http://groups.google.com/group/etherpad-open-source-discuss/browse_thread/thread/05c4bee6ebe27078%20%3E
Optimisation
- Diminuer le nombre de connexion par note à 16
- config maxThreads=100 pour diminuer le nombre de processus java démarré (pstree, passé de 300 + à 40)
- On peut passer le nombre de RAm dans la commande, ex.: ./bin/run-local.sh 128M
- dans bin/run-local.sh on peut ajuster le nombre de ram de notre machine. 1G par défaut.
Apache travaille très fort (je suis en proxypass vers le port 9000 de l'application etherpad). J'ai ajusté les variables suivantes afin qu'il tienne le coup devant plusieurs dizaines de connections en mpeme temps:
- KeepAliveTimeout? 5
- Timeout 15
- ServerLimit? 1000
- MinSpareServers? 70
- MaxSpareServers? 300
- MaxRequestsPerChild? 50
Avec ces valeurs, j'ai moins de processus (le 121) apache de pris (ça semble se rafrâichir plus rapidement):
init─┬─apache2───121*[apache2]
ce nombre monte en flèche avec plus de 20 personnes sur epad. Mais avec ma dernière config, ça semble moins sensible.
La swap est également moins solicité (200 Mo), ce qui devrait être corrigé avec l'ajout de ram sous peu. A suivre...
Problème mail après déménagement de serveur.
ajouté dans /etc/proprieties de etherpad la ligne smtpServer = 172.30.2.52:25
dans postfix main.cf, ligne mynetworks = 172.30.2.52