Deployng ElasticSearch on Heroku with Tire & Bonsai.io - ruby-on-rails

I'm trying to setup the new Bonsai ElasticSearch heroku add-on, but until now I can just run the search on my local developement machine, as soon as deployed on Heroku the same search fails silently, or better, Rails logger doesn't log anything while I get a 500 Internal Server Error. This are relevant Heroku logs during the failing query (no evident errors found): https://gist.github.com/2867221
I'm looking for some advices on how troubleshoot that. For example, I set Tire.configure { logger 'elasticsearch.log', :level => 'debug' } on Bonsai initializer config/initializers/bonsai.rb like the following:
Tire.configure { logger 'elasticsearch.log', :level => 'debug' }
if ENV['BONSAI_INDEX_URL']
Tire.configure do
url "http://index.bonsai.io"
end
BONSAI_INDEX_NAME = ENV['BONSAI_INDEX_URL'][/[^\/]+$/]
else
app_name = Rails.application.class.parent_name.underscore.dasherize
app_env = Rails.env
BONSAI_INDEX_NAME = "#{app_name}-#{app_env}"
end
but it logs on a file, which is good for local but is not accessible after deployed.
Bonsai ElasticSearch is a pritty new on-testing addon, so I wonder if someone of you guys has already had some succesfully experiences deploing that on Heroku and can give me a feedback and some advices.
UPDATE
Setting up logger logger $stdout, :level => 'debug' into Tire.configure finally heroku can log something while it's failing search :
2012-06-04T21:36:26+00:00 heroku[router]: GET gitwatcher.com/categories?utf8=%E2%9C%93&query=Asynchronous+Web+Frameworks dyno=web.1 queue=0 wait=0ms service=32ms status=500 bytes=728
2012-06-04T21:36:26+00:00 heroku[nginx]: 93.34.212.216 - - [04/Jun/2012:21:36:26 +0000] "GET /categories?utf8=%E2%9C%93&query=Asynchronous+Web+Frameworks HTTP/1.1" 500 728 "http://gitwatcher.com/categories" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0" gitwatcher.com
2012-06-04T21:36:26+00:00 app[web.1]: # 2012-06-04 21:36:26:387 [_search] (["123456789"])
2012-06-04T21:36:26+00:00 app[web.1]: #
2012-06-04T21:36:26+00:00 app[web.1]: curl -X GET "http://index.bonsai.io/123456789/category/_search?load=true&pretty=true" -d '{"query":{"query_string":{"query":"Asynchronous Web Frameworks"}}}'
2012-06-04T21:36:26+00:00 app[web.1]:
2012-06-04T21:36:26+00:00 app[web.1]: # 2012-06-04 21:36:26:387 [200] (1 msec)
2012-06-04T21:36:26+00:00 app[web.1]:
... please see more on issue opened to https://github.com/karmi/tire/issues/365

