Journal Contribuer à LinuxFr : étape 1 - installation du site

Posté par . Licence CC by-sa
62
7
nov.
2012

Bonjour,

J'ai tendance à utiliser régulièrement la recherche du site. Je trouve qu'il regorge d'informations intéressantes, aussi bien sur les nouveautés, les astuces sur l'utilisation de programmes, la programmation et le choix de logiciel (il y a toujours dans les commentaires les programmes équivalent à celui présenté).
Par contre il faut avouer que la recherche est très peu pratique: les résultats sont là mais il n'est pas possible de filtrer facilement, de voir la chaîne recherchée, connaître le nombre de résultat …

Il y a d'ailleurs deux entrées dans le suivi à ce sujet qui datent un peu et n'ont pas l'air d’intéresser grand monde. :

Je décide donc, ayant un peu de temps, de voir si je peux faire un ou deux petits patch pour corriger tout ça.
Je précise que je n'ai pas d’expérience dans l'utilisation de ROR mis à part l’installation de Redmine/ChiliProject et une petite correction de code dans Redmine (un pb dans le mailer pour les notifications).

Les commentaires que j'ai pu lire sur l'installation du site avaient tendance à dire que c'était plutôt compliqué.
Je cherche donc un peu partout sur le site, en particulier dans le wiki et le résultat est plutôt maigre (Organisation Code LinuxFr). Aucunes informations à première vu sur l'installation d'un environnement de développement.
Après un bon moment ou je galère à trouver des infos, j'ai l'idée (un peu tardive il faut avouer) de télécharger les sources du site, et là je trouve mon bonheur, un fichier readme bien complet !
Il serait intéressant de copier ce readme dans le wiki ou au moins de le mettre en lien.

Vu le nombre de truc à installer, je décide de faire ça dans une vm. Et puis on sait jamais cela pourrait peut être servir à d'autre.

Je crée donc une machine virtuelle sous VirtualBox et y installe une debian whezy standard (c'est l'iso que j'avais sous la main).
Ensuite on suit tout simplement le manuel.

1) First install some Debian packages:

    # aptitude install mysql-server mysql-client libmysql++-dev
    # aptitude install build-essential openssl libreadline6 libreadline6-dev
    # aptitude install curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev
    # aptitude install libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev bison
    # aptitude install libxslt-dev autoconf libc6-dev ncurses-dev automake libtool
    # aptitude install imagemagick hunspell hunspell-fr subversion
    # aptitude install openjdk-6-jdk

Pas de problèmes de ce coté la, tout se passe correctement. Il manque par contre une dépendance (tcl8.5) qui sera nécessaire plus tard.
 

2) Configure the database:

    # mysql -p -u root
    <enter your root password for mysql>
    > CREATE DATABASE linuxfr_rails;
    > GRANT ALL PRIVILEGES ON linuxfr_rails.* TO "linuxfr_rails"@"localhost";
    > QUIT;
    (return to user)

    Statistics need time zone at SQL level. You'll need to population time_zone* tables.
    # mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -p -u root mysql

Pas de problèmes là non plus.
 

3) Install and start redis:

    $ wget "http://redis.googlecode.com/files/redis-2.4.2.tar.gz"œ
    $ tar xzf redis-2.4.2.tar.gz
    $ cd redis-2.4.2
    $ make
    (optional, takes about ten minutes, $ make test )
    $ src/redis-server redis.conf

Les problèmes commencent :

  • il manque tclsh, il faut installer le paquet tcl8.5

  • J'ai un gros message où il m'indique de rajouter "vm.overcommit_memory = 1" au fichier /etc/sysctl.conf :
    WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    Je m’exécute , plus de message d'erreur. Par contre je ne sais pas du tout à quoi cela correspond.

  • Lors du lancement du serveur redis, on ne récupère pas la main et ça crache des lignes de log à tour de bras. Je regarde donc pour le mettre en service et enregistrer tout ça dans des log.
    En cherchant un peu je trouve cette page et crée un fichier d'init

