Arquivo da tag: gem

Você sabia que dá para usar versões diferentes de ruby na mesma máquina ?

RVM ou Ruby Version Manager é o gerenciador de versões Ruby.

Com ele você pode rodar projetos com rubys diferentes (exemplo: com a versão 1.8.7 e 1.9.3) mantendo os ambientes e as gems instaladas isoladas.

Conheça mais sobre o RVM em: https://rvm.io/

Ou se preferir, pode ir direto para a página de instalação em https://rvm.io/rvm/install/

Um outro bom exemplo de uso do RVM, não é só a utilização de multiplos Rubys, e sim a separação que ele faz entre os projetos.

Você pode criar com o RVM um “Gemset”, que é um grupo isolado onde se instalada as gem de seu projeto. Com isso você pode usar o mesmo ruby, e ter mais de um gemset configurado.

Share

Ubuntu 11.10 com Ruby on Rails + Nginx + Mysql de forma simples

Andei procurando na internet por algum script para fazer uma instalação mais “automatizada” de um ambiente Ruby on Rails numa máquina virtual (VPS) rodando Ubuntu 11.10

Depois de pesquisar muito, só encontrei referências detalhadas  para ubuntu 10.* ou então alguns blogs sugerindo algumas linhas de comando apenas.

Como eu já estava terminando um projeto de um site e precisava de um ambiente de produção, resolvi fazer um script (em bash), onde eu tivesse o controle de tudo que iria acontecer de forma segura e eficaz.

O script está disponível no meu github, use como quiser =)

Lembrando que só testei no Ubuntu 11.10, a instalação instala e configura o seguinte:
– Ruby 1.9.2-p290
–  Nginx Upload Module 2.2.0
– Nginx 1.1.12 
– iptables para as portas principais de ssh(22), http(80), https(443), dns(53)
– Mysql (versão estável do apt-get do ubuntu)
– Postfix (versão estável do apt-get do ubuntu)
– Gem Bundler (última versão pelo rubygems)

Com isso, basta configurar o domínio da sua aplicação corretamente na configuração do nginx, fazer o deploy e ser feliz! =)

Link do projeto: https://github.com/rafaelbiriba/Ubuntu-VPS-Builder 

Abaixo segue uma cópia do código que eu coloquei no git assim você pode tirar suas dúvidas pelos comentários… Caso decida usar o script, baixe ele pelo link do github. Não use o código abaixo pois o mesmo pode já estar desatualizado!

Modo de usar no servidor:
$ chmod +x vps_builder.sh
$ ./vps_builder.sh seudominio.com 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/bash
# "Automated VPS Setup for Ubuntu 11.10 - Rails with Nginx"
#
# Created by: Rafael Biriba - www.rafaelbiriba.com - [email protected]
# https://github.com/rafaelbiriba/Ubuntu-VPS-Builder/
#
# USAGE:
#
# $ chmod +x vps_builder.sh
# $ ./vps_builder.sh yourdomain.com"
 
echo "Updating before all"
apt-get update && apt-get upgrade -y
 
echo "Set Hostname"
 
echo $1 > /etc/hostname
echo "127.0.0.1 $1" >> /etc/hosts
hostname -F /etc/hostname
 
echo "Set Timezone"
 
ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
 
echo "Install Essencials"
 
apt-get install build-essential zlib1g-dev libreadline6-dev libssl-dev wget git-core sudo -y
 
echo "Install Ruby 1.9.2"
 
mkdir ~/tmp && cd ~/tmp
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz
tar xzvf ruby-1.9.2-p290.tar.gz
cd ruby-1.9.2-p290
./configure
make
make install
cd ~
rm -rf ~/tmp
 
echo "Install Passenger and Nginx"
 
mkdir ~/tmp && cd ~/tmp
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar xzvf pcre-8.21.tar.gz
cd pcre-8.21
./configure && make && make install
cd ~/tmp
 
wget http://nginx.org/download/nginx-1.1.12.tar.gz
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
tar xzvf nginx-1.1.12.tar.gz
tar xzvf nginx_upload_module-2.2.0.tar.gz
 
gem install passenger
apt-get install libcurl4-openssl-dev -y
passenger-install-nginx-module --prefix=/opt/nginx --nginx-source-dir=/root/tmp/nginx-1.1.12 --extra-configure-flags=--add-module='/root/tmp/nginx_upload_module-2.2.0'
#passenger-install-nginx-module --auto --auto-download
cd ~
rm -rf ~/tmp
 
