Note: These instructions are primarily intended for individual user accounts. If you are using a group account, you may wish to consider apphosting instead.
Ruby on Rails is a popular web framework for Ruby applications.
To create a new Rails application, use the rails
command-line interface. For
example, to create an application called foo
in your home directory, run the
command:
user@tsunami:~$ rails new foo
This may take some time.
OCF allows hosting of Rails applications via FastCGI. This requires you to
install the fcgi
gem and create a FastCGI wrapper script.
fcgi
gem Make sure the line gem 'fcgi'
appears somewhere in your project's
Gemfile
(located at the root of the project).
Run bundle install --path bundle
from the root of your project to install
bundled gems. This will also ensure that the fcgi
gem is installed. You'll
want to specify --path bundle
so that bundler installs your gems to a
local directory to your app and not system-wide. You'll also likely want to
add the new bundle
directory to your .gitignore
if you are using git for
version control.
To host your application, create a file called dispatch.fcgi
in your web root
(~/public_html/
) based on the following template:
#!/usr/bin/ruby
require 'etc'
APP_PATH = Etc.getpwuid.dir + '/foo'
ENV['GEM_HOME'] = APP_PATH + '/bundle/ruby/2.3.0/gems'
ENV['GEM_PATH'] = APP_PATH + '/bundle/ruby/2.3.0'
require_relative APP_PATH + '/config/environment'
class Rack::PathInfoRewriter
def initialize(app)
@app = app
end
def call(env)
env.delete('SCRIPT_NAME')
parts = env['REQUEST_URI'].split('?')
env['PATH_INFO'] = parts[0]
env['QUERY_STRING'] = parts[1].to_s
@app.call(env)
end
end
app, options = Rack::Builder.parse_file(APP_PATH + '/config.ru')
wrappedApp = Rack::Builder.new do
use Rack::ShowExceptions
use Rack::PathInfoRewriter
run app
end
Rack::Handler::FastCGI.run wrappedApp
Be sure to adjust the path to your application near the top of the file
(the APP_PATH
variable)
Once you've added the dispatch.fcgi
file, mark it as executable:
user@tsunami:~/public_html$ chmod +x dispatch.fcgi
Create a file called .htaccess
in your web root (or a subdirectory)
containing the following lines:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /~user/rails/dispatch.fcgi [QSA,L]
Be sure to change user
and rails
to your username and whatever directory
name you made in public_html
, respectively. (or remove rails
if not inside
a separate directory)
One issue you may run into is an error like No route matches [GET] "/~user"
.
To fix an issue like this, the best method is to edit config/routes.rb
in
your application and add a scope
block around all your routes matching the
path you are using. For instance, if your site is at
https://www.ocf.berkeley.edu/~user
then convert your routes from something like this:
MyApp::Application.routes.draw do
resources :users
[...]
end
to something like this:
MyApp::Application.routes.draw do
scope "~user" do
resources :users
[...]
end
end
This will make your application able to route all your existing routes
correctly. If your site is at something like
https://www.ocf.berkeley.edu/~user/rails
then use ~user/rails
in the scope
block instead. However, assets (images, stylesheets, javascript) may still be
broken. To fix these, add a line like this into your config/application.rb
(or under the correct environment in
config/environments/(development,production).rb
if you want to be more
specific). Note that this has to be inside the class Application
block:
Rails.application.config.assets.prefix = "/~user/asset"
Make sure to replace user
in this example (and in your config/routes.rb
)
with your username, and add the path you are using for your application if
applicable between ~user
and ~asset
.
If you see an error page when trying to load your app, you may find the webserver's logs useful. You can access them in the following locations:
/opt/httpd/error.log
(most useful)/opt/httpd/suexec.log
(only useful in rare cases)Once your app has started running, changes you make to the Ruby code or templates won't take effect for a few hours. To apply changes immediately, you can touch the dispatch.fcgi file with the command:
user@tsunami:~/public_html$ touch dispatch.fcgi