yum install nginx php-fpm supervisor git
cd /var/www git clone https://github.com/ViStepRU/callme.git chown nginx. -R callme/
/etc/nginx/conf.d/pbx.vistep.ru.conf
server { server_name www.pbx.vistep.ru pbx.vistep.ru; listen *:80; rewrite ^ https://pbx.vistep.ru$request_uri? permanent; } server { # listen *:80; # server_name pbx.vistep.ru; access_log /var/log/nginx/pbx.vistep.ru.access.log main; error_log /var/log/nginx/pbx.vistep.ru.error.log; listen 443 ssl http2; server_name pbx.vistep.ru; resolver 8.8.8.8; ssl_stapling on; ssl on; ssl_certificate /etc/letsencrypt/live/pbx.vistep.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ru/privkey.pem; ssl_dhparam /etc/nginx/certs/dhparam.pem; ssl_session_timeout 24h; ssl_session_cache shared:SSL:2m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000;"; add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report"; root /var/www/callme; index index.php; location ~ /\. { deny all; # } location ~* /(?:uploads|files)/.*\.php$ { deny all; # } location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; # } location ~ \.php { root /var/www/callme; index index.php; fastcgi_pass unix:/run/php/php5.6-fpm.sock; # fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include /etc/nginx/fastcgi_params; } }
https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt
xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6
. He also needs to be copied to himself, he is needed to make outgoing calls.On the Bitrix24 server, an ssl certificate must be configured (you can use letsencrypt), otherwise the bitrix api will not work. If you have a cloud version, don't worry - there is already ssl.
[callme] secret = JD3clEB8_f23r-3ry84gJ deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.0 permit= 10.100.111.249/255.255.255.255 permit = 192.168.254.0/255.255.255.0 read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan write = system,call,agent,log,verbose,user,config,command,reporting,originate
globals { WAV=/var/www/pbx.vistep.ru/callme/records/wav; // WAV MP3=/var/www/pbx.vistep.ru/callme/records/mp3; // mp3 URLRECORDS=https://pbx.vistep.ru/callme/records/mp3; RECORDING=1; // , 1 - . }; macro recording(calling,called) { if ("${RECORDING}" = "1"){ Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called}); Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)}); System(mkdir -p ${MP3}/${datedir}); System(mkdir -p ${WAV}/${datedir}); Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3"); Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3); Set(CDR(filename)=${fname}.mp3); Set(CDR(recordingfile)=${fname}.wav); Set(CDR(realdst)=${called}); MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt}); }; }; context incoming { 888999 => { &recording(${CALLERID(number)},${EXTEN}); Answer(); ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // CallerID 24 Set(CallStart=${STRFTIME(epoch,,%s)}); Queue(Q1,tT); Set(CallMeDISPOSITION=${CDR(disposition)}); Hangup(); } h => { Set(CDR_PROP(disable)=true); Set(CallStop=${STRFTIME(epoch,,%s)}); Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)}); ExecIF(${ISNULL(${CallMeDISPOSITION})}?Set(CallMeDISPOSITION=${CDR(disposition)}):NoOP(=== CallMeDISPOSITION already was set ===)); System(curl -s https://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION}); } } context default { _X. => { Hangup(); } }; context dial_out { _[1237]XX => { &recording(${CALLERID(number)},${EXTEN}); Set(__CallIntNum=${CALLERID(num)}) Set(CallStart=${STRFTIME(epoch,,%s)}); Dial(SIP/${EXTEN},,tTr); Hangup(); } _11XXX => { &recording(${CALLERID(number)},${EXTEN}); Set(CallStart=${STRFTIME(epoch,,%s)}); Set(__CallIntNum=${CALLERID(num)}); Dial(SIP/${EXTEN:2}@toOurAster,,t); Hangup(); } _. => { &recording(${CALLERID(number)},${EXTEN}); Set(__CallIntNum=${CALLERID(num)}) Set(CallStart=${STRFTIME(epoch,,%s)}); Dial(SIP/${EXTEN}@toOurAster,,t); Hangup(); } h => { Set(CDR_PROP(disable)=true); Set(CallStop=${STRFTIME(epoch,,%s)}); Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)}); if(${ISNULL(${CallMeDISPOSITION})}) { Set(CallMeDISPOSITION=${CDR(disposition)}); } System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION}); } };
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
_. => { &recording(${CALLERID(number)},${EXTEN}); Set(__CallIntNum=${CALLERID(num)}) Set(CallStart=${STRFTIME(epoch,,%s)}); Dial(SIP/${EXTEN}@toOurAster,,t); Hangup(); } h => { Set(CDR_PROP(disable)=true); Set(CallStop=${STRFTIME(epoch,,%s)}); Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)}); if(${ISNULL(${CallMeDISPOSITION})}) { Set(CallMeDISPOSITION=${CDR(disposition)}); } System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION}); }
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)}) Set(CallStart=${STRFTIME(epoch,,%s)});
h => { Set(CDR_PROP(disable)=true); Set(CallStop=${STRFTIME(epoch,,%s)}); Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)}); if(${ISNULL(${CallMeDISPOSITION})}) { Set(CallMeDISPOSITION=${CDR(disposition)}); } System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION}); }
888999 => { &recording(${CALLERID(number)},${EXTEN}); Answer(); ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // CallerID 24 Set(CallStart=${STRFTIME(epoch,,%s)}); // Queue(Q1,tT); Set(CallMeDISPOSITION=${CDR(disposition)}); Hangup(); }
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());
<?php return array( 'CallMeDEBUG' => 1, // : 1 - , 0 - 'tech' => 'SIP', 'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', // 'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt', //url api ( ) 'extentions' => array('888999'), // , 'context' => 'dial_out', // 'asterisk' => array( // 'host' => '10.100.111.249', 'scheme' => 'tcp://', 'port' => 5038, 'username' => 'callme', 'secret' => 'JD3clEB8_f23r-3ry84gJ', 'connect_timeout' => 10000, 'read_timeout' => 10000 ), 'listener_timeout' => 300, // asterisk );
/etc/supervisord.d/callme.conf
[program:callme] command=/usr/bin/php CallMeIn.php directory=/var/www/pbx.vistep.ru autostart=true autorestart=true startretries=5 stderr_logfile=/var/www/pbx.vistep.ru/logs/daemon.log stdout_logfile=/var/www/pbx.vistep.ru/logs/daemon.log
supervisorctl start callme supervisorctl restart callme
supervisorctl status callme callme RUNNING pid 11729, uptime 17 days, 16:58:07
Source: https://habr.com/ru/post/349316/
All Articles