Le Blog Maniatux

Bienvenue sur internet

FreeBSD 9.2 + Jail + Diaspora + MariaDB + Nginx

Rédigé par Xavier - - 6 commentaires

Il parait que Diaspora commence à devenir sympathique... alors pourquoi ne pas essayer de l'installer chez soi ;) Le wiki officiel détaille l'installation de Diaspora sur FreeBSD, mais je trouve certains passages très confus, et l'utilisation de MySQL ou MariaDB n'est aucunement mentionnée. Personnellement j'utilise FreeBSD 9.2 avec des jails, je veux donc éviter Postgresql car ce dernier ne tourne pas en jail (à moins de modifier des paramètres, mais je n'ai pas très envie). Je suis donc parti sur MariaDB.

  • Durée estimée : de 1h à 4h selon la méthode d'installation (pkng ou ports)
  • Niveau : Avancé (bonne connaissance du sysadmin sous Linux, ainsi que de nginx et mysql)
  • Pré requis: Un nom de domaine qui pointe sur le serveur (peut être fait avec le fichier hosts pour tester)

Aperçu

Le fonctionnement de Diaspora est détaillé sur le wiki. Voici un aperçu simplifié :

Le contenu statique, comme les images, est servi directement par nginx à partir du répertoire de l'application. Les contenus dynamiques en revanche sont traités par rails qui communique avec ses processus gérés par sidekiq à travers redis. Les données persistantes, comme les posts, les commentaires, sont stockés dans MySQL. Cela peut sembler compliqué, mais le schéma ci-dessus et la mise en place des composants rendra les choses plus évidentes.

Préparation de la jail

On créé à l'aide de ezjail-admin une jail nommée diaspora avec l'IP 192.168.0.8 :

(hôte)# ezjail-admin create diaspora 're0|192.168.0.8'

On démarre cette jail, on se connecte dessus afin de paramétrer le mot de passe root, puis on ferme tout :

(hôte) # ezjail-admin start diaspora
(hôte) # ezjail-admin console diaspora
(diaspora) # passwd
(diaspora) # exit
(hôte) exit

Méthode 1 : pkgng

La première méthode, consiste à utiliser pkgng et les paquets pré compilés. Cependant il peut y avoir des soucis avec les versions de ruby. On y va.

Connexion à la jail diaspora :

$ ssh root@192.168.0.8

Installation de pkg puis des paquets requis pour Diaspora :

# pkg update
# pkg install ca_root_nss git ImageMagick-nox11 redis ruby21 rubygem-bundler node mariadb55-server bash nginx

Petit rajout pour que ca_root_nss soit pris en compte par diaspora plus tard :

# ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem

Et voilà.

Méthode 2 : compilation des ports

Cette méthode est plus sûre concernant les versions des paquets.

Connexion à la jail en SSH :

$ ssh root@192.168.0.8

On installe pkg et portmaster, deux outils pour gérer nos ports plus facilement :

(diaspora) # cd /usr/ports/ports-mgmt/pkg
(diaspora) # make install clean
(diaspora) # cd /usr/ports/ports-mgmt/portmaster
(diaspora) # make install clean
(diaspora) # pkg2ng

On paramètre le make.conf :

(diaspora) # vi /etc/make.conf
WRKDIRPREFIX=           /var/ports
DISTDIR=                /var/ports/distfiles
PACKAGES=               /var/ports/packages
INDEXDIR=               /var/ports
WITHOUT_X11=            yes
OPTIONS_UNSET=X11
WITH_PKGNG=             yes
DEFAULT_VERSIONS=    perl5=5.16 ruby=2.1 python=2.7 postgresql=9.3 mysql=5.5
PERL5_DEFAULT=5.16
RUBY_VER=2.1
WANT_MYSQL_VER=55m    # 55 for MySQL ,55m for MariaDB, 55p for Percona

Voici la liste des ports à compiler et installer :

