====== Setup Performexa ======
===== Software Versions =====
ruby : 2.2.3
rubygems : 2.4.5
rails : 4.2.4
===== Install Default developer packages =====
Add below mentioned both entrys
127.0.0.1 server url
server url
#This was tested in CentOS 6.5.
yum install epel-release -y
yum update -y
yum groupinstall "Development Tools" -y
yum groupinstall "Additional Development" -y
yum install gcc gcc-c++ make wget libtool libxml libxml-devel libxslt libxslt-devel subversion curl-devel java-1.7.0-openjdk java-1.7.0-openjdk-devel git-core openssl-devel -y
yum install ImageMagick ImageMagick-devel -y
yum install gcc openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel -y
===== Add appuser =====
useradd -m expdev01
vi /etc/sudoers
expdev01 ALL=(ALL) NOPASSWD: ALL ##add this line
su - expdev01
===== Ruby & Rubygems =====
=== Using rbenv ===
a) Install rbenv
# Check out rbenv into ~/.rbenv.
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# Add ~/.rbenv/bin to your $PATH for access to the rbenv command-line utility.
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# Ubuntu Desktop note: Modify your ~/.bashrc instead of ~/.bash_profile.
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# Restart your shell so that PATH changes take effect. (Opening a new terminal tab will usually do it.)
# Now check if rbenv was set up -
type rbenv
#=> "rbenv is a function"
b) Install rbenv-build
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
c) Install ruby 2.2.3
rbenv install 2.2.3
d) Update rubygems to 2.4.5
rbenv global 2.2.3 #make this version of ruby global
rbenv rehash #reload shims
gem -v #check the gem version (Most likely this will be 2.4.5.1)
gem install rubygems-update
update_rubygems
gem update --system '2.4.5'
mkdir -p ~/.rbenv/plugins
git clone git://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo
===== Installing MYSQL 5.6.x =====
yum install wget -y
wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
rpm -ivh mysql-community-release-el6-5.noarch.rpm
yum install mysql-community-server.x86_64 -y
/etc/init.d/mysqld start
mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("GIVE-NEW-ROOT-PASSWORD") where User='root';
mysql> flush privileges;
mysql> quit
===== Installing NGINX and Phusion Passenger =====
Install Passenger and Nginx
passenger-install-nginx-module
copy the nginx.conf file from "/opt/nginx/conf/nginx.conf" from existing machine to the new machine on the same location and change "server_name" and "passenger_pre_start"
server_name newqa01.performexa.com;
passenger_pre_start "http://newqa01.performexa.com/";
vi /opt/nginx/conf/nginx.conf
worker_processes 3;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
passenger_root /home/expdev01/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/passenger-5.0.18;
passenger_ruby /home/expdev01/.rbenv/versions/2.2.3/bin/ruby;
passenger_min_instances 1;
passenger_max_pool_size 3;
passenger_pre_start "http://newqa01.performexa.com/";
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 32k;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 12;
server_tokens off;
gzip on;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/x-javascript text/xml text/css application/xml;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 15;
server {
listen 80;
server_name newqa01.performexa.com;
rewrite ^/?(.*) https://$host/$1 redirect;
}
server {
listen 443 ssl;
server_name newqa01.performexa.com;
ssl_certificate /opt/nginx/ssl/server.crt;
ssl_certificate_key /opt/nginx/ssl/server.key;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/pki/tls/private/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
passenger_enabled on;
passenger_app_env staging;
root /deploy/performance/current/public;
open_file_cache max=2000 inactive=20s;
open_file_cache_valid 60s;
open_file_cache_min_uses 5;
open_file_cache_errors off;
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
}
}
===== SSL Configuration ======
copy the ssl folder from existing machine to the new machine ( which contain ssl certificates)
zip -r ssl.zip /opt/nginx/ssl
put it into ftp
login to the new machine
cd /opt/nginx
connect to ftp and download the ssl.zip file
unzip ssl.zip
copy the nginx.conf file from "/opt/nginx/conf/nginx.conf" from existing machine to the new machine on the same location
change the old machine name with the newone
===== Installing Ejabberd =====
Download the latest version of Ejabberd from www.process-one.net website, at the time of writing this document 15.07 was the latest.
wget "https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/15.07/ejabberd-15.07-linux-x86_64-installer.run"
chmod 751 ejabberd-15.07-linux-x86_64-installer.run
./ejabberd-15.07-linux-x86_64-installer.run
Do you accept this license? [y/n]: y
Installation Directory [/opt/ejabberd-15.07]:
ejabberd server domain [newqa01.performexa.com]: newqa01.performexa.com (Specify the Fully qualified name - Hostname)
Administrator username [admin]:
Administrator password [********] :
Retype password [********] :
Cluster [y/N]: n
Do you want to continue? [Y/n]: y
----------------------------------------------------------------------------
Please wait while Setup installs ejabberd on your computer.
Installing
0% ______________ 50% ______________ 100%
#########################################
----------------------------------------------------------------------------
cd /opt/ejabberd-15.07/bin
cp ejabberd.init /etc/init.d/ejabberd
/etc/init.d/ejabberd start
=== Configure ejabberd ===
1. Change the config settings. Config file can be found in your ejabberd directory under conf (ex - /opt/ejabberd-15.07/conf/ejabberd.yml)
Change "register:" (around line 481)
register:
all: allow
registration_timeout: infinity
Change "registration_timeout:" (around line 494)
registration_timeout: infinity //(yaml file level)
Enable "mod_ping"
mod_ping:
send_pings: true
ping_interval: 250
timeout_action: none
2. Start/Restart ejabberd
3. Create a shared roster for every one.
{{:shared_roster_all.png|Screenshot with information}}
4. Add a host entry for the IP pointing to the URL.
====== ejjaberd configuration ============
vi /opt/ejabberd-15.07/conf/ejabberd.yml
1) insert the below lines on line number 161 under "http_bind: true" ( search for "http_bind: true")
*******************************************************************************************************
tls: true
certfile: "/opt/ejabberd-15.07/conf/server.pem"
2) uncomment and do the changes in Line No: 171 from "optional" to "required"
******************************************************************************
s2s_use_starttls: required
3) uncomment the below mentioned line in Line No: 176
*********************************************************
s2s_certfile: "/opt/ejabberd-15.07/conf/server.pem"
4) set the value for "max_fsm_queue: 25000" in Line No : 375
**************************************************************
max_fsm_queue: 25000
5) search for "register:" in Line No: 483 and place the below line under "all: allow"
***************************************************************************************
registration_timeout: infinity
6) search for "By default the frequency of account registrations from the same IP is limited to 1 account every 10 minutes. To
disable, specify: infinity" and place the below mentioned line in Line No:496
*******************************************************************************************************************************
registration_timeout: infinity
7) search for "mod_ping:" and do the below changes in Line No: 574 ( Hint : remove "[]" in mod_ping )
*******************************************************************************************************
mod_ping:
send_pings: true
ping_interval: 120
timeout_action: none
============ ejjaberd SSL certificate update ============
Generate the server.pem file
****************************
cd /opt/nginx/ssl
cat server.crt server.key > server.pem
cd /opt/ejabberd-15.07/conf
mv server.pem ejabbert-original-server.pem
cp /opt/nginx/ssl/server.pem .
cd /opt/ejabberd-15.07/conf
chmod 640 server.pem
chown -R ejabberd:root server.pem
===== Install the gems used by the application =====
gem install capistrano -v 3.4.0
gem install capistrano-bundler -v 1.1.4
gem install capistrano-ext -v 1.2.1
gem install capistrano-log_with_awesome -v 0.0.2
gem install capistrano-passenger -v 0.2.0
gem install capistrano-rails -v 1.1.6
gem install capistrano-rbenv -v 2.0.4
gem install capistrano-stats -v 1.1.1
gem install god -v 0.13.7
mkdir /var/run/god/
chown -R expdev01:expdev01 /var/run/god
To Install mysql2 (Interface)
********************************
gem install mysql2 -v '0.3.20'
The Application uses bundler gem to manage the gem dependencies.
Install the bundler gem first.
sudo gem install bundler
Once the bundler gem is installed, from the application directory (eg: /deploy/crossbow/current), run
bundle install
This would install all the necessary gems required by the application.
=== Deploy Application: ===
mkdir -p /deploy/performance/current
cd /deploy
mkdir systasks
cd /deploy/performance
mkdir backups
mkdir shared
mkdir releases
cd /home/expdev01
Issue the command from /home/expdev01 to download the configuration files from SVN for performexa staging site
****************************************************************************************************************
svn co https://repos.exphosted.com/svnrepos/tools/scripts/performexa/deployment/staging/performance/
cp -r /home/expdev01/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0 /deploy/performance/shared/bundle/ruby/
cd /home/expdev01/performance
./runcap.sh
copy the build folder from "/home/expdev01/" to "/deploy/performance/releases/" ( eg "1.0.9.0-JACK" folder)
**************************************************************************************************************
cp -r /home/expdev01/1.0.9.0-JACK /deploy/performance/releases/
cd /deploy/performance
ln -s current /deploy/performance/releases/1.0.9.0-JACK/
cd /deploy/performance/releases/1.0.9.0-JACK/config
mv api.yml bkp-api.yml
mv newrelic.yml bkp-newrelic.yml
mv database.yml bkp-database.yml
mv chat.yml bkp-chat.yml
mv environments bkp-environments
copy the following files from "/deploy/performance/releases/1.0.9.0-JACK/config" directory to "/deploy/performance/shared/config"
*********************************************************************************************************************************
cd /deploy/performance/releases/1.0.9.0-JACK/config
cp api.yml /deploy/performance/shared/config
cp database.yml /deploy/performance/shared/config
cp chat.yml /deploy/performance/shared/config
cp newrelic.yml /deploy/performance/shared/config
cp -r environments /deploy/performance/shared/config
Add the following in "api.yml" ( e.g - In my case it is staging )
******************************************************************
vi api.yml
staging:
doorkeeper_token_expire_time: <%= 30.days %>
enabled_for_subsites: false
enabled: true
Change the Database name and credentials for staging
*****************************************************
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password: Expertus1@
host: localhost
production:
<<: *default
database: production
staging:
<<: *default
database: performance_staging
development:
<<: *default
database: performance_development01
#test:
# <<: *default
# database: performance_development
Do the changes (server, bosh , websocket , admin_jid and admin_password in staging block in chat.yml)
*****************************************************************************************************
staging:
server: https://newqa01.performexa.com:5280
bosh: https://newqa01.performexa.com:5280/http-bind
websocket: wss://newqa01.performexa.com:5280/websocket
domain: newqa01.performexa.com
enabled: true
create_xmpp_user: true
reconnect_timeout: 10000
admin_jid: admin@newqa01.performexa.com
admin_password: Expertus1@
push_notifications: true
stun: {
host : 'stun.services.mozilla.com',
port : 3478,
transport : 'udp'
}
test:
server: http://qa01.performexa.com:5280
websocket: ws://qa01.performexa.com:5280/websocket
domain: qa01.performexa.com
bosh: http://qa01.performexa.com:5280/http-bind
enabled: false
create_xmpp_user: false
production:
server: http://qa01.performexa.com:5280
websocket: ws://qa01.performexa.com:5280/websocket
domain: qa01.performexa.com
bosh: http://qa01.performexa.com:5280/http-bind
enabled: false
create_xmpp_user: false
Do the changes in "/deploy/performance/releases/1.0.9.0-JACK/config/environments/staging.rb"
*********************************************************************************************
APP_URL = "https://newqa01.performexa.com"
API_URL = "https://newqa01.performexa.com"
AUTHENTICATION_URL = "https://newqa01.performexa.com"
Create a symlink from "/deploy/performance/shared/config" directory
********************************************************************
cd /deploy/performance/shared/config/
ln -s /deploy/performance/shared/config/api.yml
ln -s /deploy/performance/shared/config/database.yml
ln -s /deploy/performance/shared/config/chat.yml
ln -s /deploy/performance/shared/config/newrelic.yml
ln -s /deploy/performance/shared/config/environments
===== god configuration =====
copy "/etc/init.d/god" script from qa01.performexa.com and paste into the same location with "newqa01.performexa.com" and changed the ownership of the file file to "expdev01"
chown -R expdev01:expdev01 /etc/init.d/god
chmod 755 /etc/init.d/god
check out the god.sh from the below svn link
execute the below command from /deploy/systasks
cd /deploy/systasks
svn co https://repos.exphosted.com/svnrepos/tools/scripts/performexa/services/staging/god.sh .
change the ownership and permission
chown -R expdev01:expdev01 /deploy/systasks/god.sh
chmod 755 /etc/init.d/god
start the god service
/etc/init.d/god start
===== Install the gems used by the application =====
The Application uses bundler gem to manage the gem dependencies.
Install the bundler gem first.
sudo gem install bundler
Once the bundler gem is installed, from the application directory (eg: /deploy/crossbow/current), run
bundle install
This would install all the necessary gems required by the application.
bundle install will end with this message:
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
===== Database creation and loading seed data =====
Modify the database.yml file to reflect proper DB settings in development and test section and then run following rake task to create all the databases.
bundle exec rake db:create:all
Once the DBs are created run the migrations to create necessary tables using following command.
bundle exec rake db:migrate
bundle exec rake db:migrate RAILS_ENV=test
Run rake db:seed to create the default company and related data (This is just one time task)
bundle exec rake db:seed
The default company will be created with name 'Performexa' and subdomain as 'default'. No subdomain in url will refer to default company. e.g. http://dev01.performexa.com will take default company as a context. An admin user for the default company will also be created. The username for admin user is 'admin@performexa.com' and password is 'pforperformance'.