Implantando aplicativo Rails usando Nginx, Unicorn, Postgres e Capistrano para Digital Ocean

Aviso: este guia está desatualizado. Visite gorails.com para obter um passo a passo de implantação simples e mais atualizado ou um dos muitos manuais sobre oceanos digitais.

Crie uma gota de sua preferência (ubuntu 12.10 x32)

ssh para fazer root no terminal com o ip do servidor

ssh root@123.123.123.123

Adicionar impressão digital ssh e inserir senha fornecida
Alterar senha

passwd

Criar novo usuário

adduser username

Definir novos privilégios de usuários

visudo

Encontre a seção de privilégios do usuário

# User privilege specification
root ALL
=(ALL:ALL) ALL

Adicione seus novos privilégios de usuário em root & cntrl + x e depois em y para salvar

username ALL=(ALL:ALL) ALL

Configurar SSH

nano /etc/ssh/sshd_config

Encontre e altere a porta para uma que não seja o padrão (22 é o padrão: escolha entre 1025..65536)

Port 22 # change this to whatever port you wish to use
Protocol 2
PermitRootLogin no

Adicione ao final do arquivo sshd_config após alterar a porta (cntrl + x e depois y para salvar)

UseDNS no
AllowUsers username

Recarregar ssh

reload ssh

Não feche o root! Abra um novo shell e ssh para vps com o novo nome de usuário (lembre-se da porta ou você estará bloqueado!)

ssh -p 1026 username@123.123.123.123

Pacotes de atualização no servidor virtual

sudo apt-get update
sudo apt
-get install curl

instale a última versão estável do rvm

curl -L get.rvm.io | bash -s stable

carregar rvm

source ~/.rvm/scripts/rvm

instalar dependências de rvm

rvm requirements

Instale o Ruby 2.0.0

rvm install 2.0.0

Use 2.0.0 como rvm padrão

rvm use 2.0.0 --default

instale a versão mais recente do rubygems se a instalação do rvm não tiver

rvm rubygems current

instalar rails gem

gem install rails --no-ri --no-rdoc

Instale o postgres

sudo apt-get install postgresql postgresql-server-dev-9.1
gem install pg
-- --with-pg-config=/usr/bin/pg_config

Criar novo usuário postgres

sudo -u postgres psql
create user username
with password 'password';
alter role username superuser createrole createdb replication
;
create database projectname_production owner username
;

Instale o git-core

sudo apt-get install git-core

Instale o bundler

gem install bundler

configurar nginx

sudo apt-get install nginx
nginx
-h
cat
/etc/init.d/nginx
/etc/init.d/nginx -h
sudo service nginx start

cd
/etc/nginx

configuração de unicórnio local

Add unicorn to the gemfile
create unicorn
.rb & unicorn_init.sh file
chmod
+x config/unicorn_init.sh

nginx.conf (altere o nome do projeto e o nome de usuário para corresponder à sua estrutura de diretório!) (também esteja ciente da client_max_body_sizeconfiguração, consulte a documentação do nginx para obter mais informações!)

upstream unicorn {
server unix
:/tmp/unicorn.projectname.sock fail_timeout=0;
}

server
{
listen
80 default_server deferred;
# server_name example.com;
root
/home/username/apps/projectname/current/public;

location
^~ /assets/ {
gzip_static on
;
expires max
;
add_header
Cache-Control public;
}

try_files $uri
/index.html $uri @unicorn;
location
@unicorn {
proxy_set_header X
-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header
Host $http_host;
proxy_redirect off
;
proxy_pass http
://unicorn;
}

error_page
500 502 503 504 /500.html;
client_max_body_size
20M;
keepalive_timeout
10;
}

config / unicorn.rb

root = "/home/username/apps/projectname/current"
working_directory root

pid
"#{root}/tmp/pids/unicorn.pid"
stderr_path
"#{root}/log/unicorn.log"
stdout_path
"#{root}/log/unicorn.log"

listen
"/tmp/unicorn.projectname.sock"
worker_processes
2
timeout
30

# Force the bundler gemfile environment variable to
# reference the capistrano "current" symlink
before_exec
do |_|
ENV
["BUNDLE_GEMFILE"] = File.join(root, 'Gemfile')
end

config / unicorn_init.sh

#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Manage unicorn server
# Description: Start, stop, restart unicorn server for a specific application.
### END INIT INFO
set -e

# Feel free to change any of the following variables for your app:
TIMEOUT
=${TIMEOUT-60}
APP_ROOT
=/home/username/apps/projectname/current
PID
=$APP_ROOT/tmp/pids/unicorn.pid
CMD
="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
AS_USER
=username
set -u

OLD_PIN
="$PID.oldbin"

