FreeBSD 9.2 + Jail + Diaspora + MariaDB + Nginx
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: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 SSLJetez 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:loadInstallation :
$ DB=mysql bundle exec rake assets:precompileExécution de diaspora :
$ ./server/scriptAprè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 startPour tester, n'oubliez pas de démarrer votre instance diaspora, sinon nginx renverra "bad gateway" :
# su - diaspora $ cd diaspora $ .script/serverVous 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/diasporaPuis 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 startConclusion
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