Deploying Publify blog to Heroku causes Application Error

908 Views Asked by At

I'm trying to deploy a fresh install of a Publify blog to Heroku. Everything works fine on my local computer.

And git push heroku master does not saying anything about problems:

Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 786 bytes, done.
Total 6 (delta 1), reused 0 (delta 0)

-----> Heroku receiving push
-----> Ruby/Rails app detected
-----> Installing dependencies using Bundler version 1.2.2
       Running: bundle install --without development:test --path 
         vendor/bundle --binstubs bin/ --deployment

       Using rake (10.0.2)

       ... (edited out list of gems being used)

       Your bundle is complete! It was installed into ./vendor/bundle
       Cleaning up the bundler cache.
-----> Writing config/database.yml to read from DATABASE_URL
-----> Rails plugin injection
       Injecting rails_log_stdout
       Injecting rails3_serve_static_assets
-----> Discovering process types
       Procfile declares types      -> (none)
       Default types for Ruby/Rails -> console, rake, web, worker
-----> Compiled slug size: 10.7MB
-----> Launching... done, v7
       http://desolate-harbor-2909.herokuapp.com deployed to Heroku

To [email protected]:desolate-harbor-2909.git
   cea2c5c..efb4eb2  master -> master

But after that I see this on apps page:

Application Error
An error occurred in the application and your page could not be served. Please try again in a few moments.

If you are the application owner, check your logs for details.

and Heroku logs showing this:

heroku[slugc]: Slug compilation started
heroku[api]: Release v7 created by [email protected]
heroku[api]: Deploy efb4eb2 by [email protected]
heroku[web.1]: State changed from crashed to starting
heroku[slugc]: Slug compilation finished
heroku[web.1]: Starting process with command `bundle exec rails server -p 50812`
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/dsl.rb:7:in `evaluate'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/bin/bundle:14:in `<top (required)>'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/dsl.rb:32:in `instance_eval'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/friendly_errors.rb:4:in `with_friendly_errors'
app[web.1]: There was an error in your Gemfile, and Bundler cannot continue.
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/cli.rb:423:in `exec'
app[web.1]:        /app/Gemfile:7:in `eval_gemfile'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/dsl.rb:32:in `eval_gemfile'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/definition.rb:18:in `build'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler.rb:144:in `definition'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor/task.rb:27:in `run'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor/invocation.rb:120:in `invoke_task'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor.rb:275:in `dispatch'
app[web.1]:        /usr/local/lib/ruby/1.9.1/syck.rb:135:in `load'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/bin/bundle:23:in `load'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor/base.rb:408:in `start'
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/bin/bundle:14:in `block in <top (required)>'
app[web.1]: /usr/local/lib/ruby/1.9.1/syck.rb:135:in `load': syntax error on line 27, col 0: `adapter = uri.scheme' (ArgumentError)
app[web.1]:        /app/vendor/bundle/ruby/1.9.1/bin/bundle:23:in `<main>'
heroku[web.1]: Process exited with status 4
heroku[web.1]: State changed from starting to crashed
heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/ host=desolate-harbor-2909.herokuapp.com fwd=171.5.16.142 dyno= queue= wait= connect= service= status=503 bytes=
heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/favicon.ico host=desolate-harbor-[2909.herokuapp.com][1] fwd=171.5.16.142 dyno= queue= wait= connect= service= status=503 bytes=

What I'm doing wrong? I think I need to setup it somehow before deploying to Heroku.

Database.yml file is:

login: &login
  adapter: postgresql
  host: localhost
  username: *****
  password: *****

development:
  database: typo_dev
  <<: *login

test:
  database: typo_tests
  <<: *login

production:
  database: typo
  <<: *login

Heroku run rake db:migrate output is:

Running `rake db:migrate` attached to terminal... up, run.7604
/usr/local/lib/ruby/1.9.1/syck.rb:135:in `load': syntax error on line 27, col 0: `adapter = uri.scheme' (ArgumentError)
       /usr/local/lib/ruby/1.9.1/syck.rb:135:in `load'
       /app/Gemfile:7:in `eval_gemfile'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/dsl.rb:32:in `instance_eval'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/dsl.rb:32:in `eval_gemfile'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/dsl.rb:7:in `evaluate'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/definition.rb:18:in `build'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler.rb:144:in `definition'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/cli.rb:423:in `exec'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor/task.rb:27:in `run'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor/invocation.rb:120:in `invoke_task'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor.rb:275:in `dispatch'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/vendor/thor/base.rb:408:in `start'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/bin/bundle:14:in `block in <top (required)>'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/lib/bundler/friendly_errors.rb:4:in `with_friendly_errors'
       /app/vendor/bundle/ruby/1.9.1/gems/bundler-1.2.2/bin/bundle:14:in `<top (required)>'
       /app/vendor/bundle/ruby/1.9.1/bin/bundle:23:in `load'
       /app/vendor/bundle/ruby/1.9.1/bin/bundle:23:in `<main>'
There was an error in your Gemfile, and Bundler cannot continue.
1

There are 1 best solutions below

1
On

When Rails loads the database.yml file it actually filters it through ERB before loading it as a Yaml file. This is so that you can dynamically create your configuration using Ruby, e.g. to keep passwords out of your repository.

When you push a Rails app to Heroku, a new database.yml file is created, replacing the original. This new database.yml uses ERB to construct the config from the DATABASE_URL environment variable, so in reality it is not a “pure” Yaml file – you could consider it to be something like database.yml.erb.

The Gemfile of Typo loads the database.yml file and then parses it as Yaml, but doesn’t feed it through ERB first. The errors you are seeing are caused by the Yaml parser reading the file but failing as it is ERB, not valid Yaml.

To fix it you need to make sure that the database.yml file is put through ERB before being read as Yaml. In your Gemfile change the line

conf = YAML.load(File.read(dbfile))

to

require 'erb'
conf = YAML.load(ERB.new(File.read(dbfile)).result)

You might want to open bug report for Typo, or even send a pull request.