In our previous article, we sang the praises of FusionPBX as the terrific GUI that was always missing from FreeSWITCH. Little did we know that a better mousetrap was hiding just behind the curtain. And today we introduce the third layer to our 3-Layer Cake, FS PBX. Some might call it a refinement of FusionPBX. We think it’s more of an enhanced feature set of the already rich offerings in FusionPBX. Technically, it’s a fork. More accurately, it’s a fork, knife, and spoon.

In addition to a refined GUI, FS PBX also introduces an awesome collection of new features including text-to-speech and speech-to-text integration throughout the interface. With voicemail, you get transcription of messages delivered to your inbox. With IVRs, ring groups, and email, you get the ability to use OpenAI to create site-specific voice prompts. And with the Dashboard, you get feature set integration that all but eliminates the requirement to hop around the GUI to touch all the components necessary to deploy a state-of-the-art PBX. The new Call Detail Records (CDRs) will leave you drooling. And, in the security department, Fusion PBX delivers two-factor authentication (2FA) for web access, a much needed enhancement from the FusionPBX version. Coupled with our security features for FS PBX, you’ll have a multi-tenant platform that is second to none. Say goodbye to hundreds of daily hack attempts on your server.

The bad news, if there is any, is that this won’t run on your bargain-basement cloud platform with one gig of RAM. You’re going to need 4 gigs of RAM just to install it. For large deployments, more RAM and more disk are obvious must have’s. Aside from that, the minimum platform requirements are much the same as FusionPBX. You’ll want at least 20GB of disk space, a Debian 12 platform on a cloud server that offers backups, and at least one fully-qualified domain name (FQDN) so that IP address web access can be disabled. For multi-tenant deployments, you’ll obviously need more RAM, more disk space, and additional domain names.

Sizing & Choosing Your FS PBX Platform

Remember the old carpenter’s rule, "Measure Twice. Cut Once." It’s equally important here. You don’t want to go through this installation process (which is admittedly tedious) and get to the finish line only to discover that your server platform has run out of memory or storage space for your target audience. Or you forgot to consider a backup solution. So do your homework and carefully consider how many tenant platforms and users you will be supporting and what uses will be employed by each of those departments and users. Trust me when we say you really need a cloud platform for this deployment. You do not want to babysit this in house with all the maintenance headaches that entails.

You’re going to need a Debian 12 cloud platform and a static IP address for FS PBX. Spend some time considering what your long-term budget for this project will be, document your requirements, and make a shopping list. And then go shopping. LowEnd-Talk and LowEnd-Spirit offer dozens of low cost options. You’ll be hard-pressed to beat the $50/year ColoCrossing deal linked above with monthly backups, but they have dozens of other options depending upon your requirements. Just read the reviews before making a decision. UPDATE: We’ve been waiting over 5 months for ColoCrossing to sort out the monthly backups we’re paying for. Still haven’t gotten the first one!

In the middle tier, Vultr, Digital Ocean, and OVH can’t be beat. If money is no object, you have the luxury of Amazon, Microsoft, and Oracle platforms to consider. If the platform you choose doesn’t provide backups, look elsewhere!

Getting Started With FS PBX

Once you have deployed your Debian 12 server, the first thing you’ll need to do is create a fully-qualified domain name (FQDN) using the public IP address of your server. If you don’t have a domain you can use, here’s a link to some free solutions. If you already have a domain, simply create an A record in your DNS settings for fspbx.yourdomain.com. Be sure to test your new FQDN using ping before proceeding with the install. Next, use SSH to log in to your new Debian 12 server as root using the FQDN you just created: ssh root@fspbx.yourdomain.com. Now issue the following commands to bring Debian 12 up to speed. Regardless of your server platform, immediately change your root password to a very secure one with upper and lower case letters, numbers, and a few special characters. This will avoid many potential catastrophes because of a data breach by your provider.

passwd
apt-get update && apt-get upgrade
apt-get install systemd
apt-get install systemd-sysv
apt-get install ca-certificates
reboot

