ASTPP VoIP Billing v4.0 Debian v9 Freeswitch v1.10 Install Guide

This guide covers the installation of the ASTPP VoIP billing and Freeswitch applications.  ASTPP is installed manually from source.  Freeswitch is installed from deb packages.

Tested using the following software:

  • Debian v9 (Stretch) x64 minimal install
  • ASTPP v4.0
  • Freeswitch v1.10
  • Nginx v1.10
  • PHP v7.3
  • MySQL v8

Call Flow

Outbound

Inbound

Prerequisites

Verify locale is set to en US.UTF-8.

locale

If it is not then set it now.  You may also set your own UTF-8 locale if not in the US.

# Select en_US.UTF-8 UTF-8 apt install locales && dpkg-reconfigure locales

Log out/in or close/open shell for changes to take effect. 

Install prerequisite packages

apt update && apt upgrade -y && apt -y remove apache2
apt -y install software-properties-common
add-apt-repository 'deb http://security.debian.org/debian-security/ stretch/updates main contrib'
apt -y install git nano dbus sudo nginx curl sqlite3 haveged ghostscript lsb-release libtiff5-dev libtiff-tools at dirmngr postfix gawk dnsutils openssl ntp unixodbc unixodbc-bin gettext fail2ban ntpdate ntp lua5.1 bc libxml2 libxml2-dev openssl libcurl4-openssl-dev gettext gcc g++

PHP

# install this section one line at a time.

apt -y install apt-transport-https ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update && apt -y install php7.3 php7.3-fpm php7.3-gd php7.3-opcache php7.3-cli php7.3-common php7.3-curl php7.3-sqlite3 php7.3-odbc php7.3-mysql php7.3-xml php7.3-json php7.3-mbstring php-pear

MySQL

# Confirm that MySQL Server & Cluster mysql-8.0 is selected

cd /usr/src
wget https://repo.mysql.com/mysql-apt-config_0.8.15-1_all.deb
dpkg -i mysql-apt-config_0.8.13-1_all.deb
# You can leave root password blank
# Select "Use Legacy Authentication" when asked

apt update && apt -y install mysql-server

MySQL ODBC

wget https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc_8.0.22-1debian9_amd64.deb
dpkg -i mysql-connector-odbc_8.0.22-1debian9_amd64.deb

Disable Selinux

Check status

sestatus

If the command is found and is not disabled, set SELINUX=disabled in /etc/selinux/config.  Requires reboot for changes to take effect.

sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config

Disable Firewall

It is sometimes helpful to disable the firewall during installation.

systemctl disable firewalld
systemctl disable iptables
systemctl stop firewalld
systemctl stop iptables

Timezone

## FIND YOUR TIMEZONE
tzselect

## SET TIMEZONE EXAMPLE
timedatectl set-timezone America/Vancouver

## CHECK TIMEZONE
​timedatectl status
systemctl restart rsyslog

Install

Freeswitch

wget -O - https://files.freeswitch.org/repo/deb/debian-release/fsstretch-archive-keyring.asc | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/debian-release/ $(lsb_release -sc) main" > \
/etc/apt/sources.list.d/freeswitch.list

apt update && apt -y install freeswitch-meta-all

ASTPP

# Set MySQL user ${userpassword} variable.  This is used muliple times in this section.
userpassword=somepassword

# If you have set a MySQL root password assign it here.
# If you left it blank just hit ENTER when asked.
mysqlpassword=existingmysqlpassword
cd /usr/src
git clone -b v4.0.1 https://github.com/iNextrix/ASTPP.git
mysql -p${mysqlpassword} -e "CREATE DATABASE astpp;"
mysql -p${mysqlpassword} -e "CREATE USER 'astppuser'@'localhost' IDENTIFIED BY '${userpassword}';"
mysql -uroot -p${mysqlpassword} -e "ALTER USER 'astppuser'@'localhost' IDENTIFIED WITH mysql_native_password BY '${userpassword}';"
mysql -p${mysqlpassword} -e "GRANT ALL PRIVILEGES ON astpp.* TO 'astppuser'@'localhost' WITH GRANT OPTION;"
mysql -p${mysqlpassword} -e "FLUSH PRIVILEGES;"
# This will likely run for several minutes and should not be interrupted.
mysql -p${mysqlpassword} astpp < ASTPP/database/astpp-4.0.sql

