How to start server running Phusion Passenger - ruby-on-rails

I bought some hosting space where I have SSH access. Now I want to deploy a Ruby on Rails apps which works locally to one of the subdomains I made, let's call it subdomain.mywebsite.com.
I have setup SSH access via a public key, installed Ruby on Rails and Passenger on the server, and installed Capistrano locally by following the steps provided on the website and via tutorials. When I run cap production deploy the whole site is uploaded to the production server and via SSH I can see the current, releases, repo and shared folder. Unfortunately, when I go to subdomain.mywebsite.com I get a 404 - not found error.
I am new to setting up my own server and do not know what to do now. All tutorials I have found do not explain how to continue from here, and I hope someone who reads this can help me to actually being able to access the site.
Deploy.rb:
require 'capistrano'
set :stages, ["staging", "production"]
set :default_stage, "staging"
set :application, 'chiachia_store' # application name
set :repo_url, 'git#github.com:erooijak/chiachia_store.git' # your repo url
set :deploy_to, '/home/erooijak/chiachia.erooijak.simple-webhosting.eu'
set :user, "root"
set :scm, :git
set :branch, 'master'
set :keep_releases, 5
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
set :format, :pretty
set :log_level, :debug
set :pty, true
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
set :stage, :production
role :app, %w{root#213.159.6.126}
role :web, %w{root#213.159.6.126}
role :db, %w{root#213.159.6.126}
set :puma_rackup, -> { File.join(current_path, 'config.ru') }
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
namespace :deploy do
desc 'Restart application...'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# Your restart mechanism here, for example:
execute :touch, release_path.join('tmp/restart.txt')
end
end
desc 'Copy database.yml to correct location.'
task :copy_databaseyml do
on roles(:app) do
execute :cp ,'-r', shared_path.join('config/database.yml'),
release_path.join('config/database.yml')
end
end
after :publishing, :restart
after :restart, :copy_databaseyml
end
Apache.conf:
LoadModule passenger_module /usr/lib/apache2/modules/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p547/gems/passenger-4.0.49
PassengerRuby /usr/bin/ruby
ServerName www.chiachia.erooijak.simple-webhosting.eu
# !!! Be sure to point DocumentRoot to 'public'!
DocumentRoot /home/erooijak/chiachia.erooijak.simple-webhosting.eu/current/public
<Directory /home/erooijak/chiachia.erooijak.simple-webhosting.eu/current/public>
# This relaxes Apache security settings.
AllowOverride all
# MultiViews must be turned off.
Options -MultiViews
# Uncomment this if you're on Apache >= 2.4
#Require all granted
</Directory>
</VirtualHost>
The effect of running this is the following:
So it kind of works. Unfortunately I get a 404 error on all domains, the PHP application keeps running properly.
The passenger.3000.log has the following information:
passenger.3000.log
html error message metnioned in log

Why don't we start from scratch.
After reading your last comments, what you want is to be able to deploy multiple rails applications on the same server.
There are many options to do that, and depending on what you choose, configuration is going to be very different. There is a good SO answer that covers the basics you might want to read:
Ruby on Rails Server options
The stack I'm used to is Nginx/capistrano/unicorn but that depends on personal preferences and the nature of what's deployed.
Apache/Phusion passenger
The first thing to do is to configure apache for your domain. The phusion passenger documentation is a very good starting point.
You can even find a complete guide on how to deploy Rails >= 3.X apps with phusion passenger in the same documentation
If you follow carefully the instructions, you should have your app up and running without puma. They even also provide you capistrano recipes to use.
Puma
At this stage, unless you app needs high concurrency, puma is not needed. Phusion Passenger is an app server by itself, no need to add puma behind it. If you really need it for some reason, then you'll be better off switching to Nginx/Puma.
I hope the references I gave you clear things up a bit.

Related

Rails Capistrano deploy_to path

I'm trying to deploy my rails app, until now hostet at Heroku, now at DigitalOcean using Capistrano. I've created a "1-Click-Rails-Application", which creates a blank rails app, so when I open the remote server in my webbrowser, the typical rails welcome screen (index.html) shows up. When I ssh to the remote directory, the path to the rails app is:
/home/rails/
inside of the rails directory are the typical rails folders like controllers etc. So I thought that the correct deploy_to path should be:
set :deploy_to, "/home/rails/"
I've seen so many different directory suggestions that I really can't figure out what could be right. I had
set :deploy_to, "var/www/#{application}"
as well, which didn't seem to work either.
I'm glad I've managed to upload my local app to the new vpn server without any errors at all. I want to avoid using a git repo to save the extra costs for a private git repo and push it directly from my computer. The problem is, after a
cap production deploy:cold
which does a lot and runs through without any errors, doesn't seem to upload anything. At least I can't find any of "my" files on the server. Well, I'm really happy that I got this far but don't understand why my config isn't working. I hope someone can help. Here is my deploy.rb from the config directory. (I'm using rvm.)
require 'capistrano/ext/multistage'
require "bundler/capistrano"
require "rvm/capistrano"
set :application, "myApp"
set :user, "root"
set :port, 22
set :deploy_to, "home/rails/"
set :repository, "."
set :scm, :none
set :deploy_via, :copy
set :checkout, :export
set :use_sudo, false
#set :rvm_ruby_string, "ruby-2.0.0p195##{application}"
set :rvm_type, :user
set :rvm_type, :system
server "xx.xxx.xx.xx", :app, :web, :db, :primary => true
after "deploy", "deploy:migrate"
I'm using Rails 3.2.13 and Ruby 2.0.0. Thanks a lot!
Update:
I was originally following a railscast capistrano deployment tutorial to get my head around this. Thus I created the deploy folder inside the config folder with a production.rb and a staging.rb inside.
Long story short, I've found "my" rails app, inside a var/www/xx.xxx.xx.xx/current/ directory on the server. The path is specified inside the production.rb which looks like this:
server "xx.xxx.xx.xx", :app, :web, :db, :primary => true
set :deploy_to, "/var/www/xx.xxx.xx.xx"
I could now change the path above to /home/rails but the actual rails app was inside the additional folder named current. How do I have to write the path so that there is no current directory? at least not there?
set :deploy_to, "home/rails/"
The correct way is:
set :deploy_to, "/home/rails/"
and for var path:
set :deploy_to, "/var/www/#{application}"
I got this working with the latest version of Capistrano: 3.2.1 and 3.1.0
Perhaps this was fixed in a patch?
Here are the relevant parts of my files:
Gemfile:
group :development do
gem 'capistrano-rails'
end
Capfile:
require 'capistrano/setup'
# Includes default deployment tasks
require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
config/deploy.rb
set :deploy_to, '/var/www/wrong_stage_folder'
# make sure this value is ignored.
config/deploy/staging.rb
set :deploy_to, '/var/www/appname_stage'
config/deploy/production.rb
set :deploy_to, '/var/www/appname_prod'
Run check: cap staging deploy:check --trace
INFO [2618043b] Running /usr/bin/env mkdir -pv /var/www/appname_stage/shared /var/www/appname_stage/releases on example.server.com
Works as expected, same for production.

Deploying Rails app w/ Capistrano - No response

I'm having some trouble deploying a rails app to a VPS using capistrano. I'm running ubuntu 10.04, rvm, rails 3.2.2, and ruby 1.9.2, nginx, and passenger.
I tried deploying a test app with no problems, then tried doing everything with an actual app in pretty much the same way and now I've run into to trouble. I ran cap deploy:setup, cap deploy:check, cap deploy:cold without any errors.
Yet when I try to access the site, I get no response. I can't access static assets either. My nginx.conf file is pointing to the 'app_name/current/public'
The production.log doesn't give any hints either. It has pretty much nothing aside from some info about the asset compiling and migrations.
So I'm stumped. I thought I did everything the same way as I did with the test app when everything went smoothly but obviously I'm forgetting something. Let me know if there's any files I can post to help diagnose the problem. Appreciate the help!
my deploy.rb:
# RVM
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, 'default'
set :rvm_type, :user
# Bundler
require "bundler/capistrano"
# General
set :application, "my_app"
set :user, "deploy_user"
set :deploy_to, "/home/#{user}/#{application}"
set :deploy_via, :copy
set :use_sudo, false
set :normalize_asset_timestamps, false
# Git
set :scm, :git
set :repository, "~/#{application}/.git"
set :branch, "master"
# VPS
role :web, "app_name.com"
role :app, "app_name.com"
role :db, "app_name.com", :primary => true
# Passenger
namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
EDIT 1
nginx access.log shows lots of these:
[01/Jun/2012:11:23:11 -0400] "-" 400 0 "-" "-"
and error.log has these:
cache: [GET /] miss
EDIT 2: Not sure why but I realized I can access the assets in my app's public folder. What does it mean!?
Have you configured Nginx correctly? The virtual host's root must point to your Ruby on Rails application's public folder. The documentation for using Nginx with Phusion passenger may help. Try to examine the Nginx log files, access.log and error.log, probably they can be found in /var/log/nginx.

403 error after rails app deploy (apache + passenger)

This is my first rails app deploy, so please forgive me if the solution to this problem is obvious... I've been getting a 403 error (Forbidden) whenever I try to load my rails app in a browser. The deploy (using capistrano) is finally going ahead without errors, but there seems to be something wonky about my apache or passenger settings. It seems apache is trying to load an index file from the public folder rather than letting passenger intervene. I don't even get a passenger error screen when I load the app domain in a browser. I just get a Forbidden message. Has anyone else encountered the same problem?
Here's the actual error log:
[Mon Feb 27 10:03:12 2012] [error] [client xxx.xxx.xxx.xx] Directory index forbidden by Options directive: /usr/local/www/sites/project.example.ca/public/
I'm assuming this basically means it's erroring out because it can't find an index.html file, but Passenger should be intercepting it before it tries to look for an index file. So this is probably an apache error, but the virtual host is configured according to the tutorial...
I'm running rails 3.1.3, ruby 1.9.2-p290, capistrano 2.1.12, Apache 2.2, rvm 1.10.2 and whichever version of passenger would have been installed by the install script about a month ago. I followed this guide while setting up passenger: http://beginrescueend.com/integration/passenger/
Any help would be hugely appreciated! It feels like I've been trying to deploy this app FOREVER.
Here's my deploy file in case it helps:
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :application, "Project"
set :scm, "git"
set :repository, "ssh://git#server.project.ca/usr/local/git_root/project.git"
set :user, "deploy"
#set :rvm_bin_path, "/usr/local/rvm/bin"
set :rvm_ruby_string, "ruby-1.9.2-p290#project"
set :normalize_asset_timestamps, false
ssh_options[:forward_agent] = true
set :branch, "master"
set :deploy_via, :remote_cache
set :deploy_to, "/usr/local/www/sites/project.example.ca/public/"
set :use_sudo, false
set :domain, 'project.example.ca'
role :app, domain
role :web, domain
role :db, domain, :primary => true
We figured out the 403 error. We were deploying to /usr/local/sites/www/project.example.ca/public. However, the way capistrano deploys, the actual application was at /usr/local/sites/www/project.example.ca/public/current/public. I blew away everything already there and tweaked the deploy.rb to point to /usr/local/www/sites/project.example.ca, and changed the virtual host to point to /usr/local/sites/www/project.example.ca/current/public, and now we get a Phusion Passenger error page at least.

Capistrano very slow

I am not sure where exactly the problem is located but Capistrano takes about 5 minutes to deploy an almost empty project.
Can you tell me if I am doing something wrong or is it usual?
I am using:
Capistrano 2.9.0
Rails 3.1.3
Github Repository
not too slow server (4 cores, 1 GB memory)
ngix, passenger
Here is the output I am getting:
https://gist.github.com/1632009
Capfile
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
Dir['vendor/gems/*/recipes/*.rb','vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
load 'config/deploy' # remove this line to skip loading any of the default tasks
deploy.rb
# -*- encoding : utf-8 -*-
require "bundler/capistrano"
set :user, 'rubys'
set :domain, 'example.com'
set :application, 'EXAMPLE'
# adjust if you are using RVM, remove if you are not
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, '1.9.2'
#set :rvm_type, :user
# file paths
set :repository, "git#github.com:GITHUBREPO/ashop.git"
set :deploy_to, "/apps/#{application}"
# using a local git repository on the server you are deploying to.
set :deploy_via, :remote_cache
set :copy_exclude, [ '.git' ]
# distribute your applications across servers (the instructions below put them
# all on the same server, defined above as 'domain', adjust as necessary)
role :app, domain
role :web, domain
role :db, domain, :primary => true
set :deploy_via, :remote_cache
set :scm, 'git'
set :branch, 'master'
set :scm_verbose, false
set :use_sudo, false
set :rails_env, :production
namespace :deploy do
desc "cause Passenger to initiate a restart"
task :restart do
run "touch #{current_path}/tmp/restart.txt"
end
end
EDIT
Networkspeed workplace:
http://www.speedtest.net/result/1714391142.png
Speed Github - Server: ~ 300KiB
Capistrano is probably slow for a bunch of reasons. One is that it opens a new remote shell to your server for every run in your deploy.rb file.
This can be amended a bit by using ssh master channels, which will cause capistrano to actually reuse ssh connections, which means less network overhead.
Here's an article on ruby deployment that mentions ssh master channels: http://alexyoung.org/2011/05/17/deployment/
Another reason is that it copies your entire codebase to a new directory for every deploy.
This is not strictly necessary when using git, and github has a wonderful article on how to "fix" this: https://github.com/blog/470-deployment-script-spring-cleaning

Deployed rails site on ec2 using capistrano, but it doesn't show up on the browser, here is the site -> http://passionate4.net/

I am using apache passenger to deploy rails application.
I have followed each and every step clearly and everything works fine.
No error message in deployment.
But the site doesn't show up on browser.
Here are the files
$ sudo cat /etc/apache2/sites-available/capi_app
<VirtualHost *:80>
ServerName www.passionate4.net
DocumentRoot /var/www/apps/capi_app/public
RailsEnv production
<Directory /var/www/apps/capi_app/public>
Allow from all
Options -MultiViews
</Directory>
</VirtualHost>
I also tried to change
$ sudo cat /etc/apache2/sites-available/capi_app
<VirtualHost *:80>
ServerName www.passionate4.net
DocumentRoot /var/www/apps/capi_app/current/public
RailsEnv production
<Directory /var/www/apps/capi_app/current/public>
Allow from all
Options -MultiViews
</Directory>
</VirtualHost>
--> With this, when i restart apache, I don't get error (/ / / public) doesn't exist, but site still doesn't show up.
#Martin
$ sudo cat /etc/apache2/sites-enabled/capi_app
<VirtualHost *:80>
ServerName www.passionate4.net
DocumentRoot /var/www/apps/capi_app/current/public
RailsEnv production
<Directory /var/www/apps/capi_app/current/public>
Allow from all
Options -MultiViews
</Directory>
</VirtualHost>
----------- deploy.rb file -------------
require 'bundler/capistrano'
#using RVM!
$:.unshift("#{ENV["HOME"]}/.rvm/lib")
require "rvm/capistrano"
set :rvm_type, :user
set :application, "capi_app"
set :deploy_to, "/var/www/#{application}"
role :web, "50.18.155.154" # Your HTTP server, Apache/etc
role :app, "50.18.155.154" # This may be the same as your `Web` server
role :db, "50.18.155.154", :primary => true # This is where Rails migrations will run
default_run_options[:pty] = true
set :repository, "git#github.com:jaipratik/capi_app.git"
set :scm, :git
set :branch, "master"
set :user, "ubuntu" #if error use whats shown in podcast
set :use_sudo, false
set :admin_runner, "ubuntu"
set :rails_env, 'production' #<<<<<<<<<< NEW
#set :use_sudo, false #if error delete this
# if you're still using the script/reaper helper you will need
# these http://github.com/rails/irs_process_scripts
# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
ubuntu#ip-10-166-185-18:~$ ls -l /var/www/apps/capi_app
total 8
lrwxrwxrwx 1 ubuntu ubuntu 46 2011-11-17 19:04 current -> /var/www/
apps/capi_app/releases/20111117190420
drwx-w---- 5 ubuntu ubuntu 4096 2011-11-17 19:04 releases
drwx-w---- 6 ubuntu ubuntu 4096 2011-11-17 09:48 shared
ubuntu#ip-10-166-185-18:~$
I placed the application at this particular location var/www/myapplication.
This resolved the error "Symbolic link not allowed or link target not accessible". I will put all the steps I took to resolve this issue.
In addition to this i'll also blog on how to resolve errors involved with first time deployment of rails 3.1 to ec2. here ->
http://recipe4developer.wordpress.com/2011/11/19/correcting-errors-in-first-time-rails-3-1-deployment-to-ec2/
Make sure that your vhost lives somewhere in /etc/apache2/sites-available, and then make sure to add it to apache, either by using the a2ensite command, or by manually symlinking /etc/apache2/sites-enabled/your_vhost_name_here to whatever you called the site.
Possible commands to enable the site (use either one):
sudo a2ensite your_vhost_name
sudo ln -s /etc/apache2/sites-available/your_vhost_name /etc/apache2/sites-enabled
After you've done this, make sure to reload apache, by running the following command:
sudo service apache2 restart
Is there a reason you're not using Heroku? You get EC2 with very easy deployment.

Resources