After rebooting, log back into your server as root and issue the following command to install the base FS PBX platform. Note that the command may wrap around to the second line because of space constraints with most browsers.

 wget -O- https://raw.githubusercontent.com/nemerald-voip/fspbx/main/install/install-fspbx.sh | bash


When the installation finishes, be sure to make note of the FS PBX admin credentials required to access the FS PBX GUI with a browser! If you forget this step, you get to start over. They will look something like this:

Login URL:    https://69.82.75.231
 Username:    admin@fspbx.net
 Password:    AJetd9xWegDjabQIckL4ERa0i

Next, open your favorite browser and point it to the IP address of your new FS PBX server. Login using the credentials you wrote down above. Because of the FS PBX security design, we won’t be spending much time in the IP Address Domain of your new server.

The Proxmox LAN Alernative

If you just want to experiment, you can install FS PBX locally on your Proxmox server and skip the FQDN setup documented below. Begin by creating a Debian 12 Virtual Machine with at least 4GB of RAM and 20GB of disk space. Log in to your virtual machine as root and issue the FS PBX install command above. When the installation finishes, you will get the admin credentials shown above. But obviously you won’t be able to login using the public IP address shown. Issue the ip a command to decipher the LAN IP address of your virtual machine. Then switch to the FS PBX directory: cd /var/www/fspbx. Update the Environment Configuration of your FS PBX server: nano -w .env with the following entries using your server’s actual LAN IP address instead of 10.0.0.15:

APP_URL=https://10.0.0.15
SESSION_DOMAIN=10.0.0.15
SANCTUM_STATEFUL_DOMAINS=10.0.0.15

Finally, refresh the FS PBX configuration cache: php artisan config:cache. Then login to the LAN IP address with your browser using the Username and Password credentials above.

Deploying FS PBX for Production Using an FQDN

If you’re deploying FS PBX for production use, the first order of business is to create a new domain using the FQDN that you created above.

In the left column, navigate to Advanced -> Domains. Then click the Add button, enter your FQDN in the Name field, and click SAVE. This will generate the new Domain which will appear in the listing which now appears in the top right pull-down of the FS PBX Dashboard. Go ahead now and select your Domain. It then will appear as the active one in the FS PBX Dashboard. Now we need to create a new admin user account with SuperAdmin privileges. From the left column, choose Accounts -> Users -> Add and fill in the blanks leaving the unspecified fields at their default settings. Then click Save.

Username: john_doe
Password: very-secure-password-of-twelve-or-more-letters-and-numbers
 Confirm: same-password
   Email: john_doe@fspbx.yourdomain.com
Language: your-favorite
TimeZone: where-your-domain-resides
  Groups: superadmin

Now test things out by first logging out: Home -> Logout. Close the browser window and open a new one pointing to the FQDN of your server. Log in with your new email address using the password you created above. Now the fun begins so take a break if you need one.

Securing Your FS PBX Server

If you’ve been following Nerd Vittles for the past couple decades, then you know that we are sticklers when it comes to security. So bear with us while we add a few extra layers of security to FS PBX. Log back into your server as root using SSH. First, we need to change the default port for future SSH access. Edit /etc/ssh/sshd_config. Uncomment the Port line and enter a new port number. A good choice might be the year you were born. Then save the file. Don’t restart the SSH service just yet, or you will lock yourself out of your server.

Next, edit /etc/iptables/rules.v4. Scroll down to the line containing –dport 22 and duplicate the line. Change the number in the duplicated line to the port number you assigned for future SSH access. Then SAVE the file and reboot your server.

Log back in: ssh -p 1234 root@fspbx.yourdomain.com where 1234 is the port you assigned for SSH access. Assuming you got back in, edit /etc/iptables/rules.v4 again and comment out or delete the –dport 22 line. Save the file and restart IPtables: systemctl restart iptables.

Now we’re ready to add a few layers of protection for the FS PBX web interface. We’ll be using two free services: VoIP Blacklist and APIban. These two services implement a VoIP blacklist of over 100,000 bad guys, and we have found the listings block virtually all attacks on FS PBX which, by design, exposes its SIP ports on the public internet.

