Faire tourner et déployer des applications Ruby on Rails sur AlwaysData
AlwaysData est le meilleur hébergeur avec lequel j’ai travaillé en près de vingt ans, tout en étant le moins cher — ne me demandez pas comment ils réussissent cet exploit ! Voici comment simplifier le déploiement d’applications Ruby avec Capistrano, en gérant automatiquement la version de Ruby et le redémarrage de Puma sur leur infra.
Sélectionner la version de Ruby
AlwaysData fournit presque toutes les versions de Ruby précompilées, ce qui est appréciable. Ils proposent aussi Python, PHP, Node, Java, Elixir, et même .net et Deno ! Au moment où j’écris ces lignes, la version Ruby la plus ancienne disponible est la 1.8.7.
Pour changer de version Ruby globalement, allez dans Environnement puis sélectionnez soit une version majeure (qui utilisera automatiquement la dernière mineure), soit une version mineure précise.
Vous pouvez également choisir une version spécifique pour chaque application web, avec le même mécanisme majeure/mineure.
Si la version souhaitée n’a pas encore été compilée, vous pouvez soit la compiler vous-même, soit utiliser rbenv, ou rv. J’imagine que mise fonctionne aussi.
Utiliser .ruby-version
Si vous préférez gérer la version depuis l’application elle-même, comme c’est courant, changez le type d’application de “Ruby Rack” à “Programme personnalisé”, puis utilisez la commande suivante :
sh -c 'RUBY_VERSION="$(cat .ruby-version)" exec bundle exec puma --environment production'
Décomposons cette commande :
- Elle lance un shell pour exécuter la commande suivante
- Dans ce shell, la variable d’environnement
RUBY_VERSIONreprend le contenu de.ruby-version - Enfin, Bundler charge les gemmes définies dans le dossier et lance Puma en environnement de production
Redémarrer Puma après un déploiement Capistrano sur AlwaysData
Je n’ai pas réussi à redémarrer Puma avec la gemme capistrano-puma car elle utilise systemd, qui n’est pas autorisé sur AlwaysData pour des raisons de sécurité (sur les plans de type VPS).
Il existe cependant une solution simple : créer un fichier exécutable qui appelle l’API AlwaysData via curl, et l’exécuter lors du déploiement avec Capistrano.
Créer puma-restart
Vous aurez besoin de quelques informations depuis le panneau d’administration AlwaysData :
- Nom du compte : visible dans le menu en haut à droite
- Clé API : dans Profil → Tokens
- SITE_ID : visible dans l’URL lors de l’édition de votre site, ex.
https://admin.alwaysdata.com/site/123456/
Définissez API_KEY comme variable d’environnement dans la configuration du site — ne la codez pas en dur dans le script.
cat << EOF > bin/puma-restart
#!/bin/bash
# Config
if [ -z "\${ALWAYSDATA_API_KEY}" ]; then
echo "Erreur : la variable d'environnement ALWAYSDATA_API_KEY n'est pas définie."
echo "Visitez https://admin.alwaysdata.com/token/add/"
exit 1
fi
if [ -z "\${ALWAYSDATA_ACCOUNT_NAME}" ]; then
echo "Visitez https://admin.alwaysdata.com/subscription/"
exit 1
fi
if [ -z "\${ALWAYSDATA_SITE_ID}" ]; then
echo "Visitez https://admin.alwaysdata.com/site/"
exit 1
fi
# Requête POST
status=\$(curl \
--user "\${ALWAYSDATA_API_KEY} account=\${ALWAYSDATA_ACCOUNT_NAME}:" \\
--data '' \\
--silent \\
--output /dev/null \\
--write-out '%{http_code}' \\
"https://api.alwaysdata.com/v1/site/\${ALWAYSDATA_SITE_ID}/restart/")
# Affichage de la confirmation
if [ "\$status" = 204 ];
then
echo "Application redémarrée"
else
echo "Échec du redémarrage. Essayez via le panneau d'administration :"
echo "https://admin.alwaysdata.com/site/\#{ALWAYSDATA_SITE_ID}/"
exit 1
fi
EOF
# Rendre le fichier exécutable
chmod +x bin/puma-restart
Configurez ensuite les variables d’environnement ALWAYSDATA_API_KEY, ALWAYSDATA_ACCOUNT_NAME et ALWAYSDATA_SITE_ID.
Ajouter une tâche de déploiement
cat << EOF > lib/capistrano/tasks/deploy.rake
# frozen_string_literal: true
namespace :deploy do
desc "Redémarrer l'application"
task :restart do
on roles(:app) do
within current_path do
execute "bin/puma-restart"
end
end
end
# Redémarrer Puma après le déploiement
after "deploy:finished", "deploy:restart"
desc "Empêcher le déploiement si la version de Ruby n'est pas disponible"
task :check_available_ruby do
on roles(:app) do
required_version = File.read(".ruby-version").strip
actual_version = capture("RUBY_VERSION=#{required_version} ruby --version 2>&1")
unless actual_version.include?(required_version)
error "Ruby #{required_version} n'est pas disponible sur le serveur."
error "Vérifiez les versions disponibles sur https://admin.alwaysdata.com/environment/ruby/"
exit 1
end
end
end
before "deploy:starting", "deploy:check_available_ruby"
end
EOF
Tout committer
git add bin/puma-restart
git add tasks/capistrano/deploy.rake
git commit -m "Redémarrer Puma au déploiement Capistrano"
Conclusion
Et voilà, vous pouvez désormais déployer des applications Rails sur AlwaysData, la version de Ruby correspondra automatiquement à celle qui est configurée dans le projet.