sig
() {
test
-s "$PID" && kill -$1 `cat $PID`
}

oldsig
() {
test
-s $OLD_PIN && kill -$1 `cat $OLD_PIN`
}

run
() {
if [ "$(id -un)" = "$AS_USER" ]; then
eval $1
else
su
-c "$1" - $AS_USER
fi
}

case "$1" in
start
)
sig
0 && echo >&2 "Already running" && exit 0
run
"$CMD"
;;
stop
)
sig QUIT
&& exit 0
echo
>&2 "Not running"
;;
force
-stop)
sig TERM
&& exit 0
echo
>&2 "Not running"
;;
restart
|reload)
sig HUP
&& echo reloaded OK && exit 0
echo
>&2 "Couldn't reload, starting '$CMD' instead"
run
"$CMD"
;;
upgrade
)
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
then
n
=$TIMEOUT
while test -s $OLD_PIN && test $n -ge 0
do
printf
'.' && sleep 1 && n=$(( $n - 1 ))
done
echo


if test $n -lt 0 && test -s $OLD_PIN
then
echo
>&2 "$OLD_PIN still exists after $TIMEOUT seconds"
exit 1
fi
exit 0
fi
echo
>&2 "Couldn't upgrade, starting '$CMD' instead"
run
"$CMD"
;;
reopen
-logs)
sig USR1

;;
*)
echo
>&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
exit 1
;;
esac

Adicionar capistrano e rvm capistrano ao gemfile

gem 'capistrano'
gem
'rvm-capistrano'

Crie arquivos capfile e config / deploy.rb

capify .

deploy.rb

require "bundler/capistrano"
require "rvm/capistrano"

server
"123.123.123.123", :web, :app, :db, primary: true

set :application, "projectname"
set :user, "username"
set :port, 22
set :deploy_to, "/home/#{user}/apps/#{application}"
set :deploy_via, :remote_cache
set :use_sudo, false

set :scm, "git"
set :repository, "git@github.com:username/#{application}.git"
set :branch, "master"


default_run_options
[:pty] = true
ssh_options
[:forward_agent] = true

after
"deploy", "deploy:cleanup" # keep only the last 5 releases

namespace :deploy do
%w[start stop restart].each do |command|
desc
"#{command} unicorn server"
task command
, roles: :app, except: {no_release: true} do
run
"/etc/init.d/unicorn_#{application} #{command}"
end
end

task
:setup_config, roles: :app do
sudo
"ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}"
sudo
"ln -nfs #{current_path}/config/unicorn_init.sh /etc/init.d/unicorn_#{application}"
run
"mkdir -p #{shared_path}/config"
put
File.read("config/database.example.yml"), "#{shared_path}/config/database.yml"
puts
"Now edit the config files in #{shared_path}."
end
after
"deploy:setup", "deploy:setup_config"

task
:symlink_config, roles: :app do
run
"ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
after
"deploy:finalize_update", "deploy:symlink_config"

desc
"Make sure local git is in sync with remote."
task
:check_revision, roles: :web do
unless `git rev-parse HEAD` == `git rev-parse origin/master`
puts
"WARNING: HEAD is not the same as origin/master"
puts
"Run `git push` to sync changes."
exit
end
end
before
"deploy", "deploy:check_revision"
end

Capfile

load 'deploy'
load
'deploy/assets'
load
'config/deploy'

Aperte a mão com o github

# follow the steps in this guide if receive permission denied(public key)
# https://help.github.com/articles/error-permission-denied-publickey
ssh github@github
.com

Adicionar a chave ssh ao digitalocean

cat ~/.ssh/id_rsa.pub | ssh -p 22 username@123.123.123.123 'cat >> ~/.ssh/authorized_keys'

Crie um repo e envie para o github

# Add config/database.yml to .gitignore
cp config
/database.yml config/database.example.yml
git init

git
add .
git commit
-m "Inital Commit"
git remote
add origin git@github.com:username/reponame
git push origin master

desdobramento, desenvolvimento

cap deploy:setup
# edit /home/username/apps/projectname/shared/config/database.yml on server
cap deploy
:cold

após implantar: frio

sudo rm /etc/nginx/sites-enabled/default
sudo service nginx restart

sudo update
-rc.d -f unicorn_projectname defaults

Empurre as mudanças para repo e implante as mudanças!

git push origin master
cap deploy

Recursos de Railscasts / documentação digital do oceano.
Para usar se o fantoche ou o chef estiver um pouco acima da sua cabeça.
Eu sei que você pode criar uma gota usando rails, nginx, unicórnio e mysql, mas você não aprende muito assim!

Espero não ter perdido nenhuma etapa, embora tenha certeza que sim. Por favor, deixe comentários se você tiver problemas.