You will need an APIkey for APIban which you can obtain here. Once you have your APIkey, issue the following commands:

cd /
apt install ipset -y
wget https://filedn.com/lBgbGypMOdDm8PWOoOiBR7j/FusionPBX/ipset-additions.tar.gz
tar zxvf ipset-additions.tar.gz
# insert your APIkey when the text editor opens below & save the file
nano -w /usr/local/sbin/apiban-init
chmod +x /etc/rc.local
echo "2 0 * * * root rm -f /var/log/*.gz >/dev/null 2>&1" >> /etc/crontab
echo "2 5 * * * root rm -f /var/log/*.1 >/dev/null 2>&1" >> /etc/crontab
echo "9 5 * * * root rm -f /var/log/freeswitch/*.1 >/dev/null 2>&1" >> /etc/crontab
echo "3 */6 * * * root /usr/local/sbin/iptables-restart >/dev/null 2>&1" >> /etc/crontab
reboot


Depending upon the amount of RAM available in your new server, IPtables may or may not restart after you reboot. You can check it by logging in as root and issuing the command: iptables -nL. If you see the following entries as the first five in your INPUT chain, all is well and you can move on to the next section:

ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     0    --  10.8.0.0/24          0.0.0.0/0           
DROP       0    --  0.0.0.0/0            0.0.0.0/0            match-set voipbl src
DROP       0    --  0.0.0.0/0            0.0.0.0/0            match-set apiban src


If you see a bunch of DROP entries in the iptables listing, then the likely culprit is that /etc/rc.local didn’t get executed when you rebooted. You can fix this with the following commands:

cd /etc/systemd/system
rm -f rc-local.service
ln -s /lib/systemd/system/rc-local.service rc-local.service
reboot

After rebooting, issue the iptables -nL command again and check for the five entries shown above. If they’re there, you’re done. If the series of DROP commands are also missing, then we need to address the memory constraints of your server. Edit /etc/rc.local and replace the existing contents with the following:

#!/bin/sh -e

/usr/local/sbin/apiban-init
#/usr/local/sbin/voipbl-init
systemctl restart iptables
systemctl restart ip6tables
systemctl restart fail2ban
/usr/sbin/iptables -I INPUT -m set --match-set apiban src -j DROP
#/usr/sbin/iptables -I INPUT -m set --match-set voipbl src -j DROP
/usr/sbin/iptables -I INPUT -s 10.8.0.0/24 -j ACCEPT
/usr/sbin/iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/usr/sbin/iptables -I INPUT -i lo -j ACCEPT

exit 0

When you issue the iptables -nL command now, you should see only four entries at the top of the INPUT chain:

ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     0    --  10.8.0.0/24          0.0.0.0/0           
DROP       0    --  0.0.0.0/0            0.0.0.0/0            match-set apiban src


The VoIP Blacklist IPset will be run as a cron job during the day to add the necessary protection for FS PBX.

Changing the SIP Port for Phone Registrations

By default, SIP phones register on ports UDP 5060 and 5061. These are perhaps the two most dangerous ports to leave exposed to the public internet. Here’s how to change them:

blank

Securing Web Access to Your FS PBX Server

The next most vulnerable ports on your server are those providing web access: TCP 80 and TCP 443. Once you have verified that you can login with a browser using the FQDN of your server, here’s how to completely disable access to your server using its IP address.

To begin, create a Let’s Encrypt SSL Certificate for your server by following this tutorial.

Future web logins will only be allowed using https://fspbx.yourdomain.com (with your actual domain or subdomain creation) when you complete this setup. Logins using the IP address of your server will be blocked.

1. From the Linux CLI, log into your server as root
2. Edit /etc/nginx/sites-available/fspbx.conf
3. In the listen 80 section, comment out: server_name *.us.domain.com;
4. Insert just below it: server_name fspbx.yourdomain.com;
5. In the listen 443 ssl section, comment out: server_name *.us.domain.com;
6. Insert just below it: server_name fspbx.yourdomain.com;
7. Make a copy of the 6 lines in the ssl section of the listen 443 ssl section
8. Scroll to the bottom of the file and insert the following code:

