Self-hosted PBX for Ubuntu 24.04

A phone system that runs on your server

MonoPbx is a SIP PBX with its core written in Rust, rtpengine carrying the audio, a console in the browser and apps for iOS, Android and macOS. You install it with one command. The recordings, the call history and the config stay on your disk.

We built it because we wanted a PBX we could set up in an afternoon and still understand a year later.

7 days free, then a licence.

MonoPbx web console, Call history page: filters for direction, result, dates and numbers, export to CSV, XLSX and PDF, and a list of internal calls between extensions 103, 104 and 106 with result and talk time.
Call history in the web console. Test calls on our lab PBX.

What is in the box

Every install gets every feature. There are no editions to compare and no add-ons to buy.

Calls

SIP trunks and DIDs, a dial plan that turns what people dial into E.164, office hours, forwarding, transfer, park and pickup. The B2BUA is ours, written in Rust; rtpengine moves the audio.

SIP 5060 UDP/TCP · TLS 5061 · WSS /sip
Opus · G.722 · G.711 · G.729

Queues

Queues and ring groups, queue callbacks, wallboards and supervisor tools. Agents log in and out with a code from any phone.

*62 log in · *63 log out

IVR and call flows

IVR menus with dial-by-extension and a prompt library: upload MP3, WAV or Ogg, or record the greeting in the browser. When a menu is not enough, draw the flow on a canvas, simulate a call and publish it as a new version.

Voicemail and recording

Personal and shared mailboxes, voicemail to e-mail. Recording by rule or on demand, with consent announcements, pause, retention and legal hold. Recordings are encrypted on disk.

Inbox

SMS, WhatsApp, Facebook Messenger, Telegram and a live-chat widget for your website arrive in one shared inbox. Team chat sits next to it.

Desk phones

Provisioning by MAC address for Yealink, Grandstream, Cisco MPP, Fanvil, Snom, Poly and Htek, with line and BLF keys. Set DHCP option 66 once and new phones configure themselves.

https://<your host>/prov/

MonoPbx Reports page: extension statistics for the last 7 days with calls placed, answered, received, missed and talk times per extension, and buttons to export CSV, XLSX and PDF.
Reports, extension statistics for the last 7 days. Each report exports to CSV, XLSX and PDF.
Fax

Send a PDF from the web client. Incoming faxes arrive by e-mail.

Reports

Call history and CDR in ClickHouse, queue and agent reports, export to CSV, XLSX and PDF. An audit log, and a change history you can revert a setting from.

Several companies

One install can host many companies, each with its own users, numbers and settings, kept apart row by row in PostgreSQL.

API

A REST API with an OpenAPI document, signed webhooks, an events WebSocket and an MCP server for AI tools.

AI, if you want it

Off until a company turns it on. Voice agents as a step in a call flow, transcripts, call summaries and help for the agent during the call. You bring the key: Anthropic Claude by default, or any OpenAI-compatible API.

Languages

The console and the apps speak English, Spanish (Mexico), Portuguese (Brazil), French, German, Italian, Russian, Chinese and Japanese.

Every short code is a setting

Feature codes start with * and have the defaults below. A company can change any of them on the Dial codes page; the change applies from the next call. The browser phone reads the company’s real codes.

DialWhat happens
*00 … *09Park the call on slot 0 to 9
*10 … *19Take the oldest call parked on that slot
*20*102Pick up the call ringing extension 102
*61 / *60Do not disturb on / off
*86Your voicemail
*22Test call: the PBX hangs up and calls you back with music
*62 / *63Log in to / out of every queue you belong to
*35 / *36Force your office hours open / closed
MonoPbx Dial codes and parking page: park code 0, unpark code 1, ten parking orbits, and fields for directed pickup, intercom, do not disturb and office-hours codes.
Dial codes and parking, in the admin console.

MonoPhone, on the phone people already carry

Native apps for iOS, Android and macOS, and a WebRTC softphone inside the web client for everyone else.

An incoming call wakes the phone through VoIP push on iOS and a high-priority message on Android, so the app does not have to stay open. People sign in by scanning a QR code from the web client. Nobody types a SIP password.

A call keeps going when the phone moves from Wi-Fi to mobile data. Hold, transfer, park, record, add a call, voicemail, presence and chat are all in the app. CarPlay and Android Auto work too.

iOS · Android · macOS · Browser (WebRTC) · CarPlay · Android Auto

MonoPhone dialer on a phone. MonoPhone during a call, with mute, keypad, speaker, hold, add call, transfer, record and park buttons. MonoPhone team chat.

Works with

Caller pop-ups, call logging and click-to-call for your CRM and help desk. Credentials are sealed with your company key and never shown again.

Today: HubSpot, Salesforce, Zoho CRM, Pipedrive, Odoo, Zendesk, Jira, any CRM with an HTTP API, Microsoft 365 and LDAP / Active Directory directories, OpenID Connect sign-on, Twilio or any HTTP SMS API, WhatsApp, Messenger, Telegram, webhooks, MCP.

