Git, Capistrano, Passenger, and Apache Questions

First, I’m trying to do the legwork with utilizing all 4 together
because many people say it’s a good combination to use. I already have
apache setup (was using it with the PHP version of my site formerly).

I’ve installed all gems and dependencies that I need on my slice (using
slicehost).

I have a fully pushed git repository (master) on github (private git)
with one user. For sake of these questions the user on github is called
(liveuser). I followed the following guide to setup a user called
(gituser) on my slice:

http://articles.slicehost.com/2009/5/13/capistrano-series-setting-up-git

I just don’t follow the logic of it. Perhaps it’s because I don’t
understand why I even need to use (any) of these utilities to run my
server. I feel like I have to perform 100 things just to get this
scenario working together. I’m sure it’s nice when it’s all setup and
working 100% but I’m a bit frustrated at this point.

Question One: Is there a (complete guide) that acts as a walk-through
for setting up apache/capistrano/passenger/git together?

From my understanding, capistrano is meant to be used only on the
development machine and not on the server. You deploy through git
directly to your server. I don’t see any good documentation out there
that explains this in detail. If there were a deployment for dummies
book I’d buy it in a heartbeat.

My Scenario:

Windows Development machine with app
Full github private repository being pushed to from my development
machine
All tests well and am ready for deployment and production testing
Slicehost slice (server) with apache and passenger (passenger not setup
yet)

Question Two: Is there an optimal setup here? What are the exact
steps, in order for deploying? Apache configuration first? Passenger
configuration first? Github configuration first?

I will leave it at this for now. I’m sure I’m not the only one that has
pulled his or her hair out over a deployment phase and I’m certainly not
going to be the last. I think there should be some type of formalized
documentation on complete deployment (at least something that is up to
date and not 2 years old).

Alpha B. wrote:

First, I’m trying to do the legwork with utilizing all 4 together
because many people say it’s a good combination to use.

It is.

I already have
apache setup (was using it with the PHP version of my site formerly).

I’ve installed all gems and dependencies that I need on my slice (using
slicehost).

Have you installed Passenger yet? And Ruby EE, if you’ll be using that?

I have a fully pushed git repository (master) on github (private git)
with one user. For sake of these questions the user on github is called
(liveuser). I followed the following guide to setup a user called
(gituser) on my slice:

http://articles.slicehost.com/2009/5/13/capistrano-series-setting-up-git

I just don’t follow the logic of it. Perhaps it’s because I don’t
understand why I even need to use (any) of these utilities to run my
server.

You don’t need to. It just makes life easier.

(And you’re backsliding on those parentheses. They’re not a subsitute
for italics, unless you’re writing in Turkish. :slight_smile: )

I feel like I have to perform 100 things just to get this
scenario working together. I’m sure it’s nice when it’s all setup and
working 100% but I’m a bit frustrated at this point.

Question One: Is there a (complete guide) that acts as a walk-through
for setting up apache/capistrano/passenger/git together?

There is a getting started guide on the Capistrano website. Have you
looked at it?

Apache and Passenger really don’t come into the issue – all you have to
do is tell them where the code’s going to be.

From my understanding, capistrano is meant to be used only on the
development machine and not on the server. You deploy through git
directly to your server. I don’t see any good documentation out there
that explains this in detail. If there were a deployment for dummies
book I’d buy it in a heartbeat.

Ezra Z. has written such a book, but I don’t know if it’s
still up to date.

Anyway, what’s the problem? Capistrano just automates the things you’d
do yourself anyway.

My Scenario:

Windows Development machine with app
Full github private repository being pushed to from my development
machine
All tests well and am ready for deployment and production testing

Why have you waited this long for deployment? You should (IMHO) have
been doing a little at a time, all along.

Slicehost slice (server) with apache and passenger (passenger not setup
yet)

Get Passenger set up next.

Question Two: Is there an optimal setup here? What are the exact
steps, in order for deploying? Apache configuration first? Passenger
configuration first? Github configuration first?