# Default discard
server {
    listen 80 default_server; # Catches all requests to port 80 not matched
    listen 443 ssl default_server; # Catches unmatched requests to port 443
    server_name _; # This is a common convention for a catch-all server_name

    # You must have SSL certs for 443 even for the default_server
    # Use a dummy self-signed cert or one for a non-public domain

9. Just below this code, insert the 6 lines of ssl code from step #7
10. Finally, insert the following code just below your SSL code:

    return 444; # Nginx specific: drops the connection without a response
    # Or, to return a 403 Forbidden:
    # return 403;
    # Or, to redirect to the FQDN:
    # return 301 https://yourdomain.com$request_uri;
}

11. Don’t forget the closing brace }.
12. SAVE the file and restart nginx: systemctl restart nginx

Adding An OpenVPN Client To FS PBX

We are big fans of the OpenVPN virtual private network which makes it super easy to manage clients and servers worldwide in a secure, private network. The 10.8.0.0 subnet is used for this purpose as the whitelist entry above shows. If you would like to add an OpenVPN client to FS PBX, here are the steps assuming you already have an OpenVPN Server running. First, generate a new OpenVPN client for FS PBX on your OpenVPN server. Download the client to the /etc directory on FS PBX and name it fusionpbx.ovpn. Issue these commands to deploy OpenVPN:

apt install openvpn
cd /etc/systemd/system
wget https://filedn.com/lBgbGypMOdDm8PWOoOiBR7j/FusionPBX/openvpn.service
chmod +x openvpn.service
cd /etc
wget https://filedn.com/lBgbGypMOdDm8PWOoOiBR7j/FusionPBX/openvpn-start
chmod +x openvpn-start
reboot

If you want a totally secure platform with minimal SIP exposure, an alternative is to create and use your OpenVPN client address in lieu of an FQDN. The two drawbacks are that every desktop phone must have OpenVPN access and push notifications are not supported. If you want to review the deployment steps, follow this link. We personally no longer use this approach and instead follow the recommendations of the developer, Dexter Allen.

The real good news in deploying an OpenVPN client is that you always can gain access to your server even if your public IP address got poisoned in one of the VoIP blacklists. For web access, simply point your browser to FS PBX’s OpenVPN client IP address and then log in as admin@fspbx.yourdomain.com with your FQDN’s admin password. Serenity now!

Adding pbxstatus for FS PBX CLI

blank

It’s always nice to have a snapshot of all the critical components running (or not) on your server. Here’s how to install our pbxstatus application:

apt install dialog -y
cd /usr/local/sbin
wget https://filedn.com/lBgbGypMOdDm8PWOoOiBR7j/FS%20PBX/pbxstatus-FSpbx
mv pbxstatus-FSpbx pbxstatus
chmod +x pbxstatus
echo "pbxstatus -p" >> /root/.profile

Activating a Gmail SmartHost For Outgoing Email

We’ve found the easiest way to assure that outbound email gets delivered reliably is to implement a Gmail SmartHost for Postfix. To deploy this, you will need a Gmail account and a Gmail App Password, not your standard Gmail password. You can obtain a Gmail App Password for your account here. Once you have your Gmail account name and app password in hand, issue the following commands:

cd /root
# accept the defaults during Postfix install
apt install postfix
mkdir /etc/pbx
wget https://filedn.com/lBgbGypMOdDm8PWOoOiBR7j/FusionPBX/enable-gmail-smarthost-with-postfix
chmod +x enable*
./enable*
# insert your gmail account name and APP password when prompted
wget https://filedn.com/lBgbGypMOdDm8PWOoOiBR7j/FusionPBX/mailtest
chmod +x mailtest
nano -w mailtest
# insert a destination email address for testing and save mailtest
./mailtest

Two-Factor Authentication (2FA) for Web Logins