#!/bin/sh

### BEGIN INIT INFO
# Provides:          redis
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts redis database system
# Description:       starts redis using basic start scripts
### END INIT INFO

PATH=/opt/redis-2.4.2/src:/sbin:/bin:/usr/sbin:/usr/bin
NAME=redis
PIDFILE=/var/run/$NAME.pid

test -x $DAEMON || exit 0

set -e

case "$1" in
  start)
        echo -n "Starting $DESC: "

        start-stop-daemon --start --pidfile $PIDFILE \
            --startas /opt/redis-2.4.2/src/redis-server -- /opt/redis-2.4.2/redis.conf

        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "

        start-stop-daemon --stop --exec /opt/redis-2.4.2/src/redis-server -- /opt/redis-2.4.2/redis.conf

        echo "$NAME."
        ;;
      *)    
            N=/etc/init.d/$NAME
            echo "Usage: $N {start|stop}" >&2
            exit 1
            ;;
    esac

    exit 0

J'apporte également quelques modifications au fichier de configuration de redis :

daemonize yes
bind 127.0.0.1
loglevel notice
logfile /var/log/redis.log

Le lien ci-dessus spécifie un utilisateur pour rédis, cela ne fonctionne pas chez moi, le serveur se lance bien mais ensuite il a un problème de droit lorsqu'il a besoin de sauvegarder. Je le laisse donc en root, installé dans /opt (je me dis que sur une vm, on s'en fout un peu … j'ai peut être tort! )
 

4) Install RVM (more details on https://rvm.beginrescueend.com/rvm/install/ ):

    $ bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

   And follow the instructions.

Pas de soucis pour cette étape.
 

5) Install Ruby with RVM:

    $ rvm install 1.9.3
    $ rvm use --default 1.9.3

Pas de soucis non plus
 

6) Clone the repository, configure and install gems:

    $ git clone git://github.com/nono/linuxfr.org.git
    $ cd linuxfr.org
    $ cp config/database.yml{.sample,}
    $ cp config/secret.yml{.sample,}
    $ gem install bundler rake
    $ bundle install

Pas de soucis. il faut aller modifier le fichier database.yml pour mettre le bon utilisateur et mot de passe mysql.
 

7) Launch elasticsearch:

    $ desi install
    $ desi start

Pas de soucis, par contre cela ne rend pas la main. J'ai essayé de le mettre en service à l'aide de ce tutorial, cela lance bien elasticsearch mais ne fonctionne pas par la suite avec le site.
Completed 500 Internal Server Error in 39ms
Tire::Search::SearchRequestFailed (404 : {"error":"IndexMissingException[[diaries] missing]","status":404}):

Il manque à mon avis des variables d'environnement probablement liées au fichier de config elasticsearch.yml mais je n'ai pas trouvé de solution.
 

8) Finish to configure:

    $ rake db:setup
    (if you're updating, you'll need an other step: redis-cli flushdb)

La version de libhunspell n'est pas la bonne, il me demande la 1.2 et j'ai la 1.3 : je tente de faire un lien symbolique tout simplement : ln -s /usr/lib/x86_64-linux-gnu/libhunspell-1.3.so.0 /usr/lib/x86_64-linux-gnu/libhunspell-1.2.so.0
Cela fonctionne !
 

9) Let's run it:

    $ bundle exec rails server thin
    $ x-www-browser http://127.0.0.1:3000/

Cela fonctionne !! J'ai un beau site LinuxFr qui s'affiche, par contre il n'y a rien, le site est vide.
 

10) Create an admin account:

    * Create an account
    * Get confirmation link in the console and confirm the account
    * Get password in the console
    * Give admin role to this account with
      `mysql linuxfr_rails`
      `mysql> UPDATE accounts SET role='admin' WHERE login='xxxxxx';`
    * Reload the page on the site, you should be admin.

