前言
Linux 上部署 FreeSWITCH 是一件比较麻烦的事情,用 Docker 部署相对方便且更容易运维。下面详述官方项目部署步骤。
容器公开以下端口:
- 5060/tcp 5060/udp 5080/tcp 5080/udp作为SIP信令端口。
- 5066/tcp 7443/tcp作为WebSocket信令端口。
- 8021/tcp作为事件套接字端口。
- 64535-65535/udp作为媒体端口。
部署步骤
一、克隆git
- 执行命令
git clone https://github.com/BetterVoice/freeswitch-container.git

# Jenkins.
FROM ubuntu:16.04
MAINTAINER Thomas Quintana <thomas@bettervoice.com>
# Enable the Ubuntu multiverse repository.
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ trusty multiverse" >> /etc/apt/source.list
RUN echo "deb-src http://us.archive.ubuntu.com/ubuntu/ trusty multiverse">> /etc/apt/source.list
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates multiverse" >> /etc/apt/source.list
RUN echo "deb-src http://us.archive.ubuntu.com/ubuntu/ trusty-updates multiverse" >> /etc/apt/source.list
# Enable videolan stable repository.
RUN apt-get update && apt-get install -y software-properties-common
RUN add-apt-repository ppa:videolan/stable-daily
# Install Dependencies.
# missing in 16.04 libmyodbc
RUN apt-get update && apt-get install -y autoconf automake bison build-essential fail2ban gawk git-core groff groff-base erlang-dev libasound2-dev libavcodec-dev libavutil-dev libavformat-dev libav-tools libavresample-dev libswscale-dev liba52-0.7.4-dev libssl-dev libdb-dev libexpat1-dev libcurl4-openssl-dev libgdbm-dev libgnutls-dev libjpeg-dev libmp3lame-dev libncurses5 libncurses5-dev libperl-dev libogg-dev libsnmp-dev libtiff5-dev libtool libvorbis-dev libx11-dev libzrtpcpp-dev make portaudio19-dev python-dev snmp snmpd subversion unixodbc-dev uuid-dev zlib1g-dev libsqlite3-dev libpcre3-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libladspa-ocaml-dev libmemcached-dev libmp4v2-dev libpq-dev libvlc-dev libv8-dev liblua5.2-dev libyaml-dev libpython-dev odbc-postgresql sendmail unixodbc wget yasm libldap2-dev
# Use Gawk.
RUN update-alternatives --set awk /usr/bin/gawk
# Install source code dependencies.
ADD build/install-deps.sh /root/install-deps.sh
WORKDIR /root
RUN chmod +x install-deps.sh
RUN ./install-deps.sh
RUN rm install-deps.sh
# Configure Fail2ban
ADD conf/freeswitch.conf /etc/fail2ban/filter.d/freeswitch.conf
ADD conf/freeswitch-dos.conf /etc/fail2ban/filter.d/freeswitch-dos.conf
ADD conf/jail.local /etc/fail2ban/jail.local
RUN touch /var/log/auth.log
# Download FreeSWITCH.
WORKDIR /usr/src
ENV GIT_SSL_NO_VERIFY=1
#RUN git clone https://freeswitch.org/stash/scm/fs/freeswitch.git -b v1.6
RUN git clone https://github.com/signalwire/freeswitch.git -b v1.6
# Bootstrap the build.
WORKDIR freeswitch
RUN ./bootstrap.sh
# Enable the desired modules.
ADD build/modules.conf /usr/src/freeswitch/modules.conf
# Build FreeSWITCH.
RUN ./configure --enable-core-pgsql-support
RUN make
RUN make install
RUN make uhd-sounds-install
RUN make uhd-moh-install
# RUN make samples
# Post install configuration.
ADD sysv/init /etc/init.d/freeswitch
RUN chmod +x /etc/init.d/freeswitch
RUN update-rc.d -f freeswitch defaults
ADD sysv/default /etc/default/freeswitch
ADD build/bashrc /root/.bashrc
ADD conf/fs_sync /bin/fs_sync
# Add the freeswitch user.
RUN adduser --gecos "FreeSWITCH Voice Platform" --no-create-home --disabled-login --disabled-password --system --ingroup daemon --home /usr/local/freeswitch freeswitch
RUN chown -R freeswitch:daemon /usr/local/freeswitch
# Add confile file
ADD build/lib/* /usr/lib/
RUN ln /usr/lib/x86_64-linux-gnu/libpcre32.so.3.13.2 /usr/lib/libpcre.so.1
RUN ln /usr/lib/x86_64-linux-gnu/libedit.so.2.0.53 /usr/lib/libedit.so.0
RUN ln /usr/lib/libssl.so.1.0.0 /usr/lib/libssl.so.10
RUN ln /usr/lib/libcrypto.so.1.0.0 /usr/lib/libcrypto.so.10
ADD build/token.txt /usr/local/freeswitch/bin/
ADD build/robot.conf /usr/local/freeswitch/bin/
ADD build/alitoken_time.cfg /usr/local/freeswitch/bin/
ADD build/alitoken /usr/local/freeswitch/bin/
ADD build/mod_vmd.so /usr/local/freeswitch/mod/
ADD conf/* /usr/local/freeswitch/conf/
RUN chmod +x /usr/local/freeswitch/bin/alitoken
# Create the log file.
RUN touch /usr/local/freeswitch/log/freeswitch.log
RUN chown freeswitch:daemon /usr/local/freeswitch/log/freeswitch.log
# Open the container up to the world.
EXPOSE 5060/tcp 5060/udp 5080/tcp 5080/udp
EXPOSE 5066/tcp 7443/tcp
EXPOSE 8021/tcp
EXPOSE 64535-65535/udp
# Start the container.
CMD service snmpd start && service freeswitch start && tail -f /usr/local/freeswitch/log/freeswitch.log二、执行构建命令
执行完构建命令后,会得到一个 docker 镜像
docker build -t freeswitch .三、创建容器
端口需要映射,但是由于docker中的一个问题,映射 -p 60535-65535:60535-65535/udp 这样的大端口范围会占用大量内存。用 --userland proxy=false 启动 docker 可以部分解决这个问题,但启动仍然很慢。
解决方法:手动添加iptables规则
# 注意需要修改路径
CID=$(sudo docker run --name freeswitch -p 5060:5060/tcp -p 5060:5060/udp -p 5080:5080/tcp -p 5080:5080/udp -p 8021:8021/tcp -p 7443:7443/tcp -p 60535-65535:60535-65535/udp -v /home/ubuntu/freeswitch/conf:/usr/local/freeswitch/conf bettervoice/freeswitch-container:1.6.6)
# 手动添加iptables规则
CIP=$(sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $CID)
sudo iptables -A DOCKER -t nat -p udp -m udp ! -i docker0 --dport 60535:65535 -j DNAT --to-destination $CIP:60535-65535
sudo iptables -A DOCKER -p udp -m udp -d $CIP/32 ! -i docker0 -o docker0 --dport 60535:65535 -j ACCEPT
sudo iptables -A POSTROUTING -t nat -p udp -m udp -s $CIP/32 -d $CIP/32 --dport 60535:65535 -j MASQUERADE四、复制相关文件
sudo cp sysv/systemd/docker.freeswitch.service /lib/systemd/system/
sudo systemctl daemon-reload
sudo cp sysv/docker.freeswitch.py /usr/local/bin/五、开启、关闭服务
# Enable the service
sudo systemctl enable docker.freeswitch
# Start the service
sudo systemctl start docker.freeswitch
# Stop the service
sudo systemctl stop docker.freeswitch注
确保在 autoload_configs/switch.conf.xml 中正确设置了 rtp 启动端口和 rtp 结束端口。此外,还需要为每个可从公共 ip 地址访问的配置文件设置 ext rtp ip和ext sip ip。有关更多说明,请参阅freeswitch文档。
容器操作
容器中提供了以下模块,可以在运行时通过提供一个modules.conf.xml文件来加载,该文件中未注释所需的模块名称。
应用(Applications)
-
mod_avmd: Detects voicemail beeps using a generalized approach. -
mod_blacklist: Blacklist module. -
mod_callcenter: Call queuing application that can be used for call center needs. -
mod_cidlookup: Provides a means (database, url) to lookup the callerid name from a number. -
mod_commands: A mass plethora of API interface commands. -
mod_conference: Conference room module. -
mod_curl: Allows scripts to make HTTP requests as receive responses as plain text or JSON. -
mod_db: Database key/value store functionality, group dialing, and limit backend. -
mod_directory: Dial by Name directory. -
mod_distributor: Simple round-robin style distributions. -
mod_dptools: Dialplan Tools: provides a number of apps and utilities for the dialplan. -
mod_easyroute: A simple DID routing engine that uses a database lookup to determine how to route an incoming call. -
mod_enum: Route PSTN numbers over internet according to ENUM servers, such as e164.org -
mod_esf: Holds the multi cast paging application for SIP. -
mod_esl: Allows to generate remote ESL commands. -
mod_expr: Brian Allen Vanderburg's expression evaluation library. -
mod_fifo: FIFO module. -
mod_fsk: FSK (Frequency-Shift Keying) data transfer -
mod_fsv: FreeSWITCH Video application (Recording and playback) -
mod_hash: Hashtable key/value store functionality and limit backend -
mod_httapi: HT-TAPI Hypertext Telephony API (Twilio FreeSWITCH style) -
mod_http_cache: HTTP GET with caching. -
mod_ladspa: use Auto-tune on your call. -
mod_lcr: Implements LCR (Least Cost Routing) -
mod_memcache: API that integrates with memcached (a distributed key/value object store) -
mod_mongo:http://www.mongodb.org/ -
mod_mp4: MP4 File Format support for video apps. -
mod_nibblebill: Billing module ("nibbles" at credit/cash amounts during calls) -
mod_oreka: Module for Media Recording with Oreka -
mod_rad_auth: use RADIUS for authentication -
mod_redis: supplies a limit back-end that uses Redis. -
mod_rss: Reads RSS feeds via a TTS engine. -
mod_sms: Apps for chat messages -
mod_snapshot: Records a sliding window of audio and can take snapshots to disk. -
mod_snom: Controlling softkeys on Snom phones (button function, led state, label etc.) -
mod_spandsp: Spandsp tone and DTMF detectors. A combination of mod_fax and mod_voipcodecs and mod_t38gateway. -
mod_spy: User spy module. -
mod_stress: Module for detecting voice stress. -
mod_tone_detect: Tone detection module. -
mod_translate: Format numbers into a specified format. -
mod_valet_parking: Allows calls to be parked and picked up easily. -
mod_vmd: Voicemail beep detection module. -
mod_voicemail: Full-featured voicemail module. -
mod_voicemail_ivr: VoiceMail IVR Interface. -
mod_xml_odbc: Allows user directory to be accessed from a database in realtime.
语音识别/文本到语音(Speech Recognition / Text-to-Speech)
-
mod_flite - Free open source Text to Speech. -
mod_pocketsphinx - Free open source Speech Recognition. -
mod_tts_commandline - Run a command line and play the outputted file. -
mod_unimrcp - Module for an open MRCP implementation
编解码器(Codecs)
-
mod_amr: GSM-AMR (Adaptive Multi-Rate) codec. -
mod_amrwb: GSM-AMRWB (ARM Wide Band) codec. -
mod_bv: BroadVoice16 and BroadVoice32 audio codecs (Broadcom codecs). -
mod_celt: CELT ultra-low delay audio codec. -
mod_codec2: FreeSWITCH CODEC2 Module. -
mod_dahdi_codec - DAHDI Codecs (G729A 8.0kbit, G723.1 5.3kbit). -
mod_g723_1: G.723.1 codec. -
mod_g729: G.729 codec. -
mod_h26x: H26X signed linear codec. -
mod_ilbc: ILBC codec. -
mod_isac: Internet Speech Audio Codec open sourced by Google, used in WebRTC -
mod_mp4v: MPEG4 video codec -
mod_opus: The OPUS ultra-low delay audio codec (http://opus-codec.org/) -
mod_siren: G.722.1 (Siren7) and G.722.1 Annex C (Siren14) Polycom codecs. -
mod_speex: Speex codec. -
mod_theora: Theora video codec -
mod_voipcodecs: VoIP Codecs (G.711, G.722, G.726, GSM-FR, IMA_ADPCM, LPC10) -
mod_vp8: VP8 video codec
呼叫(Dialplan)
-
mod_dialplan_asterisk: Allows you to create dialplans the old-fashioned way. -
mod_dialplan_directory: Allows you to obtain a dialplan from a directory resource -
mod_dialplan_xml: Allows you to program dialplans in XML format. -
mod_yaml: Allows you to program dialplans in YAML format.
名录(Directories)
-
mod_ldap: LDAP module made to obtain dialplans, user accounts, etc.
端点(Endpoints)
-
mod_alsa: Sound card endpoint. -
mod_dingaling: Jabber/Google Talk integration module; note XMPP access to Google Voice ended 2014.05.15 -
mod_loopback: Loopback endpoint module - A loopback channel driver to make an outbound call as an inbound call. -
mod_portaudio: Voice through a local soundcard. -
mod_rtmp: "Real time media protocol" endpoint for FreeSWITCH. -
mod_skinny: SCCP module -
mod_skypopen: Skype compatible module. -
mod_sofia: SIP module.
事件句柄(Event Handlers)
-
mod_cdr_csv: CSV call detail record handler. -
mod_cdr_mongodb: MongoDB CDR module -
mod_cdr_pg_csv: Asterisk Compatible CDR Module with PostgreSQL interface -
mod_cdr_sqlite: SQLite CDR Module -
mod_erlang_event: Module to send/receive events/commands in Erlang's binary format. -
mod_event_multicast: Broadcasts events to netmask. -
mod_event_socket: Sends events via a single socket. -
mod_event_zmq:http://www.zeromq.org/ -
mod_json_cdr: JSON CDR Module to files or curl -
mod_radius_cdr: RADIUS CDR Module. -
mod_rayo: 3PCC over XMPP -http://rayo.org/xep -
mod_snmp: SNMP AgentX module -
mod_xml_cdr - XML-based call detail record handler.
文件格式(File Formats)
-
mod_local_stream: Multiple channels connected to same looped file stream. -
mod_native_file: File interface for codec specific file formats. -
mod_portaudio_stream: Stream from an external audio source for Music on Hold -
mod_shell_stream: Stream audio from an arbitrary shell command. Read audio from a database, from a soundcard, etc. -
mod_shout: MP3 files and shoutcast streams. -
mod_sndfile: Multi-format file format transcoder (WAV, etc) -
mod_ssml: Speech Synthesis Markup Language parser -
mod_tone_stream: Tone Generation Stream. -
mod_vlc: Stream audio from VLC media player using libvlc.
语言(Languages)
-
mod_lua - Lua support. -
mod_perl - Perl support. -
mod_python - Python Support. -
mod_v8 - Google V8 JavaScript (ECMAScript) engine.
日志(Loggers)
-
mod_console - Console logger. -
mod_logfile - File logger. -
mod_syslog - Syslog logger.
特定语言(Language-Specific)
-
mod_say_de - German language text-to-speech engine -
mod_say_en - English language text-to-speech engine -
mod_say_es - Spanish language text-to-speech engine -
mod_say_fa - Persian language text-to-speech engine -
mod_say_fr - French language text-to-speech engine -
mod_say_he - Hebrew language text-to-speech engine -
mod_say_hr - Croatian language text-to-speech engine -
mod_say_hu - Hungarian language text-to-speech engine -
mod_say_it - Italian language text-to-speech engine -
mod_say_ja - Japanese language text-to-speech engine -
mod_say_nl - Dutch language text-to-speech engine -
mod_say_pl - Polish language text-to-speech engine -
mod_say_pt - Portuguese language text-to-speech engine -
mod_say_ru - Russian language text-to-speech engine -
mod_say_th - Thai language text-to-speech engine -
mod_say_zh - Chinese, Mandarin, Cantonese language text-to-speech engine
外部 API
-
mod_xml_curl - XML Gateway Code. Configure FreeSWITCH™ from a web server on boot and on the fly. -
mod_xml_ldap - LDAP XML Gateway. -
mod_xml_radius - RADIUS authentication gateway. -
mod_xml_rpc - XML Remote Procedure Calls. Issue commands from your web application. -
mod_xml_scgi - Simple Common Gateway Interface.
参考:https://hub.docker.com/r/bettervoice/freeswitch-container