Once you have verified that email can be sent from your server, an important security addition will be deployment of two-factor authentication for web logins. This means a 2FA code will be emailed to you whenever you attempt to login to your server. You then will be prompted for the code before web access is authorized. Begin by editing /var/www/fspbx/.env and entering your Gmail credentials with your app password:

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=yourname@gmail.com
MAIL_PASSWORD=your-gmail-app-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=yourname@gmail.com
MAIL_FROM_NAME="${APP_NAME}"
MAIL_REPLY_TO_ADDRESS=yourname@gmail.com
MAIL_REPLY_TO_NAME="${APP_NAME}"

Next, edit /var/www/fspbx/config/fortify.php and uncomment line 157:

'email-challenge',

Finally, refresh the FS PBX configuration cache:

php /var/www/fspbx/artisan config:cache

Activating TTS and STT for FS PBX Using OpenAI

Another important addition that FS PBX brings to FusionPBX is support for text-to-speech (TTS) and speech-to-text (STT) through the GUI. It lets you dictate and create AI-generated voice prompts using the new IVR interface as well as generating ring group announcements and voicemail greetings for your extensions. And it also lets you transcribe voicemails and deliver the results via email to owners of extensions. To begin, you’ll need to create an API Key in OpenAI:

1. Navigate to https://platform.openai.com and Sign Up
2. Set up an OpenAI account using your Google account
3. Click on the Settings tool in Upper Right beside your acct photo
3. Add a few bucks in Billing
4. Navigate to API keys and create an API key to use with FS PBX.
5. Be sure to write it down. You can't view it after initial creation.

After logging into FS PBX with your browser, navigate to Advanced -> Default Settings. Enable and enter the following settings for each of the specified sections below:

Speech

api_key: your-API-key-from-OpenAI
api_url: https://api.openai.com/v1/audio/speech
enabled: True
engine: openai

Transcribe

api_key: your-API-key-from-OpenAI
api_url: https://api.openai.com/v1/audio/transcriptions
enabled: True
engine: openai

Voicemail

openai_transcription_model: whisper-1
transcribe_enabled: True
transcribe_provider: openai
transcription_enabled_default: False
voicemail_file: attach

Email

smtp_auth: True
smtp_from: your-name@gmail.com
smtp_from_name: FS PBX
smtp_host: smtp.gmail.com
smtp_password: your-gmail-APP-password
smtp_port: 587
smtp_secure: tls
smtp_username: your-name@gmail.com
smtp_validate_certificate: True

Finally, under Status -> SIP Status, click on the following buttons:

Flush Cache
Reload ACL

Setting Up A Basic System With FS PBX

If you’re coming over from the Asterisk® and FreePBX® world to FS PBX and FreeSwitch, then the initial setup drill should be familiar. You need a SIP provider (a.k.a. Trunk in FreePBX or Gateway in FS PBX), you need some extensions and a ring group, and you need outbound and inbound routes to direct calls out and into your FS PBX platform. We’ll add a few bells and whistles along the way. Let me hasten to add that debugging with FS PBX can be tedious which may be because of my inexperience on the platform. The good news is our design below works. Your "improvements" may or may not work. And your best source for a solution may be the FusionPBX Forum.

Setting Up An FS PBX Gateway With VoIP.ms

Let’s start with the SIP provider. The Gateway we’ve chosen is VoIP.ms. You can read all about them here. We also tried BulkVS for several days and had nothing but problems. My best advice comes from my dad’s favorite expression: "Be Reasonable. Do It My Way." The first steps are to create a VoIP.ms account using our signup link. That keeps the lights burning brightly here. Then order a DID in your favorite city. Make sure to set the Dialing Mode to NANPA. Next, create a SubAccount as a PBX with a Username and Password. Specify the DID you ordered as the CallerID number for the SubAccount. Specify G.711U and G.722 as the Codecs. Set DTMF Mode to Auto. Enable the IP Restriction and specify the IP address of your server. Leave the remaining defaults and click Update Account. Next, navigate to Manage DIDs and Route calls to the SubAccount you just created. Choose a POP location near your server, e.g. atlanta2.voip.ms. Leave the remaining defaults and click Apply Changes. That’s all the setup required on the VoIP.ms side.

