在Heroku上部署Sinatra应用程序

16

我有一个简单的Sinatra应用程序。

web.rb:

require 'sinatra'

get '/' do 
    "Hello" 
end

Gemfile:*

source :rubygems

gem 'sinatra', '1.1.0'
gem 'thin', '1.2.7'

config.ru:

require './web'
run Sinatra::Application

但是当我在Heroku上部署我的应用程序时,在日志中会出现以下错误:

2012-03-27T19:17:48+00:00 heroku[router]: Error H14 (No web processes running) -> GET furious-waterfall-6586.herokuapp.com/ dyno= queue= wait= service= status=503 bytes=

我该如何修复它?


heroku logs 中还有其他有用的信息吗? - Eric Wendelin
仅返回此错误。'heroku ps' 显示没有运行进程。 'heroku restart' 对我没有帮助。 - ceth
请问您遇到了什么问题? - Eric Wendelin
我不知道。我只是将sinatra-bootstrap作为我的项目模板,它可以正常工作。 - ceth
5个回答

25

以下是创建一个最小化的Sinatra应用程序并部署到Heroku的方法:

app.rb:

require 'sinatra'

get '/' do
  "hello world"
end

Gemfile:

source 'https://rubygems.org'

gem 'heroku'
gem 'sinatra'
gem 'thin'

config.ru:

require './app'
run Sinatra::Application
在命令行中输入以下命令以部署(不包括$符号):
$ bundle install
$ git init
$ git add -f app.rb Gemfile Gemfile.lock config.ru
$ git commit -am "initial commit"
$ heroku create <my-app-name>
$ git push heroku master

然后测试您的应用程序:

$ curl <my-app-name>.heroku.com

你应该会看到:

hello world

当我尝试使用上述代码时,出现了以下错误:“源:rubygems已过时,因为HTTP请求不安全。如果可能,请将您的源更改为'https://rubygems.org',如果不行,请更改为'http://rubygems.org'。” - JGallardo
@JGallardo,感谢您的评论!Bundler希望您使用HTTPS而不是HTTP,因此您只需要将source :rubygems这一行更改为source 'https://rubygems.org'即可。我在我的答案中也进行了更改。干杯! - Patrick Oscity
heroku gem现已弃用(被Heroku Toolbelt替换)。更多信息请查看:https://devcenter.heroku.com/articles/getting-started-with-ruby - ben.snape

16

你需要在config.ru文件旁边添加一个Procfile文件,告诉Heroku如何运行您的应用程序。这是一个示例Procfile的内容:

web: bundle exec ruby web.rb -p $PORT

Heroku Ruby Procfile文档

编辑:这是我其中一个 Sinatra/Heroku 应用的 config.ru 示例:

$:.unshift File.expand_path("../", __FILE__)
require 'rubygems'
require 'sinatra'
require './web'
run Sinatra::Application

你可能需要在代码中添加 require sinatra 和 require rubygems,以使其正常工作。


@demas 我添加了一个示例config.ru文件,希望能有所帮助。你的Gemfile看起来很不错(尽管这是一个相当旧的sinatra版本,不确定是否会影响)。 - Eric Wendelin
你能否在Github上创建一个最小的Sinatra应用程序?我尝试了你的更改,但对我没有帮助。 - ceth
好的,如果你在几个小时内还没有解决问题,我会创建一个。抱歉,我的Sinatra应用程序到目前为止都是闭源的 :(( - Eric Wendelin
1
你可能会发现这个sinatra-bootstrap项目在此期间非常有用:https://github.com/adambair/sinatra-bootstrap - Eric Wendelin
1
据我所知,不需要 Procfile 文件。 - Patrick Oscity
除非您希望运行除Webrick之外的Web服务器,否则不需要Procfile。查看 heroku ps,您可以看到Heroku执行的命令来运行您的应用程序! - danielricecodes

10

以前我遇到过好几次这个问题,都是因为没有在require [app].rb文件之前包含config.ru文件,然后才推送到Heroku上。即使我事后添加了它并重新启动了应用程序,Heroku也无法识别。

  • 在Heroku网站(http://www.heroku.com)上删除你的小型应用程序
  • 然后从你的项目文件夹中移除远程连接

$ git remote rm heroku
  • 然后重新创建应用程序


  • 2
    我刚刚遇到了OP报告的相同问题,这是唯一解决问题的方法。谢谢! - Matt Aimonetti
    同样的问题在这里。似乎一旦你推送了一个缺少或不正确的config.ru的应用程序,唯一的解决方法就是重新创建它。 - Andre Bernardes
    非常感谢您的帮助。这是唯一有效的方法。 - rails4sandeep

    1
    作为更新,这是我创建的一个稍微更加简约的应用程序,并确认今天仍然可以正常工作。不需要thin gem和Procfile即可获得初始工作应用程序。
    Gemfile
    source 'https://rubygems.org'
    gem 'sinatra'
    

    config.ru

    require './app'
    
    run Sinatra::Application
    

    注意:require行使用'./app'而不是'app'。

    app.rb

    require 'sinatra'
    
    get '/' do
      'Hello, World! Find me in app.rb'
    end
    

    如果您想使用此模板,可以复制、打包并推送 Git 存储库。
    $ git init
    $ git add .
    $ git commit -m "initial sinatra app"
    $ bundle
    $ git add Gemfile.lock
    $ git commit -m "bundle install"
    $ heroku create
    $ git push heroku master
    $ heroku open
    

    Gemfile 对我来说解决了问题。 - Richard Peck

    0
    通过将“heroku”宝石添加到Gemfile中,我让它正常工作了。不需要Procfile。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接