Port Options
security/ca_root_nss ETCSYMLINK
devel/git Par défaut
graphics/ImageMagick-nox11 16BIT_PIXEL, BZIP2, FONTCONFIG, FREETYPE, JPEG, LQR, LZMA, MODULES, PERL, PNG, THREADS, TIFF
print/ghostscript9-nox11 (requis par ImageMagick FONTCONFIG, ICONV, GS_jpeg, GS_jpeggray, GS_bit, GS_bitrgb, GS_bitcmyk, GS_plan, GS_pngmono, GS_pnggray, GS_png16, GS_png256, GS_png16m, GS_pngalpha, GS_png48 (désactiver tout le reste)
databases/redis Par défaut
lang/ruby21 Par défaut
sysutils/rubygem-bundler Par défaut
www/node Par défaut
databases/mariadb55-server Par défaut
shell/bash Par défaut
www/nginx Par défaut

(Entrer dans chaque répertoire et taper la commande make install clean pour compiler).

Edition du rc.conf

Que vous ayez choisi la méthode 1 ou 2, le tutoriel continue ici. Ouvrez et éditez le rc.conf comme ceci :

# vi /etc/rc.conf
redis_enable="YES"
mysql_enable="YES"

Puis on démarre les daemon :

# /usr/local/etc/rc.d/mysql-server start
# /usr/local/etc/rc.d/redis start

Base de données

On effectue la configuration initiale de la base de données, en root cette fois :

# mysql_secure_installation

Il faut paramétrer un mot de passe root. Le reste des options peuvent être laissées par défaut.

Ensuite on va se connecter à mysql :

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.35-MariaDB FreeBSD Ports

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Puis on va créer un utilisateur et une base de données pour Diaspora. Note : vous devez remplacer "password" par le mot de passe que vous voulez définir pour l'utilisateur Diaspora.

MariaDB [(none)]> CREATE USER 'diasporadb'@'localhost' IDENTIFIED BY  'password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT USAGE ON * . * TO  'diasporadb'@'localhost' IDENTIFIED BY  'password' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS  `diasporadb` ;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON  `diasporadb` . * TO  'diasporadb'@'localhost';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> commit;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit
Bye

Utilisateur Diaspora

Pour faire les choses proprement, on créé un utilisateur nommé diaspora qui servira à exécuter l'application. Cet utilisateur n'aura pas de mot de passe, ce n'est pas nécessaire, il ne pourra alors être utilisé que depuis root avec la comande su, mais nous y reviendrons.

# adduser
Username: diaspora
Full name: Diaspora
Uid (Leave empty for default):
Login group [diaspora]:
Login group is diaspora. Invite diaspora into other groups? []:
Login class [default]:
Shell (sh csh tcsh git-shell bash rbash nologin) [sh]: bash
Home directory [/home/diaspora]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]:
Username   : diaspora
Password   : 
Full Name  : Diaspora
Uid        : 1001
Class      :
Groups     : diaspora
Home       : /home/diaspora
Home Mode  :
Shell      : /usr/local/bin/bash
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (diaspora) to the user database.
Add another user? (yes/no): no
Goodbye!

Sources git

On se connecte avec l'utilisateur diaspora et on télécharge les sources de l'application (la commande su nous emmène dans le répertoire personnel /home/diaspora ce qui est très bien) :

# su - diaspora
$ git clone  git://github.com/diaspora/diaspora.git

Environnement gem

Manipulation à faire toujours en tant qu'utilisateur diaspora pour installer les outils nécessaires à l’exécution :

$ cd diaspora
$ RAILS_ENV=production DB=mysql bundle install --without test development --path vendor/bundle

Configuration diaspora

On copie les fichiers de configuration exemples de Diaspora :

$ cp config/database.yml.example config/database.yml
$ cp config/diaspora.yml.example config/diaspora.yml

Le premier fichier, database.yml, est le plus simple. Il s'agir de définir les paramètres de connexion à la base de données.
Note : Attention à bien respecter la syntaxe et les espacements ! Voici ce qu'il faut modifier :

$ vi config/database.yml
mysql: &mysql
  adapter: mysql2
  host: localhost
  port: 3306
  username: diasporadb
  password: password
