Commit b71625c8b58f573e23342fb1c32d9e6f2bfde5e1

Authored by Rodrigo Souto
2 parents 2344cd2a 89708241

Merge branch 'master' of gitlab.com:noosfero/noosfero

@@ -10,7 +10,7 @@ gem 'RedCloth', '~> 4.2.9' @@ -10,7 +10,7 @@ gem 'RedCloth', '~> 4.2.9'
10 gem 'will_paginate', '~> 3.0.3' 10 gem 'will_paginate', '~> 3.0.3'
11 gem 'ruby-feedparser', '~> 0.7' 11 gem 'ruby-feedparser', '~> 0.7'
12 gem 'daemons', '~> 1.1.5' 12 gem 'daemons', '~> 1.1.5'
13 -gem 'thin', '~> 1.3.1' 13 +gem 'unicorn', '~> 4.8'
14 gem 'nokogiri', '~> 1.5.5' 14 gem 'nokogiri', '~> 1.5.5'
15 gem 'rake', :require => false 15 gem 'rake', :require => false
16 gem 'rest-client', '~> 1.6.7' 16 gem 'rest-client', '~> 1.6.7'
@@ -2,10 +2,6 @@ @@ -2,10 +2,6 @@
2 2
3 require ::File.expand_path('../config/environment', __FILE__) 3 require ::File.expand_path('../config/environment', __FILE__)
4 4
5 -#use Rails::Rack::LogTailer  
6 -#use Rails::Rack::Static  
7 -#run ActionController::Dispatcher.new  
8 -  
9 use Rack::Cors do 5 use Rack::Cors do
10 allow do 6 allow do
11 origins '*' 7 origins '*'
@@ -14,7 +10,13 @@ use Rack::Cors do @@ -14,7 +10,13 @@ use Rack::Cors do
14 end 10 end
15 11
16 rails_app = Rack::Builder.new do 12 rails_app = Rack::Builder.new do
17 - run Noosfero::Application 13 + if ENV['RAILS_RELATIVE_URL_ROOT']
  14 + map ENV['RAILS_RELATIVE_URL_ROOT'] do
  15 + run Noosfero::Application
  16 + end
  17 + else
  18 + run Noosfero::Application
  19 + end
