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.
01 · What you're installing
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.
How this compares to a centrally-hosted 6X Switch account:
| Capability | Hosted | Self-Hosted |
|---|---|---|
| Where it runs | 6X's own servers | Your own hardware, your own network |
| Dedicated IP | Provisioned by 6X, ready in hours | Not applicable — no IP-availability wait at all, it's already your box |
| Setup | 6X provisions your sofia profile + IP | You run one installer script (this guide), free walkthrough included |
| Base price (same session tiers) | Starter $150 · Growth $300 | Starter $75 · Growth $150 — half the rent, you provide the box |
| Billing & portal branding | Centrally managed by 6X | Identical — same portal, same billing, same branding, only the routing engine moves |
| Vendor pool, session cap, LCR engine | Isolated, yours alone | Isolated, yours alone — same engine, running on your box |
| Ongoing infra/network support | Included — it's 6X's hardware | Available on request as a separate paid conversation — it's your hardware |
Current pricing for both: softswitch.6xcom.com.
02 · Prerequisites
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.
bootstrap.sh
(the blank-server path) supports; it checks for this and refuses to run on
anything else. Already have a voice engine and Docker running on a different Linux
distro? Use install.sh instead — it doesn't install an OS-specific
anything, so it isn't limited to Debian.03 · Get your installation key
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)
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.
04 · Install
Download the appliance package, then run one command as root.
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.
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.
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.
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.
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.
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.
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.
05 · How billing works
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.
| Event | What happens |
|---|---|
| A call comes in | Your box checks its local cache of the customer's balance — no wait on a network round-trip to 6X. |
| The call ends | Your box posts the call record straight to 6X, which is what actually charges the customer. |
| Every 30 seconds | Your box pulls the real, current balance back down from 6X — correcting for anything that changed since the last sync. |
06 · If your connection drops
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.
07 · Softphone, Broadcast, and Dialer capacity
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.
08 · Keeping your box updated
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:
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.
09 · Troubleshooting
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.