AviGNU - Mot-clé - openSUSEGroupe d'utilisateurs de logiciels libres du Grand Avignon2024-01-02T17:40:01+01:00Administrateururn:md5:8ed776652564792dba453bac492a5a6cDotclearLa riposte de la communauté openSUSE face au projet KDE neonurn:md5:6fe9859c43df40d17d618893517a88122016-02-20T11:49:00+01:002016-02-20T14:00:05+01:00Olivier DuchateauActualitéKDEKubuntuLeapNeonopenSUSEPlasma <p>Lors du dernier <abbr title="Free and Open Source Software Developers' European Meeting">FOSDEM</abbr>, Jonathan Riddell a annoncé un nouveau projet, <a href="http://neon.kde.org.uk/">KDE neon</a>.</p>
<p>Il permet aux utilisateurs de tester les dernières versions des bibliothèques KDE Framework et Plasma 5 (le bureau) sur une base Ubuntu <abbr title="Long Term Support">LTS</abbr> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>, <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#wiki-footnote-2" id="rev-wiki-footnote-2">2</a>]</sup>. Les applications sont issues de la branche <em>unstable</em> du dépôt Git, et non pas d'archives comme on le trouve habituellement (il faut donc en tenir compte).</p>
<p>Le but est d'offrir aux utilisateurs des paquets en continu à partir de <em>snapshots</em> (considérés utilisables par les développeurs) du dépôt Git.</p>
<p>Le projet openSUSE a donc réagit est propose <a href="https://news.opensuse.org/2016/02/19/opensuse-offers-choices-for-kde-git-builds/">deux distributions</a> contenant les tous derniers logiciels du bureau KDE Plasma.</p>
<ul>
<li><strong><a href="http://download.opensuse.org/repositories/KDE:/Medias/images/iso/">KDE Argon</a></strong>, basé sur openSUSE Leap <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#wiki-footnote-3" id="rev-wiki-footnote-3">3</a>]</sup></li>
<li><strong><a href="http://download.opensuse.org/repositories/KDE:/Medias/images/iso/">KDE Krypton</a></strong>, basé sur openSUSE Tumbleweed <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#wiki-footnote-4" id="rev-wiki-footnote-4">4</a>]</sup></li>
</ul>
<p>Trois dépôts sont à activer si l'on souhaite utiliser les tous derniers logiciels du bureau KDE Plasma.</p>
<ul>
<li><a href="http://download.opensuse.org/repositories/KDE:/Unstable:/Frameworks/">KDE:/Unstable:/Frameworks</a></li>
<li><a href="http://download.opensuse.org/repositories/KDE:/Unstable:/Applications/">KDE:/Unstable:/Applications</a></li>
<li><a href="http://download.opensuse.org/repositories/KDE:/Unstable:/Extra/">KDE:/Unstable:/Extra</a></li>
</ul>
<p>Il existe une initiative similaire pour le bureau GNOME Shell, <a href="http://download.opensuse.org/repositories/GNOME:/Next/openSUSE_Factory/">GNOME:/Next</a>.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Ubuntu étant basé sur Debian, dont la réputation est d'être très stable.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#rev-wiki-footnote-2" id="wiki-footnote-2">2</a>] Jonathan Riddel a longtemps été un membre actif, pendant plus de 10 ans, auprès de la communauté Kubuntu, ceci expliquant l'utilisation d'une base Ubuntu pour ce nouveau projet.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#rev-wiki-footnote-3" id="wiki-footnote-3">3</a>] Cette distribution est basée sur SUSE Linux Enterprise (SLE)</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2016/02/20/La-riposte-de-la-communaut%C3%A9-openSUSE-face-au-projet-KDE-neon#rev-wiki-footnote-4" id="wiki-footnote-4">4</a>] Également basée sur SLE, mais ayant le principe d'une <em>rolling release</em>.</p></div>
Installation de Dotclear sous openSUSE (bis)urn:md5:f6023a45ebe404bff4a933a411f5d8ab2015-01-19T11:32:00+01:002015-01-20T05:26:29+01:00Olivier DuchateauDocumentationDotclearFastCGIHowtoMariaDBNginxopenSUSEPHPPHP-FPM<p>Il y a quelques années, j'avais écrit un <a href="http://avignu.tuxfamily.org/index.php?post/2011/08/13/Installation-de-Dotclear-en-local%2C-sous-openSUSE">billet</a> sur l'installation de <a href="http://fr.dotclear.org/">Dotclear</a> en local.</p>
<p>Nous allons donc revoir la procédure de A à Z, en changeant cette fois-ci de serveur Web, et de système de base de données.</p>
<p>Les prérequis sont :</p>
<ul>
<li>Un serveur HTTP</li>
<li>Une base de données</li>
<li>PHP >= 5.2</li>
</ul> <h3>Le serveur HTTP</h3>
<p>J'ai décidé d'utiliser le serveur <a href="http://nginx.org/">Nginx</a> (prononcez « <em>engine-x</em> »). Sur le wiki, vous trouverez la <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:opensuse:nginx">procédure</a> pour l'installer.</p>
<p>Pour une question de facilité, j'ai choisi de mettre en place l'équivalent de la directive <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:nginx#equivalent_de_la_directive_userdir_d_apache">UserDir</a> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2015/01/19/Installation-de-Dotclear-sous-openSUSE-%28bis%29#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup> d'<a href="http://httpd.apache.org/">Apache</a>.</p>
<p>On lance le serveur avec cette commande :</p>
<pre># systemctl start nginx
</pre>
<p>On peut tester les adresses suivantes http://localhost/ et http://localhost/~olivier/ <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2015/01/19/Installation-de-Dotclear-sous-openSUSE-%28bis%29#wiki-footnote-2" id="rev-wiki-footnote-2">2</a>]</sup>.</p>
<pre>% curl -I http://localhost/
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 19 Jan 2015 05:20:47 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.1
% curl -I http://localhost/~olivier/
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 19 Jan 2015 05:23:24 GMT
Content-Type: text/html
Connection: keep-alive
</pre>
<p>Tout semble fonctionnel, on peut passer à l'étape suivante, qui consiste à installer un gestionnaire de base de données.</p>
<h3>MariaDB comme gestionnaire de base de données</h3>
<p>Rien de bien particulier, on l'installe de cette manière :</p>
<pre># zypper in mariadb mariadb-tools
</pre>
<p>Je suis passé par l'utilitaire <code>mysql_secure_installation</code> pour la configuration (on aurait pu utiliser <code>mysqladmin</code>). Elle est décrite sur une <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:mysql">page du wiki</a>.</p>
<p>On lance ce nouveau service, grâce à la commande suivante :</p>
<pre># systemctl start mysql
</pre>
<p>Il faut conserver les identifiants de connexion à la base de données, ils seront nécessaire lors de l'installation de Dotclear.</p>
<p>Maintenant, on passe au langage <abbr title="PHP: Hypertext Preprocessor">PHP</abbr>.</p>
<h3>PHP-FPM</h3>
<p>Là encore rien de compliquer.</p>
<pre># zypper in --recommends php5 php5-bcmath php5-bz2 php5-fpm php5-gd php5-gettext php5-mbstring php5-mcrypt php5-mysql php5-pear php5-sockets php5-xmlrpc php5-xsl php5-zlib
</pre>
<p>Sur le wiki, une page explique la <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:opensuse:install_php-fpm">procédure</a> pour configurer PHP-FPM sous openSUSE.</p>
<p>On lance le service :</p>
<pre># systemctl start php-fpm
</pre>
<h3>Dotclear</h3>
<p>Les modules PHP indispensables sont :</p>
<ul>
<li><code>php5-gd</code></li>
<li><code>php5-mbstring</code></li>
<li><code>php5-mysql</code> (on a configuré cette base de données)</li>
<li><code>php5-xsl</code></li>
<li><code>php5-xmlreader</code> / <code>php5-xmlwritter</code></li>
<li><code>php5-iconv</code></li>
</ul>
<p>Après avoir téléchargé la dernière archive <code>latest.tar.gz</code>, on la décompresse dans le dossier <code>public_html/</code>.</p>
<pre>% tar -xzf latest.tar.gz -C ~/public_html
</pre>
<p>J'ai dû modifier l'accès en écriture les dossiers <code>inc/</code> (sinon l'assistant refuse de se lancer), <code>cache/</code>, et <code>public/</code>.</p>
<pre>% cd ~/public_html/dotclear/
% chmod o+w inc/
% chmod o+w cache/
% chmod o+w public/
</pre>
<p>Les différentes étapes en images de l'installation sont regroupées <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:dotclear">ici</a>.</p>
<p>Désormais, on peut supprimer le dossier <code>admin/install/</code>.</p>
<pre>cd ~/public_html/dotclear/admin/
rm -Rf install/
</pre>
<p><a href="http://avignu.tuxfamily.org/news-custom/public/screenshots/dotclear-2.7.3.png" title="Capture d'écran du premier billet de DotClear"><img src="http://avignu.tuxfamily.org/news-custom/public/screenshots/.dotclear-2.7.3_m.png" alt="dotclear-2.7.3.png" title="Capture d'écran du premier billet de DotClear" /></a></p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2015/01/19/Installation-de-Dotclear-sous-openSUSE-%28bis%29#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Une configuration plus complète est disponible sur le <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:nginx">wiki</a>.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2015/01/19/Installation-de-Dotclear-sous-openSUSE-%28bis%29#rev-wiki-footnote-2" id="wiki-footnote-2">2</a>] C'est l'utilisateur sur cet ordinateur.</p></div>
Upgrade sans filet !urn:md5:a3ff306fd092767d6bb2d35b4074b3282014-12-22T06:20:00+01:002014-12-22T21:33:23+01:00Olivier DuchateauLinuxHowtoLinuxopenSUSESystemdTipszypper<p><img src="http://avignu.tuxfamily.org/news-custom/public/opensuse.png" alt="logo openSUSE" style="display:block; margin:0 auto;" title="logo openSUSE" /></p>
<p>Dans ce billet, je vais vous expliquer la procédure, que j'ai suivi pour mettre à jour (rapidement, et donc sans <strong>sauvegarde</strong>) mon système Linux (<a href="https://www.opensuse.org/fr/">openSUSE</a>).</p>
<p>Ceci a été décidé sur un coup de tête. Après un n-ième ras-le-bol suite à une mise à jour de sécurité, m'obligeant à démarrer uniquement en mode « dégradé » <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2014/12/22/Upgrade-sans-filet-%21#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>.</p>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2014/12/22/Upgrade-sans-filet-%21#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] La mise à jour de sécurité n'a pourtant pas impacté la gestion de la carte graphique.</p></div>
<p>La particularité de cet ordinateur, c'est qu'il contient un double <em>boot</em> (Linux et <a href="http://www.freebsd.org/">FreeBSD</a>). Là où ça se complique, <a href="http://www.gnu.org/software/grub/">GRUB2</a> est géré par FreeBSD, donc la mise à niveau par CD / DVD n'était pas envisageable <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2014/12/22/Upgrade-sans-filet-%21#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>.</p>
<h3>Mettre à jour les dépôts</h3>
<p>Dans un premier temps, j'ai activé le <em>runlevel 3</em>. Après pas mal de galère avec <code>systemctl</code>, j'ai choisi la manière la plus simple, c'est à dire remplacer le lien symbolique de la cible <code>default.target</code>.</p>
<pre>
ln -sf /usr/lib/systemd/system/runlevel3.target /etc/systemd/system/default.target
shutdown -r now
</pre>
<p>Sur le wiki, vous pouvez trouver une <a href="http://avignu.wiki.tuxfamily.org/doku.php?id=documentation:opensuse:zypper">page</a>, qui recense quelques commandes utiles pour <code>zypper</code>.</p>
<p>Une fois en console, j'ai désactivé tous les dépôts :</p>
<pre>
zypper mr -da
</pre>
<p>Ensuite j'ai ajouté les dépôts pour la version <strong>13.2</strong> (la dernière version actuelle, au moment où j'écris ces lignes).</p>
<pre>
zypper ar -n "openSUSE-13.2-OSS" http://download.opensuse.org/distribution/13.2/repo/oss/ repo-13.2-oss
zypper ar -n "openSUSE-13.2-Non-OSS" http://download.opensuse.org/distribution/13.2/repo/non-oss/ repo-13.2-non-oss
zypper ar -n "openSUSE-13.2-Update-Oss" http://download.opensuse.org/update/13.2/ repo-13.2-update
zypper ar -n "openSUSE-13.2-Update-Non-Oss" http://download.opensuse.org/update/13.2-non-oss/ repo-13.2-update-non-oss
</pre>
<p>Pour rafraîchir la liste et mettre à jour tous les paquets présents sur le système :</p>
<pre>
zypper ref
zypper dup
</pre>
<h3>Nettoyage des <em>patterns</em></h3>
<p>Auparavant j'étais sous le gestionnaire de bureaux, <a href="http://www.xfce.org/">Xfce</a>. Pour cette version, j'ai décidé de passer sous <a href="http://www.gnome.org/">GNOME</a>.</p>
<p>Donc pour supprimer les paquets relatifs à Xfce, j'ai appliqué cette commande :</p>
<pre>
zypper rm -u patterns-openSUSE-xfce patterns-openSUSE-xfce_basis
</pre>
<p>Certains paquets étaient encore présents, je les ai complètement supprimé.</p>
<h3>GNOME</h3>
<p>Pour installer GNOME, je suis de nouveau passé par les <em>patterns</em>.</p>
<pre>
zypper se patterns-openSUSE-gnome
[...]
S | Name | Summary | Type
--+----------------------------------------+---------------------------+--------
| patterns-openSUSE-gnome | GNOME Desktop Environment | package
| patterns-openSUSE-gnome_admin | GNOME Administration To-> | package
| patterns-openSUSE-gnome_basis | GNOME Base System | package
| patterns-openSUSE-gnome_basis_opt | GNOME Base System | package
| patterns-openSUSE-gnome_games | GNOME Games | package
| patterns-openSUSE-gnome_ide | GNOME Integrated Develo-> | package
| patterns-openSUSE-gnome_imaging | GNOME Graphics | package
| patterns-openSUSE-gnome_imaging_opt | GNOME Graphics | package
| patterns-openSUSE-gnome_internet | GNOME Internet | package
| patterns-openSUSE-gnome_laptop | GNOME Laptop | package
| patterns-openSUSE-gnome_multimedia | GNOME Multimedia | package
| patterns-openSUSE-gnome_multimedia_opt | GNOME Multimedia | package
| patterns-openSUSE-gnome_office | GNOME Office | package
| patterns-openSUSE-gnome_office_opt | GNOME Office | package
| patterns-openSUSE-gnome_utilities | GNOME Utilities | package
| patterns-openSUSE-gnome_yast | YaST GNOME User Interfa-> | package
</pre>
<p>Pour avoir un bureau fonctionnel sous cet environnement, il faut :</p>
<pre>
zypper in patterns-openSUSE-gnome patterns-openSUSE-gnome_yast
</pre>
<p>J'ai également rajouté son intégration dans YaST.</p>
<h3>Les dernières vérifications</h3>
<p>Avant de redémarrer, il faut penser à parcourir le fichier <code>/etc/sysconfig/displaymanager</code> pour vérifier la valeur de la variable <strong>DISPLAYMANAGER</strong>, elle doit correspondre à <strong>gdm</strong>. Ainsi que <code>/etc/sysconfig/windowmanager</code>, pour <strong>DEFAULT_WM</strong>, cela doit être <strong>gnome</strong>.</p>
<p>Si vous utilisez un autre <em>shell</em> que le <a href="http://tiswww.case.edu/php/chet/bash/bashtop.html">bash</a> pour votre session, pensez à vérifier qu'il est bien présent dans le fichier <code>/etc/shells</code>.</p>
<p>Une fois que tout est fonctionnel, on peut changer la valeur de la cible, <code>default.target</code>.</p>
<pre>
ln -sf /usr/lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
</pre>
<p><em>(Cliquez sur l'image pour la voir dans son format original)</em></p>
<p><a href="http://avignu.tuxfamily.org/news-custom/public/screenshots/openSUSE-13.2.png"><img src="http://avignu.tuxfamily.org/news-custom/public/screenshots/.openSUSE-13.2_s.png" alt="openSUSE-13.2.png" style="display:block; margin:0 auto;" title="openSUSE-13.2 - GNOME 3.14" /></a></p>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2014/12/22/Upgrade-sans-filet-%21#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Uniquement en dernier recours, si cette solution aurait échouée.</p></div>
Exécuter une application WSGI avec systemd sous openSUSEurn:md5:304f279f3c1d30ef82be67f722f84e632012-01-29T20:42:00+01:002012-01-29T21:36:42+01:00Olivier DuchateauDocumentationhginitMercurialNginxopenSUSEPythonSystemdWSGI <p>Ce billet est une « mise à jour » du <a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE">précédent</a>, concernant le déploiement de <a href="http://mercurial.selenic.com/">Mercurial</a>, sous forme d'application <acronym title="Web Server Gateway Interface">WSGI</acronym>.</p>
<p>Le fait de passer par le script <code>/etc/init.d/after.local</code>, pour lancer une telle application, ne m'a pas entièrement satisfait. C'est pourquoi j'ai décidé de me repencher sur ce point.</p>
<p>À la fin de l'article, j'évoqué, <a href="http://gunicorn.org/">Gunicorn</a>, comme serveur WSGI, en proposant même un exemple de fichier <code>.service</code>. Je me suis donc inspiré de celui-ci pour en créer un.</p>
<p>Le but c'est de pouvoir exécuter le script, <code>hgweb.wsgi</code> au démarrage.</p>
<p>Je vous propose donc, <code>wsgi-hg.service</code>. Il permet de lancer (ou d'arrêter) notre script WSGI. Il n'y a rien de particulier, à part la condition <strong>ConditionPathExistsGlob</strong>, qui me sert à tester si un fichier <code>.wsgi</code> (en réalité <code>hgweb.wsgi</code>) est présent sur le serveur, si c'est le cas, le service pourra être lancé.</p>
<p>Il faut bien sur, avoir correctement configuré son serveur Web. Par exemple pour <a href="http://nginx.org/">Nginx</a> :</p>
<pre>[...]
# Subdomain settings
#
# Mercurial
#
server {
listen 80;
server_name hg.errements.net;
access_log /var/log/nginx/access-hg.log;
location / {
root /srv/www/htdocs/vhosts/hg;
autoindex off;
proxy_path http://127.0.0.1:8500;
proxy_set_header Host $host;
}
}
[...]</pre>
<p>Mais on peut aller encore plus loin, actuellement dans notre script wsgi, le socket réseau (le port, et l'adresse IP) sont codés en « dur ». On pourrait les passer en paramètre. Il faut pour cela utiliser le module <a href="http://docs.python.org/dev/library/argparse.html">argparse</a>.</p>
<pre>olivier@bornem:~ $ python hgweb-opts.wsgi -h
usage: hgweb-opts.wsgi [-h] host port
positional arguments:
host Add IP address
port Add port number
optional arguments:
-h, --help show this help message and exit
olivier@bornem:~ $ </pre>
<p>On peut voir que deux paramètres sont obligatoires, l'ordre à une importance.</p>
<ul>
<li><em>host</em>, par exemple 127.0.0.1</li>
<li><em>port</em>, par exemple 8500</li>
</ul>
<pre>olivier@bornem:~ $ python hgweb-opts.wsgi 127.0.0.1 8500
serving on http://127.0.0.1:8500
</pre>
<p>On peut maintenant adapter le fichier <code>wsgi-hg.service</code>, pour pouvoir passer ces paramètres à la ligne <strong>ExecStart</strong>.</p>
<p>Voici la ligne à copier.</p>
<pre>[...]
ExecStart=/usr/bin/python2.7 /srv/www/htdocs/vhosts/hg/hgweb-opts.wsgi 127.0.0.1 8500
[...]</pre>
<p>Pour lancer le service, on place ce fichier dans <code>/etc/systemd/system/default.target.wants/</code> (ou <code>/lib/systemd/system/</code>).</p>
<pre>root@bornem:~ # systemctl start wsgi-hg.service
root@bornem:~ # systemctl status wsgi-hg.service
wsgi-hg.service - Starts WSGI script (mercurial)
Loaded: loaded (/lib/systemd/system/wsgi-hg.service; disabled)
Active: active (running) since Sun, 29 Jan 2012 21:26:45 +0100; 38s ago
Process: 17745 ExecStartPre=/bin/echo Starting WSGI script for mercurial (code=exited, status=0/SUCCESS)
Main PID: 17747 (python2.7)
CGroup: name=systemd:/system/wsgi-hg.service
└ 17747 /usr/bin/python2.7 /srv/www/htdocs/vhosts/hg/hgweb...
root@bornem:~ # </pre>Déployer Mercurial (hg) « derrière » un serveur Web (Nginx) sous openSUSEurn:md5:4a1c40ca03dab23f76d073ee3c81ccd82012-01-23T19:41:00+01:002012-01-25T19:44:35+01:00Olivier DuchateauDocumentationGunicornhginitLinuxMercurialNginxopenSUSEPythonSystemdWSGI<p><img src="http://avignu.tuxfamily.org/news-custom/public/logos.png" alt="Logos" style="display:block; margin:0 auto;" title="Logos, openSUSE + Mercurial et Nginx" /></p>
<p>Dans un précédent <a href="http://avignu.tuxfamily.org/index.php?post/2011/11/05/Mercurial-en-tant-qu-application-WSGI">billet</a>, j'avais montré comment l'on pouvait exécuter une application Web écrite dans le langage <a href="http://python.org/">Python</a> sans faire intervenir de serveurs Web.</p>
<p>Aujourd'hui, nous allons voir le cas, où un serveur (en l'occurence <a href="http://nginx.org/">Nginx</a>) est déjà en place.</p>
<p>En fait, le but inavoué de cet article est de comprendre le système <em>d'init</em>, <a href="http://www.freedesktop.org/wiki/Software/systemd">systemd</a> utilisé par <a href="http://fr.opensuse.org/">openSUSE</a> en autre.</p> <p>Dans les près-requis, on peut citer :</p>
<ul>
<li>Savoir utiliser <a href="http://mercurial.selenic.com/">mercurial</a></li>
<li>Être root sur la machine</li>
</ul>
<p>Dans un premier temps, nous allons voir la configuration du serveur, Nginx</p>
<h2>Configuration du serveur</h2>
<p>Rien de bien compliqué, la <a href="http://wiki.nginx.org/Main">documentation</a> est très complète.</p>
<p>Voici <strong>ma</strong> configuration du fichier <code>nginx.conf</code> (situé dans <code>/etc/nginx</code>).</p>
<pre>
user nginx nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
server_tokens off;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name errements.net;
charset utf-8;
autoindex on;
index index.html;
# favicon.ico
location = /favicon.ico {
log_not_found off;
access_log off;
}
location / {
root /srv/www/htdocs/bornem/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /srv/www/htdocs/;
}
# Users directory support
location ~ ^/~(.+?)(/.*)?$ {
alias /home/$1/public_html$2;
}
}
}</pre>
<p>Quelques explications concernant ce fichier.</p>
<ul>
<li>Les journaux (d'erreurs et d'accès) seront stockés dans le dossier <code>/var/log/nginx</code>.</li>
<li>Le numéro du processus sera stocké dans le fichier <code>/var/run/nginx.pid</code>.</li>
<li>L'affichage du numéro de version du serveur est désactivé dans les en-têtes <acronym title="HyperText Transfer Protocol">HTTP</acronym>, la directive <strong>server_tokens</strong> est sur <strong>off</strong>.</li>
</ul>
<p><strong>Remarque :</strong> On peut analyser ces en-têtes avec le module <a href="http://docs.python-requests.org/en/latest/index.html">Requests</a>. (Il faut faire tourner le serveur, et lancer l'interpréteur <strong>Python</strong>) :</p>
<p>Voici le cas où la directive <strong>server_tokens</strong> est sur <strong>on</strong> (valeur par défaut).</p>
<pre>olivier@bornem:~ $ python
Python 2.7.2 (default, Aug 19 2011, 20:41:43) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get("http://errements.net/")
>>> r.headers
{'date': 'Sat, 21 Jan 2012 09:41:08 GMT', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'content-type': 'text/html; charset=utf-8', 'server': 'nginx/1.0.10'}</pre>
<p>La valeur <strong>server</strong> vaut <strong>nginx/1.0.10</strong> (où <strong>1.0.10</strong> représente le numéro de version).</p>
<p>Si l'on désactive cette directive (<code>server_tokens off;</code>), on obtient ceci :</p>
<pre>>>> r = requests.get("http://errements.net/")
>>> r.headers
{'date': 'Sat, 21 Jan 2012 09:54:32 GMT', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'content-type': 'text/html; charset=utf-8', 'server': 'nginx'}</pre>
<p>Cette fois-ci, la valeur de <strong>serveur</strong> vaut <strong>nginx</strong>.</p>
<ul>
<li>L'absence de <a href="http://fr.wikipedia.org/wiki/Favicon">favicon</a> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#pnote-47-1" id="rev-pnote-47-1">1</a>]</sup>, à la racine du site, n'est pas « stockée » dans les <em>logs</em>.</li>
</ul>
<pre>[...]
# favicon.ico
location = /favicon.ico {
log_not_found off;
access_log off;
}
[...]</pre>
<ul>
<li>La racine du serveur est située dans <code>/srv/www/htdocs/bornem/</code>. Pour les utilsateurs, elle est située dans <code>$HOME/public_html</code> (cette fonctionnalité est connue sous l'appellation <a href="http://wiki.nginx.org/UserDir">UserDir</a>).</li>
</ul>
<pre>[...]
# Users directory support
location ~ ^/~(.+?)(/.*)?$ {
alias /home/$1/public_html$2;
}
[...]</pre>
<p>Nous pouvons maintenant lancer le serveur.</p>
<h3>Démarrer Nginx</h3>
<p>Sous openSUSE, les programmes pour lancer les <em>daemons</em> au démarrage sont situés dans <code>/etc/init.d/</code>.</p>
<pre>root@bornem:~# ls /etc/init.d/ | grep nginx
nginx
root@bornem:~# sh /etc/init.d/nginx start
redirecting to systemctl
Failed to issue method call: Unit name .d/nginx.service is not valid.
root@bornem:~# </pre>
<p>On obtient une erreur, car il manque un fichier <strong>nginx.service</strong>.</p>
<p>Depuis la version <strong>12.1</strong>, openSUSE intègre désormais <strong>systemd</strong>, comme service <em>d'init</em>.</p>
<p>Nous allons rechercher ce fichier.</p>
<pre>root@bornem:~# find /etc/systemd/ -type f -name 'nginx.service' -print
root@bornem:~#
root@bornem:~# find /lib/systemd/ -type f -name 'nginx.service' -print
root@bornem:~# </pre>
<p>Parmis les dossiers susceptibles de posséder un tel fichier, la recherche n'abouti pas, il faut donc le créer <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#pnote-47-2" id="rev-pnote-47-2">2</a>]</sup>.</p>
<p><em>Dans les pièces jointes vous trouverez le fichier <code>nginx.service</code>.</em></p>
<p>Vous constaterez que j'ai commenté la ligne <code>#WantedBy=multi-user.target</code>, car j'ai fait les tests avec une interface graphique, d'où la cible <strong>graphical.target</strong>.</p>
<p>Nous allons placé ce fichier, dans le dossier <code>/etc/systemd/system/default.target.wants</code> (si il n'existe pas il faut le créer).</p>
<p>Désormais, nous pouvons lancer le serveur de cette façon :</p>
<pre>root@bornem:~# systemctl start nginx.service</pre>
<h2>Mercurial</h2>
<p>Dans cette partie nous allons nous intéressé à <strong>Mercurial</strong>.</p>
<p>L'affichage du « dépôt » se fera par l'intermédiaire du module <strong>hgweb</strong>. Pour cela j'ai écris un script Python (<em>Cf.</em> <code>hgweb.wsgi</code>, en pièces jointes).</p>
<p>Ce script est très simple, si aucun fichier de configuration lui est donné, il va rechercher tous les utilisateurs présents sur la machine (<code>/etc/passwd</code>), puis il va examiner le <code>$HOME</code> de chaque utilisateur à la recherche de fichiers <code>.cfg</code> contenant le mot clé <strong>[paths]</strong> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#pnote-47-3" id="rev-pnote-47-3">3</a>]</sup> (pour l'instant, le script fonctionne uniquement pour un seul utilisateur). Le tout sera renvoyé à un serveur <a href="http://www.wsgi.org/en/latest/servers.html">WSGI</a>. Par défaut j'utilise <a href="http://pypi.python.org/pypi/waitress">waitress</a> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#pnote-47-4" id="rev-pnote-47-4">4</a>]</sup>, mais si il est absent, le script utilisera le module <a href="http://docs.python.org/library/wsgiref.html">wsgiref</a> (en standard dans Python).</p>
<p>Le serveur WSGI passe par un <em>socket</em> réseau TCP/IP (<em>network socket</em>), c'est à dire qu'il transmet les données à une adresse IP locale (l'adresse de bouclage <em>localhost</em>).</p>
<p>Il nous faut maintenant trouver un moyen pour rediriger l'adresse IP locale (inaccessible depuis « l'extérieur ») vers le serveur (accessible grâce à une adresse IP connue). On parle alors de <em><a href="http://fr.wikipedia.org/wiki/Proxy">proxy</a></em>.</p>
<p>Nginx possède une particularité intéressante, il est capable d'être utilisé comme <em>reverse proxy</em>, c'est à dire on passe par lui pour accéder aux ressources internes.</p>
<h3>Configurer Nginx pour prendre en compte Mercurial</h3>
<p>Nous allons donc utiliser le module <a href="http://wiki.nginx.org/HttpProxyModule">proxy</a>, de plus l'accès au dépôt se fera par l'intermédiaire d'un sous-domaine (<em>vhost</em>).</p>
<p>Vous devez avoir au préalable correctement configuré votre serveur <acronym title="Domain Name System">DNS</acronym>. Pour des tests en local, on peut passer par le fichier <code>/etc/hosts</code>.</p>
<p>On rajoute ces lignes :</p>
<pre>[...]
http {
}
[...]
# Subdomain settings
#
# Mercurial
#
server {
listen 80;
server_name hg.errements.net;
access_log /var/log/nginx/access-hg.log;
location / {
root /srv/www/htdocs/vhosts/hg;
autoindex on;
}
}
[...]
}</pre>
<p>On peut (re)lancer le serveur pour voir que tout fonctionne :</p>
<pre>root@bornem:~# systemctl start nginx.service</pre>
<p>Maintenant, on place notre script <code>hgweb.wsgi</code> dans le répertoire <code>/srv/www/htdocs/vhosts/hg</code>.</p>
<p>On exécute le script et on stoppe le serveur.</p>
<pre>root@bornem:~# systemctl stop nginx.service
root@bornem:~# python /srv/www/htdocs/vhosts/hg/hgweb.wsgi &
serving on http://127.0.0.1:8500</pre>
<p>ll s'agit de l'adresse IP mentionnée (vous pouvez changer le port) dans le script pour qu'il s'exécute. Il faut donc rajouter cette information au fichier de configuration de Nginx.</p>
<pre>[...]
# Subdomain settings
#
# Mercurial
#
server {
listen 80;
server_name hg.errements.net;
access_log /var/log/nginx/access-hg.log;
location / {
root /srv/www/htdocs/vhosts/hg;
autoindex off;
proxy_path http://127.0.0.1:8500;
proxy_set_header Host $host;
}
}
[...]</pre>
<p>On relance le serveur, et on ouvre notre navigateur favori à l'adresse indiquée par <strong>server_name</strong>.</p>
<h3>Automatiser le lancement du programme</h3>
<p>Il va falloir créer un fichier <code>.service</code>, je me suis inspiré de ce <a href="http://forums.opensuse.org/blogs/jdmcdaniel3/systemd-using-after-local-script-opensuse-12-1-71/" hreflang="en">billet</a>, pour écrire le mien.</p>
<p>Dans le fichier <code>/etc/init.d/after-local</code> j'ai rajouté les mêmes lignes que celles tapées en console :</p>
<pre>PYTHON_BIN=/usr/bin/python
NGINX_DIR="/srv/www/htdocs"
NGINX_VHOSTS="$NGINX_DIR/vhosts"
## Mercurial settings (subdomain, hg.)
if [ -e "$NGINX_VHOSTS/hg/hgweb.wsgi" ]; then
$PYTHON_BIN $NGINX_VHOSTS/hg/hgweb.wsgi
fi</pre>
<p>Si l'on veut lancer plusieurs scripts, il faut placer les commandes en « arrière-plan » (on rajoute le caractère <strong>&</strong> à la fin de la ligne).</p>
<p>Le fichier <code>.service</code> qui va exécuter ce programme <em>d'init</em> s'appelle <code>after-local.service</code> (<em>Cf.</em> les pièces jointes).</p>
<pre>root@bornem:~# systemctl start after-local.service</pre>
<p>On peut rajouter ce fichier au répertoire <code>/etc/systemd/system/default.target.wants</code> pour qu'il soit lancé automatiquement au démarrage.</p>
<h2>Cas pratique avec <a href="http://gunicorn.org/" title="Green Unicorn">Gunicorn</a></h2>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/gunicorn-45.png" alt="Logo du serveur WSGI, Gunicorn" style="display:block; margin:0 auto;" title="Gunicorn, serveur WSGI" /></p>
<p>Dans cette dernière partie, nous allons nous intéressé à un serveur WSGI particulier, Gunicorn.</p>
<p>Nous allons supprimer notre premier script (<code>hgweb.wsgi</code>), pour le remplacer par <code>web.py</code> (<em>Cf.</em> pièces jointes). Ce serveur à un mode de fonctionnement <a href="http://gunicorn.org/run.html#gunicorn">particulier</a>.</p>
<p>Ce programme, nous allons l'utilisé comme un « simple module Python » (je ne suis pas sûr à 100%, qu'il soit en mémoire dans <code>sys.path</code>), de ce fait, nous allons créer en plus un fichier <code>__init__.py</code> vide.</p>
<pre>root@bornem:~# touch /srv/www/htdocs/vhosts/hg/__init__.py
root@bornem:~# chown -R nginx:nginx /srv/www/htdocs/
</pre>
<p>On peut lancer le programme et relancer le serveur :</p>
<pre>root@bornem:~# cd /srv/www/htdocs/vhosts ; /usr/bin/gunicorn -p /var/run/gunicorn.pid -g nginx -u nginx -b 127.0.0.1:8500 hg.web:app &
root@bornem:~# systemctl start nginx.service</pre>
<p>Nous sommes obligé de « descendre » dans le répertoire <code>vhosts/</code> car les autres dossiers ne sont pas considérés comme des modules par Python.</p>
<p>On peut passer d'autres paramètres, notamment le nombre de <em>workers</em> (nombre de cœurs de la machine), ou passer par un fichier de configuration.</p>
<h3>Gunicorn et systemd ?</h3>
<p>La difficulté ici, c'est de pouvoir se déplacer dans le dossier souhaité. La lecture de la documentation, <a href="http://0pointer.de/public/systemd-man/systemd.exec.html">systemd.exec</a> nous apprend, qu'il existe une directive <strong>WorkingDirectory</strong>, elle ne peut fonctionner que si le type est <strong>simple</strong>, alors que l'on pourrait s'attendre à mettre <strong>forking</strong>.</p>
<blockquote><p>WorkingDirectory=</p>
<p>
Takes an absolute directory path. Sets the working directory for executed processes.</p></blockquote>
<p>En annexe vous trouverez le fichier <code>gunicorn-hg.service</code>, qui reprend la même commande lancée dans une console avec les spécificités de systemd.</p>
<p>Avec Gunicorn, au lieu de passé par un <em>socket</em> TCP/IP, on peut utiliser un <em>socket</em> unix (ou <em>Berkeley socket</em>), le fichier <code>gunicorn-hg.service</code> devient alors :</p>
<pre>[Unit]
Description=Gunicorn for mercurial
Requires=local-fs.target syslog.target
After=syslog.target local-fs.target
Before=nginx.service
[Service]
Type=simple
PIDFile=/var/run/gunicorn.pid
WorkingDirectory=/srv/www/htdocs/vhosts
ExecStartPre=/bin/echo 'Starting gunicorn (mercurial)'
ExecStart=/usr/bin/gunicorn -p /var/run/gunicorn.pid -g nginx -u nginx -b unix:/tmp/gunicorn.socket hg.web:app
StandardOutput=syslog
StandardError=syslog
KillMode=process
[Install]
#WantedBy=multi-user.target
WantedBy=graphical.target</pre>
<p>Et la partie du serveur :</p>
<pre>[...]
# Subdomain settings
#
# Mercurial
#
server {
listen 80;
server_name hg.errements.net;
access_log /var/log/nginx/access-hg.log;
location / {
root /srv/www/htdocs/vhosts/hg;
autoindex off;
proxy_path http://unix:/tmp/gunicorn.socket;
proxy_set_header Host $host;
}
}
[...]</pre>
<p>J'avoue que dans ce cas, je préfère de loin cette configuration, à celle de passer par le script <code>/etc/init.d/after-local</code>. Je trouve que c'est plus « propre », et on exploite davantage systemd.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#rev-pnote-47-1" id="pnote-47-1">1</a>] Il s'agit d'une « petite image », qui s'affiche dans la barre du navigateur, lorsque l'on consulte une page <acronym title="HyperText Markup Language">HTML</acronym>.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#rev-pnote-47-2" id="pnote-47-2">2</a>] Je vous conseille de lire la <a href="http://0pointer.de/public/systemd-man/systemd.service.html">documentation</a> concernant les fichiers <code>.service</code>.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#rev-pnote-47-3" id="pnote-47-3">3</a>] <em>Cf.</em> la <a href="http://mercurial.selenic.com/wiki/PublishingRepositories#Configuration_of_hgweb">documentation</a></p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2012/01/23/D%C3%A9ployer-Mercurial-%28hg%29-%C2%AB-derri%C3%A8re-%C2%BB-un-serveur-Web-%28Nginx%29-sous-openSUSE#rev-pnote-47-4" id="pnote-47-4">4</a>] Je mets à disposition le fichier <code>python-waitress.spec</code> permettant de construire un RPM (testé uniquement sous openSUSE).</p></div>
Upgrade openSUSEurn:md5:f177743793b26e872b9159889c94c9e62011-11-21T20:14:00+01:002011-11-21T20:56:42+01:00Olivier DuchateauLinuxKDE4LinuxopenSUSETips<p><img src="http://avignu.tuxfamily.org/news-custom/public/opensuse.png" alt="logo openSUSE" style="display:block; margin:0 auto;" title="logo de la distribution linuxienne, openSUSE" /></p>
<p>La dernière version de <a href="http://www.opensuse.org/fr/">openSUSE</a> est sortie le 16 novembre. C'est la distribution Linux que j'utilise actuellement sur mon ordinateur principal.
J'ai profité de ce week-end pour faire la mise à jour.</p>
<p>Je suis reparti complètement de zéro car :</p>
<ul>
<li>le partitionnement ne me convenait plus</li>
<li>j'étais sous <strong>GNOME2</strong> (2.32)</li>
</ul>
<p>Désormais, j'utilise <strong>KDE4</strong>, et je vais pouvoir me consacrer un peu plus à la création de paquets <acronym title="RPM Package Manager">RPM</acronym>.</p>
<p>Dans ce billet, je vais présenter, les principales modifications que j'ai apporté, afin d'avoir un système qui me convienne.</p> <h3>Le partionnement</h3>
<p>Cette étape s'est déroulée lors de l'installation, mais voici le schéma actuel.</p>
<pre> cfdisk (util-linux 2.20.1)
Disk Drive: /dev/sda
Size: 320072933376 bytes, 320.0 GB
Heads: 255 Sectors per Track: 63 Cylinders: 38913
Name Flags Part Type FS Type [Label] Size (MB)
------------------------------------------------------------------------------
Unusable 1.05*
sda1 Primary ext4 [root] 5369.76*
sda2 Boot Primary ext4 [boot] 106.96*
sda3 Primary swap [swap] 1077.94*
sda5 NC Logical ext4 [usr] 37580.97*
Logical Free Space 0.20*
sda6 NC Logical ext4 [home] 275925.25
Logical Free Space 10.84*</pre>
<p>J'ai décidé de « monter » le répertoire <code>/tmp</code> en <strong>ram</strong>. La ligne à rajouter dans son <code>/etc/fstab</code> :</p>
<pre>[...]
tmpfs /tmp tmpfs defaults,noatime,noexec ,nodev,size=256M 0 0</pre>
<p>Pour que ce dossier soit nettoyer à chaque démarrage, j'ai activé la variable <strong>CLEAR_TMP_DIRS_AT_BOOTUP</strong> du fichier <code>/etc/sysconfig/cron</code>.</p>
<h3>Définir un nom pour l'ordinateur</h3>
<p>Le nom par défaut ne me convient pas, pour le changer, il faut modifier le fichier <code>/etc/HOSTNAME</code>. Une autre bonne habitude, consiste également à ajuster le fichier <code>/etc/hosts</code>.</p>
<h3><em>Login</em> automatique</h3>
<p>Je souhaite que la connexion se fasse automatiquement, pour cela il faut lancer <strong>YaST2</strong>. À partir du menu situé à gauche :</p>
<ol>
<li><strong>Sécurité et Utilisateurs</strong></li>
<li><strong>Gestion des groupes et des utilisateurs</strong> (dans le menu central)</li>
<li>On sélectionne un utilisateur → <strong>Options expert</strong></li>
</ol>
<p><a href="http://avignu.tuxfamily.org/news-custom/public/autologin.png" title="Sélection du login automatique au démarrage"><img src="http://avignu.tuxfamily.org/news-custom/public/.autologin_s.jpg" alt="autologin openSUSE" style="display:block; margin:0 auto;" title="Capture d'écran pour activer le login automatique au démarrage" /></a></p>
<p>Comme je dispose d'un clavier <a href="http://fr.wikipedia.org/wiki/Port_PS/2">PS/2</a>, le pavé numérique n'est pas activé, il faut le faire manuellement. On peut y rémédier.</p>
<p>Dans le fichier <code>/etc/sysconfig/keyboard</code>, j'ai activé le <em><strong>numlock</strong></em></p>
<pre>[...]
## Type: list(bios,yes,no)
## Default: bios
#
NumLock on? ("yes" or "no" or empty or "bios" for BIOS setting)
KBD_NUMLOCK="yes"
[...]</pre>
<h3>La gestion des dépôts</h3>
<p>Il faut une nouvelle fois lancer <strong>YaST2</strong>, et choisir <strong>Dépôts de logiciels</strong> (dans le menu principal). Vous pouvez sélectionner des dépôts communautaires, pour ma part, j'ai choisi :</p>
<ul>
<li>devel:languages:python</li>
<li>libdvdcss repository</li>
<li>Packman Repository (pour tout ce qui concerne le multimédia)</li>
</ul>
<p>Manuellement (en précisant l'<acronym title="Uniform Resource Locator">URL</acronym>) :</p>
<p><a href="http://avignu.tuxfamily.org/news-custom/public/vlc-repo.png" title="Ajout du dépôt VLC pour openSUSE"><img src="http://avignu.tuxfamily.org/news-custom/public/.vlc-repo_s.jpg" alt="dépôt openSUSE pour VLC" style="display:block; margin:0 auto;" title="Capture d'écran pour ajouter le dépôt VLC dans YaST2" /></a></p>
<ul>
<li><a href="http://download.videolan.org/pub/videolan/vlc/SuSE/">VLC media player</a></li>
<li>Shell Implementations (pour avoir accès à différent <em>shells</em>, notamment à <a href="https://www.mirbsd.org/mksh.htm">mksh</a>)</li>
</ul>
<p>Ci-dessous la liste complète des dépôts, qui se trouvent dans <code>/etc/zypp/repos.d/</code> :</p>
<pre>[Mises-à-jour-pour-openSUSE-12.1-12.1-1.4]
name=Mises à jour pour openSUSE 12.1 12.1-1.4
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/update/12.1/
path=/
type=rpm-md
keeppackages=0
[Shells]
name=Shells
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/repositories/shells/openSUSE_12.1/
path=/
type=rpm-md
keeppackages=0
[VLC]
name=VLC
enabled=1
autorefresh=1
baseurl=http://download.videolan.org/pub/videolan/vlc/SuSE/12.1/
path=/
type=rpm-md
keeppackages=0
[download.opensuse.org-Extra]
name=openSUSE BuildService - KDE:Extra
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/repositories/KDE:/Extra/openSUSE_12.1/
path=/
type=rpm-md
keeppackages=0
[download.opensuse.org-UpdatedApps]
name=openSUSE BuildService - KDE:UpdatedApps
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/repositories/KDE:/UpdatedApps/openSUSE_12.1/
path=/
type=rpm-md
keeppackages=0
[download.opensuse.org-python]
name=openSUSE BuildService - devel:languages:python
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_12.1/
path=/
type=rpm-md
keeppackages=0
[opensuse-guide.org-repo]
name=libdvdcss repository
enabled=1
autorefresh=1
baseurl=http://opensuse-guide.org/repo/12.1/
path=/
type=rpm-md
keeppackages=0
[packman.inode.at-suse]
name=Packman Repository
enabled=1
autorefresh=1
baseurl=http://packman.inode.at/suse/12.1/
path=/
type=rpm-md
keeppackages=0
[repo-debug]
name=openSUSE-12.1-Debug
enabled=0
autorefresh=1
baseurl=http://download.opensuse.org/debug/distribution/12.1/repo/oss/
path=/
type=NONE
keeppackages=0
[repo-debug-update]
name=openSUSE-12.1-Update-Debug
enabled=0
autorefresh=1
baseurl=http://download.opensuse.org/debug/update/12.1/
path=/
type=NONE
keeppackages=0
[repo-non-oss]
name=openSUSE-12.1-Non-Oss
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/distribution/12.1/repo/non-oss/
path=/
type=yast2
keeppackages=0
[repo-oss]
name=openSUSE-12.1-Oss
enabled=1
autorefresh=1
baseurl=http://download.opensuse.org/distribution/12.1/repo/oss/
path=/
type=yast2
keeppackages=0
[repo-source]
name=openSUSE-12.1-Source
enabled=0
autorefresh=1
baseurl=http://download.opensuse.org/source/distribution/12.1/repo/oss/
path=/
type=NONE
keeppackages=0</pre>
<p>Pour finir une capture d'écran de mon bureau.</p>
<p><a href="https://picasaweb.google.com/duchateau.olivier/SystMesDExploitationLibres#5677539207969469314"><img src="https://lh6.googleusercontent.com/-LWEXuEDM6AI/Tsqr1Clfc4I/AAAAAAAABiw/MhJWjcVtOxw/s128/opensuse-12.1.png" alt="bureau openSUSE 12.1" style="display:block; margin:0 auto;" title="Capture d'écran de mon bureau openSUSE 12.1 sous KDE4" /></a></p>Installation de Dotclear en local, sous openSUSEurn:md5:4f84da0a368b59ffa4e1371c4d467b5a2011-08-13T15:54:00+02:002011-08-23T21:56:59+02:00Olivier DuchateauDocumentationDotclearFastCGILighttpdopenSUSESQLite <p><img src="http://avignu.tuxfamily.org/news-custom/public/opensuse.png" alt="logo openSUSE" style="display:block; margin:0 auto;" title="logo openSUSE" />
<img src="http://avignu.tuxfamily.org/news-custom/public/dotclear-logo.png" alt="logo de Dotclear" style="display:block; margin:0 auto;" title="logo de Dotclear" /></p>
<p>Pour célébrer les <strong><a href="http://fr.dotclear.org/blog/post/2011/08/13/Huit-ans" hreflang="fr">huit</a></strong> ans de <a href="http://fr.dotclear.org/" hreflang="fr">Dotclear</a>, j'en profite donc pour présenter une méthode pour installer ce fabuleux système de blog sur son ordinateur en « <em>local</em> ».</p>
<h3>Pré-requis</h3>
<ul>
<li>Un serveur Web, <a href="http://www.lighttpd.net/" hreflang="en">Lighttpd</a></li>
<li>PHP5 avec le module FastCGI (indispensable) ou <a href="http://php-fpm.org/" hreflang="en">PHP-FPM</a></li>
<li><a href="http://www.sqlite.org/" hreflang="en">SQLite</a> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2011/08/13/Installation-de-Dotclear-en-local%2C-sous-openSUSE#pnote-25-1" id="rev-pnote-25-1">1</a>]</sup> (<strong>installez bien le module PHP pour cette base de données</strong>)</li>
</ul>
<p>Tous ces composants ont été installés via <strong><a href="http://en.wikipedia.org/wiki/ZYpp" hreflang="en">zypper</a></strong> (vous pouvez très bien passer par <strong>Yast2</strong>).</p>
<h3>Régler le <em>daemon</em></h3>
<p>Comme il s'agit de mon ordinateur de bureau, je n'ai pas l'intention de le lancer à chaque démarrage, il sera utilisé ponctuellement.</p>
<pre>
# chkconfig --list | grep lighttpd
lighttpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
</pre>
<p>On constate qu'il est activé lorsque le système est en mode <em>multi-users</em> (numéros 3 et 5).</p>
<p>Nous allons donc désactiver ce service</p>
<pre>
# chkconfig --del lighttpd
# chkconfig --list | grep lighttpd
lighttpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
</pre>
<p>Désormais, on le lancera de cette manière :</p>
<pre>
# /etc/init.d/lighttpd start
</pre>
<h3>Configuration du serveur</h3>
<p>Dans cette partie, nous allons modifier (légèrement) le comportement par défaut de Lighttpd.</p>
<p>Le fichier principale s'appelle <code>lighttpd.conf</code>, il est situé dans <code>/etc/lighttpd</code>.</p>
<p>J'ai modifié la valeur des variables <strong>server_root</strong> , <strong>server.use-ipv6</strong> et <strong>server.bind</strong>.</p>
<pre>[...]
var.server_root = "/usr/www"
[...]
##
## Use IPv6?
##
server.use-ipv6 = "disable"
##
## bind to a specific IP
##
server.bind = "127.0.0.1"
[...]
</pre>
<p>Il reste à créer les répertoires <code>/usr/www/htdocs</code> :</p>
<pre>
# mkdir -p /usr/www/htdocs
# cd /usr/www ; chown -R lighttpd:lighttpd .
</pre>
<p>Ensuite, on va autoriser le <em>listing</em> des répertoires situés dans <strong>server_root</strong>, il faut modifier le fichier <code>/etc/lighttpd/conf.d/dirlisting.conf</code></p>
<pre>[...]
##
## Enabled Directory listing
##
dir-listing.activate = "enable"
##
## Hide dot files from the listing?
## By default they are listed.
##
dir-listing.hide-dotfiles = "enable"
</pre>
<p>Pour une question de facilité, on va activer le module <strong>userdir</strong>, il faut décommenter la ligne correspondante dans le fichier <code>/etc/lighttpd/modules.conf</code> :</p>
<pre>
[...]
##
## mod_userdir
##
include "conf.d/userdir.conf"
[...]
</pre>
<p>Vous pouvez activer la variable <strong>userdir.exclude-user</strong> dans le fichier <code>/etc/lighttpd/conf.d/userdir.conf</code></p>
<pre>
[...]
userdir.exclude-user = ( "root" )
[...]
</pre>
<p>Il nous reste plus qu'à créer le dossier <code>public_html/</code> pour chaque utilisateur.</p>
<pre>
% mkdir ~/public_html
</pre>
<p>Vous pouvez maintenant tester le serveur.</p>
<h3>PHP</h3>
<p>Nous allons utilisé PHP avec le module <a href="http://fr.wikipedia.org/wiki/FastCGI" hreflang="fr">FastCGI</a>.</p>
<p>On va rechercher le nom exacte de ce binaire :</p>
<pre>
% ls /usr/bin/php* | grep cgi
/usr/bin/php-cgi **
/usr/bin/php-cgi5
</pre>
<p><strong>**</strong> : Il s'agit d'un lien symbolique vers <code>/etc/alternatives/php-cgi</code>, donc on l'oublie (vérifiez tout de même avec <code>ls -l /usr/bin/php-cgi*</code>).</p>
<p>On va rajouter ce module au démarrage du serveur, grâce au fichier <code>/etc/lighttpd/modules.conf</code></p>
<pre>
[...]
##
## FastCGI (mod_fastcgi)
##
include "conf.d/fastcgi.conf"
[...]
</pre>
<p>Il ne nous reste plus qu'à rajouter une directive dans le fichier <code>/etc/lighttpd/conf.d/fastcgi.conf</code> :</p>
<pre>
[...]
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => socket_dir + "/php-fastcgi-0.socket",
"bin-path" => "/usr/bin/php-cgi5",
"max-procs" => 1,
"check-local" => "disable"
)
)
)
[...]
</pre>
<p>On peut relancer notre serveur.</p>
<p>Ici on utilise un <em>socket UNIX</em>, mais on peut très bien utiliser un <em>socket</em> utilisant la pile TCP/IP.</p>
<h3>Installation de Dotclear</h3>
<p>1. Téléchargez et installez le dans le dossier <code>public_html/</code>.</p>
<p>2. Il faut rendre accessible en écriture le répertoire <code>cache/</code> :</p>
<pre>
% chmod a+w dotclear/cache
</pre>
<p>3. On va créer le « fichier » de la base de données (uniquement pour SQLite)</p>
<pre>
% touch db/database.db ; chmod a+w db/database.db
% chmod a+w db/
</pre>
<p>Vous pouvez donner un autre nom, ceci est un exemple.</p>
<p>4. On copie le fichier <code>inc/config.php.in</code> en <code> inc/config.php</code> et on l'édite. Les variables à modifier sont :</p>
<ul>
<li>DC_DBDRIVER</li>
<li>DC_DBNAME (mettre le chemin complet depuis la racine du fichier du §3)</li>
<li>DC_MASTER_KEY</li>
</ul>
<p>On termine l'installation en faisant pointer notre navigateur vers http://127.0.0.1/dotclear/admin/install/</p>
<h3>Finaliser la configuration du serveur</h3>
<p>On va empêcher le <em>listing</em> de la base de données, dans le fichier <code>/etc/lighttpd/conf.d/dirlisting.conf</code> on va rajouter une expression régulière à la variable <strong>dir-listing.exclude</strong> :</p>
<pre>
[...]
##
## list of regular expressions. Files that match any of the specified
## regular expressions will be excluded from directory listings.
##
dir-listing.exclude = ( "~$", ".+\.db$" )
[...]
</pre>
<p>On va également interdir l'accès (depuis un navigateur) aux répertoires <code>dotclear/db/</code> et <code>dotclear/admin/install/</code>. Pour cela il faut activer le module, <strong>mod_access</strong> (via le fichier <code>/etc/lighttpd/modules.conf</code>).</p>
<p>Dans le fichier <code>/etc/lighttpd/lighttpd.conf</code> on rajoute ces lignes :</p>
<pre>
[...]
##
## deny access to dotclear/db/ and dotclear/admin/install/
$HTTP["url"] =~ "(/db/|/install/)" {
url.access-deny = ( "" )
}
</pre>
<p>On va empêcher le <em>listing</em> du répertoire <code>public/</code>, où sont stockés les médias tels que les images, les vidéos, etc. Dans le fichier <code>/etc/lighttpd/conf.d/dirlisting.conf</code> on rajoute ces lignes :</p>
<pre>
[...]
##
## Disable listin into public/ directory
$HTTP["url"] =~ "/public/" {
dir-listing.activate = "disable"
}
[...]
</pre>
<p>Maintenant vous pouvez passer des heures à configurer votre blog.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2011/08/13/Installation-de-Dotclear-en-local%2C-sous-openSUSE#rev-pnote-25-1" id="pnote-25-1">1</a>] Je n'avais pas envie de passer du temps à configurer MySQL ou PostgreSQL.</p></div>