Configurando o Vagrant

Isso foi escrito com marcação com sabor Github .. Isso bagunça um pouco aqui. Veja uma versão melhor: https://gist.github.com/joshteng/9901155

Baixe e instale o Vagrant http://www.vagrantup.com/ e VirtualBox https://www.virtualbox.org/ ou VMware antes de começar

Configurar o Vagrant

* este guia pressupõe o uso do Mac OS X Mountain Lion na máquina local e Ubuntu 12.04 LTS x64 na caixa do Vagrant. É compatível com muitas outras distros, mas não foi testado.

Etapa 1: fazer e executar a caixa

vagrant init
vagrant box add
<path to box directory or name according to https://vagrantcloud.com/>
vagrant up

vagrant ssh

Etapa 2: encaminhar portas

Vagrantfile

config.vm.network "forwarded_port", guest: 80, host: 8080
config
.vm.network "forwarded_port", guest: 3000, host: 3000

Configurar ambiente

Você pode optar por usar ferramentas de gerenciamento / provisionamento de configuração como Chef / Puppet para as etapas a seguir para configurar seu ambiente. Mas se você quiser entender como isso é feito, eu o encorajo a fazer manualmente.

Etapa 3: instale as bibliotecas de sistema necessárias e o Postgresql

sudo apt-get update
sudo apt
-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev libcurl4-openssl-dev python-software-properties libpq-dev postgresql postgresql-contrib

Etapa 4: instale o ruby

git clone git://github.com/sstephenson/rbenv.git .rbenv
echo
'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo
'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

git clone git
://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo
'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL

rbenv install
2.1.0
rbenv
global 2.1.0
rbenv rehash

Etapa 5: instalar o Bundler

echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler

rbenv rehash

Etapa 6: instalar o pipeline de recursos do Node.js for Rails

sudo add-apt-repository ppa:chris-lea/node.js
sudo apt
-get update
sudo apt
-get install nodejs

Etapa 7: Instale o Nginx no servidor

sudo apt-get install nginx

Etapa 8: configurar a função de ‘vagrant’ do postgres

sudo su - postgres
createuser
--pwprompt #create a role called vagrant.. just leave a blank password if you're using Vagrant locally for development and make it a superuser when prompted!
psql
ALTER USER Postgres WITH PASSWORD 'vagrant'; --run this in psql..I actually don't know why I had to do this.
q --exit psql
exit

Configurar aplicativo

Etapa 9: instalação do pacote

cd /vagrant #this is where your rails app should be by default if you changed it, just go to the right path on your VM
bundle install

rbenv rehash

Etapa 10: criar e migrar banco de dados

bundle exec rake db:create
bundle exec rake db
:migrate
  • se houver problemas de codificação: https://gist.github.com/joshteng/9895494
  • se você está enfrentando erros crípticos (por exemplo, classe ELF errada: ELFCLASS32) com bcrypt, pg etc + gems, apenas remova-o e execute novamente/vendor/bundlebundle install
  • se o acima ainda não resolver seu problema, remova todas as joias de seu aplicativo rails fazendo e execute novamente. (infelizmente, isso leva muito tempo, dependendo da sua conexão com a Internet e do rubygems.org)rm -rf /vagrant/vendor/bundlebundle install
  • se estiver recebendo um erro , você não executou a etapa 8 corretamenteFATAL: role "vagrant" does not exist

Etapa 11: Teste

bundle exec rails s
sudo service nginx start

http: // localhost: 3000 deve funcionar agora

http: // localhost: 8080 deve mostrar a página de boas-vindas do nginx

Etapa 12: configurar o unicórnio

Gemfile

gem 'unicorn'

Concha

bundle install
touch
<app_root>/config/unicorn.rb

unicorn.rb

root = "/vagrant"
app_name
= "YOUR_APP_NAME"
working_directory root

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

listen
"/tmp/unicorn.#{app_name}.sock"
worker_processes
4
timeout
40
preload_app
true

# Force unicorn to look at the Gemfile in the current_path
# otherwise once we've first started a master process, it
# will always point to the first one it started.
before_exec
do |server|
ENV
['BUNDLE_GEMFILE'] = "#{root}/Gemfile"
end

before_fork
do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
# Quit the old unicorn process
old_pid
= "#{server.config[:pid]}.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
puts
"We've got an old pid and server pid is not the old pid"
begin
Process.kill("QUIT", File.read(old_pid).to_i)
puts
"killing master process (good thing tm)"
rescue Errno::ENOENT, Errno::ESRCH
puts
"unicorn master already killed"
end
end
end

after_fork
do |server, worker|
port
= 5000 + worker.nr
child_pid
= server.config[:pid].sub('.pid', ".#{port}.pid")
system
("echo #{Process.pid} > #{child_pid}")
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
  1. Unicórnio inicial: bundle exec unicorn -c /vagrant/config/unicorn.rb -p 3000

Configure o Nginx

Etapa 13: configurar nginx.conf no diretório de configuração do rails

