Requirements
Software Requirements
|
Item |
Recommended |
Installation guide |
|
Media Server |
Latest version |
|
|
EFCX |
5.4.0 |
1. Default Configuration (Once at the time of Installation of Media Server)
Install Lua libraries
If you are already on the media server VM, skip the SSH step below, Just run the below commands one by one.
-
SSH into the Debian server onto which the Media Server is installed.
-
Use command
ssh username@server-ip -
Enter user password and press ENTER.
-
Use command
su -
Enter root password and press ENTER.
-
-
Run the following commands, one at a time:
-
apt install lua-socket sudo apt install lua-sec sudo apt-get install lua-json sudo apt-get install -y lua-dkjson
Configure IVR scripts and recordings (Once at the time of Installation of Media Server)
Deployment
-
Confirm git is installed with this command git --version, and install it if is not.
-
Clone the Media Server scripts repository, Where TAG is the latest branch tag of the Media Server scripts repository obtained from here.
git clone -b TAG https://efcx:RecRpsuH34yqp56YRFUb@gitlab.expertflow.com/rtc/freeswitch-scripts.git -
Navigate to the cloned repository to access the files:
cd freeswitch-scripts -
Set up CxIvr against the DN (Destination Number or Dialing Number) same as you have service identifier. Alter the file name of cx_env.lua to cx_env-{Domain-Name}-{DN}.lua where {Domain-Name} is the name of the Domain e.g
expertflow, {DN} is the dialing number of the IVR (Same as Service Identifier). (Will Set up IVR dialplan in the CxIvr Dialplan section below).-
e.g. for an IVR with a dialing number of 2233and Domain Name is tenant1 the file would be named cx_env-tenant1-1555.lua. So change the below command accourding to your DN and Domain.
mv cx_env.lua cx_env-tenant1-2233.lua
-
-
Move the files ending in .lua to the Media Server scripts folder:
mv *.lua /usr/share/freeswitch/scripts
-
If you have any custom IVR scripts, move them to the Media Server scripts folder, as the media server loads scripts from there
mv <custom-lua-IVR-script> /usr/share/freeswitch/scripts
-
Move the ivr_prompts folder:
mv ivr_prompts /usr/share/freeswitch/sounds/ -
Assign read-write permissions to the ivr_prompts and scripts folder:
chmod 777 -R /usr/share/freeswitch/sounds/ivr_prompts chmod 777 -R /usr/share/freeswitch/scripts -
Assign the permission to recording directory. run this command to give the permission to recording directory
chmod 777 -R /var/lib/freeswitch/recordings/
Cx IVR Configuration
Here, you will configure the environment for the CxIVR using the DN (Destination Number), also known as the Service Identifier, that you created earlier in Unified Admin.
-
Open cx_env-{Domain-Name}-{DN}.lua :
vi /usr/share/freeswitch/scripts/cx_env-{Domain-Name}-{DN}.lualocal config = {} local domain = session:getVariable("domain_name") local cxFqdn = "" if domain == "expertflow" then cxFqdn = "https://efcx4-voice.expertflow.com" -- set Default Domain here else cxFqdn = "https://" .. domain .. ".expertflow.com" -- set Tenant based Domain here end config = { -- Set to NAME or ID depending on whether queue field contains name or ID of queue queueType = '', -- Name or ID of queue to reserve agents from queue = '', -- NOTE: Keeping queue and queueType as '' will cause CX to use the default queue set in the CX Voice channel -- queue = '', -- queueType = '', -- FQDN of EF CX cxFqdn = cxFqdn, -- API of voice connector for reserving an agent voiceConnectorApi = "http://VC-IP:PORT", -- Path of folder containing sound files that play during the IVR menu, DO NOT CHANGE ivr_prompts_folder = "/usr/share/freeswitch/sounds/ivr_prompts/", auth_enabled = false, username = "admin", password = "admin" } return config -
Press the "I" key to enter editing mode.
-
The cxFqdn is dynamic in case of MTT, and for Single Tenant its value is hardcoded on line 7.
-
Single Tenant: set cxFqdn as https://efcx4-voice.expertflow.com , replace it with actual FQDN.
-
MTT: cxFqdn is set dymanically by fetching the domain value from Channel Variables, on line 9. The Root Domain need to be udpated. expertflow.com you can eplace it with actual organizational domain if needed (e.g mindbridge.com).
-
-
The queueType, Keep queue and queueType as '' will cause CX to use the default queue set in the CX Voice channel.
-
The voiceConnectorApi field will contain a URL in the following format:
-
http://VC-IP:VC-PORT
-
Replace VC-IP and VC-PORT with IP address and port of the voice connector.
-
-
The ivr_prompts_folder field contains path to the ivr_prompts folder. Leave it at the default value.
-
AUTH_ENABLED: By default leave it false, if APISIX authentication is enabled in EFCX make it true. The following settings below are set if this value is true.
-
username: The username created in Keycloak for API authentication.
-
On Keycloak create a user in the Expertflow realm.
-
Assign the admin and default roles to it .
-
Assign a non-temporary password to this user as well.
-
-
password: The password for the above user created in Keycloak for API authentication
-
Save and exit the file by pressing the Esc key, entering :wq and pressing ENTER.
-
Open vcApi.lua, this is our main voice connector api file to connect our call to agent desk.
vi /usr/share/freeswitch/scripts/vcApi.lua
-
Search for
fsIpand ReplacefsIp = '192.168.1.161'with your actual Media Server Public IP -
Save and exit the file by pressing the Esc key, entering :wq and pressing ENTER.
Configure Dialplans (Global)
These dialplans are configured globally and apply to all domains. Below, we will configure domain-specific dialplans as well.
-
Login to Media Server web interface.
-
Open in browser: https://IP-addr, where IP-addr is the IP address of the Media Server.
-
Add the username and password that was shown upon installation of Media Server and press LOGIN.
Outbound IVR Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = <Name of your choice>
-
Condition 1 = Select destination_number from list and set the value to out_(.*)
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open the dialplan.
-
Delete the line with the Action tag (Click the checkbox in the right and press SAVE in the top right).
-
Add the following information to this dialplan:
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
action |
wait_for_answer |
|
0 |
10 |
true |
|
action |
set |
sip_h_X-Destination-Number=$1 |
0 |
15 |
true |
|
action |
lua |
<script-name> |
0 |
20 |
true |
-
<script-name> is the name of the Outbound IVR script(default is outboundIvr.lua).
-
Set the Context field to the value of global.
-
Set the Domain field to the value of global.
-
Save the changes by pressing SAVE button in top right corner.
Direct-Transfer Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = CxQueue
-
Condition 1 = Select destination_number from list and add any random number as we will change it later.
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open CxQueue dialplan.
-
Change the value of the Data column in the destination_number row to ^99887766[-0-9a-zA-Z]*$
-
Change the value of the Type column in the Action row to lua and the Data field to vcApi.lua 'directTransfer'
-
Write the Context field with the value global.
-
Set the Domain field to the value of global.
-
Save the changes by pressing SAVE button in top right corner.
External Consult and Transfer Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = External_Consult_and_Transfer
-
Condition 1 = Select destination_number from the list and add any random number; we will change it below.
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open the created dialplan.
-
Change the value of the Data column in the destination_number row to ^99887765[-0-9a-zA-Z]*$
-
Change the value of the Type column in the Action row to lua and the Data field to customTransfer.lua
-
Set the Context field to the value of global.
-
Set the Domain field to the value of global.
-
Save the changes by pressing SAVE button in top right corner.
Progressive Outbound Dialplan
-
This dialplan is for the dialer.
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = Progressive Outbound Agent Transfer
-
Condition 1 = Select destination_number from list and set the value to ^agent$
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open the Progressive Outbound Agent Transfer dialplan.
-
Set the Context field to the value of global.
-
Set the Domain field to the value of global.
-
Change the value of the TAG column to Action and Type column to bridge and the Data field to user/${sip_h_X-agentExtension}@${domain_name}
-
Save the changes by pressing SAVE button in top right corner.
Manual Outbound Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = Manual_Outbound
-
Condition 1 = Click the black arrow to the right of the first field. In the first field enter ${sip_h_X-CallType} and in the second field enter ^OUT$.
-
Condition 2 = Click the black arrow to the right of the first field. In the first field enter ${customer_leg_uuid} and in the second field enter ^$.
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open Manual_Outbound dialplan.
-
Delete the line with the Action tag (Click the checkbox in the right and press SAVE in the top right)
-
Add the following information to this dialplan:
|
Tag |
Type |
Data |
Break |
Inline |
Group |
Order |
Enabled |
|---|---|---|---|---|---|---|---|
|
condition |
${sip_h_X-CallType} |
^OUT$ |
on-false |
|
0 |
5 |
true |
|
condition |
${customer_leg_uuid} |
^$ |
never |
|
0 |
10 |
true |
|
action |
set |
custom_origination_uuid=${create_uuid()} |
|
true |
0 |
15 |
true |
|
action |
set |
customer_leg_uuid=${custom_origination_uuid} |
|
true |
0 |
20 |
true |
|
action |
export |
customer_leg_uuid=${custom_origination_uuid} |
|
true |
0 |
25 |
true |
|
anti-action |
set |
custom_origination_uuid=${create_uuid()} |
|
true |
0 |
30 |
true |
-
Set the Context field to the value of global.
-
Set the Domain field to the value of global.
-
Set the Order field to 49.
-
Set the Continue field to True.
-
Save the changes by pressing SAVE button in top right corner.
Custom Hangup Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = Custom_Hangup
-
Condition 1 = Click the black arrow to the right of the first field. In the first field enter ${user_exists} and in the second field enter ${user_exists}.
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open Custom_Hangup dialplan.
-
Delete the line with the Action tag (Click the checkbox in the right and press SAVE in the top right)
-
Add the following information to this dialplan:
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
condition |
${user_exists} |
${user_exists} |
0 |
5 |
true |
|
action |
set |
sip_rh_X-CALL-DROPPED-CUSTOM-REASON=NO-DIALPLAN-FOUND |
0 |
10 |
true |
|
action |
sleep |
1000 |
0 |
12 |
true |
|
action |
hangup |
|
0 |
15 |
true |
-
Set the Context field to global.
-
Set the Domain field to Global.
-
Set the Order field to 999.
-
Set the Continue field to False.
-
Save the changes by pressing SAVE button in top right corner.
Silent Monitoring Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = Silent Monitoring
-
Condition 1 = Select destination_number from list and add ^\*44(.+)$
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open Silent Monitoring dialplan.
-
Delete the line with the Action tag (Click the checkbox in the right and press SAVE in the top right)
-
Add the following information to this dialplan:
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
action |
set |
sip_h_X-CallType=MONITOR |
0 |
10 |
true |
|
action |
export |
sip_h_X-CallType=MONITOR |
0 |
15 |
true |
|
action |
lua |
eavesdrop_custom.lua $1 |
0 |
20 |
true |
-
Set the Context field to the value of global.
-
Set the Domain field to the value of global.
-
Save the changes by pressing SAVE button in top right corner.
Conference Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = CustomConf
-
Condition 1 = Select destination_number from list and add ^custom_conf_(.*)$
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open CustomConf dialplan.
-
Delete the line with the Action tag (Click the checkbox in the right and press SAVE in the top right)
-
Add the following information to this dialplan:
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
action |
answer |
|
0 |
10 |
true |
|
action |
set |
session_in_hangup_hook=true |
0 |
15 |
true |
|
action |
export |
session_in_hangup_hook=true |
0 |
20 |
true |
|
action |
set |
api_hangup_hook=lua cx_hangup.lua $1 |
0 |
25 |
true |
|
action |
export |
api_hangup_hook=lua cx_hangup.lua $1 |
0 |
30 |
true |
|
action |
set |
absolute_codec_string=G7221@32000h,G7221@16000h,G722,PCMU,PCMA |
0 |
31 |
true |
|
action |
export |
absolute_codec_string=G7221@32000h,G7221@16000h,G722,PCMU,PCMA |
0 |
32 |
true |
|
action |
conference |
$1 |
0 |
35 |
true |
-
Set the Context field to the value of global.
-
Set the Domain field to the value of global.
-
Save the changes by pressing SAVE button in top right corner.
Changes in User Exists Dialplan
-
Ensure you are in the correct domain at the top right corner before proceeding.
-
Open the Dialplan Manager section under the Dialplan tab.
-
Find and open the user_exists dialplan.
-
At the bottom of the dialplan, add the first row of the table below. The group sequence is usually 3. Save it. A new table will appear at the end of this dialplan. Then add the remaining two rows to that group.
-
-
Add the following information(to add custom values in the Type column, select a random value then click on it to edit):
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
condition |
${sip_h_X-CallType} |
^CONSULT$ |
3 |
5 |
true |
|
action |
bind_meta_app |
A a s1 lua::consult_conf.lua CONSULT_TRANSFER |
3 |
10 |
true |
|
action |
bind_meta_app |
C a s1 lua::consult_conf.lua CONSULT_CONFERENCE |
3 |
15 |
true |
-
The result will look like this:
-
Save the changes by pressing SAVE button in top right corner.
Changes in Local extension Dialplan
-
(Skip for now) as PCS is not supported yet.
-
Open the Dialplan Manager section under the Dialplan tab.
-
Find and open the local_extension dialplan.
-
Add the following information to the last group:
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|
action |
set |
transfer_after_bridge=pcs1 |
1 |
73 |
true |
|
action |
ring_ready |
true |
1 |
74 |
true |
|
action |
lua |
vcApi.lua 'rona' |
1 |
76 |
true |
-
Action: Set
transfer_after_bridge=pcs1and enable it (true) only when PCS is required. -
Secondly, replace the Data field in the line with Order 75 with: {origination_uuid=${custom_origination_uuid}}user/${destination_number}@${domain_name}
-
The result will look like this:
-
Save the changes by pressing SAVE button in top right corner.
Changes in Global Variables dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Find and open the global-variables dialplan.
-
Add the following information to this dialplan (to add custom values in the Type column, select a random value then click on it to edit):
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
action |
set |
FreeSWITCH-IPv4=${domain_name} |
0 |
20 |
true |
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
condition |
${sip_h_X-CALL-ID} |
^$ |
2 |
5 |
true |
|
action |
set |
sip_h_X-CALL-ID=${sip_call_id} |
2 |
10 |
true |
|
action |
set |
sip_rh_X-CALL-ID=${sip_call_id} |
2 |
15 |
true |
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
condition |
${sip_h_X-CALL-VARIABLE0} |
^$ |
3 |
5 |
true |
|
action |
set |
sip_h_X-CALL-VARIABLE0=${uuid} |
3 |
10 |
true |
|
action |
set |
sip_rh_X-CALL-VARIABLE0=${uuid} |
3 |
15 |
true |
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|---|---|---|---|---|---|
|
action |
export |
sip_h_X-CALL-ID=${sip_h_X-CALL-ID} |
4 |
5 |
true |
|
action |
export |
sip_rh_X-CALL-ID=${sip_h_X-CALL-ID} |
4 |
10 |
true |
|
action |
export |
sip_h_X-CALL-VARIABLE0=${sip_h_X-CALL-VARIABLE0} |
4 |
15 |
true |
|
action |
export |
sip_rh_X-CALL-VARIABLE0=${sip_h_X-CALL-VARIABLE0} |
4 |
20 |
true |
-
The result will look like:
-
Save the changes by pressing SAVE button in top right corner.
Changes in Call Recording Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Find and open the user_record dialplan.
-
Make sure to delete the lines present previously in Group 9 apart from the first one.
-
Add the following data to the table skip first row, such that the final version of Group 9 looks like the image below:
|
Tag |
Type |
Data |
Inline |
Group |
Order |
Enabled |
|---|---|---|---|---|---|---|
|
condition |
${record_session} |
^true$ |
|
9 |
5 |
true |
|
action |
set |
record_path=${recordings_dir}/${domain_name}/archive/${strftime(%Y)}/${strftime(%b)}/${strftime(%d)} |
true |
9 |
10 |
true |
|
action |
export |
record_path=${recordings_dir}/${domain_name}/archive/${strftime(%Y)}/${strftime(%b)}/${strftime(%d)} |
true |
9 |
15 |
true |
|
action |
set |
record_name=${uuid}.${record_ext} |
true |
9 |
20 |
true |
|
action |
set |
recording_follow_transfer=false |
true |
9 |
25 |
true |
|
action |
export |
recording_follow_transfer=false |
true |
9 |
30 |
true |
|
action |
set |
record_append=true |
true |
9 |
35 |
true |
|
action |
export |
record_append=true |
true |
9 |
40 |
true |
|
action |
set |
record_in_progress=true |
true |
9 |
45 |
true |
|
action |
set |
RECORD_ANSWER_REQ=true |
- |
9 |
50 |
true |
|
action |
export |
RECORD_ANSWER_REQ=true |
- |
9 |
55 |
true |
-
Save the changes by pressing SAVE button in top right corner.
Codec Configuration
Steps to Verify and Add H.264 Codec
For WebRTC video calls we need H.264 Codec. Follow the steps to configure the H.264 codec. In case WebRTC video calls are not required move to next step
-
Go to Status → SIP Status
-
Click on Sofia Status Profile Internal, and then Sofia Status Profile External
Check the loaded codecs for both Internal and External profiles.
-
If H264 is showing, stop here — everything is fine.
If H264 is not listed, continue to the next steps. -
Go to Advanced → Variables
-
In the search bar, type global_codec_prefs
-
Open the variable and add H264 at the end of the list
(for example:PCMU,PCMA,OPUS,H264)
-
Do the same for outbound_codec_prefs
(addH264at the end) -
Go back to Advance → SIP Profile
-
Find internal and external. Go to Internal
-
Find the variables inbound_codec_prefs and outbound_codec_prefs
-
Change their value to 123 temporarily
-
Do same for the external
-
Go to Status → SIP Status
-
Stop both Internal and External SIP profiles
-
Start both profiles again
-
Go back to Status → SIP Status
-
Go to Sofia Status Profile External and check
Now the codec values should show 123 -
Check for Sofia Status Profile Internal as well
-
Go to Advanced → SIP Profiles → Internal
-
Find the field inbound_codec_prefs and outbound_codec_prefs, and change the value from 123 to
$${global_codec_prefs} -
Go to Advanced → SIP Profiles → External
-
Find the field inbound_codec_prefs and outbound_codec_prefs, and change the value from 123 to
$${outbound_codec_prefs} -
Save both profiles
-
Go to Status → SIP Status again
-
Stop and start both Internal and External profiles
-
Check the loaded codecs again
You should now see H.264 listed for both profiles.
Turn OFF the voicemail dialplan
-
Open the dialplan manager under dialplan.
-
-
Search for the voicemail dilaplan. Click on the voicemail dialplan, is opened like below, then turned off the
Enabledbutton to make the dialplan false/turnoff and save it.
Changes in conference profile
Changes in conference profile
-
Open the Conference Profiles section under the Applications tab:
-
Open the profile named default:
-
Under the Profile Parameters, find the following keywords under the Name column and click the checkbox:
-
Press TOGGLE in the top right and choose CONTINUE in the prompt shown.
-
Save the changes by pressing SAVE button in top right corner.
Changes in SIP Profile
Changes in SIP Profile
-
Press the IP address in the top right and select your working Domain:
-
Open SIP Profiles under the Advanced tab.
-
Open the internal profile, scroll down to the ws-binding and wss-binding fields, and set their Enabled column values to True.
-
Find the disable-transcoding field and its Value and Enabled columns to true.
-
Find the nat-options-ping fields and its Value and Enabled columns to true.
-
Find the liberal-dtmf fields and its Value and Enabled columns to true.
-
At the bottom add the data:
|
Name |
Value |
Enabled |
|---|---|---|
|
apply-candidate-acl |
0.0.0.0/0 |
True |
-
Press the SAVE button on the top right.
-
Open SIP Status under the Status tab.
-
Locate the line sofia status profile internal and to its right press the RESCAN button, followed by the RESTART button after the page reloads.
Configure Access Control List (ACL)
Configure Access Control List (ACL)
For the Voice Connector and Dialer to be able to access the Freeswitch ESL for communicating with Media Server, their IP address must be added to the ACL.
-
Press the IP address in the top right and select the Domain created in the Domain creation section above:
-
Open the Access Control List from the Advanced tab.
-
Create a new ACL if already not there with the Add button.
-
Set the name to esl, the Default to deny and add the following IP addresses, with the Type fields set to allow:
-
127.0.0.1
-
The IP address of the Media Server e.g. 192.168.1.17.
-
The IP address of the server the Voice connector & Dialer is running on e.g. 192.168.1.201.
-
Lastly, add the IP addresses of the docker containers for the Voice connector and Dialer(if deployed).
-
On the Voice connector and Dialer servers, use the command docker ps to list the containers.
-
-
-
Run the command:
-
docker inspect containerID -
Scroll down to the Networks object and find the Gateway and IPAddress fields.
-
-
Copy these two addresses (Gateway & IPAddress) to the esl ACL.
-
Make sure to do this process for both the Voice connector and dialer container.
-
-
Click the Save button and go to the SIP Status with from the Status tab.
-
Click the Reload ACL button on the top right.
Configure Event Socket Library (ESL)
Configure Event Socket Library (ESL)
-
Press the IP address in the top right and select your working Domain:
-
Open Settings from the Advanced tab. (If the option is unavailable, skip to step 5)
3. Change the Event Socket IP Address to 0.0.0.0, and the Event Socket ACL to esl.
-
Optionally, change the Event Socket Password to the a different value, or leave as default ClueCon and save it.
-
If the password is changed, then the same must be set in the environment files for the voice connector and dialer.
-
If the Settings option in Step 2 was unavailable, then run the following command directly in VM cli
-
We are using default password ClueCon for Event Socket Password.
echo '<configuration name="event_socket.conf" description="Socket Client"> <settings> <param name="nat-map" value="false"/> <param name="listen-ip" value="0.0.0.0"/> <param name="listen-port" value="8021"/> <param name="password" value="ClueCon"/> <param name="apply-inbound-acl" value="esl"/> </settings> </configuration>' > /etc/freeswitch/autoload_configs/event_socket.conf.xml-
If you change the default password, then the same must be set in the environment files for the voice connector and dialer.
-
In following sed command we are using password set above step 6 (So far we are using default password if you change it in above command update in this command as well), then run the command
sed -i 's/PASSWORD/ClueCon/g' /etc/freeswitch/autoload_configs/event_socket.conf.xml
-
-
Run the command to restart Media Server with the new ESL settings:
systemctl restart freeswitch -
Run the following command:
echo "switch.event_socket.host = 0.0.0.0 switch.event_socket.port = 8021 switch.event_socket.password = ClueCon" | sudo tee -a /etc/fusionpbx/config.conf-
So far we are using default password if you change it in above command update in this command as well and run the command
sed -i 's/EslPass/ClueCon/g' /etc/fusionpbx/config.conf
-
-
Log out of the Media Server web interface and log back in.
Media Server Config Files
Set Media Server Call Limits
-
Open the Media Server config file
vi /etc/freeswitch/autoload_configs/switch.conf.xml -
Locate the following line and replace 1000 with 100000
<param name="max-sessions" value="1000"/> -
Locate the following line and replace 30 with 100000, and save the file.
<param name="sessions-per-second" value="30"/> -
Run the command to restart Media Server:
systemctl restart freeswitch
Add call ending event hook
-
Open /etc/freeswitch/autoload_configs/lua.conf.xml
-
Find the line near the end containing <!-- Subscribe to events -->
-
Insert the following under it:
<hook event="CHANNEL_HANGUP_COMPLETE" subclass="" script="hangup_event.lua"/> <hook event="CHANNEL_BRIDGE" subclass="" script="channel_bridge.lua"/> <hook event="CHANNEL_UNBRIDGE" subclass="" script="channel_unbridge.lua"/> <hook event="CHANNEL_CALLSTATE" subclass="" script="channel_state.lua"/> -
Save the file.
-
Run the command:
systemctl restart freeswitch
Enable mod
-
Open /etc/freeswitch/autoload_configs/modules.conf.xml
-
Find the line near the top containing <!-- Applications -->
-
Insert the following under it:
<load module="mod_httapi"/> -
Save the file.
-
Run the command:
systemctl restart freeswitch
Configuring Nginx for WSS Path (/wss) in FusionPBX
-
Locate Nginx Configuration
On most FusionPBX systems, Nginx configuration files are located at:
nano /etc/nginx/sites-available/fusionpbx
or
nano /etc/nginx/sites-enabled/fusionpbx
2. Add the /wss Location Block
Inside the main server { } block that handles HTTPS (listen [::]:443 ssl; ), add the following configuration:
location /wss {
proxy_pass https://<IP>:7443;
proxy_pass_header Authorization;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
client_body_timeout 600s;
send_timeout 300s;
}
Replace <IP> with your FreeSWITCH IP (usually 192.168.1.17).
3. Test Nginx Configuration
Run the following command to check for syntax errors:
sudo nginx -t
If successful, reload Nginx:
sudo systemctl reload nginx
2. Configuration (on Each Domain)
The above dialplans are global. The following dialplans are domain-specific, so select your working domain.
-
Press the IP address in the top right and select your working Domain.
Configure Dialplans
Inbound IVR Dialplan
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = <Name of your choice>
-
Condition 1 = Select destination_number from list and add a dialing number in the format ^dialing_number$, matching the dialing_number {DN} value in the cx_env{DN}lua script filename set in the IVR scripts section above.
-
e.g. for a dialing number of 5555, the field must have the value ^5555$.
-
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open the dialplan.
-
Change action from transfer to lua and add the name of the custom Inbound IVR script(default is cxIvr.lua) into data column so the result looks like this:
-
Set the Context field to the value of your working Domain set in the Domain creation section.
-
Set the Domain field to the value of your working Domain set in the Domain creation section.
-
Save the changes by pressing SAVE button in top right corner.
WebRTC Dialplan
-
This dialplan is for WebRTC call (Initiated call from web browser, web widget).
-
Now we need to create new web widget in Unified Admin of your CX tenant and enable webrtc toggle below, you need to create a separate extension for that as well you can get the idea from below configuration.
-
Repeat the all necessary steps under CX IVR Configuration we perform at the top of this doc just change the DN with the dialing URI added above.
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details:
-
Name = Name of your choice
-
Condition 1 = Select destination_number from list and add the webRTC dialing number (Dialling URI)(Set in Unified Admin, under Web Widget settings) in the format ^dialing_number$.
-
e.g. for a dialing number of 123456, the field must have the value ^123456$.
-
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open the dialplan.
-
Change action from transfer to lua and add vcApi.lua 'webrtc' into data column so the result looks like this:
-
-
Set the Context field to the value of your working Domain.
-
Set the Domain field to the value of your working Domain.
-
Save the changes by pressing SAVE button in top right corner.
-
Make sure that H264. If not added follow the Codec Configuration dialplan step given above in this document.
Post Call Survey Dialplan
-
Skip this dialplan since PCS is not supported yet.
-
This section is optional, in case Post-Call-Survey is in use.
-
Open the Dialplan Manager section under the Dialplan tab.
-
Add a new Dialplan by pressing the Add Button on the top.
-
Fill the form with following details :
-
Name = PCS
-
Condition 1 = Select destination_number from list and set the value to ^pcs1$
-
Action 1 = Select first item from the list
-
-
Save the form by pressing save button on top right Corner.
-
Re-open PCS dialplan.
-
Delete the line with the Action tag (Click the checkbox in the right and press SAVE in the top right)
-
Add the following information to this dialplan:
|
Tag |
Type |
Data |
Break |
Group |
Order |
Enabled |
|---|---|---|---|---|---|---|
|
action |
lua |
pcs.lua |
|
0 |
10 |
true |
-
Set the Context field to the value of your working Domain.
-
Set the Domain field to the value of your working Domain.
-
Set the Order field to 49.
-
Set the Continue field to True.
-
Save the changes by pressing SAVE button in top right corner.
Configure SIP Trunk and routes (Optional)
These dialplans are configured to enable calls from an actual number to your media server or from your media server.
Configure SIP Trunk(Gateway) for outbound calls
-
Ensure your are in your working Domain.
-
Open the Gateways section under the Accounts tab.
-
Press the ADD button in the top right.
-
Set the following fields:
-
Gateway: A name of your choice e.g. MySipTrunk
-
Username: The username of the SIP Trunk. Not needed for IP-based SIP trunks.
-
Password: The password of the SIP Trunk. Not needed for IP-based SIP trunks.
-
Proxy: IP/hostname and port of carrier, by default its 5060 e.g.
192.168.25.35:5060. -
Register:
Truefor credential-based.Falsefor IP-based trunks
-
-
Press the SAVE button on the top right.
-
Open this newly created gateway and note the URL opened in the browser.
-
Add the IP address of the SIP trunk to the Media Server ACL, go to advanced, than access controls and click on providers, add another node and type allow add IP of trunk and save it.
-
Open SIP Profiles under the Advanced tab.
-
Open the external profile and note the value of the apply-register-acl field.
-
Use providers when devices registering to the External profile are trusted SIP providers or gateways.
-
Use domains when you want users belonging to your FusionPBX domains to register. we are using domains.
-
Open Access controls under the Advanced tab.
-
Open the entry that matches the before mentioned apply-register-acl field, if domains ACL is not there create new.
-
At the bottom add an entry where the Type is set to ‘allow’ and the CIDR field contains the address of the SIP Trunk.
-
Press the SAVE button on the top right.
-
Open SIP Status under the Status tab.
-
Press the Reload ACL button at the top right.
-
Open SIP Profiles under the Advanced tab.
-
Open the external profile and note the value of the sip-port field.
-
-
Back out via the BACK button on the top right.
-
Open the internal profile and note the value of the sip-port field.
-
Open media server VM terminal and run the command
-
sudo iptables -A INPUT -p tcp -m tcp --dport PORT -j ACCEPT -
Where PORT is the port noted down in the previous steps. Run the command once for each port.
-
-
Run the command
-
sudo iptables-save
-
-
Contact the SIP Trunk provider and have all traffic from the Media Server machine public IP address allowed.
Configuring route For Outbound calls
-
Ensure you are in your working domain.
-
Open the Outbound Routes section under the Dialplans tab.
-
Press the ADD button in the top right.
-
Set the following fields :
-
Gateway = The name of the gateway configured above.
-
Dialplan Expression = The format of the number accepted by the SIP trunk(purchased sip trunk) e.g. for 11 digits the format is ^(\d{11})$
-
-
Press the SAVE button on top right corner.
-
Re-open this newly created Outbound Route.
-
Add the following information to the last group:
|
Tag |
Type |
Data |
Group |
Order |
Enabled |
|
action |
ring_ready |
true |
0 |
125 |
true |
-
To the last row, where the Type field is bridge, append {origination_uuid=${custom_origination_uuid}} to the start of the field in the Data column. The result will look as below:
-
Set the Context field to the value of your working Domain.
-
Set the Domain field to the value of your working Domain.
-
Save the changes by pressing SAVE button in top right corner.
Configuring route For Inbound calls
-
Ensure you are in your working domain.
-
Open the Destinations section under the Dialplans tab.
-
Press the ADD button in the top right.
-
In the Destination field set the inbound dialing number provided by the SIP trunk provider(purchased trunk number) in the format ^dialing_number$. Leave Everything else as it is.
-
e.g. for a dialing number of 1234, the field must have the value ^1234$.
-
-
Press the SAVE button on top right Corner.
-
Open the Inbound Routes section under the Dialplans tab.
-
Press the ADD button in the top right.
-
Set the following fields :
-
Name = A name of your choice.
-
Destination Number = The destination created above.
-
Action = Select any random field and save it, reopen it and then edit
-
-
Add fields as shown in the screenshot above. At the bottom, replace the 1122 service identifier with your own service identifier or DN created in the IVR Configuration step at top. (Mean we will receive call from outside on destination number and then we transfer it to our internal DN which is service identifier in CX )
-
Press the SAVE button on top right Corner.