C'est un brouillon pour installer daCode, pas à pas... Ce document propose de mettre en oeuvre daCode en explorant en détail chaque étape. Chapitre 1 : installer daCode sur localhost daCode est une application Web basée sur un langage de scripts (PHP) et une base de données (MySQL ou PostgreSQL, peut-6tre d'autres ultérieurement). Les applications Web sont un peu particulières à installer. Il faut récupérer un package, mettre en place des scripts et faire une initialisation de la base de données. C'est une logique assez différente d'un logiciel `normal', mais en utilisant le bon outil, c'est très facile. Le bon outil, c'est CVS. CVS permet de synchroniser les fichiers avec la base centrale, ce qui vous permettra de mettre à jour votre daCode de manière transparente et aussi de participer au développement. daCode bouge beaucoup. Ce doit être assez général pour les applications Web. Vous avez intérêt de prévoir des mises à jour fréquentes. Se lancer dans CVS est un bon investissement. Avant de commencer à installer daCode, on va préparer un petit nid douillet pour daCode et vérifier que tout est en place. On peut créer un utilisateur spécifique `dacode' si on veut bien séparer ces fichiers du reste. C'est pratique pour les sauvegardes et le nettoyage. Mais si vous avez un login perso, il est tout aussi faisable de l'utiliser. Moi j'utilise un login perso, mais pour rediger ce papier j'ai pris l'autre methode: # adduser dacode # su - dacode $ passwd Vous utiliserez ce login pour faire des modifs sur daCode : soit des mises à jours, soit du développement. Maintenant, on va vérifier que votre config est bonne. Chez moi, je procède ainsi: $ mysql -V mysql Ver 9.38 Distrib 3.22.32, for pc-linux-gnu (i686) $ cvs -v Concurrent Versions System (CVS) 1.10.8 (client/server) $ mkdir public_html $ echo "" > public_html/test.php3 $ netscape http://localhost/~dacode/test.php3 Si Netscape n'affiche rien, commencez par soupconner un problème de droits d'accès et corrigez-le avec `chmod o+rx'. Apache va avoir besoin de lire vos fichiers et de parcourir vos répertoires: $ ls -l ~dacode | grep public_html ### ca c'est OK drwxr-xr-x 2 dacode dacode 4096 jan 3 22:50 public_html/ $ ls -l ~dacode/.. | grep dacode ### ca c'est pas bon drwx------ 8 dacode dacode 4096 jan 3 22:52 dacode/ $ chmod o+rx ~dacode $ ls -l ~dacode/.. | grep dacode ### là c'est mieux drwx---r-x 8 dacode dacode 4096 jan 3 22:52 dacode/ Si Netscape ne marche pas mieux, maintenant, vous avez un pépin avec apache ou PHP. Ouille :( Si ca marche, regardez dans les infos la version de PHP et la présence des Extensions MySQL et Apache. On pourra en avoir besoin plus tard s'il y a des problèmes. Chez moi : php 3.0.16 , mysql 3.22.32 , apache 1.3.12 config Mandrake 7.1 de base. Ca existe les vieilles Mandrake! :p Faites chauffer le modem, on va récuperer daCode. Choisissez votre stratégie. Si c'est juste pour voir la tête que ca donne, passez par le `snapshot quotidien' qui est construit toutes les nuits. Si vous pensez que le virus de daCode risque de vous attraper, il vous faudra bien un jour ou l'autre passer par le CVS. * le tgz : $ wget http://perso.linuxfr.org/penso/daCode.tar.gz * le CVS : $ cvs -d:pserver:anonymous@cvs.dacode.sourceforge.net:/cvsroot/dacode login CVS password : [tapez ENTREE] $ cvs -z3 -d:pserver:anonymous@cvs.dacode.sourceforge.net:/cvsroot/dacode co daCode Puis vous pouvez laisser reposer le modem. Par rapport au tgz, le CVS parait rebutant au premier abord mais il ne faut pas s'y fier: a) ca vous évite d'avoir à taper le `tar zxvf daCode.tar.gz' b) Ne vous souciez plus du password, ni des URLS, ni des logins. Plus rien de tout cela ne sera demandé ensuite. Il aura suffi de faire du copier/coller pour cette première récupération. Quelle que soit la methode, on se retrouve avec cette arborescence (elle peut être légèrement différente, suivant les développements de daCode) : $ tree -d daCode | grep -v CVS daCode |-- doc | |-- html | |-- script | |-- sgml | |-- txt | `-- xml `-- src |-- htdocs | |-- admin | |-- board | |-- comments | |-- images | | `-- section | |-- messages | |-- news | |-- pda | |-- poll | |-- themes | | |-- daweb | | | `-- images | | |-- kde2 | | | `-- images | | |-- linuxfr | | | `-- images | | |-- phpnukeopenmind | | | `-- images | | | `-- section | | |-- slashdot | | | `-- images | | | `-- section | | `-- wm | | `-- images | |-- users | |-- w | |-- wap | `-- webcam `-- phplib `-- themes |-- daweb |-- kde2 |-- linuxfr |-- lynx |-- phpnukeopenmind |-- printable |-- slashdot `-- wm C'est maintenant que les choses sérieuses vont commencer. Comme on a décidé de publier sur le web, on va avoir besoin d'un petit coup de pouce de Root. Autant Le prévenir tout de suite. Après Lui avoir offert une Guinness, demandez-lui gentiment: * une base de données pour stocker vos infos. Pour la base de données, l'Administrateur n'a pas besoin de se connecter en root car MySQL sait identifier root avec son mot de passe MySQL. [operator]$ mysql_setpermission -u root Password for user root to connect to MySQL: ****** ###################################################################### ## Welcome to the permission setter 1.2 for MySQL. ## made by Luuk de Boer ###################################################################### What would you like to do: 1. Set password for a user. 2. Add a database + user privilege for that database. - user can do all except all admin functions 3. Add user privilege for an existing database. - user can do all except all admin functions 4. Add user privilege for an existing database. - user can do all except all admin functions + no create/drop 5. Add user privilege for an existing database. - user can do only selects (no update/delete/insert etc.) 0. exit this program Make your choice [1,2,3,4,5,0]: 2 Which database would you like to add: dabase The new database dabase will be created What username is to be created: daiouser Username = daiouser Would you like to set a password for [y/n]: y What password do you want to specify for : dapass Type the password again: dapass We now need to know from what host(s) the user will connect. Keep in mind that % means 'from any host' ... The host please: localhost Would you like to add another host [yes/no]: no Okay we keep it with this ... The following host(s) will be used: localhost. ###################################################################### That was it ... here is an overview of what you gave to me: The database name : dabase The username : daiouser The host(s) : localhost ###################################################################### Are you pretty sure you would like to implement this [yes/no]: yes Okay ... let's go then ... Root doit vous communiquer ces indications: le nom de la base, le nom du user, le mot de passe. Maintenant le travail de Root est terminé, on revient à notre login Unix `dacode' auquel Il a transmis les indications. En fait, on va s'empresser de les oublier, mais auparavant on va les inscrire dans un fichier de configuration de daCode que vous devez impérativement créer: $ cat daCode/config.site sql_host = "localhost"; $this->sql_user = "daiouser"; $this->sql_passwd = "dapass"; $this->sql_db = "dabase"; $this->basehref = "http://exosmose.localdomain/~dacode/daroot"; $this->name = "Test daCode"; $this->titledefault = "Un forum, des fora"; ?> Tant que vous y êtes, remplacez exosmose.localdomain par votre propre machine. $ uname -n exosmose.localdomain Mais laissez tomber `basehref'. On verra cela plus loin. Avant d'oublier votre mot de passe, ca serait bien de mettre le nez dans le cambouis pour voir si ca marche. $ mysql dabase -udaiouser -pdapass mysql> create table matable (madate date); Query OK, 0 rows affected (0.00 sec) mysql> insert into matable values (now()); Query OK, 1 row affected (0.00 sec) mysql> show tables; +------------------+ | Tables in dabase | +------------------+ | matable | +------------------+ 1 row in set (0.00 sec) mysql> describe matable; +--------+------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------+------+-----+---------+-------+ | madate | date | YES | | NULL | | +--------+------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from matable; +------------+ | madate | +------------+ | 2001-01-04 | +------------+ 1 row in set (0.00 sec) ### Ca a l'air de marcher, on fait le menage: mysql> drop table matable; Query OK, 0 rows affected (0.00 sec) mysql> show tables; Empty set (0.00 sec) mysql> exit Bye Vous vous souvenez toujours du mot de passe ? Chouette! Modifiez daCode/sql/dacode.mysql à la ligne : INSERT INTO users (id,login,passwd,level,email) VALUES ('2', 'admin','X','6291456','root'); et remplacez root par votre adresse email. Créez vos tables grace au script SQL qu'on trouve bizarrement dans doc/ : $ mysql dabase -vvv -udaiouser -pdapass < daCode/sql/dacode.mysql Il est possible que daCode fournisse plus tard un autre fichier `dump.sql' qui contiendrait des exemples, pour accélerer les tests. L'installation de ce script sera similaire. Vous vous souvenez de config.site ? On trouvait cela dedans : $this->basehref = "http://exosmose.localdomain/~dacode/daroot"; Cela indique la racine de l'arborescence de l'application daCode. Afin de faciliter l'installation, nous allons utiliser un lien symbolique: $ cd /home/dacode/public_html $ ln -s /home/dacode/daCode/src/htdocs daroot Dans la mesure où vous avez les droits unix, vous pouvez changer votre vision Apache a volonté. Vous choisissez `basehref' comme vous voulez, puis vous placez `daroot' la ou Apache va aller le chercher. Nous allons étudier quelques cas, mais avant cela déplaçons notre lien afin que la suite soit plus lisible: $ mv daroot /tmp/ Monsieur Bidule souhaite récuperer daCode chez lui ? $this->basehref = "http://exosmose.localdomain/~bidule/daroot"; $ cp -va /tmp/daroot ~bidule/public_html/ Monsieur Bidule veut changer l'appellation ? $this->basehref = "http://exosmose.localdomain/~bidule/phpnuke"; $ cd ~bidule/public_html/ && mv daroot phpnuke Monsieur Bidule veut faire une place centrale a daCode ? $this->basehref = "http://exosmose.localdomain/~bidule"; $ cd ~bidule $ mv public_html public_html.old $ cp -va /tmp/daroot ./ $ mv daroot public_html Maintenant que basehref est positionnée comme vous le souhaitez, il reste à générer un fichier de configuration qui prenne vos données en compte. Pour cela, vous pouvez copier daCode/src/phplib/config.sample dans daCode/src/phplib/config.php3 et remplacer dans ce fichier les variables définies dans daCode/config.site. Une autre solution consiste à se placer dans le répertoire daCode et taper $ make reconf qui automatise cette étape. Vous pouvez maintenant consulter daCode: $ netscape [le basehref que vous avez défini dans config.site] C'est l'instant crucial. Ca peut marcher nickel, ou bien sur trois pattes ou bien pas du tout. Ne paniquons pas. Qu'avons nous sous la main pour comprendre ce qui se passe ? * la liste de diffusion dacode-dev@linuxfr.org * confrontez vos résultats aux serveurs daCode qui tournent: - http://linuxfr.org (n'est pas une machine de test) - http://www.dacode.org - http://demo.dacode.org * le script php qui affiche la config sur laquelle repose daCode. Si vous avez une config exotique (= qu'on n'a jamais vue) il faudrait arriver à nous la décrire. * Apache peut planter pour des raisons d'extensions, pour des problemes de droits d'accès unix, parce qu'il interdit les liens symboliques. Généralement le message d'erreur est explicite. * les commandes SQL peuvent être loggées dans un fichier (variable $this->sql_logfile dans config.php3) * ca peut etre utile d'avoir sous les yeux l'arborescence de daCode. Vous pourrez suivre les URLs : $ cd /tmp/daroot/ $ tree -P "*php3" | grep -v CVS . |-- admin | |-- index.php3 | |-- mod.php3 | |-- modpoll.php3 | |-- modusers.php3 | |-- tip_section_add.php3 | |-- topics_add.php3 | |-- topics_edit.php3 | `-- viewfile.php3 |-- board | |-- add.php3 | |-- index.php3 | `-- info.php3 |-- comments | |-- add.php3 | |-- index.php3 | |-- score.php3 | |-- thread.php3 | `-- view.php3 |-- dacode.php3 |-- gen.php3 |-- images | `-- section |-- index.php3 |-- messages | |-- add.php3 | |-- post.php3 | `-- view.php3 |-- news | |-- send_email.php3 | |-- send_email_view.php3 | `-- view_modero.php3 |-- pda | |-- index.php3 | `-- news.php3 |-- poll | |-- index.php3 | `-- new.php3 |-- redirect.php3 |-- search.php3 |-- short-rss.php3 |-- short.php3 |-- submit.php3 |-- themes | |-- daweb | | `-- images | |-- kde2 | | `-- images | |-- linuxfr | | `-- images | |-- phpnukeopenmind | | `-- images | | `-- section | |-- slashdot | | `-- images | | `-- section | `-- wm | `-- images |-- users | |-- index.php3 | |-- login.php3 | |-- modpasswd.php3 | |-- myposts.php3 | |-- password.php3 | `-- settings.php3 |-- view_attach.php3 |-- w | `-- news.php3 |-- wap | |-- index.php3 | `-- news.php3 `-- webcam |-- image.php3 |-- submit.php3 |-- webcam_admin.php3 `-- webcam_change.php3 * les scripts peuvent planter pour de nombreuses raisons de plantages. ;) Les méchants bugs bloquants ne trainent pas trop dans daCode parce qu'on n'a qu'une version de développement et qu'il faut impérativement qu'on puisse travailler dessus. Si un patch provoque un bug bloquant, on va vite s'en apercevoir, on découvrira vite d'ou ça vient, et on décidera vite de ce qu'on fait : le corriger si c'est facile, ou bien abandonner le patch qui l'a introduit. Il faut de la stabilité parce qu'il y a des sites comme LinuxFR qui s'appuient sur daCode. Le vôtre aussi, peut-être. Les petits bugs gentils, les warnings, les boites pas alignées, le code source html bancal, les icones moches, les docs sans accents avec pleins de fôtes, etc. sont légions. On les a mis là exprès pour vous embêter. Le but inavouable est de vous torturer psychologiquement jusqu'à ce que vous soumettiez un patch. * si on découvre un bug, on le corrige dans le CVS. ce qui permet a tout le monde de mettre à jour sa config facilement: [allumer le modem] $ cvs update -d -P [éteindre le modem] recommencer les tests... -*- Chapitre 2 : Après ça, on va voir comment faire quelques tests pour s'assurer que les modules essentiels sont fonctionnels. -*- Chapitre 3 : observer le fonctionnement du serveur A. Le cache Le cache de dacode permet de stocker des fragments HTML dans le but d'éviter de faire des appels dynamiques PHP et MySQL. Ces appels sont coûteux et doivent être évités dans la mesure du possible. Deux types de fragments sont cachés: les boites et les pages. Une page est un document Html complet, alors qu'une boite est un bout de Html qui est inséré dans un document généré par daCode. Nous allons séparer ces deux aspects: $ mkdir dacache $ mkdir dacache/boxes dacache/pages Le cache est géré par Apache. Il faut que celui ci puisse écrire et lire dans le cache. Pour l'instant, on donne des droits suffisants. On affinera plus tard... $ chmod o+rwx dacache/boxes/ dacache/pages/ Il nous faut rajouter dans le `config.site' nos emplacements: $ grep cache daCode/config.site $this->cachedir = "/home/dacode/dacache/boxes/"; $this->htmldir = "/home/dacode/dacache/pages/"; $ cd daCode; make reconf va recréer le fichier daCode/src/phplib/config.php3 Maintenant, le cache est opérationnel. Si vous faites appel à votre site daCode, les répertoires vont se remplir de fichiers petit à petit. Il n'y a pas d'intervention particulière de maintenance à prévoir. Les noms de fichiers ressemblent à ceci: $ ls dacache/* dacache/boxes: backends_agenda--.,0.html dacode_dacode--,0.html.1.0. backends_kernel--.,0.html sidebox_topics--,0.html.1.0. dacache/pages: index,0,1,0.html L'entête (backend_agenda) décrit quel est le script qui est à l'origine de la création de ce fichier de cache. Les suffixes sous forme de chiffres , séparés par des points ou des virgules représentent un Profil d'utilisateur. - Un utilisateur anonyme - Un utilisateur ayant choisi le theme Slashdot - Un utilisateur ayant choisi le theme Defaut et [un autre truc]. (TODO) Deux remarques: - Plus les profils auront d'options, plus le cache devra créer de fichiers. - Vous pouvez peut être trouver commode de vous représenter les profils comme étant une partie de la base de données de daCode stockée dans les cookies sur les navigateurs et auquel daCode accède grace à la classe PHP `Session'. Cette représentation est en grande partie erronée, mais je la trouve utile pour comprendre le fonctionnement du serveur avec un niveau d'abstraction élevé. B. Les processus C. Les logs $ cat /tmp/dacode-sqllog D. La base MysQL descriptions des tables -*- Chapitre 4 : mise en production On va créer un petit comité de pilotage pour cette mise en production. Qui trouvons nous ? - apache (httpd) C'est le daemon qui est chargé de délivrer les pages. il collabore avec PHP et MySQL pour accomplir son job. - dacode Il se charge du debugging et de la mise a jour du code, de l'installation des nouvelles versions. Sa tache n'est pas facile et il a intérêt à disposer d'une machine a part pour tester les versions de développement, à bien comprendre son code, et à maitriser CVS. - dagraf C'est le graphiste de l'équipe. il s'occupe du design, des themes, il crée aussi les topics. Il devrait collaborer étroitement avec `dacode' et il serait utile de leur créer un groupe en commun. - Root Il s'occupe de la bonne marche du site. il affecte les droits de chacun des utilisateurs de maniere a ce que personne ne marche sur les pieds des autres. il est chargé de la sécurité et il devraient donc controler les scripts et vérifier que le fonctionnement quotidien du site ne nuit pas aux ressources du serveur. (controle du cache, des process, de l'occupation RAM, backups, logs). Root blinde les droits. /* TODO * a relire, * a tester, * faire un script */ # grep dacode /etc/group dacode:x:508:dacode,dagraf # tree -gifpu ~dacode [drwx------ dacode root ] /home/dacode/daCode [drwx------ root root ] /home/dacode/dacache [drwx------ apache root ] /home/dacode/dacache/boxes [drwx------ apache root ] /home/dacode/dacache/pages [-r-------- apache root ] /home/dacode/daCode/src/phplib/config.site [lrwxrwxrwx root root ] /home/dacode/daroot -> /home/dacode/daCode/src/htdocs [drwx------ dacode root ] *CVS* [drwxr-xr-x dacode root ] /home/dacode/daCode/src [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs [drwxr-xr-x dacode root ] /home/dacode/daCode/src/phplib [drwxr-xr-x dacode dacode ] /home/dacode/daCode/doc [drwxr-xr-x dacode dacode ] /home/dacode/daCode/doc/html [drwxr-xr-x dacode dacode ] /home/dacode/daCode/doc/script [drwxr-xr-x dacode dacode ] /home/dacode/daCode/doc/sgml [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/htdocs/images [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/htdocs/images/section [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/htdocs/images/themes [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/htdocs/images/themes/slashdot [-rw-r--r-- dagraf dacode ] /home/dacode/daCode/src/htdocs/slashdot.css [-rw-r--r-- dagraf dacode ] /home/dacode/daCode/src/htdocs/style.css [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/phplib/themes [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/phplib/themes/default [drwxr-xr-x dagraf dacode ] /home/dacode/daCode/src/phplib/themes/slashdot [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/admin [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/board [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/comments [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/messages [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/news [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/poll [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/users [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/w [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/wap [drwxr-xr-x dacode root ] /home/dacode/daCode/src/htdocs/webcam -*- Chapitre 5 : Code Fréquemment Réutilisé On regarde ensuite un peu plus en detail: la doc, la difference entre htdocs et phplib, les themes, l'i18n, les sessions et les cookies.