Just for tracking purposes,
I'll report here (cat&past) the resolution I post on GitHub Tire issues:
DEFINETLY WORKS BY:
1) dropping out `to_indexed_json` from Category MongoID model ( at the opposit of README indication )
2) removing and re-adding Bonsai.io Heroku add-on
3) reindexing ElasticSearch by running `heroku run:detached rake environment tire:import CLASS='Category'`
... infact, if you just run rake environment tire:import CLASS='Category' FORCE=true it doesn't work on Heroku/Bonsai.io, becuse of Bonsai authorized operation :
2012-06-11T20:39:30+00:00 app[run.1]: curl -X DELETE http://index.bonsai.io/my-fake-index-11223344
2012-06-11T20:39:30+00:00 app[run.1]: # 2012-06-11 20:39:30:749 [401]
2012-06-11T20:39:30+00:00 app[run.1]: #
2012-06-11T20:39:30+00:00 app[run.1]: # "{\"error\": \"Not authorized: Some endpoints are admin-only, ask support#onemorecloud.com.\"}\n"
than if you want to reset/reindex your eventually dirty data, the only way is dropping the Bonsai add-on and recreate:
heroku addons:remove bonsai:test
heroku addons:add bonsai:test
That saied, I really had a dirty data indicated by :
BSON::InvalidObjectId (illegal ObjectId format: LAm-hNglS5mbrMzDlVVHCQ):
app/controllers/categories_controller.rb:25:in `index'
If you'll need the full gem stack to compare with other cases, here it is: https://gist.github.com/2912881

Related

Google API Services - Could not parse PKey: no start line in production (heroku) only

ANSWER: The two environment variables were mixed up in Heroku. CERT pointed to the private key and PRIVATE_KEY pointed to cert. Fixed that. Authorization now works.
Will mark this question answered when I can.
I am hooking into the Google Analytics Reporting API with a services account from my Rails 4 application. I have set up the authorization process and got it working in development. Upon deployment, I realized that using the .p12 key file was a problem - I either had to commit it to my repository or find a way around it. So I found a way around it, by breaking the key file into two .PEM files and storing the contents of those files as environment variables.
Works great in development (am using dotenv-rails to store environment variables there). But something must be happening to the variables on Heroku, because when I try to use my authorization method in production, I get the error ArgumentError: Could not parse PKey: no start line.
I've searched around for some clue about what's going on here - I've seen that related errors can happen due to version problems (someone downgraded from Ruby 2.2 to 1.9.8 and fixed a similar problem, although theirs just flat out didn't work anywhere, and mine works in development). Downgrading my Ruby version is not really an option. :/
Here's the related code:
def authorize_with_services
begin
self.client = Google::APIClient.new(application_name: 'Playground', application_version: '1')
p12 = OpenSSL::PKCS12.create('notasecret', 'descriptor',
problem spot --> OpenSSL::PKey.read(ENV['PRIVATE_KEY']),
OpenSSL::X509::Certificate.new(ENV['CERT']))
p12_binary = p12.to_der
self.client.authorization = Signet::OAuth2::Client.new(
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
audience: 'https://accounts.google.com/o/oauth2/token',
scope: 'https://www.googleapis.com/auth/analytics.readonly',
issuer: GA_EMAIL,
signing_key: Google::APIClient::PKCS12.load_key(p12_binary, 'notasecret')
).tap { |auth| auth.fetch_access_token! }
rescue Signet::AuthorizationError
self.client = nil
end
self.client
end
And then the ENV variables as stored in .env:
PRIVATE_KEY: "Bag Attributes\n friendlyName: privatekey\n localKeyID: 54 69 6D 65 20 31 34 33 35 36 38 34 30 33 31 30 32 39\nKey Attributes: <No Attributes>\n-----BEGIN RSA PRIVATE KEY-----\nKEY\n-----END RSA PRIVATE KEY-----\n"
CERT: "Bag Attributes\nfriendlyName: privatekey\nlocalKeyID: 54 69 6D 65 20 31 34 33 35 36 38 34 30 33 31 30 32 39\nsubject=/CN=636085506886-096q9j1uotf9kp1tv4evhn2crip6dec8.apps.googleusercontent.com\nissuer=/CN=636085506886-096q9j1uotf9kp1tv4evhn2crip6dec8.apps.googleusercontent.com\n-----BEGIN CERTIFICATE-----\nCERT\n-----END CERTIFICATE-----\n"
And I've set them exactly the same in heroku config:set PRIVATE_KEY and heroku config:set CERT.
Edit
Here's the session in the Heroku console which leads to the error:
# 11:15:36 (ruby-2.1.5#yt-ga-playground) ~/projects/confreaks/yt-ga-playground (master)$ heroku run console
Running `console` attached to terminal... up, run.8357
Loading production environment (Rails 4.2.0)
irb(main):001:0> querier = AnalyticsQuerier.new
=> #<AnalyticsQuerier:0x007f81fc6f5358 #options={"ids"=>"ga:104082366", "start-date"=>"2015-01-01", "end-date"=>"2015-07-04", "metrics"=>"ga:totalEvents"}, #ids="ga:104082366", #start_date="2015-01-01", #end_date="2015-07-04", #metrics="ga:totalEvents">
irb(main):002:0> querier.authorize_with_services
ArgumentError: Could not parse PKey: no start line
from /app/app/services/analytics_querier.rb:56:in `read'
from /app/app/services/analytics_querier.rb:56:in `authorize_with_services'
from (irb):2
from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.0/lib/rails/commands/console.rb:110:in `start'
from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.0/lib/rails/commands/console.rb:9:in `start'
from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:68:in `console'
from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.0/lib/rails/commands.rb:17:in `<top (required)>'
from bin/rails:8:in `require'
from bin/rails:8:in `<main>'
And the equivalent session in my development console:
# 11:17:47 (ruby-2.1.5#yt-ga-playground) ~/projects/confreaks/yt-ga-playground (master)$ be rails c
Loading development environment (Rails 4.2.0)
2.1.5 :001 > querier = AnalyticsQuerier.new
=> #<AnalyticsQuerier:0x007fe97d380928 #options={"ids"=>"ga:104082366", "start-date"=>"2015-01-01", "end-date"=>"2015-07-04", "metrics"=>"ga:totalEvents"}, #ids="ga:104082366", #start_date="2015-01-01", #end_date="2015-07-04", #metrics="ga:totalEvents">
2.1.5 :002 > querier.authorize_with_services
=> #<Google::APIClient:0x007fe97d36bc80 #host="www.googleapis.com", #port=443, #discovery_path="/discovery/v1", #user_agent="Playground/1 google-api-ruby-client/0.8.2 Mac OS X/10.10.3\n (gzip)", etc.>
And I have a controller method which uses the AnalyticsQuerier. I pushed it to production when I thought that it would work. Here's how that plays out in the logs:
[...] app[web.1]: Started POST "/events" for 104.231.12.227 at 2015-07-04 15:14:11 +0000
[...] app[web.1]: Completed 500 Internal Server Error in 16ms
[...] app[web.1]: Processing by EventsController#create as HTML
[...] app[web.1]: Parameters: {"authenticity_token"=>"1fvzDI1n+AlTssDybGFHAyiG4M+kir2UDLsA4dZGiAJvrWXdK6OnlAf1wK0V+/dI4QXz3lxonmRw15XbFjpOAQ=="}
[...] app[web.1]: (0.8ms) SELECT COUNT(*) FROM "analytics_calls"
[...] app[web.1]:
[...] app[web.1]: ArgumentError (Could not parse PKey: no start line):
[...] app[web.1]: app/services/analytics_querier.rb:56:in `read'
[...] app[web.1]: app/services/analytics_querier.rb:56:in `authorize_with_services'
[...] app[web.1]: app/controllers/events_controller.rb:10:in `create'
2015-07-04T15:14:11.542398+00:00 app[web.1]:
[...] app[web.1]: app/models/analytics_call.rb:19:in `get_batch'
[...] app[web.1]:
[...] heroku[router]: at=info method=POST path="/events" host=desolate-fortress-9280.herokuapp.com request_id=3822f668-6b8c-4cb2-9764-c171fc0dc67b fwd="104.231.12.227" dyno=web.1 connect=3ms service=33ms status=500 bytes=1754
Edit 2 - Possible lead in the right direction?
So, as pointed out by Val Asensio, there's a problem with the SSH setup provided by Heroku (this is more or less unfamiliar territory for me, but I'll try to word things as clearly as possible, given my understanding needs some fleshing out here).
I've found a gem called heroku-buildback-ssh, which definitely suggests that you need to do more than just load a private key into an env variable in order to use it properly. However, the readme specifies that the private cannot have a passphrase in order to be accessed. It also seems to assume you're using a file called something rsa, with no indication that this works for .pem files?
I found another discussion here about ssh tunneling from Heroku. I think this is the route to take. My understanding is that I need to be able to 'rebuild' the private key file using the env variable PRIVATE_KEY behind the scenes, and that I can write a script to do this when Heroku starts up.
However, my understanding here is so shaky, and the use-case described in the answer script is different enough that I'm not sure how to extrapolate how to go about building a solution using this kind of method.
What I want to know now is, can I build the .pem key file using a bash script that Heroku runs behind the scenes, and if so, how do I then make sure that that file is what is being read when my script runs OpenSSL::PKey.read? I guess I could also try to build the original .pk12 file itself instead?
ALSO - big question: am I going to screw anything up so terribly that I'm left in a tangled knot of confused code and have to trash the whole application (it's a code spike application, but I still want to know if anyone can provide an answer here) if I start poking around with writing scripts that create files and manage permissions on those files in my production environment?
For non-Heroku deployments
Although I've not used this particular Google API, this seems like an SSH key problem on the server- the PKey error tells us that. The error indicating "no start line" leads me to think that a key part of the SSH setup is missing on the server side.
App side
Make sure you have this in your deploy.rb
ssh_options[:forward_agent] = true
Server side
The server side SSH must be setup to access the Google API. Do you have an
~/.ssh/config file? Do you have the Google API SSH set there?
# Google API
Host hostservingAPIname.com
User yourusername
IdentityFile ~/.ssh/svn_id_rsa
# Your app
Host yourappsdomian.com
User yourrailsappusername
IdentityFile ~/.ssh/id_rsa
ControlMaster auto
I'm not sure this info will be helpful, but since it doesn't seem like anyone who has the definitive answer is going to chime in, I hope my suggestion will be helpful in moving you towards a solution.
Note: Someone may search for this question and their app is not hosted on Heroku, so they may find this answer useful, so I'll leave it here.
I had the two environment variables mixed up.
That's it.
That's all it was.

Deploying rails app with realtime-rails gem and redis on Heroku

I have built a rails app following the model presented here:
http://mikeatlas.github.io/realtime-rails/
I am using Rails with the realtime-rails gem and redis. My application is working in my development environment and i want to move it to Heroku. I have already setup a Redis database at Redis-to-go and I now want to make whatever changes are necessary for the realtime-gem and associated socket-io server setup. At a minimum, I will need to modify the production portion of my application_controller:
def realtime_server_url
if Rails.env.development?
return 'HTTPLOCALHOST:5001'
end
if Rails.env.production?
return 'PRODUCION-LOCATION'
end
end
I have deployed the socket-io server (realtime-server) that is installed by instructions from the link above for realtime-server to a separate heroku instance. I then made the PRODUCION-LOCATION that url for the realtime -server dyno with port 5001 and both http and https. No joy.
Following the instructions the realtime-server folder was created at the top level of my project folder, parallel to the app folder. Does this mean i should include it in the main repository and somehow have it run from the same dyno as the app? If so, how do i go about starting it? The instructions say to start it by locally with:
cd realtime-server
foreman start
Not clear that I can do that through the heroku cli will be able to run in the same instance and how is it started.
=============
Update
Found documentation on heroku that made me realize, I need to set the REDISCLOUD_URL for the heroku dyno running the realtime-server using:
heroku config:add REDISCLOUD_URL='redis_cloud_url'
and that in production it wasnt using the 5001 port:
if (process.env.NODE_ENV != 'production') {
port = 5001; // run on a different port when in non-production mode.
}
Also, found form console log that the realtime-server was enforcing HTTPS.
Now, the blocking issue seems to be the request of /socket.io/socket.io.js from the realtime-server which returns:
503 (Service Unavailable)
So far, it seems that separating the realtime-server from the rails app repository was the right move.
Looking through the code for the realtime-server to determine how that is routed...
================
Update
i looked at the logs on your advice, thanks. saw that the realtime-server was crashing because it wasnt liking the port, so I tried to set the PORT variable 443, 3000, 5001 variously to no avail using:
heroku config:add PORT='443'
based on this code from the enviornment.js file of the realtime-server:
var port = process.env.PORT || 5001;
if (process.env.NODE_ENV != 'production') {
port = 5001; // run on a different port when in non-production mode.
}
here is an excerpt of logs:
2015-02-22T19:26:45.512317+00:00 heroku[api]: Set PORT config vars by tmt#breakthroughtek.com
2015-02-22T19:26:45.512317+00:00 heroku[api]: Release v5 created by tmt#breakthroughtek.com
2015-02-22T19:26:45.754327+00:00 heroku[web.1]: State changed from crashed to starting
2015-02-22T19:26:48.318928+00:00 heroku[web.1]: Starting process with command `node forever.js`
2015-02-22T19:26:49.540190+00:00 app[web.1]: Detected 512 MB available memory, 512 MB limit per process (WEB_MEMORY)
2015-02-22T19:26:49.540213+00:00 app[web.1]: Recommending WEB_CONCURRENCY=1
2015-02-22T19:26:49.957808+00:00 app[web.1]: STARTING ON PORT: 5001
2015-02-22T19:27:44.163425+00:00 heroku[api]: Scale to web=1 by tmt#breakthroughtek.com
2015-02-22T19:27:48.811493+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2015-02-22T19:27:48.811551+00:00 heroku[web.1]: Stopping process with SIGKILL
2015-02-22T19:27:49.561043+00:00 heroku[web.1]: State changed from starting to crashed
2015-02-22T19:27:49.561720+00:00 heroku[web.1]: State changed from crashed to starting
2015-02-22T19:27:49.534451+00:00 heroku[web.1]: Process exited with status 137
2015-02-22T19:27:51.936860+00:00 heroku[web.1]: Starting process with command `node forever.js`
2015-02-22T19:27:53.289025+00:00 app[web.1]: Detected 512 MB available memory, 512 MB limit per process (WEB_MEMORY)
2015-02-22T19:27:53.289046+00:00 app[web.1]: Recommending WEB_CONCURRENCY=1
2015-02-22T19:27:53.703573+00:00 app[web.1]: STARTING ON PORT: 5001
2015-02-22T19:28:51.991836+00:00 heroku[web.1]: Stopping process with SIGKILL
2015-02-22T19:28:51.991836+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2015-02-22T19:28:52.758191+00:00 heroku[web.1]: Process exited with status 137
2015-02-22T19:28:52.764783+00:00 heroku[web.1]: State changed from starting to crashed
2015-02-22T19:31:22.240362+00:00 heroku[api]: Set PORT config vars by tmt#breakthroughtek.com
2015-02-22T19:31:22.240362+00:00 heroku[api]: Release v6 created by tmt#breakthroughtek.com
2015-02-22T19:31:22.378770+00:00 heroku[web.1]: State changed from crashed to starting
2015-02-22T19:31:24.766187+00:00 heroku[web.1]: Starting process with command `node forever.js`
2015-02-22T19:31:26.316332+00:00 app[web.1]: Detected 512 MB available memory, 512 MB limit per process (WEB_MEMORY)
2015-02-22T19:31:26.316353+00:00 app[web.1]: Recommending WEB_CONCURRENCY=1
2015-02-22T19:31:26.717561+00:00 app[web.1]: STARTING ON PORT: 5001
===========
Update
looking at the logs and seeing the system was still picking port 5001, I checked the heroku environement via :
heroku config
and saw that the NODE_ENV variable was not set. Did a:
heroku config:add NODE_ENV='production'
and now the js file is loading. YAY!!! .. Thanks, d.danailov :)
Have to resolve some issue with rails on heroku erring with a missing template error on access to the admin area:
2015-02-22T20:04:36.492199+00:00 app[web.1]: Processing by LocationsController#index as HTML
2015-02-22T20:04:36.497052+00:00 app[web.1]: * "/app/app/views"
2015-02-22T20:04:36.497054+00:00 app[web.1]: * "/app/vendor/bundle/ruby/2.0.0/gems/devise-3.4.1/app/views"
2015-02-22T20:04:36.497059+00:00 app[web.1]: app/controllers/locations_controller.rb:8:in `index'
2015-02-22T20:04:36.497050+00:00 app[web.1]: ActionView::MissingTemplate (Missing template locations/index, application/index with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
2015-02-22T20:04:36.497062+00:00 app[web.1]:
2015-02-22T20:04:36.497057+00:00 app[web.1]: ):
2015-02-22T20:04:36.497060+00:00 app[web.1]:
2015-02-22T20:04:36.497056+00:00 app[web.1]: * "/app/vendor/bundle/ruby/2.0.0/gems/realtime-0.0.12/app/views"
And of course, the page is working fine in development. So I am going to start with the assumption it has something to do with sprockets/asset pipeline.
But i think this portion may be solved. I will close once I verify I can send realtime msgs.
=============
Update
SOLVED: beware you dont use redis elsewhere in your app.
HEADS UP: i had a sneaky little Redis.new in an initializer that was wiping out my Redis config settings.
most of the solution was setting the NODE_ENV & REDISCLOUD_URL vars for the realitme server running in a separate instance.