Get Passenger installed. Github needs no configuration. The order of
the steps doesn’t really matter that much.

I will leave it at this for now. I’m sure I’m not the only one that has
pulled his or her hair out over a deployment phase and I’m certainly not
going to be the last. I think there should be some type of formalized
documentation on complete deployment (at least something that is up to
date and not 2 years old).

There is. Check the Cap website.

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Alpha B. wrote:

Thanks for the follow-up Marnen. Yeah I like to use parens and quotes
for emphasis - I’d much rather use quotes - but I don’t see anything
about that here.

Neither is correct for English.

Anyhoo, that’s another issue altogether.

So it is. :slight_smile:

So, here’s my logic and understanding of this subject and yes, it’s not
very large… heh.

From what I understand, Capistrano is the tool that is used to deploy
the application to your server. It has nothing to do with
apache/passenger etc. correct?

Yes. Cap just automates an SSH session to your server.

Secondly, passenger is a front-end piece and apache is the back-end
piece of the server setup correct? If I didn’t want to use passenger, I
could use mongrel in it’s place? Not saying I would do this but just
clarifying for understanding…

Also correct, although you’d have to play around with Apache proxies if
you did that.

You won’t go far wrong if you think of Passenger as the Rails equivalent
of mod_php.

In order of priority configurations:

Apache first
Passenger Second
… that handles the server end?

Right. (And Ruby EE if you’re using it.)

I believe where I’m getting confused is that I’m looking at all of it at
once and it’s making my head hurt a bit.

Is there documentation on setting up apache with rails? Prepping? Link
please.

Read the Passenger docs.

Is there documentation on setting up passenger with apache? Prepping?
Link please.

Read the Passenger docs.

How does capistrano tie in with git and my server? For instance, I see
the following as an example configuration:

set :application, “ncaastatpages”

GITHUB BELOW

Set Putty True to instantiate a passphrase call

default_run_options[:pty] = true

Set the git repository

set :repository, “[email protected]:myuser/ncaastatpages.git”

Specify which subversion or repository SCM to use

set :scm, :git

Set your GIT password

set :scm_passphrase, “mypassword”

Set your GIT user (this might need to be the same all the way around)

set :user, “myuser”

If you’re using your own private keys for git

ssh_options[:forward_agent] = true

Set the branch type

set :branch, “master”

Shallow cloning will do a clone each time, but will only get the first

tree, not all the parents trees, too.

set :git_shallow_clone, 1

If you’re using git’s submodule support for edge rails or merb, set

this guy to make sure the submodules “git” checked out.
set :git_enable_submodules, 1

Set remote cache you want to only force new changes only, fetching

changed data
set :deploy_via, :remote_cache

Set the role for your web server

role :web, “ncaastatpages.com

I only see one repository (for my current git repo), but how does it
know where to send it to? I.e. where in capistrano do you tell it where
to deploy to? I don’t see anywhere in here where I am setting my server
and the port.

That’s what role :web does.

I use a different SSH port so I need to set that
somewhere too.

Please read the Cap docs. I don’t try to keep all the config variables
in my head, so I can’t really help you.

I’ve read the documentation but it doesn’t appear to talk about this.
I’m not using Ruby EE by the way - just a heads up.

Why not?

I commented everything myself above to show you what I believe is
happening. If I’m incorrect, please let me know. Let’s bring this
topic closer to capistrano usage first and I’ll work with one piece and
iron out the others after I get capistrano logic down.

Read the Cap docs.

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Thanks for the follow-up Marnen. Yeah I like to use parens and quotes
for emphasis - I’d much rather use quotes - but I don’t see anything
about that here. Anyhoo, that’s another issue altogether.

So, here’s my logic and understanding of this subject and yes, it’s not
very large… heh.

From what I understand, Capistrano is the tool that is used to deploy
the application to your server. It has nothing to do with
apache/passenger etc. correct?

Secondly, passenger is a front-end piece and apache is the back-end
piece of the server setup correct? If I didn’t want to use passenger, I
could use mongrel in it’s place? Not saying I would do this but just
clarifying for understanding…

