Rails
Déployez une application Rails avec Postgres, des workers, Solid Queue, les assets Tailwind et les bases de données supplémentaires de Rails 8.
Étape par étape : Déployer Rails sur DigitalOcean · Déployer Rails sur Hetzner · Déployer Rails sur Vultr · Déployer Rails sur OVHcloud · Déployer Rails sur Scaleway · Déployer Rails sur UpCloud
- Version :
bin/rails db:prepares’exécute avant la mise en ligne de chaque version (votreProcfilerelease:l’emporte). - Valeurs par défaut en production :
RAILS_ENV,RACK_ENV,RAILS_SERVE_STATIC_FILESetRAILS_LOG_TO_STDOUTsont définies si vous ne l’avez pas fait; les assets se construisent avecSECRET_KEY_BASE_DUMMY=1, donc un vrai secret n’est pas nécessaire au moment du build.SECRET_KEY_BASEest généré une seule fois. - Bases de données :
pg→ Postgres,mysql2/trilogy→ MySQL,redis/sidekiq→ Redis. Les bases de données supplémentaires de Rails 8 (cache, queue, cable) trouvées dansconfig/database.ymlobtiennent chacune leur propre<NAME>_DATABASE_URL. - Workers : Sidekiq, Solid Queue (
bin/jobssi présent), GoodJob, Resque et Delayed Job sont proposés à partir de votreGemfile.lock. - Téléversements : Active Storage sur disque reçoit automatiquement un volume
storage/persistant; ou attachez un bucket et les variables S3 sont injectées. - Anciens gems natifs (nio4r, puma 5…) compilent sous GCC 14 sans changement.
Les workers sont un second processus, pas une seconde application
Une application, c’est un seul code et une seule image; web, worker, la commande de release et le cron sont des types de processus de cette même application, chacun mis à l’échelle indépendamment — le modèle 12-factor, pas une flotte d’applications presque identiques pour un seul code. Avec un Procfile :
web: bin/rails server -p $PORT
worker: bundle exec sidekiq
les deux apparaissent automatiquement. Sans Procfile, Railyard démarre web lui-même et propose le premier exécuteur de tâches trouvé dans votre Gemfile.lock comme processus worker. Ajoutez-en d’autres depuis l’onglet Workers de l’application, ou mettez à l’échelle ce qui existe déjà depuis la CLI :
railyard scale my-app worker=3
web est limité à une seule réplique pour l’instant; worker va de 1 à 10. Voir Workers et tâches planifiées pour le cron.
Solid Queue, trois façons
- Sa propre base de données (le défaut de Rails 8).
config/database.ymldéclare une entréequeue:avecmigrations_paths: db/queue_migrate; Railyard la lit comme une base de données supplémentaire et provisionne unQUEUE_DATABASE_URLséparé, en plus deDATABASE_URL.bin/rails db:preparemigre les deux dans l’étape de release. Le processus worker exécutebin/jobssi votre application l’a, sinonbundle exec rake solid_queue:start. - Partager la base de données principale. Retirez l’entrée
queue:(ou faites-la pointer vers la connexion principale) et les tables de Solid Queue vivent à côté des vôtres — rien n’est provisionné en plus, un seulDATABASE_URL, la même commande worker. - À l’intérieur de Puma, sans processus worker. Le panneau Settings → Rails du canvas, avec l’interrupteur Run Solid Queue inside Puma, définit
SOLID_QUEUE_IN_PUMA=true, que leconfig/puma.rbpar défaut de Rails 8 lit déjà (plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"]). Puma distribue les jobs lui-même; retirez le processusworkeret mettez plutôtwebà l’échelle.
Le même panneau ajoute Action Cable sur Solid Cable (WebSockets, qui provisionne son propre CABLE_DATABASE_URL), YJIT et Thruster devant Puma.
Configuration et secrets
Rien que des variables d’environnement : définissez-en une sous Variables, ou avec railyard env:set my-app KEY=VALUE depuis la CLI, et la même image tourne sans changement de staging jusqu’en production — la parité dev/prod, pas une branche au moment du build. SECRET_KEY_BASE et tout autre secret propre à votre application sont générés une seule fois et chiffrés; une clé tierce n’est jamais inventée pour vous. Pour pointer vers un Postgres ou un Redis qui tourne comme son propre service sur le canvas plutôt que comme un addon sur le serveur de l’application, référencez-le avec ${{redis.REDIS_URL}} — résolu par environnement, la même syntaxe de référence entre services utilisée partout. Voir Variables et secrets.
Précompiler les assets (Tailwind, esbuild, importmap)
assets:precompile s’exécute dans l’étape de build sans aucune configuration de votre part : le build intègre une chaîne Node directement dans le build Ruby, donc une étape tailwindcss:build ou cssbundling-rails/esbuild enchaînée derrière fonctionne tout simplement — il n’y a pas d’étape Dockerfile séparée ni de pre-deploy hook à écrire. Si la précompilation a besoin de la base de données ou de Redis — un initializer qui interroge au démarrage, par exemple — et que seul le serveur de l’application les a, Railyard détecte l’échec et reporte automatiquement cette même étape à la phase de release, là où ils existent. Pousser une image déjà construite plutôt que de laisser Railyard la construire fonctionne de la même façon : les assets se compilent d’abord contre des conteneurs Postgres et Redis temporaires sur le serveur de build et sont intégrés à l’image avant qu’elle n’atteigne le serveur de l’application, donc votre vraie base de données n’est jamais touchée. Vous n’avez besoin d’aucun release_command pour tout ça — n’en définissez un que si db:prepare ne suffit pas, par exemple un script de migration de données.
Déployez-la
- Depuis un dépôt : collez l’URL Git, ou choisissez-la dans le sélecteur une fois GitHub connecté — Railyard lit le Gemfile, remplit la liste des processus, les bases de données et les variables documentées, et déploie à chaque push.
- Depuis la CLI :
railyard create my-app https://github.com/me/my-app --addons postgres,redis, ou exécutezrailyard git:remote && git push railyard maindepuis le dépôt pour déployer à chaque push sans GitHub. - En un clic : ajoutez le bouton de déploiement à votre README, ou publiez-la dans le catalogue de modèles pour que n’importe qui puisse la lancer avec ses addons et variables déjà remplis.