#  socket: /tmp/mysql.sock
  charset: utf8
  collation: utf8_bin

# (Bien plus bas dans le fichier)
production:
  <<: *combined
#  database: diaspora_production
  database: diasporadb

Ensuite on attaque le fichier diaspora.yml qui est, disons-le, très indigeste et complexe.

$ vi config/diaspora.yml
url: "http://diaspora.example.com/" # la future url de votre instance diaspora, https pour forcer le SSL
certificate_authorities: '/etc/ssl/cert.pem'
rails_environment: 'production'
require_ssl: false # uniquement si vous ne voulez pas forcer le SSL

Jetez un œil au reste du fichier diaspora.yml, les commentaires sont assez explicites.

Installation et exécution

Pour commencer, la commande suivante va créer la structure de la base de données :

$ RAILS_ENV=production DB=mysql bundle exec rake db:create db:schema:load

Installation :

$ DB=mysql bundle exec rake assets:precompile

Exécution de diaspora :

$ ./server/script

Après quelques secondes, vous pouvez accéder à votre serveur en utilisant l'adresse http://192.168.0.8:3000 :

Notre instance diaspora tourne, mais elle fait un peu vide non ? Cela est du à l'absence de serveur Ngnix ou Apache en frontal.

Serveur frontal nginx

Nous allons utiliser la méthode debian pour configurer Nginx. C'est à dire utiliser des fichiers de configuration additionnels plutôt que de tout mettre dans le nginx.conf qui va rapidement devenir indigeste.

On va donc ouvrir le fichier nginx.conf et lui ajouter la directive Include afin de pouvoir charger des fichiers de configuration additionnels :