Ruby on Rails unicorn throws errors

I setup a droplet with Ruby on Rails on digitalocean and I removed the rails directory (App) and replaced it with the one I had locally. It is working fine, if I connect with ssh and go to the IP with the port 3000. However whenever I try to go to port 80, then it throws me an error:
http://prntscr.com/2qoljb
I have checked the logs and it says the following:
Rails Error: Unable to access log file. Please ensure that /home/rails/log/production.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
Rails Error: Unable to access log file. Please ensure that /home/rails/log/production.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
I, [2014-02-08T18:40:59.192086 #735] INFO -- : worker=1 ready
I, [2014-02-08T18:40:59.198211 #731] INFO -- : worker=0 ready
Started GET "/" for 188.193.201.119 at 2014-02-08 18:41:00 +0000
Processing by QuestionsController#index as HTML
Completed 500 Internal Server Error in 43ms
ActiveRecord::StatementInvalid (Could not find table 'users'):
app/controllers/application_controller.rb:18:in `current_user'
app/controllers/application_controller.rb:10:in `require_login'
Started GET "/" for 188.193.201.119 at 2014-02-08 18:41:01 +0000
Processing by QuestionsController#index as HTML
Completed 500 Internal Server Error in 47ms
ActiveRecord::StatementInvalid (Could not find table 'users'):
app/controllers/application_controller.rb:18:in `current_user'
app/controllers/application_controller.rb:10:in `require_login'
Started GET "/" for 188.193.201.119 at 2014-02-08 18:41:02 +0000
Processing by QuestionsController#index as HTML
Completed 500 Internal Server Error in 2ms
ActiveRecord::StatementInvalid (Could not find table 'users'):
app/controllers/application_controller.rb:18:in `current_user'
app/controllers/application_controller.rb:10:in `require_login'
Started GET "/" for 188.193.201.119 at 2014-02-08 18:41:02 +0000
Processing by QuestionsController#index as HTML
Completed 500 Internal Server Error in 2ms
ActiveRecord::StatementInvalid (Could not find table 'users'):
app/controllers/application_controller.rb:18:in `current_user'
app/controllers/application_controller.rb:10:in `require_login'
The tables should exist, as everything is working completely fine, if I manually type in the IP with port 3000...
Thanks for your help in advance
EDIT
After setting permissions and the owner I am getting the following error instead:
/usr/local/rvm/gems/ruby-2.0.0-p353/gems/bundler-1.3.5/lib/bundler/runtime.rb:216: warning: Insecure world writable dir /home/rails in PATH, mode 040777
/usr/local/rvm/gems/ruby-2.0.0-p353/gems/bundler-1.3.5/lib/bundler/runtime.rb:216: warning: Insecure world writable dir /home/rails in PATH, mode 040777
I, [2014-02-08T19:27:30.231141 #1984] INFO -- : worker=1 ready
I, [2014-02-08T19:27:30.292714 #1981] INFO -- : worker=0 ready
First two lines explicitly talk about wrong file permissions but the Unicorn process shoud run under the same user as log file created by. I guess the capistrano and Unicorn run under different users.
If you are not sure what users should be and you have no problems with security just run:
$ chmod 0666 /home/rails/log/production.log
Once you restart the Unicorn the issue should gone.
I would not care about the problem with the log file in the moment. I do not think that is the root cause.
What catches my eye is Could not find table 'users'. The app does not find a table users in the database or does not find the database at all. Did check your credentials to the production database in config/database.yml? Did you run migrations on the database? Perhaps connect to the production database and check if the schema looks like you expect it to be.

Heroku - Application Error

I've created simple application with Ruby on Rails and I’ve tried to commit it on Heroku. I’ve followed this Getting Started on Heroku guide,
I finished it and try to open my page but I still see an Error:
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.
Anybody know how to deal with it?
I don’t know what was happen but I’ve done this step, unfortunately I have another problem, I run a few commands:
# git add .
# git commit -m "my commit"
On branch master nothing to commit (working directory clean)
# git push heroku
master Everything up-to-date
# heroku open Opening
http ://eerie-meadow-9207.heroku.com/
# heroku restart
Restarting processes... done
# heroku open Opening
http ://eerie-meadow-9207.heroku.com/
And I see a message:
We're sorry, but something went wrong.
We've been notified about this issue and we'll take a look at it shortly.
From heroku logs [timestamps removed for clarity]:
app[web.1]: Started GET "/" for 77.236.11.34 at 2011-10-31 11:50:38 -0700
app[web.1]: Processing by StoreController#index as HTML
app[web.1]: Completed 500 Internal Server Error in 3ms
heroku[router]: GET eerie-meadow-9207.heroku.com/ dyno=web.1 queue=0 wait=0ms service=13ms status=500 bytes=728
heroku[nginx]: 77.236.11.34 - - [31/Oct/2011:11:50:38 -0700] "GET / HTTP/1.1" 500 728 "-" "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.04 (lucid) Firefox/3.6.23" eerie-meadow-9207.heroku.com
app[web.1]:
heroku[web.1]: State changed from up to bouncing
heroku[web.1]: State changed from bouncing to created
heroku[web.1]: State changed from created to starting
heroku[web.1]: Starting process with command `thin -p 40376 -e production -R /home/heroku_rack/heroku.ru start`
heroku[web.1]: Process exited
app[web.1]: >> Maximum connections set to 1024
app[web.1]: >> Listening on 0.0.0.0:40376, CTRL+C to stop
app[web.1]: >> Thin web server (v1.2.6 codename Crazy Delicious)
heroku[web.1]: State changed from starting to up
app[web.1]:
app[web.1]: Started GET "/" for 77.236.11.34 at 2011-10-31 11:50:59-0700
app[web.1]:
app[web.1]: Processing by StoreController#index as HTML
app[web.1]: Completed 500 Internal Server Error in 4ms
app[web.1]:
app[web.1]: ActiveRecord::StatementInvalid (PGError: ERROR: relation "products" does not exist
app[web.1]: : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
app[web.1]: FROM pg_attribute a LEFT JOIN pg_attrdef d
app[web.1]: ON a.attrelid = d.adrelid AND a.attnum = d.adnum
app[web.1]: WHERE a.attrelid = '"products"'::regclass
app[web.1]: AND a.attnum > 0 AND NOT a.attisdropped
app[web.1]: ORDER BY a.attnum
app[web.1]: ):
app[web.1]: app/controllers/store_controller.rb:3:in `index'
app[web.1]:
app[web.1]:
app[web.1]: cache: [GET /] miss
heroku[router]: GET eerie-meadow-9207.heroku.com/ dyno=web.1 queue=0 wait=0ms service=81ms status=500 bytes=728
heroku[nginx]: 77.236.11.34 - - [31/Oct/2011:11:50:59 -0700] "GET / HTTP/1.1" 500 728 "-" "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.04 (lucid) Firefox/3.6.23" eerie-meadow-9207.heroku.com
app[web.1]:
app[web.1]:
app[web.1]: Started GET "/" for 77.236.11.34 at 2011-10-31 11:54:00-0700
app[web.1]: Processing by StoreController#index as HTML
I cannot understand it because on my netbook it works on localhost, any ideas?
Try using the command
heroku run rake db:migrate
Try restarting your app with heroku restart. Assuming your app runs fine locally, this should do the trick. It solved the issue for me as I only refactored the schema and the db:reset did not seem to do the trick.
Most of the time heroku issues are due to lack of privileges to access file system. In order for your application to work on heroku you must make sure it wont try to write anything to disk (but in temporary folder).
The typical example is js/css compiling process, e.g. with compass, for which you will find a solution on their knowledge database: http://devcenter.heroku.com/articles/using-compass
You should look further in the heroku logs see if there is any "permission denied" issue at application startup or during the first requests.
http://www.youtube.com/watch?v=p_3dIPgXgkg
If you already have your application built, go to the point in the video when he begins pushing the sample app to heroku. Unfortunately heroku returns hard to solve errors when uploading 3.1 apps for the first time. Follow the troubleshooting steps in the video and you'll be fine.
I had this issue when I was starting to create a discord bot and make it online. And I figured out the reason for this was using the node latest current version(v17.1), I wasted about 2 days for this and tried downgrading node version to v16.7.And to my surprise it worked!.
So I recommend downgrading to v16.7 or the latest LTS version when you are checking this and do install the current latest version
https://nodejs.org/ca/blog/release/v16.7.0/
Here's the full code
const { Client, Intents } = require('discord.js');
const { token } = require('./config.json');
// Create a new client instance
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
// WShen the client is ready, run this code (only once)
client.once('ready', () => {
console.log('Ready!');
});
// Login to Discord with your client's token
client.login(token);
const http = require('http');
const PORT = process.env.PORT || 3000;
const requestListener = function (req, res) {
res.writeHead(200);
res.end('Bot is up and running');
}
const server = http.createServer(requestListener);
server.listen(PORT);
setInterval(function() {
http.get("http://<your app name>.herokuapp.com");
}, 300000); // every 5 minutes (300000)
Note:Last 3 lines of this code is completely additional and what they do is stop heroku from putting app to sleep every 30 minutes
I had the same problem. Have a look at your Procfile and check if you have added the proper command in it such as web: python run.py. I wasn't able to connect then I placed the command heroku logs --tail to see what was the problem and I saw that within my Procfile I had a type mistake such as >>>web: oython run.py<<< making the app not work. So, pay attention to it. command: $echo web: python run.py > Procfile
Just make sure that in the data base, you have allowed "any IP Address" to connect. This is called whitelisting the IP Address. Example: 0.0.0/0. This is because Heroku, each time it spins up, uses a different IP address. But you can change it later using Heroku docs and the docs of your Database service provider.
https://i.stack.imgur.com/Ud2VJ.png
You can use this image as an example which is a screenshot of MongoDB Atlas
Before you start please allow access to your DB network from anywhere.
Well I have also faced this "Application error" problem once
that time I used these command lines
git init
git add .
git commit -m "my first commit"
heroku create YourAppName
git push heroku main
But as you know I got the "Application error"
Then I used these commands
heroku config:set NPM_CONFIG_PRODUCTION=false
git add .
git commit -m "my first commit"
git push heroku main
After that "Application error" problem was solved.
Well, I'm not sure if it works for you or not but I guess you can try at least.

Heroku: see params and sql activity in logs?

When i view my heroku logs on the server (with heroku logs --tail --app myapp) i see something like this:
2011-06-21T14:09:25+00:00 app[web.1]: Started PUT "/reports/19.xml" for 77.89.149.137 at 2011-06-21 07:09:25 -0700
2011-06-21T14:09:25+00:00 heroku[router]: PUT myapp.heroku.com/reports/19.xml dyno=web.1 queue=0 wait=0ms service=7ms status=401 bytes=28
2011-06-21T14:09:26+00:00 heroku[nginx]: PUT /reports/19.xml HTTP/1.1 | 77.89.149.137 | 656 | http | 401
While in my local log i'd see something like this:
Started PUT "/reports/19" for 127.0.0.1 at 2011-06-21 15:27:01 +0100
Processing by ReportsController#update as XML
Parameters: {"report"=>{"workflow_status"=>"3"}, "id"=>"19"}
Person Load (0.9ms) SELECT "people".* FROM "people" WHERE "people"."email" = 'madeupemai#lkklj.com' LIMIT 1
Report Load (0.4ms) SELECT "reports".* FROM "reports" WHERE "reports"."id" = 19 LIMIT 1
DEPRECATION WARNING: Object#returning has been deprecated in favor of Object#tap. (called from update_report at /home/max/work/rails_apps/flamingo_container/flamingo/vendor/plugins/resource_this/lib/resource_this.rb:135)
Creating scope :open. Overwriting existing method Task.open.
Task Load (2.0ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = 14 LIMIT 1
Completed 200 OK in 1648ms (Views: 568.2ms | ActiveRecord: 3.2ms)
Ie with a lot more information, particularly the params, info from the router, generated sql, any templates rendered etc etc.
Does anyone know how i can get my heroku log to be as verbose as my development one? I've done the following already:
1) Set the log level in the relevant (rails 3) environment file:
config.log_level = :debug
2) Told heroku to use a different logger level, as described on http://devcenter.heroku.com/articles/logging
heroku config:add LOG_LEVEL=DEBUG --app myapp #from CLI
Neither has made any difference...any ideas anyone?
thanks, max
You're essentially wanting to show the SQL / params output in the Heroku logs. You can do this by adding the line shown below to the config block within your production.rb file:
MyAppNameHere::Application.configure do
# add this line
config.logger = Logger.new(STDOUT)
end
By the way, setting the log level to debug just means that Rails.logger.debug will output to the logs when you're on Heroku
In your production.rb add config.log_level = :debug and redeploy. That will give you the same logs as development mode :)
The detailed log you want is generated by the function start_processing in log_subscriber.rb.
action_controller/log_subscriber.rb:
def start_processing(event)
payload = event.payload
params = payload[:params].except(*INTERNAL_PARAMS)
info " Processing by #{payload[:controller]}##{payload[:action]} as #{payload[:formats].first.to_s.upcase}"
info " Parameters: #{params.inspect}" unless params.empty?
end
I checked with rails 3.0.4 in development and production environment. In both environments, we have the detailed logs.
This is an info level log. That's why the debug log level is not changing the output.
I installed the plugin used by heroku rails_log_stdout (Heroku logging) but I still have the desired output.
Right now, I can't test with heroku to find out why you don't have all the logs.
In the heroku example (see Heroku logging, section log retrieval), we don't see the "Processing" and "Parameters" lines. I think that either this method is not called when the app is running on heroku (it is somehow disabled) or heroku skips logs starting with whitespaces. Could you try to log messages starting with whitespaces and see if heroku is showing them?
Rails doesn't generate those logs when in production mode. http://groups.google.com/group/heroku/browse_thread/thread/d778fafedc9a378a
The real problem is actually due to the way Heroku works in conjunction with rails. The right way to solve this is to add: gem 'rails_12factor', group: :production
See https://devcenter.heroku.com/articles/rails-integration-gems for more info on the matter
Looks like the puma server doesn't play well with Heroku. In my project, I tried everything, but it still wouldn't log. I then replaced Puma with Unicorn, and bam, full logs are being shown.

Resources