18 end 20 end
19 21
20 run Rack::Cascade.new([ 22 run Rack::Cascade.new([
config/thin.yml.dist
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 ----  
2 -pid: tmp/pids/thin.pid  
3 -address: 127.0.0.1  
4 -user: noosfero  
5 -timeout: 30  
6 -port: 50000  
7 -log: log/thin.log  
8 -max_conns: 1024  
9 -servers: 1  
10 -max_persistent_conns: 512  
11 -environment: production  
12 -daemonize: true  
13 -chdir: /usr/share/noosfero  
config/unicorn.rb.dist 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +listen "127.0.0.1:3000"
  2 +
  3 +worker_processes 1
  4 +
  5 +# vim: ft=ruby
debian/apache2/conf.d/noosfero-cluster.conf
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -<Proxy balancer://noosfero>  
2 - Include /etc/noosfero/apache/cluster.conf  
3 - Order Allow,Deny  
4 - Allow from All  
5 -</Proxy>  
6 -  
7 -# vim: ft=apache  
8 -  
debian/apache2/virtualhost.conf
@@ -15,7 +15,11 @@ RewriteRule ^/$ /index.html [QSA] @@ -15,7 +15,11 @@ RewriteRule ^/$ /index.html [QSA]
15 RewriteRule ^([^.]+)$ $1.html [QSA] 15 RewriteRule ^([^.]+)$ $1.html [QSA]
16 16
17 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 17 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
18 -RewriteRule ^.*$ balancer://noosfero%{REQUEST_URI} [P,QSA,L] 18 +RewriteRule ^.*$ http://127.0.0.1:50000%{REQUEST_URI} [P,QSA,L]
  19 +<Proxy http://127.0.0.1:50000>
  20 + Order Allow,Deny
  21 + Allow from All
  22 +</Proxy>
19 23
20 ErrorDocument 503 /503.html 24 ErrorDocument 503 /503.html
21 25
debian/control
@@ -70,7 +70,7 @@ Depends: adduser, @@ -70,7 +70,7 @@ Depends: adduser,
70 ruby-whenever, 70 ruby-whenever,
71 ruby-will-paginate (>= 2.3.12-1~), 71 ruby-will-paginate (>= 2.3.12-1~),
72 tango-icon-theme, 72 tango-icon-theme,
73 - thin, 73 + unicorn (>= 4.8),
74 ${misc:Depends} 74 ${misc:Depends}
75 Recommends: postgresql, postgresql-client 75 Recommends: postgresql, postgresql-client
76 Description: free web-based platform for social networks 76 Description: free web-based platform for social networks
debian/noosfero-apache.install
1 -debian/apache2/conf.d/noosfero-cluster.conf etc/apache2/conf.d  
2 debian/apache2/virtualhost.conf etc/noosfero/apache 1 debian/apache2/virtualhost.conf etc/noosfero/apache
3 debian/update-noosfero-apache usr/sbin 2 debian/update-noosfero-apache usr/sbin
debian/noosfero.install
@@ -19,7 +19,7 @@ debian/noosfero-check-dbconfig usr/sbin @@ -19,7 +19,7 @@ debian/noosfero-check-dbconfig usr/sbin
19 debian/noosfero-console usr/sbin 19 debian/noosfero-console usr/sbin
20 debian/noosfero-runner usr/sbin 20 debian/noosfero-runner usr/sbin
21 debian/noosfero.yml etc/noosfero 21 debian/noosfero.yml etc/noosfero
22 -debian/thin.yml etc/noosfero 22 +debian/unicorn.rb etc/noosfero
23 doc usr/share/noosfero 23 doc usr/share/noosfero
24 doc/noosfero usr/share/noosfero/doc 24 doc/noosfero usr/share/noosfero/doc
25 etc/init.d/noosfero etc/init.d 25 etc/init.d/noosfero etc/init.d
debian/noosfero.links
1 var/tmp/noosfero usr/share/noosfero/tmp 1 var/tmp/noosfero usr/share/noosfero/tmp
2 var/log/noosfero usr/share/noosfero/log 2 var/log/noosfero usr/share/noosfero/log
3 etc/noosfero/database.yml usr/share/noosfero/config/database.yml 3 etc/noosfero/database.yml usr/share/noosfero/config/database.yml
4 -etc/noosfero/thin.yml usr/share/noosfero/config/thin.yml 4 +etc/noosfero/unicorn.rb usr/share/noosfero/config/unicorn.rb
5 etc/noosfero/plugins usr/share/noosfero/config/plugins 5 etc/noosfero/plugins usr/share/noosfero/config/plugins
6 etc/noosfero/noosfero.yml usr/share/noosfero/config/noosfero.yml 6 etc/noosfero/noosfero.yml usr/share/noosfero/config/noosfero.yml
7 etc/noosfero/local.rb usr/share/noosfero/config/local.rb 7 etc/noosfero/local.rb usr/share/noosfero/config/local.rb
debian/noosfero.postinst
@@ -10,23 +10,23 @@ makedir() { @@ -10,23 +10,23 @@ makedir() {
10 } 10 }
11 11
12 12
13 -# migrate mongrel configuration to thin  
14 -mongrel_config=/etc/noosfero/mongrel_cluster.yml 13 +# migrate thin configuration to unicorn
  14 +unicorn_config=/etc/noosfero/unicorn.rb
15 thin_config=/etc/noosfero/thin.yml 15 thin_config=/etc/noosfero/thin.yml
16 -mongrel_orig_sha1=602c642c03f79349969c08330112a6f29d4c32aa  
17 -if [ -r $mongrel_config ]; then  
18 - mongrel_sha1=$(sha1sum $mongrel_config | awk '{print $1}')  
19 - if [ "$mongrel_sha1" != "$mongrel_orig_sha1" ]; then  
20 - port=$(awk '{ if ($1 == "port:") { print($2) } }' $mongrel_config)  
21 - servers=$(awk '{ if ($1 == "servers:") { print($2) } }' $mongrel_config) 16 +thin_orig_sha1=47cee6728a7896a13f4d66544086ab88b02e89a7
  17 +if [ -r $thin_config ]; then
  18 + thin_sha1=$(sha1sum $thin_config | awk '{print $1}')
  19 + if [ "$thin_sha1" != "$thin_orig_sha1" ]; then
  20 + port=$(awk '{ if ($1 == "port:") { print($2) } }' $thin_config)
  21 + servers=$(awk '{ if ($1 == "servers:") { print($2) } }' $thin_config)
22 if test -n "$port" && test "$port" -ne 50000 || test -n "$servers" && test "$servers" -ne 1 ; then 22 if test -n "$port" && test "$port" -ne 50000 || test -n "$servers" && test "$servers" -ne 1 ; then
23 - # mongrel configuration was changed; update thin configuration 23 + # thin configuration was changed; update unicorn configuration
24 # accordingly 24 # accordingly
25 - sed -i -e "s/port: .*/port: $port/" $thin_config  
26 - sed -i -e "s/servers: .*/servers: $servers/" $thin_config 25 + sed -i -e "s/listen.*/listen '127.0.0.1:$port'/" $unicorn_config
  26 + sed -i -e "s/worker_processes.*/worker_processes $servers/" $unicorn_config
27 fi 27 fi
28 fi 28 fi
29 - mv $mongrel_config $mongrel_config.bak 29 + mv $thin_config $thin_config.bak
30 fi 30 fi
31 31
32 # create user noosfero in a portable way, while creating the log directory. 32 # create user noosfero in a portable way, while creating the log directory.
debian/thin.yml
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 ----  
2 -pid: tmp/pids/thin.pid  
3 -address: 127.0.0.1  
4 -user: noosfero  
5 -timeout: 0  
6 -port: 50000  
7 -log: log/thin.log  
8 -max_conns: 1024  
9 -servers: 1  
10 -max_persistent_conns: 512  
11 -environment: production  
12 -daemonize: true  
13 -chdir: /usr/share/noosfero  
debian/unicorn.rb 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +listen "127.0.0.1:50000"
  2 +
  3 +worker_processes `nproc`.to_i
debian/update-noosfero-apache
@@ -2,20 +2,9 @@ @@ -2,20 +2,9 @@
2 2
3 set -e 3 set -e
4 4
5 -# automatically update configuration, but if package noosfero is also installed 5 +# automatically update configuration, but only if package noosfero is also
  6 +# installed
6 if test -x /usr/share/noosfero/script/apacheconf; then 7 if test -x /usr/share/noosfero/script/apacheconf; then
7 - datadir="/etc/noosfero/apache"  
8 - mongrel_file="$datadir/mongrel.conf"  
9 - cluster_file="$datadir/cluster.conf"  
10 - if test -e "$cluster_file"; then  
11 - echo "Overwriting $cluster_file ..."  
12 - fi  
13 - /usr/share/noosfero/script/apacheconf thin > "$cluster_file"  
14 - if test -e "$mongrel_file"; then  
15 - echo "Moving existing $mongrel_file away ..."  
16 - mv "$mongrel_file" "$mongrel_file".bak  
17 - (cd $datadir && ln -sf cluster.conf mongrel.conf)  
18 - fi  
19 8
20 apache_site='/etc/apache2/sites-available/noosfero' 9 apache_site='/etc/apache2/sites-available/noosfero'
21 if ! test -e "$apache_site"; then 10 if ! test -e "$apache_site"; then
gitignore.example
@@ -10,7 +10,7 @@ config/session.secret @@ -10,7 +10,7 @@ config/session.secret
10 config/noosfero.yml 10 config/noosfero.yml
11 config/mongrel_cluster.yml 11 config/mongrel_cluster.yml
12 config/plugins 12 config/plugins
13 -config/thin.yml 13 +config/unicorn.rb
14 config/local.rb 14 config/local.rb
15 index 15 index
16 locale 16 locale
lib/noosfero/unicorn.rb 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +# our defaults
  2 +listen "0.0.0.0:3000"
  3 +pid 'tmp/pids/unicorn.pid'
  4 +
  5 +preload_app true
  6 +GC.respond_to?(:copy_on_write_friendly=) and
  7 + GC.copy_on_write_friendly = true
  8 +
  9 +before_fork do |server, worker|
  10 + ActiveRecord::Base.connection.disconnect! if defined?(ActiveRecord::Base)
  11 +end
  12 +
  13 +after_fork do |server, worker|
  14 + ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base)
  15 +end
  16 +
  17 +# load local configuration file, if it exists
  18 +config = File.join(File.dirname(__FILE__), '../../config/unicorn.rb')
  19 +instance_eval(File.read(config), config) if File.exists?(config)
  20 +
script/apacheconf
1 #!/usr/bin/env ruby 1 #!/usr/bin/env ruby
2 2
3 -def mongrel_thin(config_file)  
4 - require 'yaml'  
5 - config = YAML.load_file(config_file)  
6 - ip = config['address'] || '127.0.0.1'  
7 - servers = config['servers'] || 1  
8 - ports = port_range = config['port']..(config['port'] + servers - 1)  
9 - ports.each do |port|  
10 - puts "BalancerMember http://#{ip}:#{port}"  
11 - end  
12 -end  
13 -  
14 case ARGV.first 3 case ARGV.first
15 -when 'mongrel'  
16 - mongrel_thin(File.dirname(__FILE__) + "/../config/mongrel_cluster.yml")  
17 -when 'thin'  
18 - mongrel_thin(File.dirname(__FILE__) + "/../config/thin.yml")  
19 when 'virtualhosts' 4 when 'virtualhosts'
20 require File.dirname(__FILE__) + '/../config/environment' 5 require File.dirname(__FILE__) + '/../config/environment'
21 Environment.all.each do |environment| 6 Environment.all.each do |environment|
@@ -38,6 +23,6 @@ when &#39;virtualhosts&#39; @@ -38,6 +23,6 @@ when &#39;virtualhosts&#39;
38 end 23 end
39 puts "# vim: ft=apache" 24 puts "# vim: ft=apache"
40 else 25 else
41 - puts "usage: %s mongrel|thin|virtualhosts" % $PROGRAM_NAME 26 + puts "usage: %s virtualhosts" % $PROGRAM_NAME
42 exit 1 27 exit 1
43 end 28 end
script/development
@@ -9,9 +9,9 @@ stop() { @@ -9,9 +9,9 @@ stop() {
9 ./script/delayed_job stop 9 ./script/delayed_job stop
10 ./script/feed-updater stop 10 ./script/feed-updater stop
11 whenever --clear-crontab 11 whenever --clear-crontab
12 - if [ -f tmp/pids/thin.pid ]; then  
13 - kill -9 $(cat tmp/pids/thin.pid)  
14 - rm -f tmp/pids/thin.pid 12 + if [ -f tmp/pids/unicorn.pid ]; then
  13 + kill -9 $(cat tmp/pids/unicorn.pid)
  14 + rm -f tmp/pids/unicorn.pid
15 fi 15 fi
16 exit 16 exit
17 } 17 }
@@ -20,18 +20,17 @@ start() { @@ -20,18 +20,17 @@ start() {
20 rake db:abort_if_pending_migrations 20 rake db:abort_if_pending_migrations
21 ./script/feed-updater start 21 ./script/feed-updater start
22 ./script/delayed_job start 22 ./script/delayed_job start
23 - trap stop INT TERM 23 + trap stop INT TERM EXIT
24 whenever --write-crontab --set 'environment=development' 24 whenever --write-crontab --set 'environment=development'
25 if [ -z "$RAILS_RELATIVE_URL_ROOT" ]; then 25 if [ -z "$RAILS_RELATIVE_URL_ROOT" ]; then
26 - rails s $@ 26 + unicorn_rails --config-file lib/noosfero/unicorn.rb $@
27 else 27 else
28 mkdir -p log 28 mkdir -p log
29 touch log/development.log 29 touch log/development.log
30 - thin \  
31 - --prefix "$RAILS_RELATIVE_URL_ROOT" \  
32 - --pid tmp/pids/thin.pid \  
33 - --daemonize \  
34 - start 30 + unicorn_rails \
  31 + --path "$RAILS_RELATIVE_URL_ROOT" \
  32 + --config-file lib/noosfero/unicorn.rb \
  33 + --daemonize
35 tail -n 0 -f log/development.log || true 34 tail -n 0 -f log/development.log || true
36 fi 35 fi
37 } 36 }
script/install-dependencies/debian-wheezy.sh
@@ -72,8 +72,8 @@ run sudo apt-get -qy dist-upgrade @@ -72,8 +72,8 @@ run sudo apt-get -qy dist-upgrade
72 72
73 run sudo apt-get -y install dctrl-tools 73 run sudo apt-get -y install dctrl-tools
74 74
75 -# *sigh* need ruby-rspec from backports  
76 -run sudo apt-get -y install -t wheezy-backports ruby-rspec 75 +# need these from backports
  76 +run sudo apt-get -y install -t wheezy-backports ruby-rspec unicorn
77 77
78 # needed to run noosfero 78 # needed to run noosfero
79 packages=$(grep-dctrl -n -s Build-Depends,Depends,Recommends -S -X noosfero debian/control | sed -e '/^\s*#/d; s/([^)]*)//g; s/,\s*/\n/g' | grep -v 'memcached\|debconf\|dbconfig-common\|misc:Depends\|adduser\|mail-transport-agent') 79 packages=$(grep-dctrl -n -s Build-Depends,Depends,Recommends -S -X noosfero debian/control | sed -e '/^\s*#/d; s/([^)]*)//g; s/,\s*/\n/g' | grep -v 'memcached\|debconf\|dbconfig-common\|misc:Depends\|adduser\|mail-transport-agent')
script/production
@@ -25,12 +25,31 @@ clear_cache() { @@ -25,12 +25,31 @@ clear_cache() {
25 fi 25 fi
26 } 26 }
27 27
  28 +app_server_start() {
  29 + ruby -S bundle exec unicorn_rails \
  30 + --config-file lib/noosfero/unicorn.rb \
  31 + --env "$RAILS_ENV" \
  32 + --daemonize
  33 +}
  34 +
  35 +app_server_stop() {
  36 + # see unicorn_rails(1)
  37 + kill -s QUIT $(cat tmp/pids/unicorn.pid)
  38 +}
  39 +
  40 +app_server_restart() {
  41 + # see unicorn_rails(1) and "Signal handling" in unicorn documentation
  42 + kill -s USR2 $(cat tmp/pids/unicorn.pid)
  43 + sleep 5
  44 + kill -s QUIT $(cat tmp/pids/unicorn.pid.oldbin)
  45 +}
  46 +
28 do_start() { 47 do_start() {
29 bundle exec rake db:migrate SCHEMA=/dev/null 48 bundle exec rake db:migrate SCHEMA=/dev/null
30 clear_cache 49 clear_cache
31 environments_loop start 50 environments_loop start
32 bundle exec whenever --write-crontab --set 'environment=production' 51 bundle exec whenever --write-crontab --set 'environment=production'
33 - ruby -S bundle exec thin -C config/thin.yml start 52 + app_server_start
34 } 53 }
35 54
36 do_stop() { 55 do_stop() {
@@ -39,8 +58,8 @@ do_stop() { @@ -39,8 +58,8 @@ do_stop() {
39 # back to stopping the daemons by manually reading their PID files, killing 58 # back to stopping the daemons by manually reading their PID files, killing
40 # them and wiping the PID files. 59 # them and wiping the PID files.
41 60
42 - ruby -S bundle exec thin -C config/thin.yml stop ||  
43 - stop_via_pid_file tmp/pids/thin.*.pid 61 + app_server_stop ||
  62 + stop_via_pid_file tmp/pids/unicorn.pid
44 63
45 environments_loop stop || 64 environments_loop stop ||
46 stop_via_pid_file tmp/pids/delayed_job.pid tmp/pids/delayed_job.*.pid tmp/pids/feed-updater.*.pid 65 stop_via_pid_file tmp/pids/delayed_job.pid tmp/pids/delayed_job.*.pid tmp/pids/feed-updater.*.pid
@@ -52,10 +71,11 @@ do_restart() { @@ -52,10 +71,11 @@ do_restart() {
52 bundle exec rake db:migrate SCHEMA=/dev/null 71 bundle exec rake db:migrate SCHEMA=/dev/null
53 environments_loop stop || 72 environments_loop stop ||
54 stop_via_pid_file tmp/pids/delayed_job.pid tmp/pids/delayed_job.*.pid tmp/pids/feed-updater.*.pid 73 stop_via_pid_file tmp/pids/delayed_job.pid tmp/pids/delayed_job.*.pid tmp/pids/feed-updater.*.pid
55 - environments_loop start  
56 74
57 clear_cache 75 clear_cache
58 - ruby -S bundle exec thin -C config/thin.yml restart --onebyone 76 + app_server_restart
  77 +
  78 + environments_loop start
59 } 79 }
60 80
61 stop_via_pid_file() { 81 stop_via_pid_file() {
@@ -85,7 +105,7 @@ environments_loop() { @@ -85,7 +105,7 @@ environments_loop() {
85 } 105 }
86 106
87 do_running() { 107 do_running() {
88 - pids=$(sed "s/.*/& /" tmp/pids/thin.*.pid 2>/dev/null | tr -d '\n') 108 + pids=$(sed "s/.*/& /" tmp/pids/unicorn.pid 2>/dev/null | tr -d '\n')
89 # passes if any of $pids exist, fails otherwise 109 # passes if any of $pids exist, fails otherwise
90 kill -0 $pids > /dev/null 2>&1 110 kill -0 $pids > /dev/null 2>&1
91 } 111 }
@@ -111,6 +131,8 @@ case &quot;$ACTION&quot; in @@ -111,6 +131,8 @@ case &quot;$ACTION&quot; in
111 ;; 131 ;;
112 132
113 *) 133 *)
  134 + # `running` is not listed on purpose since it's not supposed to be a public
  135 + # API.
114 echo "usage: $0 start|stop|restart|run" 136 echo "usage: $0 start|stop|restart|run"
115 exit 1 137 exit 1
116 ;; 138 ;;
util/debian-install/test
1 #!/bin/sh 1 #!/bin/sh
2 2
3 test_web_backend_running() { 3 test_web_backend_running() {
4 - assertTrue 'Noosfero running' 'pgrep -u noosfero -f thin' 4 + assertTrue 'Noosfero running' 'pgrep -u noosfero -f unicorn'
5 } 5 }
6 6
7 test_delayed_job_running() { 7 test_delayed_job_running() {