====== How to configure multiple servers for asterCC system ====== ===== Servers ===== * CTI(Asterisk)、Nginx:192.168.1.62 (External IP:110.249.148.246) * MySQL:192.168.1.60 * PHP server 1:192.168.1.61 * PHP server 2:192.168.1.70 <note> Before you start to config, please make sure all servers have same astercc version and modules</note> 1.Backup database on your CTI server. <code> mysqldump -uroot -pyour_password astercc10 > astercc_backup.sql </code> Copy the sql file to your MySQL(192.168.1.60) sever and do import: <code> mysql -uroot -pyour_passwordastercc10 < astercc_backup.sql </code> 2.set privileges on your MySQL server, to make sure you have mysql access on CTI and PHP servers Run the following commond on your mysql server mysql> <code> grant all privileges on astercc10.* to astercc@'192.168.1.%' identified by 'asterccpw'; </code> Now you are supposed to have mysql access from 192.168.1.* 3.update /etc/astercc.conf on the CTI,PHP1,PHP2 servers, section [database] and [statistics]: <code> [database] dbtype = mysql dbhost = 192.168.1.60 dbname = astercc10 dbport = 3306 username = astercc password = asterccpw prefix= cc10_ [statistics] ;on/off status = on dbtype = mysql dbhost = 192.168.1.60 dbname = astercc10 dbport = 3306 dbuser = astercc dbpassword = asterccpw prefix= cc10_ [system] ;if Cluster no,php,asterisk,all cluster = php </code> <note> For cluster option under system, choose what kind of cluster config you want to use</note> 4.update php database config /var/www/html/asterCC/app/config/database.php on your php servers class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => '192.168.1.60', 'login' => 'astercc', 'password' => 'asterccpw', 'database' => 'astercc10', 'prefix' => 'cc10_', 'encoding' => 'utf8', ); <note> You don't need to update $test</note> 5.Update firewall config file: /etc/sysconfig/iptables, then do service iptables restart On CTI(Nginx): <code> *filter :INPUT DROP [32888:6036616] :FORWARD DROP [0:0] :OUTPUT ACCEPT [38964:13133002] -A INPUT -p udp -m udp --dport 5060 -j ACCEPT -A INPUT -p udp -m udp --dport 4569 -j ACCEPT -A INPUT -p udp -m udp --dport 5036 -j ACCEPT -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT -A INPUT -p udp -m udp --dport 2727 -j ACCEPT -A INPUT -p udp -m udp --dport 137:138 -j ACCEPT -A INPUT -p udp -m udp --dport 123 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 8081 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 139 -j ACCEPT -A INPUT -p tcp -m tcp --dport 389 -j ACCEPT -A INPUT -p tcp -m tcp --dport 445 -j ACCEPT -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -A INPUT -m state --state ESTABLISHED -j ACCEPT COMMIT </code> On MySQL: <code> *filter :INPUT DROP [32888:6036616] :FORWARD DROP [0:0] :OUTPUT ACCEPT [38964:13133002] -A INPUT -p udp -m udp --dport 5060 -j ACCEPT -A INPUT -p udp -m udp --dport 4569 -j ACCEPT -A INPUT -p udp -m udp --dport 5036 -j ACCEPT -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT -A INPUT -p udp -m udp --dport 2727 -j ACCEPT -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p udp -m udp --dport 161 -j ACCEPT -A INPUT -p tcp -m tcp --dport 161 -j ACCEPT -A INPUT -p udp -m udp --dport 162 -j ACCEPT -A INPUT -p tcp -m tcp --dport 162 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -A INPUT -m state --state ESTABLISHED -j ACCEPT COMMIT </code> On PHP1: <code> *filter :INPUT ACCEPT [32888:6036616] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [38964:13133002] -A INPUT -p udp -m udp --dport 5060 -j ACCEPT -A INPUT -p udp -m udp --dport 4569 -j ACCEPT -A INPUT -p udp -m udp --dport 5036 -j ACCEPT -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT -A INPUT -p udp -m udp --dport 2727 -j ACCEPT -A INPUT -p tcp -m tcp --dport 9000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT COMMIT </code> On PHP2: same as PHP1 <note tip><code> Port usage: please open correct port on /etc/sysconfig/iptables 21:FTP 22:SSH 80:http, if you changed http port in nginx, please make sure you set this properly 123:NTP 137:udp samba 138:udp samba 139:tcp samba 389:tcp samba 445:tcp samba 901:tcp samba 161:SNMP的 162:SNMP-trap 443:https 2727:MGCP 3306:mysql 4569:IAX2 5036:IAX1 5038:Asterisk AMI 5060:sip 9000:php fpm 10000:20000:Asterisk rtp </code></note> 6.Install samba on your CTI and php servers <code> yum install samba </code> 7.Configure samba username and password, such as: sbu/123456, first: <code> useradd sbu </code> then, enter password when it prompts: <code> smbpasswd -a sbu </code> 8.Update samba configure file /etc/samba/smb.conf, append the following lines: on CTI server: <code> [ccastspool] path = /var/spool/asterisk comment = Home Directories browseable = no writable = yes ; valid users = %S ; valid users = MYDOMAIN\%S create mask=777 directory mask = 777 force user = asterisk [ccastetc] path = /etc/asterisk/ comment = Home Directories browseable = no writable = yes ; valid users = %S ; valid users = MYDOMAIN\%S create mask=777 directory mask = 777 force user = asterisk [ccastlib] path = /var/lib/asterisk/ comment = Home Directories browseable = no writable = yes ; valid users = %S ; valid users = MYDOMAIN\%S create mask=777 directory mask = 777 force user = asterisk [ccscripts] path = /opt/asterisk/scripts/astercc comment = Home Directories browseable = no writable = yes ; valid users = %S ; valid users = MYDOMAIN\%S create mask=777 directory mask = 777 force user = asterisk </code> on PHP1 server: <code> [ccdata] path = /var/www/html/asterCC/data comment = Home Directories browseable = no writable = yes ; valid users = %S ; valid users = MYDOMAIN\%S create mask=777 directory mask = 777 force user = asterisk [ccstatistics] path = /var/www/html/asterCC/statistics comment = Home Directories browseable = no writable = yes ; valid users = %S ; valid users = MYDOMAIN\%S create mask=777 directory mask = 777 force user = asterisk </code> 9. restart sambe, execute: <code> service smb restart </code> 10. Mount files. (Please do backup first before you mount, let's say you are going to mount ccdata to /var/www/html/asterCC/data, backup your /var/www/html/asterCC/data first) on CTI server, execute: <code> mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccdate /var/www/html/asterCC/data mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccstatistics /var/www/html/asterCC/statistics </code> on PHP1, execute: <code> mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastspool /var/spool/asterisk mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccscripts /opt/asterisk/scripts/astercc mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastlib /var/lib/asterisk mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastetc /etc/asterisk </code> on PHP2, execute: <code> mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccstatistics /var/www/html/asterCC/statistics mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccdata /var/www/html/asterCC/data mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastspool /var/spool/asterisk mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastlib /var/lib/asterisk mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastetc /etc/asterisk mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccscripts /opt/asterisk/scripts/astercc </code> 11. update php-fpm config file /etc/php-fpm.d/www.conf on CTI: <code> [www] listen=127.0.0.1 listen.allowed_clients=127.0.0.1 </code> on PHP1: <code> [www] listen=192.168.1.61:9000 listen.allowed_clients=127.0.0.1,192.168.1.61,192.168.1.62 </code> on PHP2: <code> [www] listen=192.168.1.70:9000 listen.allowed_clients=127.0.0.1,192.168.1.70,192.168.1.62 </code> 12.update nginx config file /usr/local/nginx/conf/nginx.conf on CTI: 12-1: add the following content in http section: <code> http{ upstream myphp { #ip_hash; PHP load balance server 192.168.1.61:9000 weight=2; server 192.168.1.70:9000 weight=2; } } </code> 12-2:update location section: <code> location ~ .*\.(php|php5)?$ { #use local server for login and reloadConf action set $target myphp; if ($request_uri ~* login) { set $target 127.0.0.1:9000; } if ($request_uri ~* reloadConf) { set $target 127.0.0.1:9000; } fastcgi_pass $target; #fastcgi_pass 127.0.0.1:9000; } </code> <note> you don't need to update nginx on PHP1 and PHP2 </note> 13. Share licensing on CTI: 13-1: do backup: <code> cp -Rp /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp /var/www/html/asterCC/statistics/agentsxindesk.ctp </code> execute: <code> ln -s /var/www/html/asterCC/statistics/agentsxindesk.ctp /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp </code> 13-2:copy: <code> cp -Rp /var/www/html/asterCC/app/config/database.php /var/www/html/asterCC/statistics/database.php </code> execute: <code> ln -s /var/www/html/asterCC/statistics/database.php /var/www/html/asterCC/app/config/database.php </code> 13-3:make sure /opt/asterisk/scripts/astercc/identity.astercc, /opt/asterisk/scripts/astercc/license.astercc are original files before you mount <code> cp -Rp /usr/local/conf/hcdesk.conf /opt/asterisk/scripts/astercc/hcdesk.conf </code> <code> ln -s /opt/asterisk/scripts/astercc/hcdesk.conf /usr/local/conf/hcdesk.conf </code> <code> cp -Rp /etc/astercc.conf /opt/asterisk/scripts/astercc/astercc.conf </code> <code> ln -s /opt/asterisk/scripts/astercc/astercc.conf /etc/astercc.conf </code> on PHP1: 13-4:backup agentsxindesk.ctp <code> mv /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp.bak </code> <code> ln -s /var/www/html/asterCC/statistics/agentsxindesk.ctp /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp </code> 13-5: <code> mv /var/www/html/asterCC/app/config/database.php /var/www/html/asterCC/app/config/database.php.bak </code> <code> ln -s /var/www/html/asterCC/statistics/database.php /var/www/html/asterCC/app/config/database.php </code> 13-6: backup hcdesk.conf <code> mv /usr/local/conf/hcdesk.conf /usr/local/conf/hcdesk.conf.bak </code> <code> ln -s /opt/asterisk/scripts/astercc/hcdesk.conf /usr/local/conf/hcdesk.conf </code> 13-7:backup astercc.conf <code> mv /etc/astercc.conf /etc/astercc.conf.bak </code> <code> ln -s /opt/asterisk/scripts/astercc/astercc.conf /etc/astercc.conf </code> on PHP2: 13-8: bacup agentsxindesk.ctp <code> mv /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp.bak </code> <code> ln -s /var/www/html/asterCC/statistics/agentsxindesk.ctp /var/www/html/asterCC/app/views/agents/agentsxindesk.ctp </code> 13-8: <code> mv /var/www/html/asterCC/app/config/database.php /var/www/html/asterCC/app/config/database.php.bak </code> <code> ln -s /var/www/html/asterCC/statistics/database.php /var/www/html/asterCC/app/config/database.php </code> 13-9: backup hcdesk.conf <code> mv /usr/local/conf/hcdesk.conf /usr/local/conf/hcdesk.conf.bak </code> <code> ln -s /opt/asterisk/scripts/astercc/hcdesk.conf /usr/local/conf/hcdesk.conf </code> 13-10: backup astercc.conf <code> mv /etc/astercc.conf /etc/astercc.conf.bak </code> <code> ln -s /opt/asterisk/scripts/astercc/astercc.conf /etc/astercc.conf </code> 14. update config files on CTI: update /etc/asterisk/manager.conf, so other servers could access asterisk: <code> [astercc] secret = asterccsecret deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.0 permit=192.168.1.0/255.255.255.0 read = system,call,agent write = system,call,agent,user,config,command,reporting,originate </code> apply the changes <code> asterisk -rx "manager reload" </code> update /etc/astercc.conf <code> [asterisk] server = 192.168.1.62 port = 5038 username = astercc secret = asterccsecret </code> 15.make sure /etc/asterisk is owned by asterisk:asterisk 16.update crontab by "crontab -e" on CTI: <code> 30 12 * * * /opt/asterisk/scripts/astercc/processmonitors -d 30 20 * * * /opt/asterisk/scripts/astercc/processmonitors -d 30 23 * * * /opt/asterisk/scripts/astercc/processmonitors -d * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app asterccdelete >/dev/null 2>&1 10 2 * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app nighttask >/dev/null 2>&1 10 0 * * * /opt/asterisk/scripts/astercc/agent_report -d 20 0 * * * /opt/asterisk/scripts/astercc/agentgroup_report -d </code> MySQL: remove all crontabe PHP1 and PHP2, you just need to make sure these scripts are executed on either one <code> * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app checkonline >/dev/null 2>&1 * 2 * * * /opt/asterisk/scripts/astercc/astcc_backup.sh >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app monitortar >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app backupmonitor >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app export >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app asterccimport >/dev/null 2>&1 */5 * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app calculate >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app mailman >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app campaignpackgetask >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app blacklistfilter >/dev/null 2>&1 * * * * * /var/www/html/asterCC/cake/console/cake -app /var/www/html/asterCC/app asterccfilter >/dev/null 2>&1 * * * * * /opt/asterisk/scripts/astercc/astcc_historydata -d </code> 17. make sure mount in crontabe CTI: <code> */5 * * * * dfccdata=`df |grep ccdata`; [ "X${dfccdata}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccdata /var/www/html/asterCC/data`; */5 * * * * dfccstatistics=`df |grep ccstatistics`; [ "X${dfccstatistics}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccstatistics /var/www/html/asterCC/statistics`; </code> PHP1: <code> */5 * * * * dfccastspool=`df |grep ccastspool`; [ "X${dfccastspool}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastspool /var/spool/asterisk/`; */5 * * * * dfastetc=`df |grep etc/asterisk`; [ "X${dfastetc}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastetc /etc/asterisk/`; */5 * * * * dfccastlib=`df |grep ccastlib`; [ "X${dfccastlib}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastlib /var/lib/asterisk/`; */5 * * * * dfccscripts=`df |grep ccscripts`; [ "X${dfccscripts}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccscripts /opt/asterisk/scripts/astercc/`; </code> PHP2: <code> */5 * * * * dfccdata=`df |grep ccdata`; [ "X${dfccdata}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccdata /var/www/html/asterCC/data`; */5 * * * * dfccstatistics=`df |grep ccstatistics`; [ "X${dfccstatistics}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.61/ccstatistics /var/www/html/asterCC/statistics`; */5 * * * * dfccastspool=`df |grep ccastspool`; [ "X${dfccastspool}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastspool /var/spool/asterisk/`; */5 * * * * dfastetc=`df |grep etc/asterisk`; [ "X${dfastetc}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastetc /etc/asterisk/`; */5 * * * * dfccastlib=`df |grep ccastlib`; [ "X${dfccastlib}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccastlib /var/lib/asterisk/`; */5 * * * * dfccscripts=`df |grep ccscripts`; [ "X${dfccscripts}" = "X" ] && `mount -t cifs -o username=sbu,password=123456 //192.168.1.62/ccscripts /opt/asterisk/scripts/astercc/`; </code> 18. At last, On CTI server: <code> /opt/asterisk/scripts/astercc/asterccc --RNI </code> On PHP1: <code> /opt/asterisk/scripts/astercc/asterccc --ADI </code> on PHP2: <code> /opt/asterisk/scripts/astercc/asterccc --ADI </code> If everything is good, you will see 001 on CTI server, 002 on PHP1, 003 on PHP2, after license is issued, run service asterccd restart on CTI server.