Le lien de confirmation affiché dans les logs ne fonctionne pas (pb d'encodage de l'url je pense), je le récupère directement dans la base de données (table accounts).
Je ne vois pas de mot de passe dans les logs, je vais sur "mot de passe oublié", récupère le lien dans les logs, puis le code dans la base (même problème que précédemment avec le lien) et je peux changer mon mot de passe.
Je passe mon compte en admin directement dans la base.
 
 

Voila c'est finit ! Le site fonctionne correctement et j'ai un utilisateur administrateur valide !
Il faut avouer que tout ça est un peu long et cela doit vraiment décourager les gens qui souhaitent contribuer.

J'aimerai partager cette VM, histoire de permettre à tout le monde de contribuer facilement.
Il me reste donc à faire (avec votre aide) :
- mettre elasticsearch en tant que service (desi start)
- mettre le lancement du site en service (bundle exec rails server thin) avec les logs au bon endroit
- générer un jeux de données de démonstration
- plein d'autres choses que j'ai pas du bien faire ou qu'il manque et que vous ne manquerez pas de m'indiquer
 
 

ps: le site fonctionne correctement, par contre j'ai une erreur (No route matches [POST] "/b/3d072a245074a27d64426f9fd81f6600de204893") qui revient tout le temps dans les logs, je ne vois vraiment pas d'où ça vient :

