Alpine Linux latest-stable (written when latest-stable == 3.16.0)
====== Note about missing packages ======
Some Asterisk modules are unavailable due to the lack of available packages on Alpine Linux. These currently are:
* ''beanstalk'' - Available as a package, but I'm not installing it :)
* ''codec2'' - Unavailable as a package, but the [[https://github.com/drowe67/codec2|most recent commit]] does compile and install
* ''iksemel'' (Jabber-specialised XML parser) - Unavailable as a package, most recent source simply doesn't compile, but [[https://github.com/timothytylee/iksemel-1.4|version 1.4]] does compile and install.
* ''nbs'' (Network Broadcast Sound) - Unavailable as a package, compiling from source doesn't work without patching for ''musl''.
* ''osptk'' (Open Settlement Protocol) - Unavailable as a package (unsure why), couldn't be bothered finding source and seeing if it compiles.
* ''radius'' - Installing ''freeradius-dev'' is not sufficient, and I'm not interested in figuring out what package is required for this one.
* ''resample'' - Installing ''libresample-dev'' is apparently not sufficient, even though the install-prereqs script checks for the header file installed by that package before attempting to build from source.. I do not care enough.
* ''vpb'' (Voicetronix) - Unavailable as a package, website is confusing, don't care enough.
===== Applications =====
* ''app_jack'' is unavailable due to resample
* ''app_osplookup'' is unavailable due to osptk
===== Call Detail Recording =====
* ''cdr_beanstalkd'' is unavailable due to beanstalk
* ''cdr_radius'' is unavailable due to radius
===== Channel Event Logging =====
* ''cel_beanstalkd'' is unavailable due to beanstalk
* ''cel_radius'' is unavailable due to radius
===== Channel Drivers =====
* ''chan_misdn'' (ISDN BRI/PRI) is unavailable due to isdnnet, misdn and suppserv
* ''chan_nbs'' (network broadcast sound) is unavailable due to nbs
* ''chan_phone'' (linux telephony api) is unavailable due to ixjuser
* ''chan_vpb'' (Voicetronix) is unavailable due to vpb
===== Resource Modules =====
* ''res_corosync'' is unavailable due to corosync
* ''res_timing_kqueue'' is unavailable due to kqueue
====== Install commands ======
Not exactly a ready-to-run script, more a log of all the commands I ran in the pursuit of sippies. During the menuconfig step, I enabled everything possible except for any deprecated modules that aren't enabled by default anyway.
apk add -t pbx-build-deps alpine-sdk alsa-lib-dev asterisk-openrc \
binutils-dev bison bluez-dev bsd-compat-headers \
cmake curl-dev \
dahdi-linux dahdi-linux-dev dahdi-tools dahdi-tools-dev doxygen \
fftw-dev findutils flex freeradius-utils freetds-dev \
gmime-dev graphviz-dev gsm-dev \
ilbc-dev imap-dev \
jansson-dev \
libedit-dev libical-dev libpri-dev libresample libsamplerate-dev libsndfile-dev libsrtp-dev libtool libxml2-dev libxslt-dev libzip-dev \
lua-dev lua5.2-dev lua5.3-dev lua5.4-dev \
mariadb-connector-c-dev mariadb-dev mysql-client \
neon-dev net-snmp net-snmp-dev newt-dev \
openldap-clients openldap-dev openssl-dev opus-dev opusfile-dev \
pjproject-dev popt-dev portaudio-dev postgresql14-client postgresql14-dev \
spandsp spandsp-dev speex-dev speexdsp-dev sqlite sqlite-dev \
tar tiff-dev \
unbound-dev unixodbc-dev uriparser uriparser-dev util-linux-dev \
xmlstarlet
mkdir -p /usr/local/src/patches/asterisk /usr/local/src/dist/asterisk /usr/local/src/build/codec2
cd /usr/local/src/dist
git clone https://github.com/drowe67/codec2
git clone https://github.com/timothytylee/iksemel-1.4 iksemel
cd /usr/local/src/build/codec2
cmake /usr/local/src/dist/codec2
make -j5
make install
cd /usr/local/src/dist/iksemel
# not sure what the order of operations is supposed to be here because I ran autoupdate
# but then got messages from autogen.sh about obsolete things I should fix with autoupdate..
autoupdate
./autogen.sh
./configure
# edit makefile here to remove all variables referencing the doc folder,
# followed by removing the doc folder from SUBDIRS
# otherwise make will error out because it wants to build the documentation
# TODO: make a patch for that
vi Makefile
make -j5
make install
cd /usr/local/src/patches/asterisk
wget https://git.alpinelinux.org/aports/plain/main/asterisk/10-musl-mutex-init.patch
wget https://git.alpinelinux.org/aports/plain/main/asterisk/20-musl-astmm-fix.patch
wget https://git.alpinelinux.org/aports/plain/main/asterisk/30-asterisk-mariadb.patch
wget https://git.alpinelinux.org/aports/plain/main/asterisk/40-asterisk-cdefs.patch
wget -O 50-usecallmanager-18.11.3.patch https://raw.githubusercontent.com/usecallmanagernz/patches/master/asterisk/cisco-usecallmanager-18.11.3.patch
cd /usr/local/src/dist/asterisk
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-18.11.3.tar.gz
cd /usr/local/src/build
tar xzf /usr/local/src/asterisk/dist/asterisk-18.11.3.tar.gz
mv asterisk-18.11.3 asterisk
cd /usr/local/src/build/asterisk
patch --strip=1 < /usr/local/src/patches/asterisk/10-musl-mutex-init.patch
patch --strip=1 < /usr/local/src/patches/asterisk/20-musl-astmm-fix.patch
patch --strip=1 < /usr/local/src/patches/asterisk/30-asterisk-mariadb.patch
patch --strip=1 < /usr/local/src/patches/asterisk/40-asterisk-cdefs.patch
patch --strip=1 < /usr/local/src/patches/asterisk/50-usecallmanager-18.11.3.patch
# Asterisk official documentation makes a big stink about how you should only use their bundled pjproject
# otherwise you'll have instabilities and whatever, but their bundled pjproject doesn't build cleanly on Alpine
# so they can stink up somewhere else.
CFLAGS="-DENABLE_SRTP_AES_GCM -DENABLE_SRTP_AES_256" ./configure --without-pjproject-bundled
make menuconfig
./contrib/scripts/get_mp3_source.sh
make -j9
make install samples
addgroup -S asterisk
adduser -S -D -h /var/lib/asterisk -s /sbin/nologin -G asterisk -g asterisk asterisk
addgroup -S dialout
addgroup asterisk dialout
chown -R asterisk:asterisk /run/asterisk
chown -R asterisk:asterisk /var/lib/asterisk
chown -R asterisk:asterisk /var/log/asterisk
chown -R asterisk:asterisk /var/spool/asterisk
====== Configuration ======
This part was initially extremely daunting. Not helping matters is that the fact that there are no pages online (that I could find) that discuss a viable minimal configuration for a recent Asterisk version. Apparently either nobody is starting fresh with Asterisk in 2022 or nobody is interested in writing about it. Further frustrating matters is that Asterisk's official wiki, a Confluence site, went down shortly after I began the process of setting Asterisk up.
===== Files removed =====
I deleted the config files installed by ''make samples'' that were installed for all modules I explicitly removed:
* app_skel.conf
* cdr_adaptive_odbc.conf
* cdr_beanstalkd.conf
* cdr_odbc.conf
* cdr_pgsql.conf
* cdr_syslog.conf
* cel_beanstalkd.conf
* cel_odbc.conf
* cel_pgsql.conf
* func_odbc.conf
* misdn.conf
* osp.conf
* oss.conf
* res_odbc.conf
* res_pgsql.conf
* res_snmp.conf
* sip.conf
* sip_notify.conf
* vpb.conf
===== Files edited =====
[acl_deny_default]
deny = 0.0.0.0/0
deny = ::
[acl_permit_default]
permit = 0.0.0.0/0
permit = ::
[acl_local_subnets]
permit = 10.13.37.0/24
permit = 10.46.0.0/16
permit = 172.31.255.0/28
permit = fd46::/16
[acl_permit_local_only]
deny = 0.0.0.0/0
deny = ::
permit = 10.13.37.0/24
permit = 10.46.0.0/16
permit = 172.31.255.0/28
permit = fd46::/16
[intro]
alignment = center
greeting => hewwo
[startup_commands]
;sip set debug on = yes
;core set verbose 3 = yes
;core set debug 1 = yes
; custom CELT codec defs. one custom definition per sample rate.
;[celt44]
;type=celt
;samprate=44100
;framesize=480
;[opus]
;type=opus
;max_playback_rate=8000
;fec=no
;packet_loss=10
;complexity=10
;max_bandwidth=48000
;bitrate=auto
;application=voip
;cbr=no
;dtx=no
[plc]
genericplc => true
genericplc_on_equal_codecs => false
[silk8]
type = silk
samprate = 8000
maxbitrate = 10000
fec = true
packetloss_percentage = 10
dtx = false
[silk12]
type = silk
samprate = 12000
maxbitrate = 12000
fec = true
packetloss_percentage = 10
dtx = false
[silk16]
type = silk
samprate = 16000
maxbitrate = 20000
fec = true
packetloss_percentage = 10
dtx = false
[silk24]
type = silk
samprate = 24000
maxbitrate = 30000
fec = true
packetloss_percentage = 10
dtx = false
[speex]
vbr => true
quality => 3
complexity => 2
enhancement => true
vad => true
abr => 0
vbr_quality => 4
dtx => false
experimental_rtcp_feedback => false
preprocess => false
pp_vad => false
pp_agc => false
pp_agc_level => 8000
pp_denoise => false
pp_dereverb => false
pp_dereverb_decay => 0.4
pp_dereverb_level => 0.3
[general]
[default]
active = no
[settings]
[general]
transferdigittimeout => 3
xfersound = beep
xferfailsound = beeperr
;pickupsound = beep
;pickupfailsound = beeperr
featuredigittimeout = 1000
;recordingfailsound = beeperr
atxfernoanswertimeout = 15
atxferdropcall = no
atxferloopdelay = 10
atxfercallbackretries = 2
transferdialattempts = 3
transferretrysound = beep
transferinvalidsound = beeperr
atxferabort = *1
atxfercomplete = *2
atxferthreeway = *3
atxferswap = *4
pickupexten = *8
[featuremap]
; requires two channels to be both answered and bridged, chan_local is needed w/ Answer in order to use them while RP is ringing or in progress
disconnect => *0 ;requires H or h
automon => *1 ;requires W or w
atxfer => *2 ;requires T or t
automixmon => *3 ;requires X or x
blindxfer => #1 ;requires T or t
parkcall => #72;requires X or x
[applicationmap]
[general]
enabled = no
;capture_address = 1.2.3.4:1234
;capture_password = password
;capture_id = 1234
;uuid_type = call-id | channel
[general]
servername = Puppybarks
enabled = yes
bindaddr = 0.0.0.0
bindport = 8088
tlsenable = no
;prefix=asterisk
;sessionlimit=100
;session_inactivity=30000
;session_keep_alive=15000
;enable_static=yes
;enable_status=no
;redirect = / /static/config/index.html
;tlsenable=yes
;tlsbindaddr=0.0.0.0:8089
;
;tlscertfile=
;tlsprivatekey=
; tlscipher=
; ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:
; ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:
; kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:
; ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:
; ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:
; DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:
; AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:
; AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:
; !EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
; tlsdisablev1=yes
; tlsdisablev11=yes
; tlsdisablev12=yes
; tlsservercipherorder=yes
;[post_mappings]
;uploads = /var/lib/asterisk/uploads/
[modules]
autoload=yes
[general]
enabled = yes
core_metrics_enabled = yes
uri = metrics
===== pjsip.conf =====
It was at this point that I gave up because the file is approximately three bibles long and simultaneously contains every example known to humanity and yet no information I'm capable of parsing and retaining. I'll come back to this later.
====== Dialplan notes ======
===== Trunk configuration =====
A&A SIP trunks don't seem to indicate the incoming number, or maybe I configured the trunks on A&A's end wrongly. The solution is simply to specify a contact header, so I have devised the following internal dialplan for inbound trunks
8 44 1382 00 339
Where 8 is the incoming number prefix, 44 is the country-code, 1382 is the area code of the line, 00 is the provider number, and 339 is the last few digits.
Provider numbers are as follows
00 - A&A VoIP
01 - Voipfone
02 - sipgate
03 - Twilio
99 - SIPBroker