Comment changer l'IP de liaison par défaut du serveur de développement Rails 4.2?


88

Après la mise à niveau de l'application rails de notre équipe vers la version 4.2, comme indiqué dans la note de publication , l'ip par défaut rails serverse lie à est remplacé localhostpar0.0.0.0 .

Nous développons avec Vagrant, et souhaitons que le serveur de développement soit accessible directement depuis le navigateur sur la machine hôte.

Au lieu de taper à rails s -b 0.0.0.0chaque fois à partir de maintenant, je me demande s'il existe une solution plus élégante, pour que nous puissions toujours utiliser sth aussi simple que rails spour démarrer le serveur. Peut-être:

  • un fichier de configuration rails slit où je peux modifier l'IP de liaison par défaut (sans utiliser -c)
  • port forward avec vagrant (essayé mais échoué, voir le problème rencontré ci-dessous)
  • un patch de singe au rack, qui change l'IP de liaison par défaut

Le véritable objectif derrière cela est que je souhaite que la mise à niveau se fasse en douceur au sein de notre équipe, en évitant le problème que les gens devront constamment redémarrer leur serveur de rails en raison du manque. -b 0.0.0.0 pièce .

J'ai essayé la redirection de port vagabond, mais Connection Refusedje reçois toujours lorsque je visite localhost:3000sur la machine hôte. Les deux lignes de configuration que j'ai essayées étaient:

config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000

Je n'ai trouvé aucune instruction pertinente dans la documentation officielle. Toute aide serait appréciée.



La réponse actuelle des rails 5 est d'utiliser Puma
Prusswan

Encore une autre réponse de Rails 5: définissez la variable d'environnement HOST=0.0.0.0, et le serveur de développement Rails utilisera automatiquement cette valeur.
Topher Hunt

Réponses:


71

J'ai le même problème ici et j'ai trouvé aujourd'hui une meilleure solution. Ajoutez simplement ce code à votre config / boot.rb et cela devrait fonctionner avec vagrant.

require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge(Host:  '0.0.0.0', Port: 3000)
    end
  end
end

ps: C'est basé sur: cette réponse


1
Avec cette approche, vous perdez les autres valeurs par défaut . Voir la réponse de Vanitas ci-dessous pour une alternative.
Mark Joseph Jorgensen

Je suis d'accord, jetez un oeil à la réponse de Vanita
sonne le

46

Vous pouvez utiliser Foreman pour exécuter un Procfileavec vos commandes personnalisées:

# Procfile in Rails application root
web:     bundle exec rails s -b 0.0.0.0

Démarrez maintenant votre application Rails avec:

foreman start

L'avantage de Foreman est que vous pouvez ajouter d'autres applications au Procfile (comme sidekiq, mailcatcher).

La mauvaise chose à propos du contremaître est que vous devez former votre équipe à la course à la foreman startplace rails s.


Merci. J'accepterai votre réponse dans quelques jours si cela s'avère être la meilleure solution :)
Huang Tao

L'abréviation foreman sfonctionnera également - peut être une transition plus facile à partir de rails s.
Eliot Sykes


7

Si vous activez les options par défaut, config/boot.rbtous les attributs de commande pour rake et rails échouent (exemple: rake -Tou rails g model user)! Donc, ajoutez ceci à la bin/railsligne après require_relative '../config/boot'et le code est exécuté uniquement pour la commande du serveur rails:

if ARGV.first == 's' || ARGV.first == 'server'
  require 'rails/commands/server'
  module Rails
    class Server
      def default_options
        super.merge(Host:  '0.0.0.0', Port: 3000)
      end
    end
  end
end

Le bin/railsfichier ressemble à ceci:

#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'

# Set default host and port to rails server
if ARGV.first == 's' || ARGV.first == 'server'
  require 'rails/commands/server'
  module Rails
    class Server
      def default_options
        super.merge(Host:  '0.0.0.0', Port: 3000)
      end
    end
  end
end

require 'rails/commands'

6

Pour Rails 5.1.7 avec Puma 3.12.1 la réponse sélectionnée ne fonctionne pas, mais je l'ai accomplie en ajoutant ce qui suit à mon config/puma.rbfichier:

set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port

port ENV.fetch('PORT') { 3000 }

J'ai déterminé cela en inspectant le fichier dsl . Il utilise instance_evalsur ce fichier, il y a donc probablement d'autres façons de le faire, mais cela m'a semblé le plus raisonnable.


Merci, tu m'as sauvé !!
Proz1g

1

Voici une solution plus simple que j'utilise. J'aime déjà / ai besoin de dotenv et puma-heroku , donc si leur utilisation ne fonctionne pas pour vous, cela pourrait ne pas être pour vous.

/config/puma.rb

plugin :heroku

Gemfile

gem 'dotenv-rails', groups: [:development, :test]

.env

PORT=8080

Maintenant, je peux commencer à la fois le développement et la production avec rails s.



1

Si vous utilisez docker ou un autre outil pour gérer les variables d'environnement, vous pouvez définir la HOSTvariable d'environnement sur l'adresse IP que vous devez lier.

Exemple: HOST=0.0.0.0

Ajoutez-le au docker.envfichier si vous utilisez Docker ou .envsi vous utilisez Foreman.


0

Pour Rails 5 avec Puma, la réponse sélectionnée ne fonctionne pas. Vous pouvez obtenir une telle erreur:cannot load such file -- rails/commands/server

Pour une solution appropriée, ajoutez ce qui suit à config/puma.rb:

bind 'tcp://0.0.0.0:3000'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.