Started GET "/journaux" for 192.168.1.57 at 2012-11-07 06:42:09 +0100
Processing by DiariesController#index as HTML
  Account Load (0.9ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 2 LIMIT 1
  Rendered shared/_order_navbar.html.haml (3.8ms)
   (1.6ms)  SELECT COUNT(*) FROM `nodes` WHERE `nodes`.`public` = 1 AND `nodes`.`content_type` = 'Diary'
  Node Load (1.0ms)  SELECT `nodes`.* FROM `nodes` WHERE `nodes`.`public` = 1 AND `nodes`.`content_type` = 'Diary' ORDER BY created_at DESC LIMIT 15 OFFSET 0
  Rendered collection (0.0ms)
  Rendered diaries/index.html.haml within layouts/application (33.0ms)
  Rendered layouts/_head.html.haml (7.3ms)
  Rendered layouts/_site.html.haml (2.9ms)
  User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
  News Load (0.3ms)  SELECT `news`.* FROM `news` WHERE `news`.`state` = 'draft' ORDER BY created_at DESC
  Rendered redaction/_box.html.haml (3.1ms)
   (0.4ms)  SELECT COUNT(*) FROM `news` WHERE `news`.`state` = 'candidate'
   (0.2ms)  SELECT COUNT(*) FROM `polls` WHERE `polls`.`state` = 'draft'
  Rendered boards/_form.html.haml (3.5ms)
  Rendered boards/_board.html.haml (0.0ms)
  Rendered boards/_boards.html.haml (8.7ms)
  Rendered moderation/_box.html.haml (16.2ms)
  Rendered admin/_box.html.haml (1.5ms)
  Rendered layouts/_sidebar.html.haml (36.1ms)
  Comment Load (0.3ms)  SELECT id, node_id, title FROM `comments` WHERE `comments`.`state` = 'published' ORDER BY created_at DESC LIMIT 12
  Tag Load (0.7ms)  SELECT name FROM `tags` INNER JOIN `taggings` ON `taggings`.`tag_id` = `tags`.`id` WHERE `tags`.`public` = 1 AND (created_at > '2012-10-07 04:42:09') GROUP BY tag_id ORDER BY COUNT(*) DESC LIMIT 12
  FriendSite Load (0.4ms)  SELECT url, title FROM `friend_sites` ORDER BY position ASC
  Rendered layouts/_footer.html.haml (10.8ms)
Completed 200 OK in 114ms (Views: 101.3ms | ActiveRecord: 6.1ms)


Started POST "/b/3d072a245074a27d64426f9fd81f6600de204893" for 192.168.1.57 at 2012-11-07 06:42:30 +0100

ActionController::RoutingError (No route matches [POST] "/b/3d072a245074a27d64426f9fd81f6600de204893"):
  actionpack (3.2.8) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.8) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.8) lib/rails/rack/logger.rb:16:in `call'
  quiet_assets (1.0.1) lib/quiet_assets.rb:20:in `call_with_quiet_assets'
  actionpack (3.2.8) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.1) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.8) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.1) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.8) lib/rails/engine.rb:479:in `call'
  railties (3.2.8) lib/rails/application.rb:223:in `call'
  rack (1.4.1) lib/rack/content_length.rb:14:in `call'
  railties (3.2.8) lib/rails/rack/log_tailer.rb:17:in `call'
  thin (1.5.0) lib/thin/connection.rb:81:in `block in pre_process'
  thin (1.5.0) lib/thin/connection.rb:79:in `catch'
  thin (1.5.0) lib/thin/connection.rb:79:in `pre_process'
  thin (1.5.0) lib/thin/connection.rb:54:in `process'
  thin (1.5.0) lib/thin/connection.rb:39:in `receive_data'
  eventmachine (1.0.0) lib/eventmachine.rb:187:in `run_machine'
  eventmachine (1.0.0) lib/eventmachine.rb:187:in `run'
  thin (1.5.0) lib/thin/backends/base.rb:63:in `start'
  thin (1.5.0) lib/thin/server.rb:159:in `start'
  rack (1.4.1) lib/rack/handler/thin.rb:13:in `run'
  rack (1.4.1) lib/rack/server.rb:265:in `start'
  railties (3.2.8) lib/rails/commands/server.rb:70:in `start'
  railties (3.2.8) lib/rails/commands.rb:55:in `block in <top (required)>'
  railties (3.2.8) lib/rails/commands.rb:50:in `tap'
  railties (3.2.8) lib/rails/commands.rb:50:in `<top (required)>'
  script/rails:6:in `require'
  script/rails:6:in `<main>'


  Rendered /usr/local/rvm/gems/ruby-1.9.3-p286/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (2.1ms)

  • # elasticsearch

    Posté par . Évalué à  10 .

    En fait j'ai reussi à mettre elasticsearch en service.
    Il fallait le mettre en service, faire "rake db:setup" puis entrer au moins un contenu pour que cela fonctionne.

    Il manque plus que le site en lui même !

  • # Redis-server

    Posté par . Évalué à  10 .

    Pourquoi installer redis depuis les sources ?
    http://packages.debian.org/wheezy/redis-server

    • [^] # Re: Redis-server

      Posté par . Évalué à  9 .

      Parce que j'ai suivi le README comme un âne …
      Je viens de tester avec la version fournit dans les paquets. Cela fonctionne correctement.
      C'est quand même plus pratique !

  • # extraction de base anonymisée

    Posté par . Évalué à  1 .

    il me semble que par le passé, peut-etre quand on etait encore en test, les admins avaient fait une extraction de base pour avoir un echantillon de contenu.

    si la base n'a pas trop bougé, l'echantillon est peut-etre encore disponible.

    • [^] # Re: extraction de base anonymisée

      Posté par . Évalué à  2 .

      Je n'ai pas trouvé cet échantillon malgré mes recherches.
      Par contre il y a un post dans le suivi : http://linuxfr.org/suivi/fournir-des-donnees-d-exemple
      En résumé : yakafokon

      Le problème du jeu de données (en tout cas pour mon problème de recherche), c'est qu'il faut qu'il puisse être généré à tout moment pour avoir des données avec des dates à peu prés réel (vieux, moins vieux, récent …).
      Je vais regarder ce que je peux faire …

      • [^] # Re: extraction de base anonymisée

        Posté par (page perso) . Évalué à  4 .

        Le vrai souci est de garantir l'anonymisation surtout. On évite en général de prendre de données réelles et de les anonymiser. On préfère générer des données factices et plausibles.

        • [^] # Re: extraction de base anonymisée

          Posté par . Évalué à  3 .

          Je suis d'accord sur le coté anonyme mais la majorité des données nécessaires sont public : dépêches, journaux, forums, sondages wiki, suivi et les commentaires. Je ne vois pas trop ce que l'on pourrait rendre anonyme la dedans.
          J'aimerais bien avoir un petit dump mysql avec une vingtaine de dépêches, journaux (…) et leurs commentaires associés.
          Il n'y aurait plus qu'à créer des comptes utilisateurs bidons pour faire correspondre, on aurait déjà quelque chose de correct.

          Actuellement je ne vois pas 50 solutions :
          - soit je fais à la main la saisie et ensuite je fait un dump réutilisable
          - soit je fais un script qui me génère tout ça avec des mots aléatoires

          ps: je suis ouvert à toute autre idée

        • [^] # Commentaire supprimé

          Posté par . Évalué à  2 .

          Ce commentaire a été supprimé par l'équipe de modération.

        • [^] # Re: extraction de base anonymisée

          Posté par . Évalué à  1 .

          Sur linuxfr.org, les données sensibles sont assez limitées. Il me semble d'ailleurs qu'un dump anonymisés avait été mis à disposition lors d'un précédent concours.

          Personnellement, j'ai souvent travaillé avec des données de production et elles n'étaient anonymisées que dans la mesure où il était difficile de surveiller la population qui y avait accès.

          • [^] # Re: extraction de base anonymisée

            Posté par (page perso) . Évalué à  7 .

            Sur linuxfr.org, les données sensibles sont assez limitées.

            On pourrait croire naïvement que c'est le cas mais en fait, il y a quand même pas mal de données à « nettoyer ». Voici quelques exemples :

            • évidemment tout ce qui concerne les comptes utilisateurs (email, hash des passwords, karma, etc.)
            • tous les jetons OAuth2
            • les contenus archivés (certains l'ont été à la demande de l'auteur car ils contenaient des infos sensibles)
            • les adresses de courriel des auteurs qui ont proposé une dépêche sans être connecté
            • les votes (pas envie que des gens les analysent pour savoir qui sont leurs « ennemis »)
            • etc.
            • [^] # Re: extraction de base anonymisée

              Posté par . Évalué à  1 .

              Tout cela peut assez facilement être nettoyé:

              • les mots de passe peuvent tous être mis à 1234
              • les jetons oauh peuvent être supprimés?
              • les adresses e-mail / xmpp peuvent toutes êtres mises à example@example.org
              • les contenus archivés et les votes peuvent être purement et simplement supprimés.

              On peut aussi limiter l'export aux contenus en CC et aux commentaires associés.

              • [^] # Re: extraction de base anonymisée

                Posté par . Évalué à  4 .

                Ayka.

                J'imagine que l'équipe utilisera avec plaisir les requêtes SQL toutes cuites que tu vas leur fournir.

                • [^] # Re: extraction de base anonymisée

                  Posté par . Évalué à  0 .

                  J'espère que tu plaisantes. Deux DELETE et deux UPDATE sans même une clause WHERE ?

                  • [^] # Re: extraction de base anonymisée

                    Posté par (page perso) . Évalué à  2 .

                    Je partage l'avis de Bruno. Je ne crois pas à un nettoyage aussi facile en deux requêtes (qui ne prendront pas en compte le etc. évoqué précédemment forcément) et qui ne prendront pas en compte toute évolution future. C'est bien pour ça que les gens utilisent des données générées.

                    De plus une extraction partielle des données risque d'entraîner des incohérences dans les divers compteurs présents en base.

            • [^] # Re: extraction de base anonymisée

              Posté par . Évalué à  2 .

              les votes (pas envie que des gens les analysent pour savoir qui sont leurs « ennemis »)

              Oh c'est dommage. Si en plus vous avez une grande rétention des logs serveurs ont aurait pu faire une jolie démonstration de ce qu'il est possible de faire avec les infos que les gens laissent traîner en navigant. Si j'ai un peu de temps un jour, ça serait marrant de faire une page privée pour chaque utilisateur ou on remonte des exemples de données.

        • [^] # Re: extraction de base anonymisée

          Posté par (page perso) . Évalué à  3 .

          Tu veux dire des journaux sur zino ?

  • # Quelques réponses

    Posté par (page perso) . Évalué à  10 .

    C'est cool d'avoir des contributeurs motivés !

    Il manque par contre une dépendance (tcl8.5) qui sera nécessaire plus tard.

    OK, c'est ajouté.

    J'ai un gros message où il m'indique de rajouter "vm.overcommit_memory = 1" au fichier /etc/sysctl.conf

    Pour un environnement de dév, ce n'est vraiment pas nécessaire de faire ça (à part pour cacher le warning). Par contre, c'est très utile en prod pour éviter de perdre des données lors des sauvegardes.

    En cherchant un peu je trouve cette page et crée un fichier d'init

    Pour les scripts d'init (et d'autres choses pour la prod), on a un second dépôt git : https://github.com/nono/admin-linuxfr.org

    Pas de soucis, par contre cela ne rend pas la main.

    Effectivement, je viens de créer un bug report pour ça : https://github.com/AF83/desi/issues/5.

    La version de libhunspell n'est pas la bonne, il me demande la 1.2 et j'ai la 1.3

    OK, il faudra que je regarde ça.

    j'ai une erreur (No route matches [POST] "/b/3d072a245074a27d64426f9fd81f6600de204893") qui revient tout le temps dans les logs

    L'environnement de dév tel que décrit dans le README n'est pas complet. Il n'indique pas comment installer les autres services spécifiques à LinuxFr.org :

    • board : envoyer les messages des tribunes en temps-réel vers les navigateurs
    • share : partager les dépêches sur les réseaux sociaux
    • img : proxy pour les images externes.

    En particulier, l'erreur rencontrée vient de l'absence de board. Quand un utilisateur affiche une tribune (ça veut dire à peu près toutes les pages pour les modérateurs vu qu'il y a une tribune de modération dans la colonne de gauche), le navigateur essaye de se connecter avec Server-Sent Events à /b/<qqchose> pour recevoir les nouveaux messages sur cette tribune.

    • [^] # Re: Quelques réponses

      Posté par (page perso) . Évalué à  6 .

      La version de libhunspell n'est pas la bonne, il me demande la 1.2 et j'ai la 1.3

      J'ai mis à jour la gem ruby qui devrait maintenant utiliser libhunspell 1.3.

      Effectivement, je viens de créer un bug report pour ça : https://github.com/AF83/desi/issues/5.

      Mon collègue qui s'occupe de Desi a corrigé ça aujourd'hui. desi start rend bien la main maintenant (bug dans une dépendance qui a été contourné).

      • [^] # Re: Quelques réponses

        Posté par . Évalué à  3 .

        Merci pour toutes ces réponses.

        Pour les services complémentaires (board, share, img) je les laisse de coté pour l'instant. J'ai essayé rapidement sans succès et je sens bien que ça va tourner à la grosse galère.

        Pour desi, comme indiquer dans un commentaire plus haut j'ai contourné le problème en lançant directement elasticsearch avec un script dans init.d, ça fonctionne.

        La j'ai donc une machine virtuelle fonctionnelle. J'ai crée un petit script shell qui permet de reinstaller le site avec les sources à jour et insère des données de test (pour l'instant juste des utilisateurs, journaux et suivi).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.