On the FS PBX side, using your SSH connection, ping the VoIP.ms POP server you chose above to get its IP address.

Using a browser while logged into your FQDN domain, navigate to Advanced -> Access Controls -> providers. In the Nodes field, enter an Allow entry with the IP address of the VoIP.ms POP you’ve chosen. Enter VoIP.ms as the Description. Then click SAVE.

Next, choose Accounts -> Gateways -> Add. Enter the following. Then click SAVE.

 Gateway: voip.ms
Username: subaccount-name
Password: subaccount-password
FromUser: subaccount-name
FromDomain: atlanta2.voip.ms (or whatever you chose above)
   Proxy: same-as-from-domain
   Realm: same-as-from-domain
 Expires: 60
Register: True
   Retry: 30
 Context: public
 Profile: external
Register: Enabled

Navigate to Accounts -> Gateways again and make sure your gateway shows as REGED after a minute or so.

Setting Up Extensions With FS PBX

FusionPBX’s slickest feature is its multiple extension setup procedure. Navigate to https://fspbx.yourdomain.com/app/extensions/extensions.php replacing fspbx.yourdomain.com with your actual FQDN. Then click the +Add button. In Extension, specify the starting extension number. Then in Range, specify the number of extension numbers to create. For example, if you specified 411 as the starting Extension with a Range of 9, FS PBX will create extensions 411 through 419 with unique default passwords. If you want to specify a User for the extensions, choose it from the pull-down list. Otherwise, leave it blank. Specify a default voicemail password for the extensions. You can leave all of the CallerID fields blank because we’ve already specified the CallerID number on the VoIP.ms side. The other options are self-explanatory so just follow your nose and then click Save.

We’ve always found it wise to specify the IP addresses as Allow entries in Advanced -> Access Controls -> rfc1918 although this may not be necessary for extensions registered to your FS PBX FQDN. What will be necessary if you’re using an application such as Groundwire on a smartphone or tablet is to review Status -> Event Guard after attempting to register a device that supports Push Notifications. You probably will see the SIPIS push server access got blocked, and you’ll need to toggle this to Unblocked and also register the SIPIS IP address as Allowed in Advanced -> Access Controls -> rfc1918 before Push Notifications will work.

TIP: Any device or service that connects to FS PBX by IP address needs to be whitelisted in either the rfc1918 or providers section of Advanced -> Access Controls. If a connection or service is failing, the first place to check is Status -> Event Guard. From the command line interface, also check for IPtables blocks with iptables -nL. This is the price we pay for having SIP access exposed. But it’s manageable once you get the hang of it.

Creating a VoIP.ms Outbound Route With FS PBX

Gotcha #1. A word of caution before we set up your Outbound Route. Unless you’re outside the North American Dialing Plan, be consistent in always specifying North America as your Dialplan Expression. The reason is because if you choose 10-digit dialing in your Outbound Route and one of your SIP phones is configured to always add a 1 prefix, the outbound calls from that phone will fail. Choosing North America as your Outbound Route’s Dialplan Expression will allow outbound calls from 1NXXNXXXXXX and +1NXXNXXXXXX and NXXNXXXXXX. Ask us how we know. 🙂

To create an Outbound Route for your VoIP.ms Gateway, choose Dialplan -> Outbound Routes -> Add from the FS PBX Dashboard. Fill in the form as shown below and click SAVE.

Gateway: VoIP.ms
Dialplan Expression Shortcut: North America
Prefix: 1
Limit: Number-of-Simultaneous-Outbound-Calls-Allowed
Acct Code: Your-FQDN
Description: VoIP.ms

Creating a VoIP.ms Inbound Route With FS PBX

It’s anything but intuitive, but you don’t create an Inbound Route in FS PBX by choosing Dialplan -> Inbound Routes. Instead, you choose Dialplan -> Destinations -> Add. You only need a few of the fields filled in to complete the setup. Then click SAVE.

Type: Inbound
Country Code: 1
Destination: Your-10-Digit-VoIP.ms-DID
Context: public
Actions: Choose-One-Of-Your-Extensions-From=The-List
User: admin
Usage: Voice
Domain: Your-FQDN
Order: 100
Enabled: True