[diaspora@diaspora ~/diaspora]$ exit
# vi /usr/local/etc/nginx/nginx.conf

 #gzip  on;
 include /usr/local/etc/nginx/conf.d/*.conf;

On créé le répertoire conf.d/ puis notre fichier de configuration du vhost :

# mkdir /usr/local/etc/nginx/conf.d
# vi /usr/local/etc/nginx/conf.d/diaspora.conf
server {
    listen 80;
    server_name diaspora.example.com;
    root /home/diaspora/diaspora/public;

    # Configure maximum picture size
    # Note that Diaspora has a client side check set at 4M
    client_max_body_size 5M;

# Proxy if requested file not found
    try_files $uri @diaspora;

    location @diaspora {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header Host $http_host;
      proxy_redirect off;

      proxy_pass http://127.0.0.1:3000;
    }
  }

Ajoutez nginx au rc.conf :

# vi /etc/rc.conf
nginx_enable="YES"

Puis démarrez nginx :

# /usr/local/etc/rc.d/nginx start

Pour tester, n'oubliez pas de démarrer votre instance diaspora, sinon nginx renverra "bad gateway" :

# su - diaspora
$ cd diaspora
$ .script/server

Vous devez obtenir ceci :

C'est beaucoup mieux non ? :D

Lancement au démarrage

Dans l'état, c'est assez pénible car non seulement il faut lancer le script à la main, mais en plus il ne faut pas fermer la connexion SSH sinon tout s'arrête. Il faut donc tenter d'automatiser ça et tout mettre en arrière plan. Ce fut laborieux, j'ai passé près de 4h à obtenir quelque chose qui marche, et encore c'est plutôt sale. Ce script est donné à titre indicatif et doit être amélioré :

# vi /usr/local/etc/rc.d/diaspora

#!/bin/sh
#
#

# PROVIDE: diaspora
# REQUIRE: MYSQL LOGIN

. /etc/rc.subr

name="diaspora"
rcvar=diaspora_enable


command="/home/diaspora/diaspora/script/server"

# read configuration and set defaults
load_rc_config "$name"
: ${diaspora_enable="NO"}
: ${diaspora_user="diaspora"}
#: ${redis_config="/usr/local/etc/$name.conf"}

#command_args="${redis_config}"
command_args="&> /dev/null"
#required_files="${redis_config}"

run_rc_command "$1"

On autorise l'éxécution du script :

# chmod +x /usr/local/etc/rc.d/diaspora

Puis on ajoute diaspora au rc.conf :

# vi /etc/rc.conf
diaspora_enable="YES"

Ensuite, on peut redémarrer le serveur pour que tous les services, incluant diaspora, se lancent, ou simplement le lancer à la main :

# /usr/local/etc/rc.d/diaspora start

Conclusion

Diaspora n'est vraiment pas simple à installer, il y a énormément de composants à gérer, et un minimum de bases sur l'environnement ruby et sur nginx sont nécessaires pour réussir. Le choix de l'environnement ruby est discutable, car cela exclut les installations faciles du style wordpress où il suffit d'uploader les fichiers chez son hébergeur par FTP. Non, diaspora requiert un accès complet au serveur, et une configuration longue et compliquée.

Il reste la possibilité de s'inscrire sur des pods existants, comme diaspora-fr, mais pourquoi construire un réseau social décentralisé si la complexité de l'ensemble incite les utilisateurs à s'agréger sur des services fournis par un tiers ?

Après avoir passé presque une semaine à installer Diaspora (documentation rare) et à rédiger + tester ce tutoriel avec les deux méthodes disponibles, je vais enfin voir à quoi ça ressemble. Je ferai des articles pour donner mon retour d'expérience, mais également pour revenir sur la procédure d'upgrade.

Ressources

6 commentaires

#1 Flaburgan a dit :

Salut et merci beaucoup pour cet article !
Le wiki n'est pas toujours à jour, surtout en français et pour les systèmes peu utilisés (comme BSD ;p). N'hésite pas à éditer le wiki pour aider les autres, on en a vraiment besoin !
diaspora* est plus facile à installer avec debian ou Ubuntu. Pour autant, tu as raison, un accès complet au serveur est toujours nécessaire. Il faut aussi un certificat SSL valide (auto signé ça ne marche pas). Bref, pas à la portée de tout le monde, malheureusement.

#2 wilfried18 a dit :

Pas mal comme article , en effet je suis redevenu actif sur diaspora car je trouve qu'il est mieux a beaucoup d'égard que les gros (propre et figuré).
Quand je présenterais ce service web opensource sur mon blog , j'ajouterais ton article.
J'utilise un pod (auto-hébergé), je sais pas si ont peux migré d'un pod a une installation sur serveur ?

#3 Xavier a dit :

@Flaburgan : Hello,
J'utilise un certificat de chez StartSSL, mais il est incorrect (pour un autre domaine).
Cela a l'air de fonctionner... sinon il est toujours possible de ne pas utiliser le HTTPS du tout.

#4 Xavier a dit :

@wilfried18 : Salut,
Hm, apparemment la migation n'est pas possible.
J'ai regardé dans les FAQ et les discussions github, beaucoup de gens demandent cette fonctionalité, au cas où le pod qu'ils utilisent cesserait d'être mis à jour ou changerait de politique vis à vis de la vie privée, mais les discussions s'éternisent depuis 3 ans.
J'ai fait mon propre pod pour avoir le controle dessus justement !
D'ailleurs, si tu veux, envoie moi le lien de ton profil, je t'ajouterai.

#5 Fla a dit :

Que disent les https://www.ssllabs.com/ de ton pod ?
Ne pas utiliser HTTPS est vraiment problématique, ça revient à rendre le réseau vulnérable...

Ps: fla@diaspora-fr.org

#6 Xavier a dit :

@Fla : Hello,
Sur le pod que j'ai installé, j'utilise le SSL. Je n'ai pas traité cette partie dans le tutoriel car il est déjà assez long et c'est très chiant à faire.
Je dis justement dans l'en-tête qu'il faut un niveau avancé, donc je laisse les gens se débrouiller pour le SSL.
Je rencontre actuellement un problème d'actualisation des flux, je vais t'ajouter et voir si cela fonctionne.

Écrire un commentaire

Quelle est la troisième lettre du mot tyamef ? :