In order of priority configurations:

Apache first
Passenger Second
… that handles the server end?

I believe where I’m getting confused is that I’m looking at all of it at
once and it’s making my head hurt a bit.

Is there documentation on setting up apache with rails? Prepping? Link
please.

Is there documentation on setting up passenger with apache? Prepping?
Link please.

How does capistrano tie in with git and my server? For instance, I see
the following as an example configuration:

set :application, “ncaastatpages”

GITHUB BELOW

Set Putty True to instantiate a passphrase call

default_run_options[:pty] = true

Set the git repository

set :repository, “[email protected]:myuser/ncaastatpages.git”

Specify which subversion or repository SCM to use

set :scm, :git

Set your GIT password

set :scm_passphrase, “mypassword”

Set your GIT user (this might need to be the same all the way around)

set :user, “myuser”

If you’re using your own private keys for git

ssh_options[:forward_agent] = true

Set the branch type

set :branch, “master”

Shallow cloning will do a clone each time, but will only get the first

tree, not all the parents trees, too.

set :git_shallow_clone, 1

If you’re using git’s submodule support for edge rails or merb, set

this guy to make sure the submodules “git” checked out.
set :git_enable_submodules, 1

Set remote cache you want to only force new changes only, fetching

changed data
set :deploy_via, :remote_cache

Set the role for your web server

role :web, “ncaastatpages.com

I only see one repository (for my current git repo), but how does it
know where to send it to? I.e. where in capistrano do you tell it where
to deploy to? I don’t see anywhere in here where I am setting my server
and the port. I use a different SSH port so I need to set that
somewhere too.

I’ve read the documentation but it doesn’t appear to talk about this.
I’m not using Ruby EE by the way - just a heads up.

I commented everything myself above to show you what I believe is
happening. If I’m incorrect, please let me know. Let’s bring this
topic closer to capistrano usage first and I’ll work with one piece and
iron out the others after I get capistrano logic down.

From what I understand, Capistrano is the tool that is used to deploy
the application to your server. It has nothing to do with
apache/passenger etc. correct?

99% correct. You can (and will) tell Capistrano how to restart your
webserver in order to pick up the latest deployed files (since Rails
won’t check for new files in production).

For Apache/Passenger this just amounts to adding the following to your
deploy.rb file:

namespace :deploy do
desc “Restarts your application.”
task :restart, :roles => :app, :except => { :no_release => true } do
as = fetch(:runner, “app”)
via = fetch(:run_method, :sudo)
invoke_command “touch #{current_path}/tmp/restart.txt”, :via =>
via, :as => as
end
end

Secondly, passenger is a front-end piece and apache is the back-end
piece of the server setup correct?

Sort of. Apache is the web server and is the first piece of
software to handle any requests coming from the client. Passenger is
an apache module that knows how to handle requests made to your Rails
app. So Passenger is like mod_php, but for Rails.

If I didn’t want to use passenger, I
could use mongrel in it’s place? Not saying I would do this but just
clarifying for understanding…

Yes, you could. The Apache configuration would be a little bit
different, but you’re right in that you either use Passenger or you
use Mongrel (or thin, etc.).

In order of priority configurations:

Apache first
Passenger Second
… that handles the server end?

Yes.

Is there documentation on setting up apache with rails? Prepping?
Link
please.

Is there documentation on setting up passenger with apache? Prepping?
Link please.

http://modrails.com/install.html
http://modrails.com/documentation/Users%20guide%20Apache.html

How does capistrano tie in with git and my server? For instance, I
see
the following as an example configuration:

Seems you’re missing the “deploy_to” line…

set :deploy_to, “/home/web/yourapp.com”

Google around and you’ll find articles on how to get this working.

I’ve read the documentation but it doesn’t appear to talk about this.
I’m not using Ruby EE by the way - just a heads up.

You don’t need to. You can, but it’s not necessary.