We’re going to modify this setup a bit in the following sections, but this will get you started so that calls from your DID will be delivered to one of your extensions for testing purposes.

Enabling a Softphone Extension for FS PBX

So that we can test things out, we need to enable a softphone on either an iPhone, iPad, Android phone, or Android tablet. To keep things simple, follow our tutorial for Groundwire to load the app onto your device. This will get you a softphone with Push notifications to experiment with FS PBX. Down the road, FS PBX provides an incredible assortment of Device Profiles that will preconfigure dozens of SIP phones for you. But, for now, let’s stick with Groundwire.

On the FS PBX side, you’ll need to edit one of your extensions and copy down the extension password. Then startup Groundwire on your mobile device and choose Settings -> Accounts. Click the + icon in the bottom left of the display to get started. Choose New SIP Account. Click CheckMark when finished.

Title: FS PBX
Username: Your-Chosen-Extension-Number
Password: Your-Extension-Passwor
Domain: Your-FQDN

Now click Advanced Settings and continue:

Incoming Calls: Use Global Setting
NAT Traversal: STUN 
  Send Media Back: True
  STUN Server: stun.acrobits.cz
  Force Private IP: True  
Enable Video Calls: True
Codecs WiFi: G.711U, G.722, OPUS
  Honor Remote Codecs: True
Codecs Mobile: same-settings-as-WiFi
Video Codecs: H.264 and VP8
Outgoing Calls Need Registration: True
Call Waiting: True
Transport Protocol: TCP
Push Options: Simulate NAT and Block Registration During Call
DTMF Mode: RFC2833
Secure Calls: Disabled

Your FS PBX account should now show as registered by displaying in Green. In the Settings tab, click on Push Notifications Test to see if push notifications are working. When the test completes successfully, it is an excellent time to switch over to Event Guard on your FS PBX Dashboard to see if the SIPIS Push Server has been blocked. If so, unblock it and also Allow its IP address in Advanced -> Access Controls -> rfc1918. Now push notifications should continue to work reliably.

TIP: If you have lots of smartphones to deploy, Groundwire has a slick feature that will save you a bunch of time. First, build Groundwire with an extension you don’t plan to use. For example, use extension 888 with its password and a domain of xyz.com. Save your settings with all of the configuration options documented above. Then choose Settings -> Preferences -> Backup Configuration. Enable Application configurations only and make up a password for your backup. Then click Backup and Send By Email. You then can restore this file to each additional phone and simply change the extension, password, and domain without having to wade through the remaining settings on each phone. This works on both Android and iOS devices running Groundwire.

blank

Keeping the Spammers At Bay With FS PBX

We have a tried-and-true solutions to blocking the scammers and politicians. It forces callers to press a number before being routed to your phones.

Here’s how to deploy our Press7 inbound call option. First, download the press7.mp3 file onto your desktop. Then choose Applications -> Recordings -> Upload and choose the MP3 file you downloaded to your desktop. Save the file and then play it once to be sure it works.

Next, we want to create a simple IVR with an option7 that points to your extension and a timeout option that hangs up the call. Navigate to Applications -> IVR Menus -> Add. Fill in the form as shown below and then click SAVE.

Name: Press7
Extension: 777
Greet Long: press7.mp3
Options:
  Option: 7
  Destination: your-extension-number
  Enabled: True 
TimeoutL 6000
Exit Action: Hangup
Context: Your-FQDN
Enabled: True

Finally, edit the Inbound Route created above: Dialplan -> Destinations -> Inbound. In the Action pull-down menu, choose the 777 IVR option. Then SAVE your changes. Now try out a test call to your DID.

Keeping Spammers At Bay With Lenny

blank

Verify OpenAI TTS API Key Is Working

1. Go to Home -> Dashboard -> Virtual Receptionists
2. Create a New IVR using any of the existing Voice Prompts
3. Edit the IVR and Navigate to Prompt section.
4. Click on + to create a new voice prompt.
5. Choose text-to-speech
6. Type a Custom Greeting, pick a Voice, and click Generate
7. Play it back to verify that your TTS API key is working.

