Articles

Assets non résolus lors du passage à Rails 4

Lors du passage d’une de mes applications à Rails 4, je me suis trouvé face à un problème que j’ai eu beaucoup de mal à résoudre. En effet, alors que les assets étaient parfaitement distribués en développement, ce n’était plus le cas en production : tous les assets autre que CSS et JS (images, polices de caractères…)  étaient distribué comme des fichiers de zéro octet.

Après de longues recherches sur le web, j’ai pu trouver la source de mes ennuis grâce au post dont vous trouverez le lien ci-dessous. Une ligne issue d’une version de Rails antérieure à la version 4 causait le problème. Il restait en effet dans le fichier config/environments/production.rb la ligne suivante :

config.action_dispatch.x_sendfile_header ="X-Sendfile"

Je l’ai donc commentée, puis ensuite ai supprimé le répertoire assets sur le serveur, et enfin redéployé mon application pour régénérer les assets Rails. Un redémarrage ensuite de mon serveur Web, et le problème était réglé !

Via stackoverflow

Déplacer une application Rails d’un serveur à un autre

Ayant recyclé une machine plus puissante comme serveur interne, je me suis trouvé face à la tâche fastidieuse de déplacer mes applications Rails d’un serveur à l’autre. Je détaille ici à titre d’aide-mémoire les opérations à effectuer, les problèmes rencontrés et les solutions apportées.

Recopier les fichiers de l’application

Pour recopier les fichiers de l’application, deux possibilités : modifier votre fichier de déploiement si vous utilisez capistrano, c’est la méthode la plus pérenne; en mode « quick and dirty », je passe par rsync pour synchroniser les répertoires.

Pour cette deuxième méthode, connectez vous à votre serveur source, et tapez la commande suivante :

rsync -a /source/path/to/myapp/ user@mytargetserver.org:/target/path/to/myapp/

Vous devrez bien sûr donner le mot de passe de user sur mytargetserver.org.

Migrer la base de données

Nous allons tout d’abord exporter les données depuis le serveur mysql source. Connectez-vous à votre serveur source en ssh et exportez la base de données avec la commande suivante :

mysqldump -u user -pmypassword myapp_production > myapp_production.sql

Recopiez la base de données sur votre machine cible, en utilisant par exemple la commande scp :

scp myapp_production.sql user@mytargetserver.com:

Connectez-vous à votre machine cible, lancez mysql et tapez la commande suivante pour créer votre base de données :

create database redmine_production;

Donnez les droits à votre utilisateur mysql sur votre base de données ; pour ce faire, lancez mysql avec votre utilisateur root et votre mot de passe, puis tapez la commande suivante :

grant all on myapp_production.* to 'myrailsuser'@'localhost';

Quittez mysql et importez ensuite votre base de données en tapant la commande   suivante :

mysql -u user -pmypassword myapp_production < my app_production.sql

Problèmes rencontrés

Fatal error lors du bundle install

Mon application n’était plus installée au même endroit que précédemment, et bundler avait gardé en configuration le chemin ou se trouvait le bundle sur la précédente machine. J’ai eu droit à un joli message du genre :

Unfortunately, a fatal error has occurred. Please see the Bundler troubleshooting documentation at http://bit.ly/bundler-issues. Thanks!

Avec comme information supplémentaire qu’il n’arrivait pas à créer une arborescence de répertoires dans /var/www

Pour trouver l’endroit du stockage, il suffit de taper :

bundle config path

Editez le fichier qui contient la configuration locale avec votre éditeur préféré et faites le pointer sur le répertoire bundle de votre application.

Impossible de trouver un gem lors de bundle install

Si lors de l’installation des gems avec bundle vous obtenez la sortie suivante :

Fetching gem metadata from http://rubygems.org/..
Could not find gem-xxx in any of the sources

Ou gem-xxx peut être n’importe lequel de vos gens, il vous suffit de procéder comme suit :

  1. Supprimer le fichier Gemfile.lock
  2. Modifier le fichier de configuration locale de bundler (chemin visible avec bundle config) pour passer le paramètre freeze à 0 au lieu de 1.
  3. Relancer la commande bundle install
  4. Modifier le fichier de configuration de bundler pour remettre freeze à 1.

Associer branche et base de données

Si vous utilisez git pour développer vos applications rails, vous êtes certainement un adepte des branches, qui vous permettent de développer vos nouvelles fonctionnalités en gardant au chaud votre branche « master », qui doit correspondre à tout moment à votre application en production.

Git, branches et base de données

Git, branches et base de données

Tant que vos modifications ne concernent que votre source, pas de problème ; mas si vous touchez à la base de données, vous courez à la catastrophe, puisque cette dernière est partagée entre toutes vos branches.

Heureusement, Mislav Marohnić a développé un petit hack du fichier database.yml qui permet de lever ce problème d’une manière élégante :

  • Récupérer le nom de la branche courante
  • Vérifier que vous souhaitez bien utiliser une base de données alternative grâce à un flag posé dans la configuration de git
  • Suffixer le nom de votre base de données avec le nom de la branche

Cela se traduit de la manière suivante :

## database.yml (after) <% # http://mislav.uniqpath.com/rails/branching-the-database-along-with-your-code/ 
branch = `git symbolic-ref HEAD 2>/dev/null`.chomp.sub('refs/heads/', '') 
suffix = `git config --bool branch.#{branch}.database`.chomp == 'true' ? "_#{branch}" : "" %> 

development: 
# ... autres infos de configuration de la base de données ... 
database: myapp<%= suffix %>

Il faudra également positionner le flag dans la configuration de git :

$ git config --bool branch.feature.database true

Créez ensuite la nouvelle base de données et appliquez le schéma de celle-ci avec les commandes de Rails suivantes :

rake db:create
rake:db:schema:load

Et voià le travail !

via mislav.uniqpath.com

Utiliser la console Rails en production

La console Rails est utilisable également en production, ce qui vous permet d’obtenir des informations sur votre application (et en particulier les données qui lui sont associées) plus facilement qu’avec le client de votre base de données.

La console Rails

La console Rails

Pour utiliser la console Rails, il vous suffit de vous positionner à la racine de votre application et de taper :

rails c production

Via stackoverflow

Pousser son dépôt git vers un serveur

Lorsque je démarre un nouveau projet, cela se passe toujours sur ma machine cliente, et je crée bien entendu le dépôt git dans la foulée. Ce n’est généralement qu’après que je mutualise ce dépôt en le stockant sur github ou sur mon serveur git personnel.

Voici la méthode que j’utilise pour créer le dépôt à postériori :

# Sur le serveur
mkdir /chemin/vers/git/projet

# Sur le client, depuis le répertoire de votre projet
scp -r .git monloginserveur@monserveur/chemin/vers/git/projet

La commande scp permet de copier des fichiers par ssh. Cette copie binaire permet de dupliquer le dépôt du client vers le serveur en utilisant le login dont vous vos servez pour vous connecter en ssh.

Une fois que vous avez copié le dépôt, vous pouvez ajouter votre serveur comme dépôt distant dans votre projet avec la commande suivante :

git remote add origin ssh://monloginserveur@monserveur/chemin/vers/git/projet

Pour pouvoir pousser vos modifications vers votre serveur, vous devez ensuite taper la commande suivante dans le répertoire git de votre serveur :

git config --bool core.bare true

A partir de Simple Central Git Repository