I commented everything myself above to show you what I believe is
happening. If I’m incorrect, please let me know. Let’s bring this
topic closer to capistrano usage first and I’ll work with one piece
and
iron out the others after I get capistrano logic down.

http://articles.slicehost.com/2009/5/13/capistrano-series-setting-up-git

Also, if you’re not, hop on the slicehost IRC chat… lots of helpful
people there doing exactly what you’re doing…

-philip

work. I just need to understand the work I’m doing.
Been there! Once you get it working it all starts to make sense, but
there are a lot of pieces…

-philip

Thanks again Philip and Marnen,

So, the point I’m stuck at during this particular piece is really
understanding how github and capistrano work together.

For instance, my server user/password are completely different from
github user/password. Do these need to be the same?

And, if so, do I need to create a special user that has the same
credentials as my github account so that deployment works?

If the above is true, and my deploy_to is set in a specific user
directory, wouldn’t the new user have to have write access to that
directory as well? These are some of the questions that are a bit
confusing to me. I could be overthinking this too much.

I’ll look over the links you provided to see what I can figure out. I’m
usually very patient but when I have difficulty understanding all of the
various pieces, I can get a bit downtrodden. I don’t mind doing the
work. I just need to understand the work I’m doing.

Thanks.

Okay having a few issues but making some headway:

Apache+Passenger installed okay

I finally managed to get git and capistrano to work and deployed my app
successfully.

Unfortunately, it appears that git did not pull my plugins and also has
extra files that are old and that were not removed. So, here’s my
questions:

  1. How do I add plugins into github?
  2. How do I populate my production database?
  3. What do I do with capistrano and passenger when I update something
    on my development side. Is it that I update on my side, push to github
    and then run cap deploy:update?
  4. Anything else I should know about?

Alpha B. wrote:

Thanks again Philip and Marnen,

So, the point I’m stuck at during this particular piece is really
understanding how github and capistrano work together.

For instance, my server user/password are completely different from
github user/password. Do these need to be the same?

Of course not. Why would they? Cap just uses github credentials to
pull code from github, same as you would if you were doing this without
Cap.

And, if so, do I need to create a special user that has the same
credentials as my github account so that deployment works?

No. But in most cases, you will want to create a special user account
on your server for Capistrano to use.

If the above is true, and my deploy_to is set in a specific user
directory, wouldn’t the new user have to have write access to that
directory as well?

Yes, the user that Cap logs in as will have to have write access in the
directory where it’s told to put the files.

These are some of the questions that are a bit
confusing to me. I could be overthinking this too much.

You are. Cap just automates what you’d do yourself.

I’ll look over the links you provided to see what I can figure out. I’m
usually very patient but when I have difficulty understanding all of the
various pieces, I can get a bit downtrodden. I don’t mind doing the
work. I just need to understand the work I’m doing.

I didn’t realize (until Philip posted it) that Github now has a Cap
guide. Since their documentation is usually excellent, that could be a
big help.

Thanks.

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

  1. How do I add plugins into github?

There’s several ways… you can do it directly… I find a tool called
‘braid’ to be very handy.

  1. How do I populate my production database?

Depends… if you’re starting from scratch you could try:

cap deploy:migrate

Otherwise do it manually, but if you can get things setup so that ‘cap
deploy:migrations’ works you’ll find life much easier as you make
changes down the road.

  1. What do I do with capistrano and passenger when I update something
    on my development side. Is it that I update on my side, push to
    github
    and then run cap deploy:update?

Don’t run deploy:update. Just run ‘deploy’ or ‘deploy:migrations’ (if
you have migrations that need running). There’s more to it than just
updating the code. Capistrano will keep a backup of the old revision
so you can easily revert (deploy:rollback) and will (or can) restart
your web server, etc.

I only read the original post and then kind of just glanced through
the rest.

I think articles.slicehost.com has got the best articles in getting a
slice up and running with everything u need for a Rails app.
Ive gone through the process twice and it took me no more than 2/3
hours.

You would love this blog post though. Just one beautiful Cap file that
sets up your whole slice. Run it, sit back, sip coffee and wallow in
delight.