touch <app_root>/config/nginx.conf

nginx.conf

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

server
{
listen
80 default deferred;
# server_name example.com;
root
/vagrant/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
4G;
keepalive_timeout
10;
}

Etapa 14: Symlink nginx.conf

sudo ln -s /vagrant/config/nginx.conf /etc/nginx/sites-enabled/<your_app_name>

Etapa 15: Excluir o site padrão Nginx

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

Etapa 16: reinicie o Nginx

sudo service nginx restart
  1. Comece unicórnio: bundle exec unicorn -c /vagrant/config/unicorn.rb
  2. O site deve funcionar em http: // localhost: 8080 agora (certifique-se de que o unicórnio ainda esteja em execução)

Faça do Unicorn um serviço para sua conveniência

Etapa 17: Configurar unicorn_init.sh

touch <app_root>/config/unicorn_init.sh
bundle install
--binstubs #creates an executable in the bin directory for our unicorn_init shell script

unicorn_init.sh

#!/bin/sh
set -e
# Example init script, this can be used with nginx, too,
# since nginx and unicorn accept the same signals

# Feel free to change any of the following variables for your app:
TIMEOUT
=${TIMEOUT-60}
APP_ROOT
=/vagrant
PID
=$APP_ROOT/tmp/pids/unicorn.pid
CMD
="$APP_ROOT/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
action
="$1"
set -u

old_pid
="$PID.oldbin"

cd $APP_ROOT
|| exit 1

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

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

case $action in
start
)
sig
0 && echo >&2 "Already running" && exit 0
echo
"ATTEMPTING TO START UNICORN"
ruby
-v
$CMD

# sudo su -c "ruby -v" - postgres
# sudo su -c "$CMD" - vagrant
;;
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"
$CMD

;;
upgrade
)
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
then
n
=$TIMEOUT
while test -s $old_pid && test $n -ge 0
do
printf
'.' && sleep 1 && n=$(( $n - 1 ))
done
echo


if test $n -lt 0 && test -s $old_pid
then
echo
>&2 "$old_pid still exists after $TIMEOUT seconds"
exit
1
fi
exit
0
fi
echo
>&2 "Couldn't upgrade, starting '$CMD' instead"
$CMD

;;
reopen
-logs)
sig USR1

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

Tornar executável unicorn_init.sh

chmod +x config/unicorn_init.sh

Etapa 18: Symlink unicorn_init.sh

sudo ln -s <app_root>/config/unicorn_init.sh /etc/init.d/unicorn_your_app_name

Etapa 19: Inicie o Unicorn

#shut down all instances of Unicorn (optional)
ps aux
| grep unicorn #find unicorn processes
kill
-9 <pid> #shut it down

#start up unicorn as a linux process
sudo service unicorn_your_app_name start
#it's important to know which version of ruby will be used when running as different users. if you're facing errors, see below.
Se você está recebendo este erro:

/opt/vagrant_ruby/lib/ruby/site_ruby/1.8/rubygems.rb:900:in "report_activate_error": Could not find RubyGem unicorn (>= 0) (Gem::LoadError)
Seu script de inicialização não está usando a versão correta do Ruby. Aqui estão algumas coisas que você pode tentar:

  1. Modifique o script de shell para executar seu comando como vagrant em vez de apenassu -c "$CMD" - vagrant$CMD
  2. Tente sudo service unicorn_app_name starteservice unicorn_app_name start
Para depurar com eficácia:

UM: Verifique a versão do Ruby que está sendo usada ao tentar inicializar o Unicorn através do seu script de shell de inicialização
“ `sh

este é apenas um trecho de código no arquivo unicorn_init

case $ action in
start)
sig 0 && echo> & 2 “Já executando” && exit 0
echo “TENTANDO INICIAR UNICORN”
ruby -v #verifique a versão do ruby ​​que você está usando
$ CMD
# sudo su -c “ruby -v “- vagrant #check a versão do ruby ​​que você está usando
# sudo su -c” $ CMD “- vagrant`

DOIS: Saída de log do Tail Unicorn para descobrir quais outros erros você pode ter
sh tail -f /vagrant/log/unicorn.log

Finalmente

se estiver executando o unicórnio como root, você precisará adicionar root como uma função para o postgres (vá até a etapa 8, mas adicione root em vez de vagrant)

Voila! Deve funcionar agora!

MISC

Problemas de lentidão do VirtualBox no mac

  1. Acelerando o Vagrant: http://kubaf.wordpress.com/2013/01/12/vagrant-speed-up-on-mac-os-x/
  2. Adicione o seguinte no ruby config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"] endaviso de isenção de responsabilidade do Vagrantfile : Não consigo fazer com que nenhuma dessas soluções acelere minha VM. Se você conseguiu acelerar sua VM em um Mac com o VirtualBox, deixe algum comentário e nos ajude! Obrigado!
    Nesse ínterim, você pode querer olhar para VMware em vez de VirtualBox