ViciDial is the open-source contact centre suite that runs a very large share of the world's small and mid-size call centers. It is a predictive dialer, agent desktop, lead manager, recorder, and reporting system, and it costs nothing. It is also, by modern standards, an awkward piece of software with a dated interface and a configuration model that assumes you know Asterisk.
This guide gets you from an empty server to a live test call. Budget three to five hours for your first install and expect to redo it once.
Before you start: what you need
| Requirement | Minimum | Comfortable |
|---|---|---|
| RAM | 4 GB | 8-16 GB |
| vCPU | 2 | 4-8 |
| Disk | 60 GB SSD | 160 GB+ SSD |
| OS | openSUSE Leap (ViciBox) or Rocky Linux 9 | Same |
| Network | Public IPv4, unfiltered SIP/RTP | Same |
| Access | Root over SSH | Same |
| A SIP trunk | Host, username, password | Same |
You also need a public IPv4 address. ViciDial behind NAT is possible but adds an entire category of one-way-audio problems you do not want on your first install.
Route A: ViciBox (recommended)
ViciBox is an openSUSE-based ISO with ViciDial and every dependency pre-integrated. It is what the developers test against, and it turns a day of dependency wrangling into an installer.
1. Boot the ISO
Download the current ViciBox ISO from the official ViciDial download page. On a VPS, upload it as a custom ISO or use your provider's "mount ISO" console feature. On bare metal, write it to a USB stick.
Install to disk with the default partitioning unless you have a reason to deviate. Set a strong root password at this stage.
2. First boot and network
Log in as root. Confirm the box has its public IP and can reach the internet:
ip addr show
ping -c 3 1.1.1.1Set a hostname and make sure it resolves — Asterisk and MariaDB both complain otherwise:
hostnamectl set-hostname dialer.yourdomain.com
echo "127.0.0.1 dialer.yourdomain.com dialer" >> /etc/hosts3. Run the installer
ViciBox ships an interactive installer that configures the database, Asterisk, and the web interface:
vicibox-installAnswer the prompts. For a single-server setup accept the defaults for the database and let it configure this machine as both database and telephony server. When asked for the server IP, give the public address.
4. Bring up the services
vicibox-express
systemctl enable --now mariadb apache2 asteriskThen confirm the core processes are alive:
systemctl status asterisk
asterisk -rx "core show channels"Route B: Manual install on Rocky Linux 9
Use this only if you have a specific reason — a corporate standard OS, or an existing server you cannot rebuild. You will be compiling Asterisk and installing roughly 60 Perl modules.
The broad sequence:
- Install the base system with
@development-tools, MariaDB, Apache, and Perl. - Compile DAHDI, then LibPRI, then Asterisk 13 or 16 (ViciDial pins to specific branches — check the current
SVNnotes before choosing). - Install the Perl dependencies via CPAN. This is the step that eats hours.
- Check out ViciDial from its repository and run
install.pl. - Import the database schema and run
ADMIN_update_server_ip.pl.
The community-maintained scratch install documents on the ViciDial wiki are the authoritative reference and are updated more often than any blog post, including this one. Follow those for exact package lists.
Securing the box before it is on the internet
Every ViciDial install ships with well-known default credentials, and there are bots scanning for exactly this. Do these before your first coffee break.
Change the default logins
The web admin default is user 6666 with password 1234. Log into https://your-server/vicidial/admin.php and change it immediately. Then create a personal admin account and disable 6666 entirely.
Firewall everything except what you need
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=5060/udp
firewall-cmd --permanent --add-port=10000-20000/udp
firewall-cmd --reloadBetter still: restrict SIP port 5060 to only your carrier's IP addresses and your agents' office IPs. An open 5060 on a public IP will receive registration brute-force attempts within hours.
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="CARRIER_IP" port port="5060" protocol="udp" accept'Install fail2ban
zypper install fail2ban # or: dnf install fail2ban
systemctl enable --now fail2banEnable the asterisk and sshd jails. Toll fraud is the real risk here — a compromised dialer gets used to route thousands of dollars of premium-rate calls overnight, and the bill is yours.
Get HTTPS working
Agents' browsers will not grant microphone access to an insecure origin, so WebRTC softphone mode requires TLS. Point a domain at the server and:
certbot --apache -d dialer.yourdomain.comConnecting your SIP carrier
This is where your provider's credentials go. In ViciDial: Admin → Carriers → Add A New Carrier.
You fill in three text boxes that are written verbatim into Asterisk's configuration.
Registration string
Only needed if your carrier uses registration rather than IP authentication:
register => YOUR_USERNAME:YOUR_PASSWORD@sip.yourprovider.comAccount entry
[cloudyvoice]
type=friend
host=sip.yourprovider.com
username=YOUR_USERNAME
secret=YOUR_PASSWORD
fromuser=YOUR_USERNAME
fromdomain=sip.yourprovider.com
context=trunkinbound
insecure=port,invite
qualify=yes
nat=no
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
dtmfmode=rfc2833A few of these matter more than they look:
disallow=allthenallow=ulaw— pin your codec explicitly. Letting Asterisk negotiate freely is how you end up transcoding and burning CPU.canreinvite=nokeeps media flowing through your server, which you need for recording.insecure=port,invitelets the carrier send calls in without re-authenticating.nat=nois correct only on a public IP with no NAT. Behind NAT, setnat=force_rport,comediaand configureexternip.
Dialplan entry
This is what actually places the call. The _91NXXNXXXXXX pattern means "9, then 1, then a valid North American number" — the leading 9 is ViciDial's dial prefix, stripped by ${EXTEN:1}.
exten => _91NXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _91NXXNXXXXXX,n,Dial(SIP/cloudyvoice/${EXTEN:1},,tTo)
exten => _91NXXNXXXXXX,n,Hangup()For international dialing with a 9 prefix and full E.164 numbers:
exten => _9X.,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _9X.,n,Dial(SIP/cloudyvoice/${EXTEN:1},,tTo)
exten => _9X.,n,Hangup()Reload Asterisk after saving:
asterisk -rx "sip reload"
asterisk -rx "dialplan reload"
asterisk -rx "sip show registry"
asterisk -rx "sip show peers"You want to see your carrier peer as OK with a latency figure.
Creating your first campaign
1. Add a phone (agent extension)
Admin → Phones → Add A New Phone. Each agent seat needs one. Set the extension, a strong secret, and Server IP to your server. For browser-based agents using WebRTC, set the protocol accordingly; for a desktop softphone like Zoiper or MicroSIP, use SIP.
2. Add a user
Admin → Users → Add A New User. Give a user ID, password, full name, and a user group. Set the user level — level 1 is a plain agent, level 9 is full admin.
3. Add a campaign
Admin → Campaigns → Add A New Campaign. The settings that actually matter on day one:
| Setting | Start with | Why |
|---|---|---|
| Dial Method | MANUAL then RATIO | Never start predictive. Learn the flow first. |
| Auto Dial Level | 1.0 | One call per available agent. |
| Dial Prefix | 9 | Must match your dialplan pattern. |
| Campaign CallerID | Your DID | Not a spoofed number. See compliance. |
| Dial Timeout | 30 | Seconds to ring before giving up. |
| Drop Call Seconds | 3 | Abandon threshold. Regulated in several countries. |
| Local Call Time | 9am-8pm | Calling hours are legally restricted. |
| Recording | ON DEMAND | Then adjust per consent requirements. |
4. Load leads
Admin → Lists → Add A New List, then use the lead loader to upload a CSV. Map your columns to ViciDial's fields — at minimum phone_number, and ideally first_name, last_name, and any custom fields your script needs.
5. Make a test call
Log an agent in at https://your-server/agc/vicidial.php, choose the campaign, and place a manual call to your own mobile. Verify:
- Two-way audio with no delay or echo
- The call appears in Real-Time Report
- A recording is produced if enabled
- Dispositioning the call returns the agent to ready state
If you get one-way audio, the answer is almost always NAT or firewall RTP ports. If you get no audio at all, check codecs.
Tuning the predictive dialer
Once manual dialing works, move to RATIO and raise the auto-dial level slowly. The relationship you are managing:
- Too low — agents sit idle, cost per contact rises.
- Too high — calls connect with no agent free, the caller hears silence, and the call is dropped. This is the abandon rate, and it is legally capped in several jurisdictions (commonly 3% in the UK and under Ofcom rules; the US FTC applies its own limits to covered telemarketing).
Start at 1.0, move to 1.5, then 2.0, watching the drop percentage in the real-time report. ADAPT_HARD_LIMIT will manage this automatically against a target abandon rate once you have enough call volume for the statistics to mean anything — generally a few hundred calls per hour.
Common problems and their actual causes
| Symptom | Usual cause |
|---|---|
| One-way audio | RTP ports 10000-20000/UDP blocked, or NAT misconfigured |
| No audio at all | Codec mismatch — carrier wants alaw, you offered ulaw only |
| Calls fail instantly | Dialplan pattern does not match the dialed string |
sip show registry empty | Registration string wrong, or carrier uses IP auth (no registration needed) |
| Agent screen hangs | Apache or MariaDB out of memory; check free -m |
| Choppy audio under load | Server undersized, or disk I/O saturated by recordings |
| Recordings missing | canreinvite=yes let media bypass the server |
| Calls connect but drop at 30s | NAT keepalive / qualify issue, or a firewall idle timeout |
For anything Asterisk-level, the console is the fastest diagnostic:
asterisk -rvvvThen place a call and read what actually happens.
Backups
The database is your business. Leads, recordings, dispositions, and agent history all live in MariaDB.
mysqldump --single-transaction -u root -p asterisk | gzip > /backup/vici-$(date +%F).sql.gzPut that in cron nightly and copy it off the server. A dialer with no backup is one failed disk away from losing every lead and call record you own.
Where to go next
- How to start a call center with $200 — the full budget context for this build.
- VoIP fundamentals: SIP, codecs, and DIDs — what the settings above actually mean.
- Bandwidth and audio quality for call centers — sizing your connection properly.
- Compliance: TCPA, DNC, and GDPR — before your first live campaign.
When you are ready to point the carrier entry at real minutes, our rate directory is public and searchable, and accounts start at a $10 top-up with no monthly commitment.
Frequently asked questions
Is ViciDial really free?
Yes. ViciDial is released under the AGPL and the full predictive dialer, agent interface, reporting, and recording features are included at no cost. The ViciDial Group sells optional paid support, hosting, and certified hardware, but you never have to buy any of it. There is no seat licence and no feature paywall.
How many agents can one ViciDial server handle?
A 4 GB / 2 vCPU VPS comfortably runs about 10 concurrent agents with call recording enabled. A well-specified dedicated server with 32 GB RAM and fast SSDs handles 100+ agents on a single box. Past roughly 50 agents, most operators split the database, web, and telephony roles onto separate servers using ViciDial's built-in cluster support.
Can I install ViciDial on a VPS or does it need bare metal?
A VPS works fine for small deployments and is what almost every new call center starts on. The traditional objection was timing jitter under virtualisation causing audio problems, which was a real issue on oversold OpenVZ hosts a decade ago. Modern KVM virtualisation on a reputable provider is fine up to a few dozen agents. Avoid the very cheapest oversold providers.
What is the difference between ViciBox and a manual ViciDial install?
ViciBox is an installable ISO based on openSUSE with ViciDial and all dependencies pre-integrated — it is the fastest and most reliable path, and what the developers test against. A manual install (usually on Rocky Linux or Debian) gives you more control over the base OS but means compiling Asterisk and resolving Perl module dependencies yourself. Beginners should use ViciBox.