Deployment guide · Self-hosted

6X Switch — install on your own server

Everything you need to run your own wholesale voice + SMS switch on hardware you control, while your account, billing, and branding stay managed on 6X's platform exactly the way they already are.

⏱ ~20–40 min install 🖥 1 Linux server 🔑 1 command to run 🏷 Fully whitelabel — your brand, day one

Your own switch, still on 6X's rails

6X Switch is the same wholesale termination engine 6X runs for every centrally-hosted Switch partner — least-cost routing, balance enforcement, CLI handling, CDR billing — just running on a server you own instead of 6X's. Nothing about your portal, pricing page, logo, live chat widget, or custom domain changes: those are served from 6X's platform today and keep working exactly the same way after you install.

What moves to your box is the call-routing and SMS-routing engine itself. It phones home for billing and rate updates, the same trust relationship any 6X wholesale account already has — just running closer to your own network.

Your server
  • Voice engine
  • SMS engine
  • Local rate/balance cache
sync every 30s CDRs on every call
6X platform
  • Your portal & branding
  • Billing & balances
  • Vendor rates you own

How this compares to a centrally-hosted 6X Switch account:

CapabilityHostedSelf-Hosted
Where it runs6X's own serversYour own hardware, your own network
Dedicated IPProvisioned by 6X, ready in hoursNot applicable — no IP-availability wait at all, it's already your box
Setup6X provisions your sofia profile + IPYou run one installer script (this guide), free walkthrough included
Base price (same session tiers)Starter $150 · Growth $300Starter $75 · Growth $150 — half the rent, you provide the box
Billing & portal brandingCentrally managed by 6XIdentical — same portal, same billing, same branding, only the routing engine moves
Vendor pool, session cap, LCR engineIsolated, yours aloneIsolated, yours alone — same engine, running on your box
Ongoing infra/network supportIncluded — it's 6X's hardwareAvailable on request as a separate paid conversation — it's your hardware

Current pricing for both: softswitch.6xcom.com.

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 server with root access, a public IP, and enough capacity for your expected call/SMS volume. The installer handles the voice engine, Docker, and everything else itself — see Install below.

Already running a voice engine and Docker on this box your own way — a shared server, not a dedicated one? Then you'll need those two, plus Python 3 and the sqlite3 CLI, already in place first; 6X's installer only adds its own layer on top and won't touch what's already there.

One credential, generated once

Contact your 6X account manager and ask to be provisioned as a self-hosted Switch partner. There's nothing for you to do on 6X's side — once set up, you'll be handed one value:

# a 64-character key, unique to your account
switch_installation_key = 3f7a1e9c... (example — yours will differ)
i

Treat it like a password This one key authenticates every sync and every call your box bills through — it's tied directly to your account. Don't commit it to a public repo or share it outside your own infrastructure team.

Run the installer

Download the appliance package, then run one command as root.

0

Download and extract the appliance package

cd /root
wget https://softswitch.6xcom.com/download -O 6x-switch-appliance.tar.gz
tar xzf 6x-switch-appliance.tar.gz
cd appliance

This creates an appliance/ folder with everything below in it. Run every command from inside that folder — bootstrap.sh and install.sh both look for their sibling files relative to wherever they're actually run from.

i

Blank Debian 12 server, only 6X on it? Use bootstrap.sh This is the one most customers want. It installs the voice engine (compiled fresh — the official package needs a separate account elsewhere, so this avoids that step entirely), Docker, and everything else, then finishes the install for you — genuinely one command, start to finish. It's a long run (30-60+ minutes, depending on your hardware) since it's building the voice engine from scratch — that's expected, walk away and check back.

i

About the <your-installation-key> part The angle brackets (< >) are a placeholder, not literal characters — a common convention in technical docs meaning "put your real value here." Replace the whole <your-installation-key>, brackets included, with the actual key 6X gave you. For example, if your key were a1b2c3...yourrealkey, you'd run sudo ./bootstrap.sh a1b2c3...yourrealkey — no < or > anywhere in the real command. Typed the brackets literally by mistake? The script now catches this itself and tells you exactly what to fix.