cd ~
wget https://raw.github.com/rafaelbiriba/Ubuntu-VPS-Builder/master/ubuntu_11-10_desktop/nginx-init.sh
cp nginx-init.sh /etc/init.d/nginx
rm nginx-init.sh
chmod +x /etc/init.d/nginx
/usr/sbin/update-rc.d -f nginx defaults
/etc/init.d/nginx start
 
echo "Configure iptables"
 
apt-get install iptables
 
tee /etc/init.d/firewall <<ENDOFFILE
#!/bin/bash
 
start(){
# Accepting all connections made on the special lo - loopback - 127.0.0.1 - interface
iptables -A INPUT -p tcp -i lo -j ACCEPT
 
# Rule which allows established tcp connections to stay up
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# DNS:
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
 
# HTTP e HTTPS:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# Block others ports
iptables -A INPUT -p tcp --syn -j DROP
iptables -A INPUT -p udp --dport 0:1023 -j DROP
 
}
stop(){
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
}
 
case "\$1" in
"start") start ;;
"stop") stop ;;
"restart") stop; start ;;
*) echo "start or stop params"
esac
ENDOFFILE
 
chmod +x /etc/init.d/firewall
update-rc.d firewall defaults 99
/etc/init.d/firewall start
 
echo "Install MySQL"
 
apt-get install mysql-server mysql-client libmysqlclient-dev -y
 
echo "Install postfix"
 
# Install type: Internet Site
# Default email domain name: example.com
apt-get install postfix mailutils telnet -y
/usr/sbin/update-rc.d postfix defaults
/etc/init.d/postfix start
 
echo "Install gem bundler"
 
gem install bundler
 
echo "VPS Setup Complete"

Qualquer dúvida, estamos aí para trocar ideias 😉

___________________________________________________

Atualização 1 – 07/fev/2012:

Agradeço ao leitor Laércio pelo contato via email, reportando um problema, onde se o ubuntu estiver muito desatualizado, o script não roda direito. Com isso adicionei lá no github e no exemplo acima os comandos apt-get update e apt-get upgrade para atualizar o ubuntu antes de fazer qualquer coisa. Obrigado mais uma vez Laércio !

Share

Cloud Crowd: A primeira action

cloud-crowd

Cloud Crowd é um controlador de filas para processamento paralelo, desenvolvido em ruby. Pode ser utilizado em Encoding de video, migração de arquivos e bancos de dados, redimensionamento de imagens e etc…

Uma explicação rápida: Em uma máquina você levanta o server, onde é gerenciado a fila (criação, exclusão, status das tarefas e etc…). Em outras máquinas você levanta o node, onde as terefas serão recebidas e executadas. Ao terminar, o node informa ao server, liberando-se para receber outra tarefa.

Essa semana comecei a desvendar os benefícios do Cloud Crowd, principalmente para encoding paralelo de vídeo. Mas antes, tive que entender como ele funciona e o que tem para nos oferecer.

Então, acompanhando o “tutorial” em http://wiki.github.com/documentcloud/cloud-crowd/writing-an-action, escrevi uma pequena action:

class HelloWorld < CloudCrowd::Action
   def process
      Thin::Logging.log("HelloWorld :: -- criando arquivo #{input}!")
      `touch #{input}`
      0
   end
end

Você passa um nome qualquer, e o script cria um arquivo em branco. Simples !?, Mas serviu bem para meus primeiros testes.

Também aproveitei e usei o log do Thin que é o servidor que o Cloud Crowd levanta, para registrar o evento de dentro da action… Isso significa que as mensagens de log da minha action foram registradas no arquivo de log do node que a executou… Se preferir você pode utilizar o Logger do Rails. Como foi apenas um experimento, utilizei o do Thin mesmo.

Cadastrando tarefas:

Para começar a utilizar sua action,  você precisa postar um JSON com as informações necessárias no server, para cadastrar uma tarefa. (Não preciso lembrar que o server e algum node deve estar rodando, certo ?)

Para isso, crie um script ruby, ou rode pelo irb os comandos*:

require 'rubygems'
require 'restclient'
require 'json'
RestClient.post('http://localhost:9173/jobs',{:job => { 'action' => 'hello_world' , 'inputs' => ['/home/rafael/arquivo_teste1', '/home/rafael/arquivo_teste2']}.to_json})

Considerando que o server está rodando na máquina que rodou o script. Caso contrário, altere o localhost pelo ip do Server. E os arquivos são criados (pelo comando “touch”) na máquina que roda o Node. Para fins de teste e desenvolvimento, é possível rodar o server e o node na mesma máquina, já que eles sobem em portas diferentes…

Então é isso… Você já pode paralelizar qualquer tarefa. Basta escrever suas próprias actions… 😉

 

Share