Docs Sales Partners 6X Switch Self-Hosted: Installation & Setup Guide

6X Switch Self-Hosted: Installation & Setup Guide

The full walkthrough for installing 6X Switch — a true one-command bootstrap for a blank Debian 12 server, or the standalone installer if you already run FreeSWITCH/Docker your own way.


See Self-Hosted Pricing →

Your Own Switch, Still On 6X's Rails

A self-hosted 6X Switch install runs the exact same wholesale voice/SMS routing engine on your own server instead of 6X's — your own dedicated hardware, your own network, zero shared infrastructure. Your portal, billing, and white-label branding all stay exactly where they already work today: centrally, on 6X's platform. Only the call/SMS routing engine itself moves.

Before You Start — Pick Your Path

Most customers want a server that runs only 6X Switch — nothing else already on it. If that's you, all you need is a blank, dedicated Debian 12 (bookworm) server with root access and a public IP — the installer handles FreeSWITCH, Docker, and everything else itself.

Already running FreeSWITCH and Docker on this box your own way (a shared server, not a dedicated one)? You'll need those two plus Python 3 and the sqlite3 CLI already in place — 6X's installer only adds its own layer on top, it never touches an existing setup.

Get Your Installation Key

Ask 6X to provision your account as a self-hosted Switch partner. You'll be given a unique installation key generated specifically for your box — treat it like a password, it authenticates your server for billing, rate sync, and CDR posting.

Run The Installer

Blank Debian 12 server, only 6X on it (most customers):

sudo ./bootstrap.sh <your-installation-key>

Genuinely one command from a blank box. Compiles FreeSWITCH from source (the official packaged repo now needs a separate SignalWire account, so source avoids that extra sign-up step entirely), installs Docker/Python3/sqlite3, then finishes by running install.sh itself. Long — 30-60+ minutes depending on hardware, since it's building FreeSWITCH from scratch — that's expected, walk away and check back. Refuses to run on anything but Debian 12, and refuses if FreeSWITCH is already present.

Already have FreeSWITCH/Docker set up your own way:

sudo ./install.sh <your-installation-key>

Checks your prerequisites, writes your local config, initializes the local cache database, wires the dialplan into FreeSWITCH, starts the SMS engine via Docker, and installs the background sync service. This is also exactly what bootstrap.sh runs at the end, so both paths end up here.

journalctl -u 6x-switch-sync -f

Watch it come online. The sync service polls 6X every 30 seconds for your vendor list, rates, and customer balances — your box won't accept its first call until the first successful sync lands, which is expected, not an error.

How Billing Works

Your box checks a customer's balance locally before routing a call — fast, no network round-trip needed per call. The moment a call ends, it reports back to 6X the same way a centrally-hosted call already does, and that's what actually bills the customer — 6X's billing records are always the source of truth, your local copy just gets corrected on the next sync.

If your connection drops: your box keeps running normally on its last-known data for 60 minutes — long enough to ride out any realistic network hiccup. Past that window, it stops accepting new calls until the connection recovers. There's no local override, by design — a short cushion protects your day-to-day service, and the eventual stop protects both sides from billing against numbers that might be badly out of date.

Softphone, Broadcast, and Dialer Capacity

Your 6X Softphone and any Voice Broadcast / Power Dialer / Predictive Dialer campaigns always route through 6X's central servers, not your own box — on purpose, since it keeps billing and vendor routing correct against your own account exactly like a call your box handled directly. Your box reports how many sessions it's currently using every 30 seconds, and 6X reserves the rest of your session limit for that centrally-routed traffic. If your box goes quiet for more than 5 minutes, centrally-routed sessions pause until it reports in again — your box's own direct trunk calls are unaffected.

Keeping Your Box Updated

Central 6X updates reach you automatically, same as every customer. Code that runs directly on your box only changes when you run it yourself — when 6X releases an appliance update, re-download the package and run:

sudo ./update.sh

It backs up everything it's about to replace first, updates only the routing/sync code, and restarts the sync service — your installation key and live local balance cache are never touched. Safe to run any time; it does nothing if you're already current.

Troubleshooting

The sync service won't start. Check /opt/6x-switch/config.env has your real installation key, not the placeholder value.

Calls are rejected with no route found. Confirm at least one vendor is active on your account and a sync has completed successfully (journalctl -u 6x-switch-sync).

I lost my installation key. Ask 6X to regenerate it — the old one stops working the instant a new one is issued, so update config.env as soon as you get the replacement.

Does my portal or branding change at all? No. Your login, dashboard, logo, colors, and custom domain are all served from 6X's platform, completely independent of where your call traffic physically runs.

See the main 6X Softswitch guide for pricing and how self-hosted compares to hosted.

Was this article helpful?