In development, not released: Microsoft Teams, Kommo, Bitrix24, Zapier, Make, n8n, Freshdesk, ServiceNow, Slack, Shopify, WooCommerce, Mercado Libre, Stripe, Mercado Pago, SCIM, a browser extension.

Install

On a fresh Ubuntu 24.04 server with a public IP, run:

curl -fsSL https://ilinaya.github.io/monopbx-apt/install.sh | sudo bash

Setup asks for an e-mail address for the Let’s Encrypt certificate. Add your own domain too; without --domain the server is named <ip>.sslip.io:

curl -fsSL https://ilinaya.github.io/monopbx-apt/install.sh | sudo bash -s -- --domain pbx.example.com --email you@example.com

Then

  1. Open the console. The installer finishes by printing your console address and a one-time setup link. Lost it? sudo monopbx setup-url prints a new one.
  2. Create your account. E-mail, password, then a code from your authenticator app. This is the first administrator of your PBX.
  3. Your 7-day free trial starts. Everything is switched on. Add a SIP trunk, create extensions, and sign in to MonoPhone with the QR code.
ubuntu@pbx:~What the end of the install looks like
curl -fsSL https://ilinaya.github.io/monopbx-apt/install.sh | sudo bash -s -- --domain pbx.example.com --email you@example.com
==> Prerequisites
==> MonoPbx APT repository: https://ilinaya.github.io/monopbx-apt
    signing key verified: 320D C78E FDC8 439C 04F5  FCA6 3E87 FE3D 4C71 5372
==> Installing monopbx (with Ubuntu's docker.io and docker-compose-v2 unless Docker is already installed)
    monopbx 0.1.0~edge
==> monopbx setup --domain pbx.example.com --email you@example.com
    …
==> MonoPbx is ready
    console:        https://pbx.example.com
    web softphone:  wss://pbx.example.com/sip
    SIP:            pbx.example.com port 5060 (UDP/TCP), 5061 (TLS)
    first admin:    open the single-use setup link printed above (.../setup#token=...)
    manage:         monopbx status | logs | sudo monopbx backup | upgrade | uninstall

Requirements

System
Ubuntu 24.04 LTS, amd64. Other systems are refused and nothing is changed.
Machine
2 CPUs, 4 GB RAM, 20 GiB free under /var/lib
Network
A public IP. A DNS name is optional.

Ports

80/tcpCertificate challenge, redirect to HTTPS
443/tcpConsole, API, browser phone (wss://…/sip)
5060 udp+tcpSIP
5061/tcpSIP over TLS
30000–40000/udpRTP audio. Without it calls connect but nobody hears anything.

If ufw is active, setup opens these ports. Open the same ones in your cloud firewall.

Not on Ubuntu? There is a Docker Compose bundle (also for arm64) and plain Kubernetes manifests with Kustomize. Docker Compose guide · Kubernetes guide · Full install guide

Pricing

You pay for simultaneous calls, not for users. Every tier has unlimited users and every feature: AI agents with your own key, the contact centre, the inbox, the apps and the integrations.

Simultaneous callsPer year (USD)
4$199
8$249
16$499
32$899
64$1,599
128+Write to us
  • Calls between your own phones never count.
  • Monthly billing costs about 20% more.
  • Hosting several companies on one install: the same tiers, plus $5 per company per month.
  • Every plan starts with a 7-day free trial after you install. You buy the licence in the console.

Priced by simultaneous calls, like 3CX, with every feature included.

Where your data lives

On your disk
Configuration, recordings, voicemail, chats and call history live in your PostgreSQL, your ClickHouse and your storage. Nothing passes through us to make a call.
One exception: push
To wake a phone for an incoming call, your server sends a notification through the MonoPbx push relay. Install with --no-relay and the apps ring only while they are open.
Encrypted at rest
Recordings and files are encrypted on disk by default. CRM and provider credentials are sealed with your company key.
Sign-in
Two-factor sign-in, OpenID Connect single sign-on and an IP allow-list for administrators.
The SIP edge
Geo blocking, allow and deny lists, automatic bans, and STIR/SHAKEN for caller ID.
Backups
Encrypted, on a schedule, and they restore onto a new host. sudo monopbx backup takes one now.

Questions

Is it ready for production?

The APT repository carries preview builds (0.1.0~edge) until we tag the first release. The docs say plainly what works today and what is still planned, page by page. Try it on a spare server first.

What happens after the 7 days?

You buy a licence in the console, sized by how many calls you need at the same time. Prices are in the Pricing section above.

Do I need my own domain?

No. Without --domain the server is named after its IP on sslip.io and still gets a real certificate. Use your own name when you have one.

How do upgrades work?

sudo apt-get upgrade. The package takes a pg_dump first, runs the migrations and a self-test, and rolls back on its own if the upgrade fails.

Which desk phones work?

There are provisioning templates for Yealink, Grandstream, Cisco MPP, Fanvil, Snom, Poly and Htek. Any standards-based SIP phone can register by hand.

Which AI providers can I use?

Anthropic Claude by default, or any API compatible with OpenAI chat completions. Each company brings its own key. AI is off until a company turns it on.