Verify OpenAI STT API Key Is Working

1. Edit Home -> Dashboard -> Voicemail Settings for an extension
2. Enter an Email Address for the voicemails
3. Enable Voicemail Transcription
4. Enable Attach File to Voicemails
5. Choose whether to delete voicemail after email delivery
6. Save your updates
7. Send a voicemail to that extension and check your email box

Some Admin Tools For Your FS PBX Toolkit

If you’re coming from the Asterisk world, you know how important the Asterisk CLI interface was. With FreeSWITCH, there’s a similar command line application: fs_cli. We’re also still a little fuzzy when a synchronization with FS PBX is necessary so we’ve learned to issue the following two commands after making SIP modifications in the dialplan:

sofia profile internal restart
sofia profile external restart

There are a few other FS PBX commands worth learning. By navigating to Status -> SIP Status, you can Reload ACL, Reload XML, and Flush Cache. If you modify call routing, add new IVRs, or change any logic in the dialplan, reload_xml is typically needed for those changes to take effect. More importantly, reload_acl reloads the Access Control Lists (ACLs) in FreeSWITCH. ACLs are used to define which IP addresses or networks are allowed or denied access to various FreeSWITCH services (e.g., SIP registrations, gateways). It also performs a reload_xml implicitly before reloading the ACLs. Flush Cache typically is used if you update sound files or other key components in FS PBX to assure that the updated version is used rather than an earlier copy that still may be cached. When all else fails, it may be time to restart FreeSwitch from SSH: systemctl restart freeswitch.

We trust we’ve given you enough tips and tricks to get FS PBX deployed and functioning. Now is probably a good time to read through the FusionPBX Getting Started Tutorial which covers some additional topics. Deploy at your own risk.

If you would like to deploy BulkVS with FS PBX, we now have documented the process here. Enjoy!

Originally published: Monday, July 28, 2025


blank
Help with Asterisk or FS PBX? Visit the VoIP-info Forum.


 

Special Thanks to Our Generous Sponsors


FULL DISCLOSURE: ClearlyIP, Skyetel, Vitelity, DigitalOcean, Vultr, VoIP.ms, 3CX, Sangoma, TelecomsXchange and VitalPBX have provided financial support to Nerd Vittles and our open source projects through advertising, referral revenue, and/or merchandise. As an Amazon Associate and Best Buy Affiliate, we also earn from qualifying purchases. We’ve chosen these providers not the other way around. Our decisions are based upon their corporate reputation and the quality of their offerings and pricing. Our recommendations regarding technology are reached without regard to financial compensation except in situations in which comparable products at comparable pricing are available from multiple sources. In this limited case, we support our sponsors because our sponsors support us.

blankBOGO Bonaza: Enjoy state-of-the-art VoIP service with a $10 credit and half-price SIP service on up to $500 of Skyetel trunking with free number porting when you fund your Skyetel account. No limits on number of simultaneous calls. Quadruple data center redundancy. $25 monthly minimum spend required. Tutorial and sign up details are here.

blankThe lynchpin of Incredible PBX 2020 and beyond is ClearlyIP components which bring management of FreePBX modules and SIP phone integration to a level never before available with any other Asterisk distribution. And now you can configure and reconfigure your new Incredible PBX phones from the convenience of the Incredible PBX GUI.

blankVitalPBX is perhaps the fastest-growing PBX offering based upon Asterisk with an installed presence in more than 100 countries worldwide. VitalPBX has generously provided a customized White Label version of Incredible PBX tailored for use with all Incredible PBX and VitalPBX custom applications. Follow this link for a free test drive!
 

blankSpecial Thanks to Vitelity. Vitelity is now Voyant Communications and has halted new registrations for the time being. Our special thanks to Vitelity for their unwavering financial support over many years and to the many Nerd Vittles readers who continue to enjoy the benefits of their service offerings. We will keep everyone posted on further developments.
 



blank

Tags:

Leave a comment

Your email address will not be published. Required fields are marked *

*