# If you get a datetime error on this step try restart mysql
mysql -p${mysqlpassword} astpp < ASTPP/database/astpp-4.0.1.sql

Configure MySQL

cp ASTPP/misc/odbc/deb_odbc.ini /etc/odbc.ini
sed -i "s#\(^PASSWORD\).*#PASSWORD = ${userpassword}#g" /etc/odbc.ini

sed -i '33i wait_timeout=600' /etc/mysql/mysql.conf.d/mysqld.cnf
sed -i '33i interactive_timeout = 600' /etc/mysql/mysql.conf.d/mysqld.cnf
sed -i '33i sql_mode=""' /etc/mysql/mysql.conf.d/mysqld.cnf

systemctl restart mysql

Test odbc driver

odbcinst -s -q

Test odbc connection

isql -v astpp astppuser ${userpassword} 
quit

Copy and configure Freeswitch files

cd /usr/src
cp -R ASTPP/freeswitch/fs /var/www/html/
cp -R ASTPP/freeswitch/scripts/* /usr/share/freeswitch/scripts/
cp -R ASTPP/freeswitch/sounds/*.wav /usr/share/freeswitch/sounds/en/us/callie/

rm -Rf /etc/freeswitch/dialplan/*
touch /etc/freeswitch/dialplan/astpp.xml
rm -Rf /etc/freeswitch/directory/*
touch /etc/freeswitch/directory/astpp.xml
rm -Rf /etc/freeswitch/sip_profiles/*
touch /etc/freeswitch/sip_profiles/astpp.xml

Copy and configure ASTPP files

cd /usr/src
mkdir -p /usr/local/astpp
mkdir -p /var/log/astpp
mkdir -p /var/lib/astpp
cp ASTPP/config/astpp-config.conf /var/lib/astpp/astpp-config.conf
cp ASTPP/config/astpp.lua /var/lib/astpp/astpp.lua

# Copy/config web GUI files
cp -R ASTPP/web_interface/astpp /var/www/html/
cp ASTPP/web_interface/nginx/deb_astpp.conf /etc/nginx/sites-available/astpp.conf
cp ASTPP/web_interface/nginx/deb_fs.conf /etc/nginx/sites-available/fs.conf

ln -s /etc/nginx/sites-available/astpp.conf /etc/nginx/sites-enabled/astpp.conf 
ln -s /etc/nginx/sites-available/fs.conf /etc/nginx/sites-enabled/fs.conf 
rm /etc/nginx/sites-enabled/default

# Just press ENTER to use defaults for all the questions
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

# Add nginx log files
touch /var/log/nginx/astpp_access.log
touch /var/log/nginx/astpp_error.log
touch /var/log/nginx/fs_access.log
touch /var/log/nginx/fs_error.log

# Add ASTPP log files
touch /var/log/astpp/astpp.log
touch /var/log/astpp/astpp_email.log

# Copy ASTPP specific freeswitch config files
/bin/cp -R ASTPP/freeswitch/conf/autoload_configs/* /etc/freeswitch/autoload_configs/

# Configure ASTPP config files in /var/lib/astpp.
serverIP=$(ifconfig | sed -En 's/127.0.0.*//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
sed -i "s#\(^dbname\).*#dbname = astpp#" /var/lib/astpp/astpp-config.conf
sed -i "s#\(^dbuser\).*#dbuser = astppuser#" /var/lib/astpp/astpp-config.conf
sed -i "s#\(^dbpass\).*#dbpass = ${userpassword}#" /var/lib/astpp/astpp-config.conf
sed -i "s#\(^base_url\).*#base_url = https://${serverIP}/#" /var/lib/astpp/astpp-config.conf
sed -i "s#\(^DB_USERNAME\).*#DB_USERNAME = \"astppuser\"#" /var/lib/astpp/astpp.lua
sed -i "s#\(^DB_PASSWD\).*#DB_PASSWD = \"${userpassword}\"#" /var/lib/astpp/astpp.lua

Enable mariadb module

nano /etc/freeswitch/autoload_configs/pre_load_modules.conf.xml
<configuration name="pre_load_modules.conf" description="Modules">
  <modules>
    <!-- Databases -->
    <load module="mod_mariadb"/>
  </modules>
</configuration>

CRON

crontab -u www-data -e
# Call all crons
* * * * * cd /var/www/html/astpp/cron/ && php cron.php crons

Systemd

Create unit file.

