{"id":119,"date":"2026-04-24T18:14:36","date_gmt":"2026-04-24T18:14:36","guid":{"rendered":"https:\/\/phonesstillexist.com\/?p=119"},"modified":"2026-04-24T18:23:52","modified_gmt":"2026-04-24T18:23:52","slug":"installing-freeswitch-pick-your-path-binary-packages-or-source-build","status":"publish","type":"post","link":"https:\/\/phonesstillexist.com\/index.php\/2026\/04\/24\/installing-freeswitch-pick-your-path-binary-packages-or-source-build\/","title":{"rendered":"Installing FreeSWITCH: Pick Your Path \u2014 Binary Packages or Source Build"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/phonesstillexist.com\/wp-content\/uploads\/2026\/04\/freeswitch-header-1600x840-1-1024x538.png\" alt=\"\" class=\"wp-image-133\" srcset=\"https:\/\/phonesstillexist.com\/wp-content\/uploads\/2026\/04\/freeswitch-header-1600x840-1-1024x538.png 1024w, https:\/\/phonesstillexist.com\/wp-content\/uploads\/2026\/04\/freeswitch-header-1600x840-1-300x158.png 300w, https:\/\/phonesstillexist.com\/wp-content\/uploads\/2026\/04\/freeswitch-header-1600x840-1-768x403.png 768w, https:\/\/phonesstillexist.com\/wp-content\/uploads\/2026\/04\/freeswitch-header-1600x840-1-1536x806.png 1536w, https:\/\/phonesstillexist.com\/wp-content\/uploads\/2026\/04\/freeswitch-header-1600x840-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>What is FreeSWITCH?<\/strong><\/p>\n\n\n\n<p>FreeSWITCH is a powerful, open-source communication platform designed to route and interconnect popular communication protocols such as audio and video. Originally released in 2006, it has been in production for over 20 years and serves as the foundation for some of the world&#8217;s largest communication service providers, including Twilio, Five9, and Zoom. Current estimates suggest FreeSWITCH powers communication for over 300 million daily users globally.<\/p>\n\n\n\n<p>Being open source, anyone can download and install the platform. Many enterprises shudder at the words &#8220;open source,&#8221; but one thing that makes FreeSWITCH unique is that you can purchase support directly from the team that wrote the application, making it ideal for enterprise use. Head over to <a href=\"https:\/\/signalwire.com\">https:\/\/signalwire.com<\/a> to learn more.<\/p>\n\n\n\n<p>If we&#8217;re going to build something cool with FreeSWITCH, first we need to install it. In this guide, we&#8217;ll cover two ways to install FreeSWITCH: installing via binary packages and compiling from source.<\/p>\n\n\n\n<p>Note: For these examples, I\u2019m using Debian 12 (Bookworm).  As of this writing, binary packages do not exist for Debian 13 (Trixie).<\/p>\n\n\n\n<p>I&#8217;ve also created scripts automating the procedures below, which can be found on my GitHub:  <a href=\"https:\/\/github.com\/thevoiceguy\/freeswitch_tools\">https:\/\/github.com\/thevoiceguy\/freeswitch_tools<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Installing FreeSWITCH via Binary Packages (Recommended)<\/strong><\/p>\n\n\n\n<p>This is the easiest and most stable installation method for most production systems. It uses the official SignalWire FreeSWITCH package repository and installs FreeSWITCH through standard Debian packages rather than compiling from source. A SignalWire Personal Access Token (PAT) is required to access the pre-built FreeSWITCH binaries, which you can generate for free from your SignalWire account.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Prerequisite \u2014 Create a SignalWire Personal Access Token<\/strong><\/p>\n\n\n\n<p>Before installing FreeSWITCH, create a SignalWire Personal Access Token.<\/p>\n\n\n\n<p>Log in to SignalWire, then:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open your SignalWire Space.<\/li>\n\n\n\n<li>Navigate to Personal Access Tokens.<\/li>\n\n\n\n<li>Click Create Token.<\/li>\n\n\n\n<li>Copy the token. It will look something like: pt_xxxxxxxxxxxx<\/li>\n<\/ol>\n\n\n\n<p>\u26a0\ufe0f Treat this token like a password. Anyone with access to it can authenticate against the SignalWire FreeSWITCH package repository using your account.<\/p>\n\n\n\n<p>\u26a0\ufe0f Be sure to save this token as you will not be able to see it again.  If lost, you&#8217;ll need to generate a new one.  <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 1 \u2014 Become root and set your token<\/strong><\/p>\n\n\n\n<p>The installation steps require root privileges. The easiest approach is to open a root shell and export your token once:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo -i\nexport TOKEN=pt_xxxxxxxxxxxx<\/code><\/pre>\n\n\n\n<p>Replace pt_xxxxxxxxxxxx with your real SignalWire PAT.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 2 \u2014 Install prerequisites<\/strong><\/p>\n\n\n\n<p>Install the basic tools needed to fetch the repository signing key and configure apt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export DEBIAN_FRONTEND=noninteractive\napt-get update\napt-get install -y --no-install-recommends gnupg2 wget lsb-release ca-certificates<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 3 \u2014 Detect your Debian codename<\/strong><\/p>\n\n\n\n<p>SignalWire&#8217;s Debian repository is organized by Debian codename, such as bookworm or bullseye. Detect the codename automatically:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CODENAME=\"$(lsb_release -sc)\"\necho \"Using codename: $CODENAME\"<\/code><\/pre>\n\n\n\n<p>For Debian 12, this should return bookworm.<\/p>\n\n\n\n<p>Ubuntu note: If you are running Ubuntu, lsb_release -sc will return an Ubuntu codename such as jammy or noble. The SignalWire FreeSWITCH Debian repository expects a Debian codename, so you may need to override it manually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CODENAME=bookworm<\/code><\/pre>\n\n\n\n<p>For best results, use Debian 12 directly when installing FreeSWITCH from the official binary packages.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 4 \u2014 Download the SignalWire repository signing key<\/strong><\/p>\n\n\n\n<p>Download the SignalWire FreeSWITCH repository signing key. The username is literally signalwire, and the password is your PAT:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget --quiet \\\n  --http-user=signalwire \\\n  --http-password=\"$TOKEN\" \\\n  -O \/usr\/share\/keyrings\/signalwire-freeswitch-repo.gpg \\\n  https:&#47;&#47;freeswitch.signalwire.com\/repo\/deb\/debian-release\/signalwire-freeswitch-repo.gpg\n\nchmod 644 \/usr\/share\/keyrings\/signalwire-freeswitch-repo.gpg<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 5 \u2014 Configure apt authentication<\/strong><\/p>\n\n\n\n<p>Apt needs to authenticate to the SignalWire repository each time it pulls packages. Create an apt auth file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/apt\/auth.conf.d\ncat &gt; \/etc\/apt\/auth.conf.d\/signalwire.conf &lt;&lt;EOF\nmachine freeswitch.signalwire.com\nlogin signalwire\npassword ${TOKEN}\nEOF\nchmod 600 \/etc\/apt\/auth.conf.d\/signalwire.conf<\/code><\/pre>\n\n\n\n<p>The chmod 600 is important because this file contains your PAT.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 6 \u2014 Add the SignalWire FreeSWITCH repository<\/strong><\/p>\n\n\n\n<p>Create the FreeSWITCH apt source file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/apt\/sources.list.d\/freeswitch.list &lt;&lt;EOF\ndeb     &#91;signed-by=\/usr\/share\/keyrings\/signalwire-freeswitch-repo.gpg] https:\/\/freeswitch.signalwire.com\/repo\/deb\/debian-release\/ ${CODENAME} main\ndeb-src &#91;signed-by=\/usr\/share\/keyrings\/signalwire-freeswitch-repo.gpg] https:\/\/freeswitch.signalwire.com\/repo\/deb\/debian-release\/ ${CODENAME} main\nEOF<\/code><\/pre>\n\n\n\n<p>Then refresh apt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt-get update<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 7 \u2014 Install FreeSWITCH<\/strong><\/p>\n\n\n\n<p>Install FreeSWITCH and the official module set:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt-get install -y freeswitch-meta-all<\/code><\/pre>\n\n\n\n<p>The freeswitch-meta-all package pulls in FreeSWITCH plus the standard set of official modules. It can be a large install, so this step may take a few minutes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 8 \u2014 Enable and start FreeSWITCH<\/strong><\/p>\n\n\n\n<p>The package install includes a systemd service. Enable and start FreeSWITCH:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl enable --now freeswitch<\/code><\/pre>\n\n\n\n<p>If the service fails to start, check the logs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>journalctl -u freeswitch -e<\/code><\/pre>\n\n\n\n<p>You can also follow the logs live:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>journalctl -u freeswitch -f<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 9 \u2014 Verify the installation<\/strong><\/p>\n\n\n\n<p>Check the service status:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status freeswitch<\/code><\/pre>\n\n\n\n<p>Open the FreeSWITCH CLI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fs_cli<\/code><\/pre>\n\n\n\n<p>Inside fs_cli, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>status<\/code><\/pre>\n\n\n\n<p>You should see the running FreeSWITCH version, uptime, session counts, and other runtime details. To exit fs_cli, type \/exit or press Ctrl+D.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Useful Information<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Service status: systemctl status freeswitch<\/li>\n\n\n\n<li>Interactive CLI: fs_cli<\/li>\n\n\n\n<li>Config directory: \/etc\/freeswitch<\/li>\n\n\n\n<li>Logs: journalctl -u freeswitch<\/li>\n\n\n\n<li>Apt auth file: \/etc\/apt\/auth.conf.d\/signalwire.conf<\/li>\n\n\n\n<li>Apt source file: \/etc\/apt\/sources.list.d\/freeswitch.list<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Prefer a one-shot script?<\/strong><\/p>\n\n\n\n<p>If you&#8217;d rather not run the commands manually, my repo includes a helper script named install-freeswitch-token.sh.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/thevoiceguy\/freeswitch_tools\">https:\/\/github.com\/thevoiceguy\/freeswitch_tools<\/a><\/p>\n\n\n\n<p>Make it executable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x install-freeswitch-token.sh<\/code><\/pre>\n\n\n\n<p>Run it with your SignalWire PAT:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo TOKEN=pt_xxxxxxxxxxxx .\/install-freeswitch-token.sh<\/code><\/pre>\n\n\n\n<p>Or pass the token as the first argument:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo .\/install-freeswitch-token.sh pt_xxxxxxxxxxxx<\/code><\/pre>\n\n\n\n<p>The script automates the same process covered above:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Installs the required apt tools.<\/li>\n\n\n\n<li>Detects the Debian codename.<\/li>\n\n\n\n<li>Downloads the SignalWire repository signing key.<\/li>\n\n\n\n<li>Configures apt authentication using your PAT.<\/li>\n\n\n\n<li>Adds the SignalWire FreeSWITCH repository.<\/li>\n\n\n\n<li>Installs freeswitch-meta-all.<\/li>\n\n\n\n<li>Enables and starts the FreeSWITCH service.<\/li>\n\n\n\n<li>Verifies that fs_cli is available.<\/li>\n<\/ol>\n\n\n\n<p><strong>Installing FreeSWITCH from Source<\/strong><\/p>\n\n\n\n<p>Compiling FreeSWITCH from source takes longer than the binary method, but it gives you full control over which modules are built, lets you pin a specific version, and avoids the SignalWire token requirement entirely. This is the right approach if you want to customize the build, run a version that isn&#8217;t in the binary repo, or simply prefer building critical infrastructure from source.<\/p>\n\n\n\n<p>This guide targets Debian 12 and Ubuntu 22.04 \/ 24.04. We&#8217;ll build FreeSWITCH v1.10.12, but you can swap in any tagged version.<\/p>\n\n\n\n<p>\u26a0\ufe0f Compiling takes time. On a modest VM, expect 20\u201340 minutes for the full build. On a beefier box with lots of cores, expect closer to 10 minutes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 1 \u2014 Become root<\/strong><\/p>\n\n\n\n<p>All the build steps require root privileges. Open a root shell:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo -i<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 2 \u2014 Set up your build variables<\/strong><\/p>\n\n\n\n<p>These are few variables used throughout the guide. Setting them once keeps the commands clean:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FS_VERSION=v1.10.12\nBUILD_DIR=\/usr\/src\nPREFIX=\/usr\/local\/freeswitch\nJOBS=$(nproc)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FS_VERSION is the FreeSWITCH git tag to build. v1.10.12 is the current stable release at the time of writing.<\/li>\n\n\n\n<li>BUILD_DIR is where source trees will live.<\/li>\n\n\n\n<li>PREFIX is where the compiled FreeSWITCH will be installed.<\/li>\n\n\n\n<li>JOBS tells make how many parallel build jobs to run. $(nproc) uses all available CPU cores.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 3 \u2014 Install build dependencies<\/strong><\/p>\n\n\n\n<p>FreeSWITCH has a long list of build-time dependencies \u2014 compilers, autotools, and the development headers for every codec and library it can link against. Install them all in one shot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export DEBIAN_FRONTEND=noninteractive\napt-get update\napt-get install -y --no-install-recommends \\\n  git build-essential cmake automake autoconf libtool libtool-bin pkg-config \\\n  ca-certificates wget unzip uuid-dev \\\n  libssl-dev zlib1g-dev libdb-dev libsqlite3-dev libcurl4-openssl-dev \\\n  libpcre3-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev \\\n  libtiff-dev libjpeg-dev libopus-dev libsndfile1-dev libavformat-dev \\\n  libswscale-dev libswresample-dev libpq-dev liblua5.2-dev \\\n  yasm nasm<\/code><\/pre>\n\n\n\n<p>This pulls in roughly 300 MB of packages, so give it a minute.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 4 \u2014 Build libks<\/strong><\/p>\n\n\n\n<p>libks is a SignalWire-maintained foundational library that FreeSWITCH depends on. Clone it, build it, and install it into \/usr so the rest of the build can find it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \"$BUILD_DIR\"\ngit clone https:\/\/github.com\/signalwire\/libks.git || true\ncd libks\ngit pull --ff-only\ncmake . -DCMAKE_INSTALL_PREFIX=\/usr\nmake -j\"$JOBS\"\nmake install<\/code><\/pre>\n\n\n\n<p>The <code>|| true<\/code> on the clone lets you re-run the script safely if the directory already exists.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 5 \u2014 Build sofia-sip<\/strong><\/p>\n\n\n\n<p>sofia-sip is the SIP stack FreeSWITCH uses for all SIP signaling. Build it the same way:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \"$BUILD_DIR\"\ngit clone https:\/\/github.com\/freeswitch\/sofia-sip.git || true\ncd sofia-sip\ngit pull --ff-only\n.\/bootstrap.sh\n.\/configure --prefix=\/usr\nmake -j\"$JOBS\"\nmake install<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 6 \u2014 Build spandsp (pinned)<\/strong><\/p>\n\n\n\n<p>spandsp handles DSP tasks like fax, DTMF, and tone generation. There&#8217;s a catch here: in June 2023, spandsp&#8217;s upstream renamed some V18 mode constants and changed the v18_init() function signature. FreeSWITCH 1.10.12&#8217;s mod_spandsp was written against the older API and won&#8217;t compile against newer spandsp.<\/p>\n\n\n\n<p>The fix is to pin spandsp to the commit immediately before that breaking change:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \"$BUILD_DIR\"\ngit clone https:\/\/github.com\/freeswitch\/spandsp.git || true\ncd spandsp\ngit fetch --all --tags\ngit checkout d9681c3747ff4f56b1876557b9f6d894b7e6c18d~1\n.\/bootstrap.sh\n.\/configure --prefix=\/usr\nmake -j\"$JOBS\"\nmake install\nldconfig<\/code><\/pre>\n\n\n\n<p>The <code>~1<\/code> suffix tells git to check out the parent of that commit \u2014 in other words, the last commit before the API-breaking change landed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 7 \u2014 Clone FreeSWITCH and check out your version<\/strong><\/p>\n\n\n\n<p>Now for the main event. Clone FreeSWITCH itself and check out the tag you want to build:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \"$BUILD_DIR\"\ngit clone https:\/\/github.com\/signalwire\/freeswitch.git || true\ncd freeswitch\ngit fetch --tags\ngit checkout \"$FS_VERSION\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 8 \u2014 Disable mod_signalwire<\/strong><\/p>\n\n\n\n<p>Before building, disable mod_signalwire. This module connects FreeSWITCH to SignalWire&#8217;s cloud platform and requires the proprietary signalwire-client-c library, which is only available from SignalWire&#8217;s token-gated repo. If you&#8217;re compiling from source, you almost certainly don&#8217;t want this module \u2014 comment it out:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/bootstrap.sh -j\nsed -i 's|^applications\/mod_signalwire|#applications\/mod_signalwire|' modules.conf<\/code><\/pre>\n\n\n\n<p>The <code>.\/bootstrap.sh -j<\/code> generates modules.conf (and the rest of the build system), so you need to run it before editing the file.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 9 \u2014 Configure and build FreeSWITCH<\/strong><\/p>\n\n\n\n<p>Configure the build with your chosen prefix and PostgreSQL support, then compile:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/configure --prefix=\"$PREFIX\" \\\n  --enable-core-pgsql-support \\\n  --disable-dependency-tracking\nmake -j\"$JOBS\"\nmake install<\/code><\/pre>\n\n\n\n<p>This is the long step. Grab a coffee, go for a walk, or just watch the compiler output scroll by.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 10 \u2014 Install default sounds and music-on-hold<\/strong><\/p>\n\n\n\n<p>FreeSWITCH ships with a large library of prompts and hold music. Install the default 8 kHz sounds (good enough for most telephony use) and the default music-on-hold tracks:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>make cd-sounds-install cd-moh-install\nldconfig<\/code><\/pre>\n\n\n\n<p>If you want higher-quality 16 kHz, 32 kHz, or 48 kHz sound packs, you can run <code>make hd-sounds-install<\/code>, <code>make uhd-sounds-install<\/code>, or <code>make cd-sounds-install<\/code> variants with different rates \u2014 but 8 kHz is the safe default.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 11 \u2014 Create the freeswitch user and fix ownership<\/strong><\/p>\n\n\n\n<p>Running FreeSWITCH as root is a bad idea. Create a dedicated system user and hand over ownership of the install directory:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>id -u freeswitch &gt;\/dev\/null 2&gt;&amp;1 || useradd --system --home \"$PREFIX\" --shell \/sbin\/nologin freeswitch\nchown -R freeswitch:freeswitch \"$PREFIX\"<\/code><\/pre>\n\n\n\n<p>The <code>id<\/code> check makes this safe to re-run \u2014 it won&#8217;t fail if the user already exists.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 12 \u2014 Create a systemd service<\/strong><\/p>\n\n\n\n<p>The source install doesn&#8217;t ship a systemd unit, so we&#8217;ll create one. This unit runs FreeSWITCH as the freeswitch user with the ulimits it expects (large file descriptor limits, unlimited core dumps, real-time scheduling):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;\/etc\/systemd\/system\/freeswitch.service &lt;&lt;EOF\n&#91;Unit]\nDescription=FreeSWITCH Telephony Platform\nAfter=network-online.target\nWants=network-online.target\n\n&#91;Service]\nType=forking\nUser=freeswitch\nGroup=freeswitch\nLimitCORE=infinity\nLimitNOFILE=100000\nLimitNPROC=60000\nLimitSTACK=250000\nLimitRTPRIO=infinity\nLimitRTTIME=7000000\nExecStart=${PREFIX}\/bin\/freeswitch -ncwait -nonat\nExecReload=${PREFIX}\/bin\/fs_cli -x reloadxml\nRestart=on-failure\nRestartSec=5\n\n&#91;Install]\nWantedBy=multi-user.target\nEOF<\/code><\/pre>\n\n\n\n<p>Reload systemd, then enable and start the service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl daemon-reload\nsystemctl enable --now freeswitch<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 13 \u2014 Add convenience symlinks<\/strong><\/p>\n\n\n\n<p>Because FreeSWITCH is installed under \/usr\/local\/freeswitch\/bin, those binaries aren&#8217;t on your PATH by default. Link them into \/usr\/local\/bin so you can run freeswitch and fs_cli from anywhere:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ln -sf \"$PREFIX\/bin\/freeswitch\" \/usr\/local\/bin\/freeswitch\nln -sf \"$PREFIX\/bin\/fs_cli\"     \/usr\/local\/bin\/fs_cli<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Step 14 \u2014 Verify the installation<\/strong><\/p>\n\n\n\n<p>Check the service is running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status freeswitch<\/code><\/pre>\n\n\n\n<p>Open the FreeSWITCH CLI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fs_cli<\/code><\/pre>\n\n\n\n<p>Inside fs_cli, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>status<\/code><\/pre>\n\n\n\n<p>You should see the FreeSWITCH version, uptime, and session counts. To exit, type \/exit or press Ctrl+D.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Useful Information<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install prefix: \/usr\/local\/freeswitch<\/li>\n\n\n\n<li>Config directory: \/usr\/local\/freeswitch\/conf<\/li>\n\n\n\n<li>Logs: \/usr\/local\/freeswitch\/log (or journalctl -u freeswitch)<\/li>\n\n\n\n<li>Service unit: \/etc\/systemd\/system\/freeswitch.service<\/li>\n\n\n\n<li>Source trees: \/usr\/src\/{libks,sofia-sip,spandsp,freeswitch}<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Prefer a one-shot script?<\/strong><\/p>\n\n\n\n<p>Everything above is bundled into a helper script in my GitHub repo named install-freeswitch.sh.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/thevoiceguy\/freeswitch_tools\">https:\/\/github.com\/thevoiceguy\/freeswitch_tools<\/a><\/p>\n\n\n\n<p>Make it executable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x install-freeswitch.sh<\/code><\/pre>\n\n\n\n<p>Run it with the default version (v1.10.12):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo .\/install-freeswitch.sh<\/code><\/pre>\n\n\n\n<p>Or specify a different FreeSWITCH version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo .\/install-freeswitch.sh v1.10.11<\/code><\/pre>\n\n\n\n<p>The script automates the entire process covered above:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verifies you&#8217;re running as root on Debian or Ubuntu.<\/li>\n\n\n\n<li>Installs all build dependencies.<\/li>\n\n\n\n<li>Clones and builds libks.<\/li>\n\n\n\n<li>Clones and builds sofia-sip.<\/li>\n\n\n\n<li>Clones and builds spandsp (pinned to a compatible commit).<\/li>\n\n\n\n<li>Clones FreeSWITCH and checks out the chosen version.<\/li>\n\n\n\n<li>Disables mod_signalwire.<\/li>\n\n\n\n<li>Configures, compiles, and installs FreeSWITCH.<\/li>\n\n\n\n<li>Installs default sounds and music-on-hold.<\/li>\n\n\n\n<li>Creates the FreeSWITCH system user.<\/li>\n\n\n\n<li>Writes and enables a systemd service.<\/li>\n\n\n\n<li>Adds convenience symlinks for FreeSwitch and fs_cli.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is FreeSWITCH? FreeSWITCH is a powerful, open-source communication platform designed to route and interconnect popular communication protocols such as audio and video. Originally released&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/phonesstillexist.com\/index.php\/2026\/04\/24\/installing-freeswitch-pick-your-path-binary-packages-or-source-build\/\">Continue reading<span class=\"screen-reader-text\">Installing FreeSWITCH: Pick Your Path \u2014 Binary Packages or Source Build<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":41,"footnotes":""},"categories":[12],"tags":[],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-freeswitch","entry"],"_links":{"self":[{"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":14,"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"predecessor-version":[{"id":134,"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/posts\/119\/revisions\/134"}],"wp:attachment":[{"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/phonesstillexist.com\/index.php\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}