1

Blank server — run the full bootstrap

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

Only for a dedicated box with nothing else already on it — refuses to run if a voice engine is already present, or if this isn't Debian 12. If you already run a voice engine and Docker here your own way, skip this and use step 1b instead.

1b

Already have a voice engine/Docker set up — just add 6X

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

This checks your prerequisites are actually present, then in order: writes your local config, initializes the local cache database, wires the dialplan into the voice engine, starts the SMS engine via Docker, and installs the background sync service. This is also exactly what bootstrap.sh runs at the end of step 1, so either path ends up here.

2

Watch it come online

journalctl -u 6x-switch-sync -f

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 — that's expected, not an error.

3

Confirm it's healthy

systemctl status 6x-switch-sync

Should show active (running). Once you see a Synced OK line in the logs, your box is live and routing traffic under your own account's rates and balances.

Every call still bills through 6X

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

EventWhat happens
A call comes inYour box checks its local cache of the customer's balance — no wait on a network round-trip to 6X.
The call endsYour box posts the call record straight to 6X, which is what actually charges the customer.
Every 30 secondsYour box pulls the real, current balance back down from 6X — correcting for anything that changed since the last sync.

A 60-minute cushion, then a safe stop

If your box can't reach 6X to sync for any reason, it keeps running normally on its last-known data for 60 minutes — long enough to ride out any realistic network hiccup without your callers noticing anything. Past that window, it stops accepting new calls until the connection recovers.

✓

Why a hard stop instead of running forever Neither side can see real balance changes while disconnected. A short cushion protects your day-to-day service; the eventual stop protects both you and 6X from billing against numbers that might be badly out of date. There's no local override — call 6X if you hit it.

Two engines, one shared limit

Your 6X Softphone and any Voice Broadcast / Power Dialer / Predictive Dialer campaigns you run always route through 6X's central servers, not your own box — on purpose, since it keeps every call billing and routing through your own vendor rates exactly like a call your box handled directly. Your box's direct trunk traffic and that centrally-routed traffic are two separate engines, so 6X reserves room for both out of your one session limit: your box reports how many sessions it's currently using every 30 seconds, and 6X sets aside the rest for your Softphone/Broadcast/Dialer traffic.

✓

If your box goes quiet for more than 5 minutes 6X can no longer tell how much of your limit your box is using, so it conservatively pauses new Softphone/Broadcast/Dialer sessions until your box reports in again. Your box's own direct trunk calls are completely unaffected — this only ever touches the centrally-routed side, and only after a real gap in reporting, not a single missed check-in.

Central updates are automatic. Box updates are yours to run.

Improvements to 6X's central platform — billing, your portal, pricing, anything at app.6xcom.com — reach you the moment 6X ships them, same as every other customer. Nothing to do on your end.

Code that runs directly on your box is different, on purpose: 6X never pushes anything onto your server without you running it yourself. When 6X releases an update to the appliance package, re-download it and run:

↻

Update your box

sudo ./update.sh

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

✓

You're always in control There's no silent auto-update mechanism watching your box. If 6X tells you an update is available, it's your call when to run it — just like the install itself.

Common questions

The sync service won't start.

Check /opt/6x-switch/config.env has your real installation key, not the placeholder value — the service refuses to start with the example key still in place.

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). A box with zero synced vendors has nowhere to route calls to.

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 on your box as soon as you get the replacement.

My Softphone or a Broadcast/Dialer campaign is being rejected, but my box's own calls work fine.

Your box hasn't reported its current usage to 6X recently — check journalctl -u 6x-switch-sync for sync errors. Once reporting resumes (next successful poll, normally within 30 seconds), Softphone/Broadcast/Dialer capacity comes back automatically. See "Softphone, Broadcast, and Dialer capacity" above.

Does my customer portal or branding change at all?

No. Your login, dashboard, logo, colors, custom domain, and chat widget are all served from 6X's platform, completely independent of where your call traffic physically runs.