systemctl stop freeswitch
rm -r /run/freeswitch
nano /etc/systemd/system/freeswitch.service
[Unit]
Description=freeswitch
After=syslog.target network.target local-fs.target mariadb.service

[Service]
Type=forking
RuntimeDirectory=freeswitch
PIDFile=/run/freeswitch/freeswitch.pid
Environment="DAEMON_OPTS=-ncwait -nonat"
EnvironmentFile=-/etc/default/freeswitch
ExecStart=/usr/bin/freeswitch $DAEMON_OPTS
TimeoutSec=45s
Restart=always

User=www-data
Group=www-data
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=60000
LimitSTACK=250000
LimitRTPRIO=infinity
LimitRTTIME=infinity
IOSchedulingClass=realtime
IOSchedulingPriority=2
CPUSchedulingPriority=89
UMask=0007

; Comment this out if using OpenVZ
CPUSchedulingPolicy=rr

[Install]
WantedBy=multi-user.target

Create environment file.

cat >> /etc/default/freeswitch << EOF
# Uncommented variables will override variables in unit file
# User=""
# Group=""
# DAEMON_OPTS=""

EOF

Set ownership and permissions

Run this any time there are any changes/moves/adds/upgrades or if experiencing problems.

# Ownership
chown -R www-data. /etc/freeswitch /var/lib/freeswitch \
/var/log/freeswitch /usr/share/freeswitch /var/www/html \
/var/log/astpp /var/log/nginx

# Directory permissions to 755 (u=rwx,g=rx,o='rx')
find /etc/freeswitch -type d -exec chmod 755 {} \;
find /var/lib/freeswitch -type d -exec chmod 755 {} \;
find /var/log/freeswitch -type d -exec chmod 755 {} \;
find /usr/share/freeswitch -type d -exec chmod 755 {} \;
find /var/www/html -type d -exec chmod 755 {} \;
find /var/log/astpp -type d -exec chmod 755 {} \;

# File permissions to 664 (u=rw,g=rw,o=r)
find /etc/freeswitch -type f -exec chmod 664 {} \;
find /var/lib/freeswitch -type f -exec chmod 664 {} \;
find /var/log/freeswitch -type f -exec chmod 664 {} \;
find /usr/share/freeswitch -type f -exec chmod 664 {} \;
find /var/www/html -type f -exec chmod 664 {} \;
find /var/log/astpp -type d -exec chmod 664 {} \;

Configure php-fpm

sed -i "s/;request_terminate_timeout = 0/request_terminate_timeout = 300/" /etc/php/7.3/fpm/pool.d/www.conf
sed -i "s#short_open_tag = Off#short_open_tag = On#g" /etc/php/7.3/fpm/php.ini
sed -i "s#;cgi.fix_pathinfo=1#cgi.fix_pathinfo=1#g" /etc/php/7.3/fpm/php.ini
sed -i "s/max_execution_time = 30/max_execution_time = 3000/" /etc/php/7.3/fpm/php.ini
sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 20M/" /etc/php/7.3/fpm/php.ini
sed -i "s/post_max_size = 8M/post_max_size = 20M/" /etc/php/7.3/fpm/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 512M/" /etc/php/7.3/fpm/php.ini
systemctl restart php7.3-fpm
systemctl restart nginx

Configure firewall

apt -y install firewalld
systemctl enable firewalld
systemctl start firewalld

firewall-cmd --permanent --zone=public --add-service={http,https}
firewall-cmd --permanent --zone=public --add-port={5060,5061}/tcp
firewall-cmd --permanent --zone=public --add-port={5060,5061}/udp
firewall-cmd --permanent --zone=public --add-port=16384-32768/udp
firewall-cmd --reload
firewall-cmd --list-all

Enable services

systemctl daemon-reload
systemctl enable freeswitch
systemctl restart freeswitch

Test Freeswitch console

If fs_cli command is not working change the following line.

nano +4 /etc/freeswitch/autoload_configs/event_socket.conf.xml
<param name="listen-ip" value="127.0.0.1"/>
systemctl restart freeswitch

Browse to control panel

https://x.x.x.x

username: admin
password: admin

The  443 listening port can be changed at /var/lib/astpp/astpp-config.conf and  /etc/nginx/sites-available/astpp.conf. Remember to change the port on the firewall as well.  If accessing by DNS name change the IP to the DNS name.

User documentation is located at the following link
https://docs.astppbilling.org/display/itplmars/Overview+of+ASTPP